使用 CryptoJS 进行渐进式 AES 解密
Progressive AES decryption with CryptoJS
我尝试使用 CryptoJS 的渐进式加密来解密文件。
如 CryptoJS 文档 (CryptoJS) 中所示,这些文件使用 OpenSSL 进行了加密和 base64 编码 (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);
有人知道我做错了什么吗?
问题是 encryptedText
是一个 OpenSSL 格式的字符串。不是ciphertext
属性加密后得到的纯密文:
var ct = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext;
Cipher.process
函数only accepts a WordArray
or the data string and encryptedText
is neither. You either need to use 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));
我尝试使用 CryptoJS 的渐进式加密来解密文件。 如 CryptoJS 文档 (CryptoJS) 中所示,这些文件使用 OpenSSL 进行了加密和 base64 编码 (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);
有人知道我做错了什么吗?
问题是 encryptedText
是一个 OpenSSL 格式的字符串。不是ciphertext
属性加密后得到的纯密文:
var ct = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext;
Cipher.process
函数only accepts a WordArray
or the data string and encryptedText
is neither. You either need to use 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));