无法使用 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() 产生了一个我无法转换回文本的缓冲区。

这是解密代码。 contentiv 是直接从文件中读取的二进制字符串。 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 );。另外,您是否已经将 contentkey 解析为原生 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编码字符串的正确方法?

用 CryptoJS 加密,用 PHP 解密

有关使用CryptoJS的AES方法进行加密和解密,后台获取前端生成的公钥进行AES加密。前端js如何使用私钥解密

使用CryptoJS解决微信小程序用户信息解密

细说CryptoJs使用(微信小程序加密解密)

在 PHP openssl 中加密并在 javascript CryptoJS 中解密