[英]Can't decrypt using CryptoJS (works in Java, Python)
我有一个使用AES加密的文件。 从历史上看,我有一套工具(Java,Python),每个工具都能够加密和解密这些文件。 但是,我一直在使用CryptoJS解密这些文件时遇到问题。
加密文件的IV存储在前16个字节中,其余为有效负载。 在加密期间,通过使用SHA-1对密码字符串进行散列并使用十六进制摘要中的前32个字符来形成密钥。 我已经可以确认CryptoJS使用的IV和密钥与其他工具使用的字节和字节完全相同,但是AES.decrypt()
产生了一个我无法转换回文本的缓冲区。
这是解密代码。 content
和iv
是直接从文件读取的二进制字符串。 password
是带有文本密码的字符串。 代码尝试将结果转换为UTF8失败(我认为这是由于解密未成功的事实)。
function string2bytes(s) {
var bytes = [];
for (var i = 0; i < s.length; i++) {
bytes.push(s.charCodeAt(i));
}
return bytes;
}
function decryptData(content, ivx, password) {
// build a key out of text password
var key = CryptoJS.SHA1(password).toString(CryptoJS.enc.Hex).substring(0, 32);
console.log("key0: ", key);
key = string2bytes(key)
console.log(key);
// Convert IV from binary string to WordArray
var iv = CryptoJS.enc.Latin1.parse(ivx);
console.log("IV: ", iv.toString(CryptoJS.enc.Hex));
var decrypted = CryptoJS.AES.decrypt(content, key, { iv: iv });
console.log("raw decrypted: ", decrypted);
console.log("decrypted: ", iv.toString(CryptoJS.enc.Latin1));
console.log("decrypted: ", iv.toString(CryptoJS.enc.Utf8));
}
任何帮助,将不胜感激。
通过坚持使用WordArrays找到解决方案(即使对于表面上可以使用二进制字符串的参数也是如此):以下函数确实起作用。 参数如下:
data
是带有加密文本的base64字符串 password
是带有密码的常规字符串 iv
是带有IV的base64字符串。 所以
function decryptData(data, password, iv) {
var data = CryptoJS.enc.Base64.parse(data);
var key = CryptoJS.SHA1(password).toString(CryptoJS.enc.Hex).substring(0, 32);
key = CryptoJS.enc.Base64.parse(btoa(key));
var iv = CryptoJS.enc.Base64.parse(iv);
var decrypted = CryptoJS.AES.decrypt({ciphertext: data}, key, {iv: iv});
return decrypted.toString(CryptoJS.enc.Utf8);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.