以下是使用OpenSSL库在C语言环境中实现RSA非对称加密算法的一个基本示例。请注意,这个示例仅用于展示如何生成密钥、进行加密和解密操作的基本流程。在实际应用中,你可能需要更复杂的错误处理和数据管理。
首先,你需要确保你的系统中安装了OpenSSL库。以下示例代码包括密钥生成、加密和解密过程:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
// 初始化OpenSSL库
void init_openssl() {
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
}
// 清理OpenSSL库使用的资源
void cleanup_openssl() {
ERR_free_strings();
}
// RSA密钥生成
RSA *generate_rsa_keys(unsigned long e, unsigned long key_length) {
RSA *rsa = RSA_new();
BIGNUM *bne = BN_new();
BN_set_word(bne, e);
RSA_generate_key_ex(rsa, key_length, bne, NULL);
BN_free(bne);
return rsa;
}
// RSA公钥加密
int rsa_public_encrypt(unsigned char *data, int data_len, unsigned char *encrypted, RSA *rsa, int padding) {
return RSA_public_encrypt(data_len, data, encrypted, rsa, padding);
}
// RSA私钥解密
int rsa_private_decrypt(unsigned char *encrypted, int encrypted_len, unsigned char *decrypted, RSA *rsa, int padding) {
return RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa, padding);
}
int main() {
init_openssl();
RSA *rsa = generate_rsa_keys(RSA_F4, 2048); // 使用RSA_F4作为公钥指数,密钥长度为2048位
if (!rsa) {
perror("RSA key generation failed");
exit(EXIT_FAILURE);
}
// 示例数据
unsigned char original_data[] = "Hello, RSA!";
int original_data_len = strlen((char *)original_data);
// 加密缓冲区
unsigned char encrypted_data[4096];
int encrypted_data_len = rsa_public_encrypt(original_data, original_data_len, encrypted_data, rsa, RSA_PKCS1_PADDING);
if (encrypted_data_len == -1) {
perror("RSA public encryption failed");
exit(EXIT_FAILURE);
}
// 解密缓冲区
unsigned char decrypted_data[4096];
int decrypted_data_len = rsa_private_decrypt(encrypted_data, encrypted_data_len, decrypted_data, rsa, RSA_PKCS1_PADDING);
if (decrypted_data_len == -1) {
perror("RSA private decryption failed");
exit(EXIT_FAILURE);
}
printf("Original: %s\n", original_data);
printf("Decrypted: %s\n", decrypted_data);
RSA_free(rsa);
cleanup_openssl();
return 0;
}
注意:
- 这个示例使用了RSA_PKCS1_PADDING作为填充模式,这是RSA加密中常用的填充方式之一。
- 密钥生成使用了RSA_F4(即65537)作为公钥的指数,这是一个常见的选择,因为它既安全又有效。
- 请确保在实际部署中处理所有可能的错误情况,并适当地管理内存和资源。
- 编译这个程序时,需要链接OpenSSL库。如果你使用的是gcc,可以添加`-lcrypto`标志来链接OpenSSL的加密库。