【发布时间】:2014-05-29 06:18:52
【问题描述】:
我目前正在使用 Windows API 在 C++ 中开发一个简单的加密/解密系统。
我相信我已经成功地让CryptEncrypt() 工作 (AES_128) 来加密文件。
但是当我使用CryptDecrypt() 解密文件时,前 16 个字节被损坏,然后在 4000 个字节之后(这是我从ReadFile() 提取并加密的块的大小)是另一块损坏的字节,所以在。如果我尝试解密总长度小于 4000 字节的文件,则解密效果很好。
我很困惑为什么会这样。完全没有错误。
这是我的代码的 sn-p(我有一个紧挨着的 CryptEncrypt() 和 CryptDecrypt(),以节省我导出密钥并加快测试速度):
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 字节读取 704 第二个 CryptEncrypt 字节读取 720 第二个 CryptDecrupt 字节读取 704
一切似乎都很好,但我仍然遇到问题。
我正在使用增强型加密 api(带有 verifycontext),并使用 CRYPT_EXPORTABLE 属性生成单个 AES 密钥
【问题讨论】:
-
尝试添加一些测试以确保在调用 CryptEncrypt 和 CryptDecrypt 对之前和之后 bytesRead 相同。您也不需要您的 SetFilePointer 和
pointer代码,因为ReadFile无论如何都会按顺序读取。 -
一切似乎都很正常。我将结果编辑到问题中。
标签: c++ winapi encryption cryptoapi