vs2010使用C语言和openssl编写RSA加解密并附上每行代码注释
时间: 2024-03-12 21:43:40 浏览: 122
下面是在 VS2010 中使用 C 语言和 OpenSSL 库编写 RSA 加解密程序,每行都附带了注释:
```c
#include <stdio.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define KEY_LENGTH 2048 // RSA 密钥长度
#define PUB_EXP 3 // RSA 公钥指数
#define PRIV_EXP "mykey.pem" // 私钥文件名
int main()
{
RSA *keypair = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL); // 生成 RSA 密钥对
if (!keypair) // 如果生成密钥对失败
{
printf("Error generating RSA key!\n"); // 打印错误信息
return -1; // 返回错误
}
// 保存私钥
FILE *priv_file = fopen(PRIV_EXP, "wb"); // 打开保存私钥的文件
if (priv_file) // 如果成功打开文件
{
PEM_write_RSAPrivateKey(priv_file, keypair, NULL, NULL, 0, NULL, NULL); // 将私钥写入文件中
fclose(priv_file); // 关闭文件
printf("Private key saved to %s.\n", PRIV_EXP); // 打印保存私钥的文件名
}
else // 如果打开文件失败
{
printf("Error saving private key!\n"); // 打印错误信息
RSA_free(keypair); // 释放密钥对内存
return -1; // 返回错误
}
// 加密
const char *msg = "Hello, world!"; // 要加密的消息
size_t msg_len = strlen(msg) + 1; // 消息长度,包括空字符
unsigned char enc_msg[KEY_LENGTH / 8]; // 加密后的消息,长度为密钥位数除以 8
int enc_msg_len = RSA_public_encrypt(msg_len, (unsigned char*)msg, enc_msg, keypair, RSA_PKCS1_PADDING); // 使用公钥加密消息
if (enc_msg_len == -1) // 如果加密失败
{
printf("Error encrypting message!\n"); // 打印错误信息
RSA_free(keypair); // 释放密钥对内存
return -1; // 返回错误
}
printf("Encrypted message: "); // 打印加密后的消息
for (int i = 0; i < enc_msg_len; i++) // 循环打印每个字节的十六进制表示
{
printf("%02x", enc_msg[i]);
}
printf("\n");
// 解密
unsigned char dec_msg[KEY_LENGTH / 8]; // 解密后的消息缓存区,长度为密钥位数除以 8
int dec_msg_len = RSA_private_decrypt(enc_msg_len, enc_msg, dec_msg, keypair, RSA_PKCS1_PADDING); // 使用私钥解密消息
if (dec_msg_len == -1) // 如果解密失败
{
printf("Error decrypting message!\n"); // 打印错误信息
RSA_free(keypair); // 释放密钥对内存
return -1; // 返回错误
}
printf("Decrypted message: %s\n", dec_msg); // 打印解密后的消息
RSA_free(keypair); // 释放密钥对内存
return 0; // 返回成功
}
```
这个程序使用 OpenSSL 库生成 RSA 密钥对,将私钥保存到文件中。然后,将一个字符串加密,解密加密后的消息,并打印原始消息。
阅读全文