Winapi CAPI AES:CryptSetKeyParam为什么返回NTE_BAD_数据(0x80090005)

Winapi CAPI AES:CryptSetKeyParam为什么返回NTE_BAD_数据(0x80090005),winapi,encryption,aes,padding,cryptoapi,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, &tempS

我正在尝试使用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)——这是默认状态

然后我尝试将padding设置为ZERO_padding(3),函数返回FALSE,最后一个错误是NTE_BAD_DATA。我试着将其设置为PKCS5_PADDING,没有错误。随机填充:错误

尽管我在搜索互联网,但我找不到任何文档来说明为什么更改填充会失败(甚至没有一条注释说某些关键算法只允许使用PKCS5_填充)


有人有什么建议吗?

微软提供的加密服务提供商只支持
PKCS5\u填充


请参阅以供参考;搜索
KP\u PADDING

由Microsoft提供的加密服务提供商仅支持
PKCS5\u PADDING


请参阅以供参考;搜索
KP\u PADDING

您使用的是哪家服务提供商?请注意,如果输入数据的最后一个字节为null(0x00),则null PADDING不起作用。注意:当您看到PKCS#5 for AES填充文档尚未更新时,AES需要PKCS#7填充,但好消息是,由于实际实现,PKCS#5还支持PKCS#7。您使用的是哪个服务提供商?请注意,如果输入数据的最后一个字节为null(0x00),则null填充不起作用。注意:当您看到PKCS#5 for AES填充文档尚未更新时,AES需要PKCS#7填充,但好消息是,由于实际实现,PKCS#5还支持PKCS#7.grr…我反复阅读了很多次该文档。完全错过了关于它不被MS提供商支持的一行。grr…我反复阅读了很多次那个文档。完全没有听到MS提供商不支持它的话。