RSA加解密过程
RSA为非对称加密算法,由一对公钥和一对私钥构成,私钥加密公钥解密,公钥加密私钥解密
如下图,D为私密的,假设传输英文字母,我们给英文字母编号A=1,B=2,C=3…
RSA加解密过程
两对密钥产生方法如下
C++ OpenSSL库实现加解密
#include <openssl/rsa.h> // 包含OpenSSL RSA加密算法相关函数
#include <openssl/pem.h> // 包含PEM格式编码和解码函数
#include <openssl/err.h> // 包含错误处理函数
#include <iostream> // 包含标准输入输出流
#include <cstring> // 包含C字符串处理函数
#include <vector> // 包含向量容器
#include <memory> // 包含智能指针
#include <stdexcept> // 包含标准异常类// RSAEncryptor类用于封装RSA加密和解密操作
class RSAEncryptor
{
private:// 使用智能指针管理RSA结构体和BIGNUM结构体资源std::unique_ptr<RSA, decltype(&RSA_free)> rsa;std::unique_ptr<BIGNUM, decltype(&BN_free)> bn;public:// 构造函数,初始化RSA密钥对RSAEncryptor() : rsa(RSA_new(), RSA_free), bn(BN_new(), BN_free){// 设置公钥指数为RSA_F4(65537),这是一个常用的公钥指数BN_set_word(bn.get(), RSA_F4);// 生成2048位的RSA密钥对if (RSA_generate_key_ex(rsa.get(), 2048, bn.get(), nullptr) != 1){// 如果密钥生成失败,抛出异常throw std::runtime_error("RSA key generation failed");}}// 析构函数,默认即可,智能指针会自动释放资源// 加密函数,接收一个字符串,返回加密后的字节数组std::vector<unsigned char> encrypt(const std::string &plaintext){// 获取RSA密钥长度int rsa_size = RSA_size(rsa.get());// 创建足够大的缓冲区来存储加密数据std::vector<unsigned char> encrypted(rsa_size);// 执行公钥加密操作int result = RSA_public_encrypt(plaintext.size(),reinterpret_cast<const unsigned char *>(plaintext.data()),encrypted.data(),rsa.get(),RSA_PKCS1_PADDING);// 如果加密失败,抛出异常if (result == -1){throw std::runtime_error("RSA encryption failed");}// 调整vector大小以匹配加密后的数据长度encrypted.resize(result);return encrypted;}// 解密函数,接收加密后的字节数组,返回解密后的字符串std::string decrypt(const std::vector<unsigned char> &ciphertext){// 获取RSA密钥长度int rsa_size = RSA_size(rsa.get());// 创建足够大的缓冲区来存储解密数据std::vector<unsigned char> decrypted(rsa_size);// 执行私钥解密操作int result = RSA_private_decrypt(ciphertext.size(),ciphertext.data(),decrypted.data(),rsa.get(),RSA_PKCS1_PADDING);// 如果解密失败,抛出异常if (result == -1){throw std::runtime_error("RSA decryption failed");}// 将解密后的数据转换为字符串return std::string(decrypted.begin(), decrypted.begin() + result);}
};// 主函数,演示RSAEncryptor类的使用
int main()
{try{// 创建RSAEncryptor实例RSAEncryptor encryptor;// 原始消息std::string original_message = "你好, RSA!";// 加密消息std::vector<unsigned char> encrypted_message = encryptor.encrypt(original_message);// 解密消息std::string decrypted_message = encryptor.decrypt(encrypted_message);// 输出原始消息std::cout << "原信息: " << original_message << std::endl;// 输出加密后的数据std::cout << "加密数据: ";for (auto c : encrypted_message){std::cout << std::hex << static_cast<int>(c);}std::cout << std::endl;// 输出解密后的数据std::cout << "解密数据: " << decrypted_message << std::endl;}catch (const std::exception &e){// 如果发生异常,输出错误信息std::cerr << "发生错误: " << e.what() << std::endl;return 1;}return 0;
}
编译运行:
g++ -o rsa_example RSA.cpp -lssl -lcrypto
运行结果: