Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Javascript的反向操作';Python3/Django中的s CryptoJS.enc.base64.stringify(数据)?_Javascript_Python_Django_Encryption_Decoding - Fatal编程技术网

什么是Javascript的反向操作';Python3/Django中的s CryptoJS.enc.base64.stringify(数据)?

什么是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){

我试图用Javascript加密,用Python/Django解密相同的数据

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

我通过Diffie Hellman(使用jQuery的Ajax)生成一个密钥,并将其传递给下面的加密函数。输入通常是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);
}
我得到的结果如下:

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,其余的,我必须解密。让我试试,让你知道。