gpt4 book ai didi

c++ - CryptDecrypt() 无法解密某些 block C++

转载 作者:行者123 更新时间:2023-11-28 00:30:36 25 4
gpt4 key购买 nike

我目前正在使用 Windows API 使用 C++ 开发一个简单的加密/解密系统。

我相信我已经成功获得 CryptEncrypt()工作 (AES_128) 加密文件。但是当我使用 CryptDecrypt()要解密文件,前 16 个字节已损坏,然后 4000 个字节(这是我从 ReadFile() 中提取并加密的 block 的大小)是另一 block 损坏的字节,依此类推。如果我尝试解密一个总长度小于 4000 字节的文件,解密会完美无缺。

我很困惑为什么会这样。完全没有错误。

这是我的代码片段(我有一个 CryptEncrypt()CryptDecrypt() 来节省我导出 key 并使测试更快):

DWORD bytesRead;
DWORD bytesWritten;
DWORD pointer = 0;
unsigned int blockSize = 4000;
void *fileBuffer = new unsigned char[4106];
bool EOF = false;
do
{
SetFilePointer(hFileOrginal,pointer,0,0);
ReadFile(hFileOrginal,fileBuffer,blockSize,&bytesRead,NULL);
if(bytesRead<blockSize)
{
EOF=true;
}
CryptEncrypt(aesKey,NULL,EOF,0,(BYTE *)fileBuffer,&bytesRead,(blockSize+16));
CryptDecrypt(aesKey,NULL,EOF,0,(BYTE *)fileBuffer,&bytesRead);

WriteFile(hTempFile,fileBuffer,bytesRead,&bytesWritten,NULL);
pointer +=bytesRead;
}
while(!EOF);
delete[] fileBuffer;

如果有任何关于问题的建议,我将不胜感激。

编辑:在一个 4704 字节的文件上,我使用断点得到以下内容。

第一个 ReadFile bytesread 4000首先 CryptEncrypt bytesRead 4000第一个 CryptDecrypt bytesRead 4000第二个 ReadFile bytesread 704第二个 CryptEncrypt bytesread 720第二个 CryptDecrupt bytesread 704

一切似乎都很好,但我仍然遇到问题。

我正在使用增强型加密 api(带有 verifycontext)和生成的带有 CRYPT_EXPORTABLE 属性的单个 AES key

最佳答案

您根本没有进行任何错误处理。您正在调用的所有 API 函数都有返回值和错误代码,您没有检查它们。

您也没有正确管理 bytesReadCryptEncrypt() 修改您传递给它的变量,然后影响您对 CreateDecrypt() 的调用,后者也会修改它,然后影响对 的后续调用SetFilePointer(),您不应该在循环中调用它。您没有验证您是否拥有预期的字节数,或者 bytesRead 最终返回到 ReadFile() 返回的原始值,因此您可能最终跳过源文件中的字节。

尝试更像这样的东西:

bool ReadFromFile(HANDLE hFile, void *Buffer, DWORD BufSize, DWORD *BytesRead)
{
if (BytesRead)
*BytesRead = 0;

LPBYTE pBuffer = (LPBYTE) Buffer;
DWORD dwRead;

while (BufSize > 0)
{
if (!ReadFile(hFile, pBuffer, BufSize, &dwRead, NULL))
return false;

if (dwRead == 0)
break;

pBuffer += dwRead;
BufSize -= dwRead;

if (BytesRead)
*BytesRead += dwRead;
}

return true;
}

bool WriteToFile(HANDLE hFile, void *Buffer, DWORD BufSize)
{
LPBYTE pBuffer = (LPBYTE) Buffer;
DWORD dwWritten;

while (BufSize > 0)
{
if (!WriteFile(hFile, pBuffer, BufSize, &dwWritten, NULL))
return false;

pBuffer += dwWritten;
BufSize -= dwWritten;
}

return true;
}

DWORD bytesRead;
const UINT blockSize = 4000;
LPBYTE fileBuffer = new BYTE[blockSize+16];
bool EOF;

if (SetFilePointer(hFileOrginal, 0, NULL, FILE_BEGIN) != 0)
{
errorCode = GetLastError();
...
}
else
{
do
{
if (!ReadFromFile(hFileOrginal, fileBuffer, blockSize, &bytesRead))
{
errorCode = GetLastError();
...
break;
}

EOF = (bytesRead < blockSize);

bytesEncrypted = bytesRead;
if (!CryptEncrypt(aesKey, NULL, EOF, 0, fileBuffer, &bytesEncrypted, blockSize+16))
{
errorCode = GetLastError();
...
break;
}

bytesDecrypted = bytesEncrypted;
if (!CryptDecrypt(aesKey, NULL, EOF, 0, fileBuffer, &bytesDecrypted))
{
errorCode = GetLastError();
...
break;
}

if (!WriteToFile(hTempFile, fileBuffer, bytesDecrypted))
{
errorCode = GetLastError();
...
break;
}

if (bytesDecrypted != bytesRead)
{
...
break;
}
}
while (!EOF);
}
delete[] fileBuffer;

关于c++ - CryptDecrypt() 无法解密某些 block C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23074495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com