- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 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 函数都有返回值和错误代码,您没有检查它们。
您也没有正确管理 bytesRead
。 CryptEncrypt()
修改您传递给它的变量,然后影响您对 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/
我正在使用 Windows Crypto API,但无法解密文件。在 CryptDecrypt 之后,我的文件的一些第一个字节被解密,但其他字节是垃圾。 例如: 0123456701234567012
我正在尝试制作一个简单的应用程序来加密一个字符串,然后对其进行解密。到目前为止我的代码: int main( int argc, char* argv[] ) { char test[ 32 ] =
Alejandro Magencio 编写的以下代码可以生成 key 对,使用 Microsoft CryptoAPI 加密和解密文件,效果很好,但仅适用于小于 key 的文件: http://blo
我写了一个简单的程序来加载由 openssl 生成的公钥来解密由公钥的私钥加密的字符串。但我不知道为什么我失败了 b = CryptDecrypt(hKey,NULL,FALSE,0,pbEncryp
我目前正在使用 Windows API 使用 C++ 开发一个简单的加密/解密系统。 我相信我已经成功获得 CryptEncrypt()工作 (AES_128) 加密文件。但是当我使用 CryptDe
好的,我正在尝试使用 C++ 中的 Win32 Crypto API 来解密使用 RijndaelManaged 类在 C# (.NET 2) 中加密的字符串。但是我一点运气都没有,我得到了乱码或错误
我曾经与 crypto++ 一起工作以前在 Visual Studio 中,但现在我想使用 wincrypt.h使用 加密字符串的 API 函数AES 256 带有 四 (cbc 模式)。 我做了以下
我制作了一个小应用程序来加密和解密一些文本。只要我直接使用加密的字节数组,一切都很好。但是,一旦我复制数组以模仿将加密文本作为文件发送的过程,解密就不会运行。 为什么我无法使用复制的数组运行解密? u
.net 有这些函数的实现吗?或者您知道我可以从哪里下载该单元,它将这些方法包装在一个 c# 单元中吗? 谢谢! 最佳答案 这就是你要找的here 关于c# - .net 下是否提供 CryptoAP
在documentation它说该函数在 winapi::um::wincrypt::CryptDecrypt 中,但是当我安装 crate 并将其放入我的项目时一切正常,直到我尝试调用我得到的函数以
你好我正在尝试在 C++ 和 C# 之间加密和解密已经使用 CryptEncrypt wincrypt 在这里我使用的代码创建了一个 dll 项目C++语言 #include #include e
我已经编写了加密/解密自定义长度内存缓冲区的程序。加密结束很好;但是我的解密代码在任何缓冲区位置只解密一次数据,对应于 block 条目。其他 block 的解密以 NTE_BAD_DATA 结束。
我正在尝试解密 - 在 C++ 中使用微软的 CryptoAPI - 在 PHP 中使用 mcrypt_encrypt 加密的短消息。 php行是: mcrypt_encrypt( MCRYPT_RI
我正在尝试使用 wincrypt 解密一段文件,但我似乎无法正确解密此函数。这些字节使用 C# 中的 RC2 实现加密,我为加密和解密过程提供相同的密码和 IV(在 C# 中加密,在 C++ 中解密)
我是一名优秀的程序员,十分优秀!