什么是Javascript的反向操作';Python3/Django中的s CryptoJS.enc.base64.stringify(数据)?
我试图用Javascript加密,用Python/Django解密相同的数据 免责声明:不是生产级代码,而是学习概念 我通过Diffie Hellman(使用jQuery的Ajax)生成一个密钥,并将其传递给下面的加密函数。输入通常是JSON格式的ID和密码 加密就是这样发生的。{在某处找到了代码。}什么是Javascript的反向操作';Python3/Django中的s CryptoJS.enc.base64.stringify(数据)?,javascript,python,django,encryption,decoding,Javascript,Python,Django,Encryption,Decoding,我试图用Javascript加密,用Python/Django解密相同的数据 免责声明:不是生产级代码,而是学习概念 我通过Diffie Hellman(使用jQuery的Ajax)生成一个密钥,并将其传递给下面的加密函数。输入通常是JSON格式的ID和密码 加密就是这样发生的。{在某处找到了代码。} function toWordArray(str){ return CryptoJS.enc.Utf8.parse(str); } function toString(words){
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);
}
我得到的结果如下:
final key: 47 signin:119:33
Input: {"name":"Buzz","password":"lightyear"} signin:55:25
Bytes before Base64 encoding: 414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138 signin:67:25
Payload: QU1BWk9OAujsm4qUnrdU4wWs++Ugfx6+dScsGBRrylfOOZkowP/X5QbZDhGwEdpCsb2NI5PsWcySbO8zwhIdo/SN/VmSUTg= signin:137:37
XHRGEThttp://127.0.0.1:8000/Shenzen/actsignin/?encrypted_string=QU1BWk9OAujsm4qUnrdU4wWs%2B%2BUgfx6%2BdScsGBRrylfOOZkowP%2FX5QbZDhGwEdpCsb2NI5PsWcySbO8zwhIdo%2FSN%2FVmSUTg%3D
[HTTP/1.1 500 Internal Server Error 24ms]
AES failed.
现在我用python对其进行如下解码:
encrypted\u string=request.GET['encrypted\u string']
打印(“加密字符串解码:”,base64.b64解码(加密字符串))#第2行
打印(“---”)
sha256_key=sha256.new(数据=字节(key))
cipher=AES.new(sha256_key.digest(),AES.MODE_CBC)
打印(cipher.decrypt(base64.b64解码(加密字符串)))
[12/Oct/2019 18:39:41]“GET/Shenzen/dh/?step=calcval&level1=37 HTTP/1.1”200 16
已解码加密字符串:b“AMAZON\x02\xcb0\xb5~\xbf
- 在JavaScript代码中,一个头(作为hextstring:
414d415a4f4e02
),将随机生成的IV和密文连接起来并进行Base64编码。在Python代码中,连接的数据是Base64解码的。但是,似乎没有执行头、IV和密文的拆分。因此,解密时缺少密文和IV。连接的数据不是密文,而是用于解密,这是错误的。AES实例是在没有IV的情况下创建的,这也是错误的
- 在JavaScript方面,Base64编码之前的连接数据以十六进制表示,如下所示:
414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138
414d415a4f4e02cb30b57e20bf3c96160e4a594088fe94c238f26a196e8f8ddbb67963892d4c93a39fc369d5f46534277ca11f9db96b954fb93cc3a0d7a6425e852b5353546f65
在Python端,Base64解码后的级联数据以十六进制表示,如下所示:
414d415a4f4e02e8ec9b8a949eb754e305acfbe5207f1ebe75272c18146bca57ce399928c0ffd7e506d90e11b011da42b1bd8d2393ec59cc926cef33c2121da3f48dfd59925138
414d415a4f4e02cb30b57e20bf3c96160e4a594088fe94c238f26a196e8f8ddbb67963892d4c93a39fc369d5f46534277ca11f9db96b954fb93cc3a0d7a6425e852b5353546f65
从IV开始,数据明显不同(即从第8字节开始)。JavaScript代码会在每次运行时生成一个随机IV,因此每次运行的密文也不同。很可能这两个数据都来自不同的运行,因为开始是相同的,偏差从每次运行中随机生成的部分开始。否则,数据将不得不在别处更改(可能不是通过公布的代码)以这种特有的方式
- 也可能存在填充问题。默认情况下使用PKCS7填充。相反,/默认情况下不使用填充(即用户必须手动填充),因此在解密过程中Python端的填充可能不会自动删除
python字符串base64是如何像您得到的那样解码的?我还有其他一些东西。您能解释一下,您是如何得到该值的吗?这只是您解码的数据base64的十六进制表示:print(b)AMAZON\x02\xcb0\xb5~\xbfSo亚马逊之后的字符串内容也是十六进制的。这意味着,我可以从我看到的字符串版本和其他内容中提取IV,其余的,我必须解密。让我试试,让你知道。