c++ - 函数 CryptEncrypt 期间崩溃
问题描述
我正在编写将生成 RSA 密钥对、导出\导入密钥和加密字符串的小程序。所以,我写了这段代码:
void EncryptString(std::string data)
{
int lenght = strlen(data.c_str());
DWORD temp = data.length() * sizeof(char);
DWORD possiblersa = 0;
unsigned char* buffer = new unsigned char[lenght];
std::copy(data.begin(), data.end(), buffer);
if (!CryptEncrypt(hKey, NULL, true, NULL, NULL, &possiblersa, NULL))
{
printf("Error: %d\n", GetLastError());
ExitThread(0);
}
if (!CryptEncrypt(hKey, NULL, true, NULL, buffer, &temp, possiblersa)) // Problem here
{
printf("Error: %d\n", GetLastError());
ExitThread(0);
}
DWORD dlen = 0;
if (!CryptBinaryToString(buffer, possiblersa, CRYPT_STRING_BASE64, NULL, &dlen))
{
printf("Error: %d\n", GetLastError());
ExitThread(0);
}
TCHAR* str = new TCHAR[dlen];
if (!CryptBinaryToString(buffer, possiblersa, CRYPT_STRING_BASE64, str, &dlen))
{
printf("Error: %d\n", GetLastError());
ExitThread(0);
}
for (DWORD i = 0; i < dlen; i++)
{
printf("%d\n", str);
}
delete[] buffer;
delete[] str;
}
CryptEncrypt 以崩溃结束。我不知道我应该怎么做才能解决这个问题。
解决方案
CryptEncrypt(hKey, NULL, true, NULL, NULL, &possiblersa, NULL))
将存储possiblersa
通过从空指针加密零字节返回的数据量。您几乎肯定需要传入要加密的实际数据(来自data.c_str()
)。
CryptEncrypt(hKey, NULL, true, NULL, buffer, &temp, possiblersa)
这会加密您的纯文本并声称您提供的缓冲区是 length possiblersa
。这几乎肯定不是真的:很可能possiblersa
是比 大得多的情况length
。
您需要延迟分配缓冲区(并将明文复制到其中),直到您发现密文缓冲区需要多大。(它至少和明文一样长,但可以更长。)
推荐阅读
- matlab - 如何从 fseminf 函数的输出中保存 funccount
- fortify - 强化中的报告生成器是否存在一些过滤问题的命令?
- javascript - 如何在节点中的给定时间(HH:MM:SS)添加 2 分钟?
- python - 具有 2 个返回值的 scipy.optimize.minimize 处理函数
- python - 如何在 html 中添加动态内容以在 Python 中发送邮件
- c# - 一个服务,两个实例,如何使用 ASP.NET Core DI 进行配置?
- regex - 在名称中间的某处允许使用连字符
- linux - 脚本返回特定状态时的 Tcsh 循环
- java - Oracle:在java程序中将java日期转换为Oracle日期
- java - 从数据库中选择列表给出空值