猿问

Python3/Django 中 Javascript 的 CryptoJS.enc.base64

我正在尝试在 Javascript 中加密并在 Python/Django 中解密相同的数据。


免责声明:不是生产级代码,而是学习概念


我通过 Diffie Hellman(使用 jQuery 的 Ajax)生成一个密钥,然后将其传递给下面的 encrypt 函数。输入一般是 JSON 格式的 ID 和密码。


这就是加密发生的方式。{在某处找到代码。}


function toWordArray(str){

    return CryptoJS.enc.Utf8.parse(str);

}


function toString(words){

    return CryptoJS.enc.Utf8.stringify(words);

}


function toBase64String(words){

    return CryptoJS.enc.Base64.stringify(words);

}


function encrypt(input, key){

    console.log("Input: " + input);  

    var PROTOCOL_AES256 = 2;

    var secret_key = CryptoJS.SHA256(key);

    var header = toWordArray("AMAZON" + String.fromCharCode(PROTOCOL_AES256));

    var iv = CryptoJS.lib.WordArray.random(16);

    var body = CryptoJS.AES.encrypt(input, secret_key, {iv: iv});


    // construct the packet

    // HEADER + IV + BODY

    header.concat(iv);

    header.concat(body.ciphertext);


    console.log("Bytes before Base64 encoding: " + header); //Line 1

    // encode in base64

    return toBase64String(header);

}


我希望第 1 行和第 2 行的输出相等,但这就是我得到的:


Javascript Bytes before Base64 encoding: 414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138 signin:67:25


Python Encrypted string decoded:  b"AMAZON\x02\xcb0\xb5~ \xbf<\x96\x16\x0eJY@\x88\xfe\x94\xc28\xf2j\x19n\x8f\x8d\xdb\xb6yc\x89-L\x93\xa3\x9f\xc3i\xd5\xf4e4'|\xa1\x1f\x9d\xb9k\x95O\xb9<\xc3\xa0\xd7\xa6B^\x85+SSToe"


你能解释一下发生了什么吗?如何获得与javascript相同的字符串?或如何将 Python 中的字符串转换为可解密的(?)数据。


POPMUISE
浏览 732回答 1
1回答

繁星点点滴滴

在 JavaScript 代码中,标头(如 hexstring:&nbsp;414d415a4f4e02)、随机生成的 IV 和密文被连接起来并进行 Base64 编码。在 Python 代码中,连接的数据是 Base64 解码的。但是,似乎没有执行拆分为标头、IV 和密文的操作。因此,解密时缺少密文和 IV。而不是密文,而是使用连接的数据进行解密,这是错误的。并且 AES 实例是在没有 IV 的情况下创建的,这也是错误的。在 JavaScript 端,Base64 编码之前的连接数据以十六进制表示形式给出:414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138在 Python 端,Base64 解码后的连接数据以十六进制表示形式给出:414d415a4f4e02cb30b57e20bf3c96160e4a594088fe94c238f26a196e8f8ddbb67963892d4c93a39fc369d5f46534277ca11f9db96b954fb93cc3a0d7a6425e852b5353546f65数据从 IV 开始明显不同(即从第 8 个字节开始)。JavaScript 代码在每次运行时生成一个随机 IV,因此每次运行的密文也不同。两个数据很可能来自不同的运行,因为开始是相同的,并且偏差从每次运行中随机生成的部分开始。否则,数据将不得不以这种特有的方式在其他地方(并且可能不是通过发布的代码)进行更改。也可能存在填充问题。CryptoJS默认使用 PKCS7-padding。相比之下,PyCrypto&nbsp;/&nbsp;PyCryptodome默认不使用填充(即用户必须手动填充),因此在解密过程中可能不会自动删除 Python 端的填充。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答