我正在使用 microsoft crypto api 来加密消息。这是代码:
char str[16] = "mamamama";
DWORD count = strlen(str);
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
CHAR szPassword[] = "123456\0";
DWORD dwLength;
dwLength = (DWORD)strlen(szPassword);
FILE* fp;
char name[] = "C:\\pg\\log.txt";
fp = fopen(name, "w");
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET))//PROV_RSA_FULL
{
fprintf(fp, "%u,%s", GetLastError(), "CryptAcquireContext DEL\n");
}
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))//PROV_GOST_2012_256
{
fprintf(fp, "%u,%s", GetLastError(), "CryptAcquireContext\n");
fclose(fp);
return 69;
}
if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
{
fprintf(fp, "%u,%s", GetLastError(), "CryptCreateHash\n");
fclose(fp);
return 69;
}
// Хэширование строки пароля.
if (!CryptHashData(hHash, (BYTE*)szPassword, dwLength, 0))
{
fprintf(fp, "%u,%s", GetLastError(), "CryptHashData\n");
fclose(fp);
return 69;
}
// Создание сессионного ключа, основанного на хэше, полученного из пароля.
if (!CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey))
{
fprintf(fp, "%u,%s", GetLastError(), "CryptDeriveKey\n");
fclose(fp);
return 69;
}
int str_len = strlen(str);
DWORD buf_len = 0;
//узнаю нужную длину буфера
if(!CryptEncrypt(hKey, 0, true, 0, 0, &buf_len, str_len))
{
fprintf(fp, "%u,%s", GetLastError(), "CryptEncrypt size");
fclose(fp);
}
BYTE* data = new BYTE[buf_len];
int i = 0;
while (str[i] != '\0')
{
data[i] = (BYTE)str[i];
++i;
}
//зашифрование
if(!CryptEncrypt(hKey, 0, true, 0, data, &buf_len, str_len))
{
fprintf(fp, "%u,%s", GetLastError(), "CryptEncrypt");
fclose(fp);
}
最后一个 GetLastError 引发错误 234 - 有更多数据可用。怎么了?
我认为你混淆了最后两个参数。后者必须包含缓冲区的完整大小。而倒数第二个应该指向一个变量,该变量最初包含输入数据的大小,然后接收写入数据的大小。