使用CryptoJS进行渐进式AES解密

时间:2015-03-01 15:12:37

标签: javascript encryption cryptojs

我尝试使用CryptoJS的渐进式加密来解密文件。 这些文件是加密的& base64使用OpenSSL编码,如CryptoJS文档(CryptoJS)所示。

当我使用CryptoJS.AES.decrypt时,一切正常:

var encryptedText = "U2FsdGVkX19X2wD+xFnLd3WLuzW5qA0dppGtV+VPOFdjslLsZpwfdqd02BOe4pvxG2zZok06DchVfZBBBS/JWg==";

var key = CryptoJS.enc.Hex.parse("A6420198998C341308AF100CF7CCAC95884E4084581A4F8CFB8DFA7FEAD045EF");
var iv =  CryptoJS.enc.Hex.parse("7F418B4532F8BC83261639DBA60C0A50");

var decrypted = CryptoJS.AES.decrypt(encryptedText, key, {iv: iv});
var base64 = CryptoJS.enc.Base64.stringify(decrypted);
var result = atob(base64);

但是当我尝试渐进式解密时,结果已损坏:

var decrypted;
var cipher = CryptoJS.algo.AES.createDecryptor(key, { iv: iv});
decrypted = cipher.process(encryptedText);
decrypted.concat(cipher.finalize());
var base64 = CryptoJS.enc.Base64.stringify(decrypted);
var result = atob(base64);

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是encryptedText是一个OpenSSL格式的字符串。它不是加密后从ciphertext属性获得的纯密文:

var ct = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext;

Cipher.process函数only accepts a WordArray or the data stringencryptedText都不是。您需要使用CryptoJS.format.OpenSSL.parse()来检索密文WordArray

var ct = CryptoJS.format.OpenSSL.parse(encryptedText).ciphertext;

或在加密时直接检索ciphertext,就像在第一个代码段中一样。

之后,你可以这样做:

var decrypted = cipher.process(ct);
decrypted = decrypted.concat(cipher.finalize());

我也不确定为什么你将其作为Base64进行字符串化然后使用atob,因为有一种更简单的方法来恢复原始字符串:

console.log(decrypted.toString(CryptoJS.enc.Utf8));