javascript - 如何使用 Python AES 解密以 Javascript 加密的数据?

标签 javascript python aes pycrypto cryptojs

我有一个页面中的 javascript 代码,看起来像

var link = '{"ct":"AAQz1rUDqp849MRxu0tqGRGvPcLzVG24xa5zbYxpwVHH6Z2p95xPPzNhMIRMcaTPvijE71RQU1X3cQhtnXdRScA6UBiLWNs9vMul2gldnMTpT92sDYHl+hKBGy2dR22Un7ElToipSqeqRrwhEK8T9ROMChrBw8i7JOICpOYoVhqDB72BH2RG\/PqjRqsKittES5BVhTTY9cs+zQI0rM+FQA62bVCL57P3RD+E+aWJJLjUvoXBqct6Jc5W7li9mk9udgn9rPKkCbXSCvwIxcWS5C1kw4uSO7y0IlovaTWLAIw5nY0l4REjbC1wPWrtxDWLlr8J+\/sQdDF+P61VHz6yiC+w56QLDjVwz4kBl3r3uP\/VZ7kUuLwWHSHnbmmXv31f","iv":"feae762ac889376169708872d9676319","s":"9b2328e8a4ee2717"}';
var msg = "f12c8b59265dc1e898135211cc30be49";    
var finalUrl = JSON.parse(CryptoJS.AES.decrypt(link, msg, {format: CryptoJSAesJson}).toString(CryptoJS.enc.Utf8));

我认为 ct 是加密的 msg,s 是 Salt,iv 是 iv

我正在尝试用 python 解码 finalUrl。

AES = AESDecrypter()
decryptor = AES.new(s, AES.MODE_CBC, IV=iv)
dec = decryptor.decrypt(ct)

我知道它不会起作用,因为我不知道如何使用

var msg = "f12c8b59265dc1e898135211cc30be49"

在 Python 中。 还认为 CryptoJSAesJson 可能有一些额外的功能。 有人请告诉我如何使用 Python 使用此处给出的数据检索 finalUrl 的步骤。 非常感谢任何建议。为我糟糕的编码知识道歉。

最佳答案

实际的 AES key 是通过以下过程派生的(派生自 https://stackoverflow.com/a/27582253/5722339 ):

  1. 所需的库。

    import base64;
    import hashlib;
    from Crypto.Cipher import AES;
    
  2. 将提供的输入从十六进制或 base64 字符串解码为原始字节。

    ct = base64.b64decode("AAQz1rUDqp849MRx ... bmmXv31f");
    iv = bytes.fromhex("feae762ac889376169708872d9676319");
    salt = bytes.fromhex("9b2328e8a4ee2717");
    
    # In your case, the pass phrase is NOT a hex-encoded byte array.
    #  It is directly used as bytes.
    pass_phrase = b"f12c8b59265dc1e898135211cc30be49";
    
  3. 使用 MD5 摘要对密码短语和 salt 进行哈希处理,以导出 key 的前 128 位(16 字节)。

    md = hashlib.md5();
    md.update(pass_phrase);
    md.update(salt);
    cache0 = md.digest();
    
  4. 散列之前派生的 16 个字节,然后是密码短语和 MD5 摘要盐再次派生 key 的后 128 位(16 字节)。

    md = hashlib.md5();
    md.update(cache0);
    md.update(pass_phrase);
    md.update(salt);
    cache1 = md.digest();
    
  5. 将两个字节数组连接起来,得到256位的AES key 。

    key = cache0 + cache1;
    
  6. 最后,使用 256 位 AES 和 CBC 模式对密文进行解密。

    cipher = AES.new(key, AES.MODE_CBC, iv);
    result = cipher.decrypt(ct);
    

    解密后的数据现在作为字节数组存储在result中。

请注意,虽然您的示例输入中的密文 ct 是 base64 编码的,而 saltiv 都是十六进制编码的,密码短语不是十六进制编码的(尽管它看起来像那样)。

此外,您可能需要先取消填充输出,然后再使用它。使用lambda可以实现un-pad功能:(解决方案来自https://stackoverflow.com/a/12525165/5722339)

unpad = lambda s : s[:-ord(s[len(s)-1:])];

样本输入的输出是: http:\/\/pmd.dittotv3.com.edgesuite.net\/draco\/shows\/Zee_Bangla\/Dweep_Jwele_Jai\/July\/19072016\/Webisode\/Dweep_Jwele_Jai_Webisode_19072016_100.mp4?key1=ozee.com&hdnea =st=1469018324~exp=1469020124~acl=%2F%2A~hmac=07e8cf2b49f51899f60b129f3a99eb792f45e779fbdae94d4a70215398fc590d

关于javascript - 如何使用 Python AES 解密以 Javascript 加密的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38483378/

相关文章:

javascript - 如何将回调 hell 重写为 promise ?

python - Pandas :如何按类别分组(和求和)并保留子类别的信息

python - 集中两个列表交替python

c - C 中的 AES CBC 模式

c# - 如何存储用于加密文件的 key

javascript - AngularJS 在 div 中使用 ng-click

javascript - $watch 或 ng-change,检测范围输入的 onchange 并根据值进行处理

python - Modelica - Dymola Python 接口(interface) : Set output format to textual

asp.net-core - ASP.NET Core - 数据保护

javascript - 开发控制台日志条目在 Firefox 中隐藏