CryptoJS.AES.decrypt()输出的wordArray用0x8080808填充

The wordArray that CryptoJS.AES.decrypt() output was padded with 0x8080808

本文关键字:wordArray 0x8080808 填充 输出 AES decrypt CryptoJS      更新时间:2023-09-26

我使用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>解密。words0x8080808填充?我怎样才能得到正确长度的wordArray?

AES是分组密码,需要以块大小的块输入,AES为16字节。如果要加密的数据不是块大小的偶数倍,则需要添加填充字节。pkcs# 7填充是一种常见的填充模式。大多数AES库支持pkcs# 7填充模式,该模式将在加密时添加填充并在解密时删除填充。

在本例中,添加了8个字节的填充,即8个字节的值0x08。

见pkcs# 7 padding.

注意:不要使用ECB模式,这是不安全的,见ECB模式,向下滚动到企鹅。相反,使用CBC模式与随机IV,只需在加密数据的前缀与IV用于解密。