【问题标题】:CAPI AES: Why does CryptSetKeyParam returns NTE_BAD_DATA (0x80090005)CAPI AES:为什么 CryptSetKeyParam 返回 NTE_BAD_DATA (0x80090005)
【发布时间】:2016-04-20 10:23:24
【问题描述】:

我正在尝试使用带有零填充的 AES 128 位加密/解密数据。如果我不尝试使用填充模式(默认为 PKCS5_PADDING),我可以很好地加密/解密,所以下面的代码 sn-p 是为了显示事情在哪里发生了故障:

// sanity check -- is key configured how I expect?
CryptGetKeyParam(hKey, KP_KEYLEN, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_ALGID, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_MODE, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_PADDING, temp, &tempSz, 0);
// force padding to zero padding
DWORD padding = ZERO_PADDING;
CryptSetKeyParam(hKey, KP_PADDING, (PBYTE)&padding, 0);

每个查询的运行都没有问题,其值为:128、0x0000660e (CALG_AES_128)、1 (CRYPT_MODE_CBC) 和 1 (PKCS5_PADDING) - 这是默认状态。

然后我尝试将填充设置为 ZERO_PADDING (3),该函数返回 FALSE,最后一个错误为 NTE_BAD_DATA。我试着把它设置为 PKCS5_PADDING——没有错误。 RANDOM_PADDING:错误。

尽我所能搜索互联网,我找不到任何文档来说明为什么更改填充会失败(甚至没有说明某些关键算法只允许使用 PKCS5_PADDING)。

有人有什么建议吗?

【问题讨论】:

  • 您使用的是哪个服务提供商?
  • 请注意,如果输入数据的最后一个字节为空 (0x00),则空填充不起作用。注意:当您看到 PKCS#5 用于 AES 填充时,文档尚未更新,AES 需要 PKCS#7 填充,但好消息是,由于实际实现,PKCS#5 也支持 PKCS#7。

标签: winapi encryption aes padding cryptoapi


【解决方案1】:

微软提供的加密服务商只支持PKCS5_PADDING

参考https://msdn.microsoft.com/en-us/library/windows/desktop/aa380272(v=vs.85).aspx;搜索KP_PADDING

【讨论】:

  • grr....我多次阅读该文档。完全错过了 MS 提供商不支持它的说法。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多