openssl rsa 私钥加密和公钥解密的c语言的代码示例
时间: 2023-09-19 18:11:38 浏览: 515
下面是一个简单的示例,展示了如何使用 OpenSSL 库进行 RSA 加密和解密。
首先,我们需要生成一对 RSA 密钥。这可以使用以下命令完成:
```
openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem
```
其中,`private_key.pem` 是生成的私钥文件,`public_key.pem` 是生成的公钥文件。
接下来,我们可以使用以下代码来进行 RSA 加密和解密:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
int main() {
RSA *rsa = NULL;
FILE *fp = NULL;
int rsa_len = 0;
unsigned char *encrypted = NULL;
unsigned char *decrypted = NULL;
// 读取公钥文件
fp = fopen("public_key.pem", "r");
if (fp == NULL) {
printf("Failed to open public key file\n");
return -1;
}
rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
if (rsa == NULL) {
printf("Failed to read public key\n");
return -1;
}
// 计算 RSA 密钥长度
rsa_len = RSA_size(rsa);
// 分配加密和解密缓冲区
encrypted = (unsigned char*)malloc(rsa_len * sizeof(unsigned char));
decrypted = (unsigned char*)malloc(rsa_len * sizeof(unsigned char));
// 要加密的明文
const char *plain_text = "Hello, RSA!";
int plain_text_len = strlen(plain_text);
// 加密明文
int encrypted_len = RSA_public_encrypt(plain_text_len, (unsigned char*)plain_text, encrypted, rsa, RSA_PKCS1_PADDING);
if (encrypted_len == -1) {
printf("Failed to encrypt\n");
return -1;
}
// 输出加密后的结果
printf("Encrypted: ");
for (int i = 0; i < encrypted_len; i++) {
printf("%02x", encrypted[i]);
}
printf("\n");
// 读取私钥文件
fp = fopen("private_key.pem", "r");
if (fp == NULL) {
printf("Failed to open private key file\n");
return -1;
}
rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
if (rsa == NULL) {
printf("Failed to read private key\n");
return -1;
}
// 解密密文
int decrypted_len = RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
if (decrypted_len == -1) {
printf("Failed to decrypt\n");
return -1;
}
// 输出解密后的结果
printf("Decrypted: %s\n", decrypted);
free(encrypted);
free(decrypted);
return 0;
}
```
在上述示例中,我们首先读取公钥文件,然后计算 RSA 密钥长度,并分配加密和解密缓冲区。接下来,我们使用 `RSA_public_encrypt` 函数对明文进行加密,并使用 `RSA_private_decrypt` 函数对密文进行解密。在解密后,我们可以输出解密后的结果。
需要注意的是,在实际使用中,我们应该使用更安全的填充方式,如 RSA OAEP 填充。此外,为了确保安全,我们应该使用随机数生成器来生成 RSA 密钥。
阅读全文