Прежде всего, я прошу прощения, если я что-то здесь упускаю.Это моя первая попытка использования Windows CryptAPI, и, хотя я прошел через Google, MSDN, MSDN и т. Д., Я не могу понять, почему возникает эта проблема.У меня есть следующий код, который должен скопировать код операции (блоки байтов), найденные по определенному адресу, зашифровать их, а затем записать обратно.Это ни в коем случае не полный код, и он очень мало проверяет ошибки.Я использую AES256.
bool CryptoClass::encrypt(DWORD address, DWORD len)
{
DWORD dwBlockLen = 0;
DWORD dwBufferLen = 0;
DWORD dwCount = 0;
PBYTE pbBuffer = NULL;
dwBlockLen = AES_BLOCK_SIZE - AES_BLOCK_SIZE % ENCRYPT_BLOCK_SIZE;
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
if(pbBuffer = (BYTE *)malloc(dwBufferLen))
{
bool EOB = FALSE;
while ( dwCount <= len) )
{
memcpy((void*)pbBuffer,(void*)address,dwBlockLen);
if ( (len - dwCount) < dwBlockLen) EOB = TRUE;
if(CryptEncrypt(hKey,NULL,EOB,0,pbBuffer,&dwBlockLen,dwBufferLen))
{
memcpy((void*)address,(void*)pbBuffer,dwBlockLen);
address += dwBlockLen;
dwCount += dwBlockLen;
}
else
{
error = GetLastError();
MessageBoxA(NULL,"problem","error",MB_OK);
}
}
free(pbBuffer);
return true;
}
else return false;
}
Насколько я понимаю, AES может шифровать блоки по 16 байт, поэтому для AES_BLOCK_SIZE задано значение 16. Кроме того, для моего ENCRYPT_BLOCK_SIZE установлено значение 8. Я в основном копирую пример, найденный на MSDN.и настройку для AES256 и для использования с памятью вместо файла.Однако в моем цикле while всякий раз, когда он достигает конца буфера, где для FINAL установлено значение TRUE, CryptEncrypt завершается ошибкой.Я пробовал много разных способов сделать это, но это всегда терпит неудачу.Это потому, что размер буфера в конце меньше 16 байт?Может кто-нибудь, пожалуйста, помогите, я полный нуб, когда дело доходит до шифрования.Спасибо РЕДАКТИРОВАТЬ: GetLastError возвращает: 0x000000ea