RSA加解密一串字符串
时间: 2024-11-28 19:13:20 浏览: 4
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它的安全性基于大数分解的难度。在RSA中,我们有两把钥匙:一把是公钥(public key),用来加密数据;另一把是私钥(private key),用于解密。
要使用RSA加解密一串字符串,你需要按照以下步骤进行:
**生成RSA密钥对:**
1. 使用`openssl genrsa -out private_key.pem <key_size>`命令生成一个指定大小(如2048位)的私钥文件(`.pem`或`.pkcs8`格式)。
2. 使用`openssl rsa -pubout -in private_key.pem -out public_key.pem`从私钥文件导出公钥。
**加密过程(使用公钥):**
```c
#include <openssl/pem.h>
#include <openssl/rsa.h>
// 加载公钥
FILE* pub_key_file = fopen("public_key.pem", "r");
BIO* bio_pub_key = BIO_new(BIO_s_mem());
if (!PEM_read_bio_RSAPublicKey(bio_pub_key, &rsa_public_key, NULL, NULL)) {
// 处理错误...
}
// 假设你要加密的字符串是 "my_string"
unsigned char input_string[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g'};
size_t string_length = strlen(input_string);
// RSA加密
unsigned char encrypted[CryptoPP::AES::DEFAULT_KEYLENGTH];
int encrypted_len;
RSA_public_encrypt(string_length, input_string, encrypted, rsa_public_key, RSA_PKCS1_OAEP_PADDING, &encrypted_len);
```
**解密过程(使用私钥):**
```c
// 加载私钥
FILE* priv_key_file = fopen("private_key.pem", "r");
BIO* bio_priv_key = BIO_new(BIO_s_mem());
if (!PEM_read_bio_RSAPrivateKey(bio_priv_key, &rsa_private_key, NULL, NULL)) {
// 处理错误...
}
// 解密
unsigned char decrypted[CryptoPP::AES::DEFAULT_KEYLENGTH];
RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa_private_key, RSA_PKCS1_OAEP_PADDING);
// 将解密后的字节转换回字符串
char decrypted_string[decrypted_len+1];
memset(decrypted_string, 0, sizeof(decrypted_string));
memcpy(decrypted_string, decrypted, decrypted_len);
decrypted_string[decrypted_len] = '\0';
```
请注意,这里用到了`Crypto++`库来进行实际的加密和解密操作,因为标准的OpenSSL API不直接支持AES加密,而RSA本身并不涉及对称加密。实际应用中可能还需要处理字符编码、Base64编码等问题。
阅读全文