无法使用 CryptoJS 解密(适用于 Java、Python)
Posted
技术标签:
【中文标题】无法使用 CryptoJS 解密(适用于 Java、Python)【英文标题】:Can't decrypt using CryptoJS (works in Java, Python) 【发布时间】:2016-03-23 18:12:05 【问题描述】:我有一个使用 AES 加密的文件。从历史上看,我有一组工具(Java、Python),每个工具都能够加密和解密这些文件。但是,我在使用 CryptoJS 解密这些文件时遇到了问题。
加密文件的前 16 个字节存储了 IV,其余为有效负载。在加密期间,密钥是通过 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));
任何帮助将不胜感激。
【问题讨论】:
如果解密代码不起作用请显示加密代码 你试过CryptoJS.AES.decrypt(ciphertext: content, key, iv: iv );
。另外,您是否已经将 content
和 key
解析为原生 CryptoJS 表示? Java 和 Python 都有一百万种不同的加密方式。说 "(works in Java, Python)" 并没有真正说明什么。
试过了 - 返回一个包含 52 个单词的数组,它转换为一个空字符串。数据传递给解密如下:内容是一个二进制字符串(从文件中读取,基本上所有文件内容都从偏移量 16 开始),密钥是一个整数的 javascript 数组,构造方式如下:密码 -> SHA-1 摘要 ->前 32 个十六进制字符 -> 字节数组,每个字符一个。 IV 是从文件中读取的二进制 IV 字符串构建的 WordArray(前 16 个字符)。
【参考方案1】:
通过坚持 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);
【讨论】:
以上是关于无法使用 CryptoJS 解密(适用于 Java、Python)的主要内容,如果未能解决你的问题,请参考以下文章
使用Java解密CryptoJS DES编码字符串的正确方法?