CAPI AES:为什么CryptSetKeyParam返回NTE_BAD_DATA(0x80090005)

时间:2016-01-14 22:05:11

标签: winapi encryption aes padding cryptoapi

我正在尝试使用带有零填充的AES 128位加密/解密数据。如果我没有尝试使用填充模式(默认为PKCS5_PADDING),我可以加密/解密,所以下面的代码片段将显示事情发生的地方:

// 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)。

有没有人有任何建议?

1 个答案:

答案 0 :(得分:2)

Microsoft提供的加密服务提供程序仅支持PKCS5_PADDING

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