用C++程序实现输入信息用RAS加密和解密
时间: 2024-03-24 15:39:07 浏览: 14
以下是一个使用 C++ 实现 RSA 加密和解密的示例代码:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
#include <wincrypt.h>
#pragma comment(lib, "crypt32.lib")
using namespace std;
// 生成 RSA 公钥和私钥
bool GenerateRSAKeys(HCRYPTPROV hProv, HCRYPTKEY& hPublicKey, HCRYPTKEY& hPrivateKey)
{
bool success = false;
// 生成 RSA 密钥对
if (CryptGenKey(hProv, AT_SIGNATURE, CRYPT_EXPORTABLE | 0x800000, &hPrivateKey))
{
DWORD dwPublicKeyLen = 0;
// 获取 RSA 公钥大小
if (CryptExportKey(hPrivateKey, 0, PUBLICKEYBLOB, 0, NULL, &dwPublicKeyLen))
{
BYTE* pPublicKeyBlob = new BYTE[dwPublicKeyLen];
// 导出 RSA 公钥
if (CryptExportKey(hPrivateKey, 0, PUBLICKEYBLOB, 0, pPublicKeyBlob, &dwPublicKeyLen))
{
// 导入 RSA 公钥
if (CryptImportKey(hProv, pPublicKeyBlob, dwPublicKeyLen, 0, 0, &hPublicKey))
{
success = true;
}
}
delete[] pPublicKeyBlob;
}
}
return success;
}
// RSA 加密
bool EncryptRSA(HCRYPTKEY hPublicKey, const BYTE* pData, DWORD dwDataLen, vector<BYTE>& encryptedData)
{
bool success = false;
DWORD dwBlockLen = 0;
DWORD dwEncryptedLen = 0;
// 获取 RSA 加密块大小
if (CryptGetKeyParam(hPublicKey, KP_BLOCKLEN, (BYTE*)&dwBlockLen, &dwEncryptedLen, 0))
{
DWORD dwPadding = 0;
// 计算 RSA 加密填充长度
if (CryptGetKeyParam(hPublicKey, KP_PADDING, (BYTE*)&dwPadding, &dwEncryptedLen, 0))
{
DWORD dwBlockSize = (dwBlockLen + 7) / 8;
DWORD dwBlockCount = (dwDataLen + dwBlockSize - 1) / dwBlockSize;
encryptedData.resize(dwBlockCount * dwBlockSize);
for (DWORD i = 0; i < dwBlockCount; i++)
{
DWORD dwBlockDataLen = min(dwDataLen - i * dwBlockSize, dwBlockSize);
DWORD dwEncryptedDataLen = encryptedData.size() - i * dwBlockSize;
if (!CryptEncrypt(hPublicKey, 0, (i == dwBlockCount - 1) ? TRUE : FALSE, 0, &pData[i * dwBlockSize], &dwBlockDataLen, &encryptedData[i * dwBlockSize], &dwEncryptedDataLen))
{
encryptedData.clear();
break;
}
}
success = encryptedData.size() > 0;
}
}
return success;
}
// RSA 解密
bool DecryptRSA(HCRYPTKEY hPrivateKey, const BYTE* pEncryptedData, DWORD dwEncryptedDataLen, vector<BYTE>& decryptedData)
{
bool success = false;
DWORD dwBlockLen = 0;
DWORD dwDecryptedLen = 0;
// 获取 RSA 解密块大小
if (CryptGetKeyParam(hPrivateKey, KP_BLOCKLEN, (BYTE*)&dwBlockLen, &dwDecryptedLen, 0))
{
DWORD dwPadding = 0;
// 计算 RSA 解密填充长度
if (CryptGetKeyParam(hPrivateKey, KP_PADDING, (BYTE*)&dwPadding, &dwDecryptedLen, 0))
{
DWORD dwBlockSize = (dwBlockLen + 7) / 8;
DWORD dwBlockCount = (dwEncryptedDataLen + dwBlockSize - 1) / dwBlockSize;
decryptedData.resize(dwBlockCount * dwBlockSize);
for (DWORD i = 0; i < dwBlockCount; i++)
{
DWORD dwEncryptedBlockLen = min(dwEncryptedDataLen - i * dwBlockSize, dwBlockSize);
DWORD dwDecryptedBlockLen = decryptedData.size() - i * dwBlockSize;
if (!CryptDecrypt(hPrivateKey, 0, (i == dwBlockCount - 1) ? TRUE : FALSE, 0, (BYTE*)&pEncryptedData[i * dwBlockSize], &dwEncryptedBlockLen, &decryptedData[i * dwBlockSize], &dwDecryptedBlockLen))
{
decryptedData.clear();
break;
}
}
success = decryptedData.size() > 0;
}
}
return success;
}
int main()
{
// 获取 CSP 句柄
HCRYPTPROV hProv = 0;
if (CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT))
{
HCRYPTKEY hPublicKey = 0;
HCRYPTKEY hPrivateKey = 0;
// 生成 RSA 公钥和私钥
if (GenerateRSAKeys(hProv, hPublicKey, hPrivateKey))
{
string message;
// 输入需要加密的信息
cout << "请输入需要加密的信息:";
getline(cin, message);
// RSA 加密
vector<BYTE> encryptedData;
if (EncryptRSA(hPublicKey, (BYTE*)message.c_str(), message.length(), encryptedData))
{
string encryptedMessage((char*)&encryptedData[0], encryptedData.size());
// RSA 解密
vector<BYTE> decryptedData;
if (DecryptRSA(hPrivateKey, &encryptedData[0], encryptedData.size(), decryptedData))
{
string decryptedMessage((char*)&decryptedData[0], decryptedData.size());
// 输出加密和解密结果
cout << "加密后的信息:" << encryptedMessage << endl;
cout << "解密后的信息:" << decryptedMessage << endl;
}
}
// 释放 RSA 公钥和私钥
CryptDestroyKey(hPublicKey);
CryptDestroyKey(hPrivateKey);
}
// 释放 CSP 句柄
CryptReleaseContext(hProv, 0);
}
return 0;
}
```
需要注意的是,此代码使用 Microsoft Cryptographic API (CryptoAPI) 实现 RSA 加密和解密。在编译此代码之前,请确保已将 `crypt32.lib` 库添加到项目中。