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

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

我使用 CryptoJS 从我的网络服务器(使用 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]    
}

为什么 decrypt.words 被填充 0x8080808 ?如何获得正确长度的 wordArray?

提前致谢。

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

在这种情况下,添加了 8 个字节的 paddig,即值 0x08 的八个字节。

参见PKCS#7 padding

Note: Do not use ECB mode, it is insecure, see ECB mode, scroll down to the Penguin. Instead use CBC mode with a random IV, just prefix the encrypted data with the IV for use in decryption.