我使用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?
提前致谢。
答案 0 :(得分:0)
AES是一种分组密码,需要以块大小块输入,AES需要16字节。如果要加密的数据不是块大小的偶数倍,则需要添加填充字节。 PKCS#7填充是一种常见的填充模式。大多数AES库都支持PKCS#7填充模式,该模式将在加密时添加填充并在解密时删除填充。
在这种情况下,添加了8字节的paddig,这是值0x08的8个字节。
请参阅PKCS#7 padding。
注意:不要使用ECB模式,这是不安全的,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需将加密数据与IV前缀用于解密。