我正在尝试使用带有零填充的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)。
有没有人有任何建议?
答案 0 :(得分:2)
Microsoft提供的加密服务提供程序仅支持PKCS5_PADDING
。
请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/aa380272(v=vs.85).aspx以供参考;搜索KP_PADDING
。