【发布时间】:2012-02-23 20:30:59
【问题描述】:
首先,如果我在这里遗漏了什么,我深表歉意。这是我对 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 就会失败。我尝试了许多不同的方法来做到这一点,但总是失败。 是因为最后的缓冲区小于 16bytes 吗? 有人可以帮忙吗,在加密方面我是个菜鸟。 谢谢 编辑:GetLastError 返回:0x000000ea
【问题讨论】:
-
ENCRYPT_BLOCK_SIZE 到底是做什么的?你有指向所用示例的指针吗?
标签: c++ winapi encryption