【问题标题】:C++ CryptDecrypt error NTE_BAD_DATAC++ CryptDecrypt 错误 NTE_BAD_DATA
【发布时间】:2018-03-18 02:53:45
【问题描述】:

我可以在加密后解密一个带有“这是纯文本”的小文本文件。但是,当我尝试解密较大的文件时,我最终会遇到 NTE_BAD_DATA 错误。

谁能指出可能出了什么问题?

以下是整个代码的摘录部分。

#define ENCRYPT_BLOCK_SIZE 256

dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
dwBufferLen = dwBlockLen;

if (!ReadFile(hSourceFile, pbBuffer, dwBlockLen, &dwCount, NULL)) {
    handleError("Error reading from source file.\n", GetLastError());
    goto Exit_decryptFile;
}

if (dwCount <= dwBlockLen) {
    fEOF = TRUE;
}

if (!CryptDecrypt(hKey, 0, fEOF, 0, pbBuffer, &dwCount)) {
    handleError("Error during CryptDecrypt.\n", GetLastError());
    goto Exit_decryptFile;
}

【问题讨论】:

  • 您致电GetLastError 可能为时已晚。您将希望在条件建立后立即调用它,它会返回一个有意义的值。
  • @IInspectable 我确实在每个 API 之后调用了 GetLastError。该程序仅在 CryptDecrypt 失败。需要我把整个代码上传到这里给你看吗?
  • 未指定函数参数的求值顺序。我们不知道handleError 函数签名,据我们所知,它可以从字符串文字构造一些临时的(例如std::string),从而使GetLastError 的结果无效。不要让我们猜,生成一个minimal reproducible example
  • @IInspectable 我已经在 pastebin 上上传了标题和实现者。看看吧。标头:pastebin.com/5KU21KFC 实现者:pastebin.com/sTH5C6PK
  • 所有代码必须在问题中。有充分的理由。提出一个好问题是有好处的。请参阅How to Ask 以获得指导。

标签: c++ windows winapi encryption windows-console


【解决方案1】:

因为您读取了 232 个字节。如果文本很小(少于 232 个字节),那么您解密一个(最终)块。如果文本足够大 - 您解密块和缓冲区的大小应该是块大小的倍数。

【讨论】:

  • 很抱歉,我应该如何更改我的代码?我打印出 dwCount 为 896
  • 但我如何指定要读取的字节数和缓冲区大小?我使用的代码是从微软网站引用的,但他们使用的是 RSA。
  • 你的条件不对:if (dwCount
  • 是的,你是对的!我应该设置为 (dwCount
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多