请用C语言调用openssl库实现求数组md5的函数
时间: 2023-03-12 10:22:36 浏览: 107
可以参考下面的代码:
#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
unsigned char digest[MD5_DIGEST_LENGTH];
char string[] = "hello world";
MD5((unsigned char*)&string, strlen(string), (unsigned char*)&digest);
char mdString[33];
for(int i = 0; i < 16; i++)
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
printf("md5 digest: %s\n", mdString);
return 0;
}
相关问题
windows下使用C语言调用openssl库生成rsa密钥对,并给出完整代码
好的,下面是一个示例程序,可以在Windows下使用C语言调用openssl库生成RSA密钥对:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
int main() {
int ret = 0;
RSA *rsa = NULL;
BIGNUM *e = NULL;
BIO *bio_pub = NULL, *bio_pri = NULL;
char *pub_key = NULL, *pri_key = NULL;
// 生成RSA密钥对
e = BN_new();
ret = BN_set_word(e, RSA_F4);
if (ret != 1) {
printf("BN_set_word failed\n");
return -1;
}
rsa = RSA_new();
ret = RSA_generate_key_ex(rsa, 2048, e, NULL);
if (ret != 1) {
printf("RSA_generate_key_ex failed\n");
return -1;
}
// 生成公钥和私钥
bio_pub = BIO_new(BIO_s_mem());
ret = PEM_write_bio_RSAPublicKey(bio_pub, rsa);
if (ret != 1) {
printf("PEM_write_bio_RSAPublicKey failed\n");
return -1;
}
bio_pri = BIO_new(BIO_s_mem());
ret = PEM_write_bio_RSAPrivateKey(bio_pri, rsa, NULL, NULL, 0, NULL, NULL);
if (ret != 1) {
printf("PEM_write_bio_RSAPrivateKey failed\n");
return -1;
}
// 从BIO中读取公钥和私钥
long pub_len = BIO_get_mem_data(bio_pub, &pub_key);
long pri_len = BIO_get_mem_data(bio_pri, &pri_key);
if (pub_len <= 0 || pri_len <= 0) {
printf("BIO_get_mem_data failed\n");
return -1;
}
// 输出公钥和私钥
printf("public key:\n%s\n", pub_key);
printf("private key:\n%s\n", pri_key);
// 释放资源
RSA_free(rsa);
BN_free(e);
BIO_free_all(bio_pub);
BIO_free_all(bio_pri);
free(pub_key);
free(pri_key);
return 0;
}
```
这个程序使用了openssl库中的RSA函数和PEM函数,生成了一个2048位的RSA密钥对,并且输出了公钥和私钥。需要注意的是,这个程序中的公钥和私钥都是以PEM格式保存的,如果需要使用其他格式,可以使用openssl库中的其他函数进行处理。
c语言调用openssl进行aes加解密
在C语言中,要使用OpenSSL库进行AES(高级加密标准)加解密,你需要包含相关的头文件,并引入OpenSSL函数。以下是一个简单的示例,展示如何使用AES-CBC模式进行加密和解密:
首先,确保已经安装了OpenSSL库,并链接到你的项目中。
```c
#include <stdio.h>
#include <string.h>
#include <openssl/aes.h>
// 加密函数
void aes_encrypt(const char *plaintext, char *ciphertext, const AES_KEY *key, const unsigned char iv[AES_BLOCK_SIZE]) {
AES_encrypt((unsigned char *) plaintext, (unsigned char *) ciphertext, key, iv);
}
// 解密函数
void aes_decrypt(const char *ciphertext, char *plaintext, const AES_KEY *key, const unsigned char iv[AES_BLOCK_SIZE]) {
AES_decrypt((unsigned char *) ciphertext, (unsigned char *) plaintext, key, iv);
}
int main() {
const char *key = "0123456789012345"; // 16字节的密钥
unsigned char iv[AES_BLOCK_SIZE] = {0}; // 初始化向量
// 加密示例
char input[] = "Hello, World!";
char output[EVP_MAX_CIPHER_LENGTH];
AES_KEY aes_key;
AES_set_encrypt_key((unsigned char *) key, 128, &aes_key); // AES-128
memset(output, 0, sizeof(output));
aes_encrypt(input, output, &aes_key, iv);
printf("Encrypted: %s\n", output);
// 解密示例
memset(output, 0, sizeof(output));
AES_set_decrypt_key((unsigned char *) key, 128, &aes_key);
aes_decrypt(output, input, &aes_key, iv);
printf("Decrypted: %s\n", input);
return 0;
}
```
注意:
1. 上述代码仅作演示用途,实际应用中需要处理错误处理和输入长度校验。
2. OpenSSL提供了一个封装好的EVP系列API,更推荐使用`EVP_EncryptInit` 和 `EVP_DecryptInit` 进行操作,它们更为安全和便捷。
阅读全文