繁体   English   中英

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

[英]Can't decrypt using CryptoJS (works in Java, Python)

我有一个使用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));
}

任何帮助,将不胜感激。

通过坚持使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM