无法使用CryptoJS解密(适用于Java,Python)

时间:2016-03-23 18:12:06

标签: javascript encryption cryptojs

我有一个使用AES加密的文件。从历史上看,我有一套工具(Java,Python),每个工具都能够加密和解密这些文件。但是,我在使用CryptoJS解密这些文件时遇到了问题。

加密文件的IV存储在前16个字节中,其余的是有效负载。在加密期间,通过使用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));
}

任何帮助都将不胜感激。

1 个答案:

答案 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