RSA算法OpenSSL实现
时间: 2023-11-18 10:48:49 浏览: 147
RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,常用于数字签名、密钥交换等方面。OpenSSL是一个常用的开源密码库,支持RSA算法的实现。
以下是使用OpenSSL库进行RSA加密和解密的基本步骤:
1. 生成RSA密钥对
使用OpenSSL库生成RSA密钥对,可使用命令行工具openssl或者编程接口。其中,私钥通常保存在文件中,公钥可以通过私钥推导出来。
2. 加密数据
使用公钥对需要加密的数据进行加密,可使用OpenSSL库提供的函数RSA_public_encrypt。
3. 解密数据
使用私钥对加密后的数据进行解密,可使用OpenSSL库提供的函数RSA_private_decrypt。
以下是一个简单的示例代码:
```c
#include <openssl/rsa.h>
#include <openssl/pem.h>
// 生成RSA密钥对
RSA* generateKeyPair(int keyLength) {
RSA* keyPair = RSA_new();
BIGNUM* exponent = BN_new();
BN_set_word(exponent, RSA_F4);
RSA_generate_key_ex(keyPair, keyLength, exponent, NULL);
BN_free(exponent);
return keyPair;
}
// 加密数据
int encryptData(unsigned char* data, int dataLen, RSA* publicKey, unsigned char* encryptedData) {
int encryptedDataLen = RSA_public_encrypt(dataLen, data, encryptedData, publicKey, RSA_PKCS1_PADDING);
return encryptedDataLen;
}
// 解密数据
int decryptData(unsigned char* encryptedData, int encryptedDataLen, RSA* privateKey, unsigned char* decryptedData) {
int decryptedDataLen = RSA_private_decrypt(encryptedDataLen, encryptedData, decryptedData, privateKey, RSA_PKCS1_PADDING);
return decryptedDataLen;
}
int main() {
RSA* keyPair = generateKeyPair(2048);
unsigned char plainText[] = "Hello, RSA!";
unsigned char encryptedData[4096];
unsigned char decryptedData[4096];
int encryptedDataLen = encryptData(plainText, strlen(plainText), keyPair, encryptedData);
int decryptedDataLen = decryptData(encryptedData, encryptedDataLen, keyPair, decryptedData);
printf("Plain text: %s\n", plainText);
printf("Encrypted data: ");
for (int i = 0; i < encryptedDataLen; i++) {
printf("%02X", encryptedData[i]);
}
printf("\n");
printf("Decrypted data: %s\n", decryptedData);
RSA_free(keyPair);
return 0;
}
```
该示例代码生成了一个2048位的RSA密钥对,并使用公钥加密了一个字符串,然后使用私钥解密得到原始字符串。注意,加密和解密时都使用了RSA_PKCS1_PADDING填充方式。
阅读全文