我只想使用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,盐,钥匙都没关系。解密时会出现问题。
答案 0 :(得分:0)
经过粗暴测试后,我发现问题出在盐上。
我认为这个功能做了同样的事情:
var salt = CryptoJS.lib.WordArray.random(128/8);
salt = salt.toString(CryptoJS.enc.Base64);
salt = CryptoJS.enc.Base64.stringify(salt); //correct one
但他们是不同的。第二个是保持相同价值的那个。