RSA加密解密代码

RSA加密解密代码(Ubuntu下)

下面是一个用C++和OpenSSL库在Ubuntu下进行RSA加密和解密的验证代码示例。你可以用它来测试RSA加密和解密的过程。

安装OpenSSL库(如果尚未安装):

sudo apt-get install libssl-dev

RSA加密和解密代码(rsa_example.cpp):

#include

#include <openssl/rsa.h>

#include <openssl/pem.h>

#include <openssl/err.h>

#include

using namespace std;

// 打印错误信息

void print_errors() {

char buffer120;

while (ERR_get_error()) {

ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer));

cout << buffer << endl;

}

}

// 生成RSA密钥对并保存

void generate_rsa_keys() {

RSA* rsa = RSA_new();

BIGNUM* bn = BN_new();

if (!BN_set_word(bn, RSA_F4)) {

print_errors();

return;

}

复制代码
if (!RSA_generate_key_ex(rsa, 2048, bn, NULL)) {
    print_errors();
    return;
}

// 保存私钥
FILE* privateKeyFile = fopen("private.pem", "wb");
PEM_write_RSAPrivateKey(privateKeyFile, rsa, NULL, NULL, 0, NULL, NULL);
fclose(privateKeyFile);

// 保存公钥
FILE* publicKeyFile = fopen("public.pem", "wb");
PEM_write_RSAPublicKey(publicKeyFile, rsa);
fclose(publicKeyFile);

RSA_free(rsa);
BN_free(bn);

}

// 使用RSA公钥加密

int encrypt_with_rsa_public_key(const string& message, unsigned char** encryptedMessage) {

FILE* publicKeyFile = fopen("public.pem", "rb");

RSA* rsa = PEM_read_RSAPublicKey(publicKeyFile, NULL, NULL, NULL);

fclose(publicKeyFile);

复制代码
int rsaSize = RSA_size(rsa);
*encryptedMessage = (unsigned char*)malloc(rsaSize);

int result = RSA_public_encrypt(message.length(), (unsigned char*)message.c_str(), *encryptedMessage, rsa, RSA_PKCS1_OAEP_PADDING);
if (result == -1) {
    print_errors();
    RSA_free(rsa);
    return -1;
}

RSA_free(rsa);
return result;

}

// 使用RSA私钥解密

string decrypt_with_rsa_private_key(unsigned char* encryptedMessage, int encryptedMessageLen) {

FILE* privateKeyFile = fopen("private.pem", "rb");

RSA* rsa = PEM_read_RSAPrivateKey(privateKeyFile, NULL, NULL, NULL);

fclose(privateKeyFile);

复制代码
unsigned char* decryptedMessage = (unsigned char*)malloc(RSA_size(rsa));
int result = RSA_private_decrypt(encryptedMessageLen, encryptedMessage, decryptedMessage, rsa, RSA_PKCS1_OAEP_PADDING);
if (result == -1) {
    print_errors();
    RSA_free(rsa);
    return "";
}

string decryptedText((char*)decryptedMessage, result);
RSA_free(rsa);
free(decryptedMessage);

return decryptedText;

}

int main() {

// 生成密钥对

generate_rsa_keys();

复制代码
string message = "Hello, RSA Encryption!";
cout << "Original Message: " << message << endl;

// 使用RSA公钥加密
unsigned char* encryptedMessage = NULL;
int encryptedMessageLen = encrypt_with_rsa_public_key(message, &encryptedMessage);
if (encryptedMessageLen == -1) {
    return 1;
}

// 打印加密后的数据
cout << "Encrypted Message: ";
for (int i = 0; i < encryptedMessageLen; i++) {
    printf("%02x ", encryptedMessage[i]);
}
cout << endl;

// 使用RSA私钥解密
string decryptedMessage = decrypt_with_rsa_private_key(encryptedMessage, encryptedMessageLen);
cout << "Decrypted Message: " << decryptedMessage << endl;

free(encryptedMessage);
return 0;

}

代码解释:

生成RSA密钥对:generate_rsa_keys函数会生成2048位的RSA密钥对,并将它们分别保存为private.pem和public.pem。

RSA公钥加密:encrypt_with_rsa_public_key函数使用公钥对消息进行加密。

RSA私钥解密:decrypt_with_rsa_private_key函数使用私钥解密加密后的消息。

加密后输出:加密后的数据以十六进制格式输出,便于查看。

编译与运行:

编译代码:

g++ -o rsa_example rsa_example.cpp -lssl -lcrypto

运行:

./rsa_example

输出示例:

相关推荐
潜创微科技2 分钟前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu26 分钟前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊31 分钟前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby1 小时前
C++11
开发语言·c++
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
夜不会漫长2 小时前
C++:类和对象(2)
java·javascript·c++
ch.ju2 小时前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
无小道2 小时前
C++ 中 `explicit` 关键字详解:彻底理解隐式类型转换
c++·explicit
Evand J2 小时前
【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接
开发语言·图像处理·人工智能·计算机视觉·matlab·滑动窗口·滤波
蒸蒸yyyyzwd2 小时前
cpp 选手秋招学习笔记 day34
c++·八股