【发布时间】: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