函数CryptEncrypt崩溃

时间:2019-07-16 10:36:40

标签: c++ encryption wincrypt

我正在编写一个小程序,它将生成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以崩溃结束。我不知道该怎么办才能解决此问题。

1 个答案:

答案 0 :(得分:1)

CryptEncrypt(hKey, NULL, true, NULL, NULL, &possiblersa, NULL))

将在possiblersa中存储通过从空指针加密零字节将返回的数据量。几乎可以肯定,您需要传递要加密的实际数据(来自data.c_str())。

CryptEncrypt(hKey, NULL, true, NULL, buffer, &temp, possiblersa)

这会加密您的纯文本并声明您提供的缓冲区的长度为possiblersa声明。几乎可以肯定这是不正确的:possiblersa可能比length大得多。

您需要延迟分配缓冲区(并将明文复制到其中),直到发现密文缓冲区需要多大为止。 (这将至少与纯文本一样长,但可能会更长)。