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

时间:2016-11-13 08:59:21

标签: javascript aes cryptojs

我使用CryptoJS解密来自我的网络服务器的加密(使用php和AES-128-ECB),但我无法得到正确的单词阵列,它的长度太长。这是我的测试代码:

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 填充?我怎样才能获得正确长度的单词Array?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

请参阅PKCS#7 padding

  

注意:不要使用ECB模式,这是不安全的,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需将加密数据与IV前缀用于解密。