CryptoJS.AES.decrypt()输出的wordArray用0x8080808填充
The wordArray that CryptoJS.AES.decrypt() output was padded with 0x8080808
我使用CryptoJS从我的web服务器解密加密(使用php和AES-128-ECB),但我不能得到正确的wordArray,它的长度太长。下面是我的测试代码:
var pwd = "abcdefghijklmnop";
var words = [0x86C5464, 0x7335231];
var plain_array= CryptoJS.lib.WordArray.create(words);
var base64_pwd = CryptoJS.enc.Utf8.parse(pwd).toString(CryptoJS.enc.Base64);
var pwd_key = CryptoJS.enc.Base64.parse(base64_pwd);
var encryption = AES.encrypt(plain_array,pwd_key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString();
var decrypt = AES.decrypt(encryption,pwd_key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
解密是:
decrypt == {
sigBytes : 8,
words : [0x86C5464, 0x7335231, 0x8080808, 0x8080808]
}
<为什么strong>解密。words用0x8080808填充?我怎样才能得到正确长度的wordArray?为什么strong>
AES是分组密码,需要以块大小的块输入,AES为16字节。如果要加密的数据不是块大小的偶数倍,则需要添加填充字节。pkcs# 7填充是一种常见的填充模式。大多数AES库支持pkcs# 7填充模式,该模式将在加密时添加填充并在解密时删除填充。
在本例中,添加了8个字节的填充,即8个字节的值0x08。
见pkcs# 7 padding.
注意:不要使用ECB模式,这是不安全的,见ECB模式,向下滚动到企鹅。相反,使用CBC模式与随机IV,只需在加密数据的前缀与IV用于解密。