我正在尝试在 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:25Python 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 中的字符串转换为可解密的(?)数据。
1 回答
![?](http://img1.sycdn.imooc.com/54584d6100015f5802200220-100-100.jpg)
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
在 JavaScript 代码中,标头(如 hexstring:
414d415a4f4e02
)、随机生成的 IV 和密文被连接起来并进行 Base64 编码。在 Python 代码中,连接的数据是 Base64 解码的。但是,似乎没有执行拆分为标头、IV 和密文的操作。因此,解密时缺少密文和 IV。而不是密文,而是使用连接的数据进行解密,这是错误的。并且 AES 实例是在没有 IV 的情况下创建的,这也是错误的。在 JavaScript 端,Base64 编码之前的连接数据以十六进制表示形式给出:
414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138
在 Python 端,Base64 解码后的连接数据以十六进制表示形式给出:
414d415a4f4e02cb30b57e20bf3c96160e4a594088fe94c238f26a196e8f8ddbb67963892d4c93a39fc369d5f46534277ca11f9db96b954fb93cc3a0d7a6425e852b5353546f65
数据从 IV 开始明显不同(即从第 8 个字节开始)。JavaScript 代码在每次运行时生成一个随机 IV,因此每次运行的密文也不同。两个数据很可能来自不同的运行,因为开始是相同的,并且偏差从每次运行中随机生成的部分开始。否则,数据将不得不以这种特有的方式在其他地方(并且可能不是通过发布的代码)进行更改。
也可能存在填充问题。CryptoJS默认使用 PKCS7-padding。相比之下,PyCrypto / PyCryptodome默认不使用填充(即用户必须手动填充),因此在解密过程中可能不会自动删除 Python 端的填充。
添加回答
举报
0/150
提交
取消