c++ openssl rsa 加解密从字符串读取公私钥
时间: 2024-10-23 15:20:35 浏览: 22
在C++中使用OpenSSL库进行RSA加解密,你需要先包含相关的头文件并初始化OpenSSL上下文。下面是一个简单的示例,展示如何从字符串中读取公钥和私钥,并进行加密和解密操作:
```cpp
#include <openssl/pem.h>
#include <openssl/rsa.h>
// 从字符串中加载PEM格式的公钥
std::string publicKeyStr;
// ... (填充公钥字符串)
RSA* loadRSAPublicKey(const std::string& keyStr) {
RSA* pubKey = nullptr;
pem_password_cb pass_cb = [](char* buf, int size, int rwflag, void* udata) -> int {
// 实现密码回调函数(这里假设不需要密码)
return 0;
};
const BIO* bioIn = BIO_new_mem_buf(keyStr.c_str(), -1);
if (!bioIn || !PEM_read_bio_RSAPublicKey(&pubKey, NULL, &pass_cb, NULL)) {
// 处理错误
return nullptr;
}
BIO_free_all(bioIn);
return pubKey;
}
// 从字符串中加载PEM格式的私钥
std::string privateKeyStr;
// ... (填充私钥字符串)
RSA* loadRSAPrivateKey(const std::string& keyStr) {
RSA* privKey = nullptr;
pem_password_cb pass_cb = [](char* buf, int size, int rwflag, void* udata) -> int {
// 实现密码回调函数(如果需要提供密码)
return 0; // 这里假设无密码
};
const BIO* bioIn = BIO_new_mem_buf(keyStr.c_str(), -1);
if (!bioIn || !PEM_read_bio_PrivateKey(&privKey, NULL, &pass_cb, NULL)) {
// 处理错误
return nullptr;
}
BIO_free_all(bioIn);
return privKey;
}
// 加密示例
std::string encryptRSA(RSA* key, const std::string& plaintext) {
unsigned char encrypted[512];
int len;
if (RSA_public_encrypt(strlen(plaintext), (const unsigned char*)plaintext.c_str(), encrypted, key, RSA_PKCS1_OAEP_PADDING)) {
len = BIO_ctrl_pending(bioOut);
std::string ciphertext((char*)encrypted, len);
return ciphertext;
} else {
// 处理错误
return "";
}
}
// 解密示例
std::string decryptRSA(RSA* key, const std::string& ciphertext) {
unsigned char decrypted[512];
int len;
if (RSA_private_decrypt(strlen(ciphertext), (unsigned char*)ciphertext.c_str(), decrypted, key, RSA_PKCS1_OAEP_PADDING)) {
len = BIO_ctrl_pending(bioOut);
std::string plainText((char*)decrypted, len);
return plainText;
} else {
// 处理错误
return "";
}
}
```
阅读全文