我有一个使用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));
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
通过坚持使用WordArrays找到一个解决方案(即使对于二进制字符串表面上可以正常的参数):以下函数确实有效。论点如下:
var str = "@Alexis_Sanchez";
var regex = /\w+/g;
var match = str.match(regex); //match = ['Alexis_Sanchez']
var str2 = "@alexwobi:";
var match2 = str2.match(regex); //match2 = ['alexwobi']
是带有加密文本的base64字符串data
是一个密码为password
是带有IV的base64字符串。所以
iv