rsa生成公私钥并用私钥解密,c实现
时间: 2024-02-20 13:00:26 浏览: 91
手动实现RSA的公钥和私钥生成,加密和解密
下面是一个使用OpenSSL库生成RSA公私钥对,并使用私钥解密的C语言示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define KEY_LENGTH 2048
#define PUB_KEY_FILE "public.pem"
#define PRI_KEY_FILE "private.pem"
int main()
{
RSA *rsa = NULL;
unsigned char *encrypted = NULL, *decrypted = NULL;
int encrypted_length, decrypted_length;
// 生成RSA密钥对
rsa = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);
if (rsa == NULL) {
printf("Failed to generate RSA key pair\n");
return -1;
}
// 把私钥保存到文件中
FILE *priv_key_file = fopen(PRI_KEY_FILE, "wb");
if (priv_key_file == NULL) {
printf("Failed to open private key file\n");
RSA_free(rsa);
return -1;
}
PEM_write_RSAPrivateKey(priv_key_file, rsa, NULL, NULL, 0, NULL, NULL);
fclose(priv_key_file);
// 把公钥保存到文件中
FILE *pub_key_file = fopen(PUB_KEY_FILE, "wb");
if (pub_key_file == NULL) {
printf("Failed to open public key file\n");
RSA_free(rsa);
return -1;
}
PEM_write_RSAPublicKey(pub_key_file, rsa);
fclose(pub_key_file);
// 使用私钥解密数据
const char *message = "Hello, World!";
encrypted_length = RSA_public_encrypt(strlen(message) + 1, (unsigned char *)message, &encrypted, rsa, RSA_PKCS1_PADDING);
if (encrypted_length == -1) {
printf("Failed to encrypt message\n");
RSA_free(rsa);
return -1;
}
decrypted = (unsigned char *)malloc(RSA_size(rsa));
decrypted_length = RSA_private_decrypt(encrypted_length, encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
if (decrypted_length == -1) {
printf("Failed to decrypt message\n");
RSA_free(rsa);
free(encrypted);
free(decrypted);
return -1;
}
printf("Decrypted message: %s\n", decrypted);
RSA_free(rsa);
free(encrypted);
free(decrypted);
return 0;
}
```
该示例中,使用`RSA_generate_key`函数生成RSA公私钥对,使用`PEM_write_RSAPrivateKey`和`PEM_write_RSAPublicKey`函数将私钥和公钥保存到文件中。
使用`RSA_public_encrypt`函数使用公钥加密数据,使用`RSA_private_decrypt`函数使用私钥解密数据。注意,在使用`RSA_public_encrypt`函数加密数据时,需要指定要加密的数据长度,因为RSA加密算法只能加密比密钥长度小的数据。在使用`RSA_private_decrypt`函数解密数据时,需要使用`RSA_size`函数得到解密后数据的最大长度。
阅读全文