CryptoJS奇怪的加密/解密失败

时间:2018-04-25 20:52:21

标签: cryptojs

我只想使用AES-128加密128位代码,但会导致奇怪的解密结果。

它以这种方式设置,因此它可以代表我的真实实现:

var plain = CryptoJS.lib.WordArray.random(128/8);
console.log("plain: " + plain.toString(CryptoJS.enc.Base64));

var iv_wordArr = CryptoJS.lib.WordArray.random(128/8);
var salt = CryptoJS.lib.WordArray.random(128/8);

var key128Bits = CryptoJS.PBKDF2("12345678", salt, { keySize: 128/32, iterations: 1000 });

var encrypted = CryptoJS.AES.encrypt(plain.toString(CryptoJS.enc.Base64), key128Bits, { iv: iv_wordArr });

var dbKeyEnc = iv_wordArr.toString(CryptoJS.enc.Base64) + ":" + encrypted.toString();

salt = salt.toString(CryptoJS.enc.Base64);

var splitted = dbKeyEnc.split(":");

key128Bits = CryptoJS.PBKDF2("12345678", CryptoJS.enc.Base64.parse(salt), { keySize: 128/32, iterations: 1000 });

iv_wordArr = CryptoJS.enc.Base64.parse(splitted[0]);

var decrypt = CryptoJS.AES.decrypt(splitted[1], key128Bits, { iv: iv_wordArr });

console.log("decrypt: " + decrypt.toString(CryptoJS.enc.Base64));
//console error: Invalid array length (because of decrypt wrong result)

我已经逐步检查了iv,盐,钥匙都没关系。解密时会出现问题。

1 个答案:

答案 0 :(得分:0)

经过粗暴测试后,我发现问题出在盐上。

我认为这个功能做了同样的事情:

var salt = CryptoJS.lib.WordArray.random(128/8);

salt = salt.toString(CryptoJS.enc.Base64);

salt = CryptoJS.enc.Base64.stringify(salt); //correct one

但他们是不同的。第二个是保持相同价值的那个。