编程实现RSA加解密软件C++语言
时间: 2023-07-12 14:02:12 浏览: 57
下面是一个使用C++语言和OpenSSL库实现的RSA加解密软件的代码示例:
```c++
#include <iostream>
#include <cstring>
#include <openssl/rsa.h>
#include <openssl/pem.h>
std::string encrypt(const std::string& public_key_file, const std::string& plaintext) {
// load public key
FILE* fp = fopen(public_key_file.c_str(), "rb");
if (fp == nullptr) {
throw std::runtime_error("Failed to open public key file");
}
RSA* rsa = PEM_read_RSA_PUBKEY(fp, nullptr, nullptr, nullptr);
fclose(fp);
if (rsa == nullptr) {
throw std::runtime_error("Failed to load public key");
}
// encrypt plaintext
int rsa_size = RSA_size(rsa);
std::string ciphertext(rsa_size, '\0');
int encrypted_size = RSA_public_encrypt(static_cast<int>(plaintext.length()),
reinterpret_cast<const unsigned char*>(plaintext.c_str()),
reinterpret_cast<unsigned char*>(ciphertext.data()),
rsa, RSA_PKCS1_PADDING);
RSA_free(rsa);
if (encrypted_size < 0) {
throw std::runtime_error("Failed to encrypt plaintext");
}
ciphertext.resize(encrypted_size);
return ciphertext;
}
std::string decrypt(const std::string& private_key_file, const std::string& ciphertext) {
// load private key
FILE* fp = fopen(private_key_file.c_str(), "rb");
if (fp == nullptr) {
throw std::runtime_error("Failed to open private key file");
}
RSA* rsa = PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr);
fclose(fp);
if (rsa == nullptr) {
throw std::runtime_error("Failed to load private key");
}
// decrypt ciphertext
int rsa_size = RSA_size(rsa);
std::string plaintext(rsa_size, '\0');
int decrypted_size = RSA_private_decrypt(static_cast<int>(ciphertext.length()),
reinterpret_cast<const unsigned char*>(ciphertext.c_str()),
reinterpret_cast<unsigned char*>(plaintext.data()),
rsa, RSA_PKCS1_PADDING);
RSA_free(rsa);
if (decrypted_size < 0) {
throw std::runtime_error("Failed to decrypt ciphertext");
}
plaintext.resize(decrypted_size);
return plaintext;
}
int main() {
std::string public_key_file = "public.pem";
std::string private_key_file = "private.pem";
std::string plaintext = "hello world";
std::string ciphertext = encrypt(public_key_file, plaintext);
std::string decrypted_plaintext = decrypt(private_key_file, ciphertext);
std::cout << "Plaintext: " << plaintext << std::endl;
std::cout << "Ciphertext: " << ciphertext << std::endl;
std::cout << "Decrypted plaintext: " << decrypted_plaintext << std::endl;
return 0;
}
```
该代码使用了OpenSSL库的`RSA`模块,其中`PEM_read_RSA_PUBKEY`和`PEM_read_RSAPrivateKey`分别为公钥和私钥加载函数。`RSA_public_encrypt`和`RSA_private_decrypt`分别实现了RSA加密和解密。注意,在使用OpenSSL库的函数时需要注意内存管理和错误处理。