CryptJS PyCryptoDome-无法进行JS端AES解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CryptJS PyCryptoDome-无法进行JS端AES解密相关的知识,希望对你有一定的参考价值。

我一直在努力解决以下问题。我已经检查了许多其他主题的答案,但是似乎没有任何效果。因此,我不得不问这里可能是什么问题。

因此,我可以使用带有MODE_CBC的AES在JS中加密某些内容,并在python中对其进行解密。但是,我无法采取其他方法,因此,我无法使用相同的模式,密钥和IV在Python中加密和在CryptoJS中解密。我以为JS可能会收到密码短语,字符串或IV认证,但没有。

有人可以帮忙吗?

这里是代码

function Decrypt(key_from_python, passcode_encrypted_from_python){
    var key, k = sha256(key_from_python).substring(0, 32)
    var iv, i = sha256(key_from_python).substring(0, 16)
    key =  CryptoJS.enc.Utf8.parse(key);
    iv = CryptoJS.enc.Utf8.parse(iv);
    var to_decrypt = CryptoJS.enc.Base64.parse(passcode_encrypted_from_python)
    var encrypted = CryptoJS.AES.decrypt({ciphertext : to_decrypt}, key, {
          iv: iv,
    });
    return {
        "passcode": to_decrypt.toString(CryptoJS.enc.Base64),
        "passcode_bytes": to_decrypt.toString(CryptoJS.enc.Latin1),
        "s" : to_decrypt,
        "key" : k,
        "iv" : i,
        "enc" : encrypted
    }
}

Python代码:

def _pad(self, data):
    length = 16 - (len(data) % 16)
    return data + chr(length)*length

def _encrypt(self, to_encrypt, passphrase, iv):
    to_encrypt = self._encode(to_encrypt)
    print("To Encrypt", to_encrypt)
    passphrase = self._encode(passphrase)
    iv = self._encode(iv)

     #aes = AES.new(passphrase, AES.MODE_CFB, iv, segment_size=128)
     aes = AES.new(passphrase, AES.MODE_CBC, iv=iv)
     return aes.encrypt(to_encrypt)

从PYTHON输出:

key:  f26e2b2b7f6e89f5a8601bd24fb15327
iv:  f26e2b2b7f6e89f5
passcode:  b'8/TCP7QSx08x08x08x08x08x08x08x08'
To Encrypt b'8/TCP7QSx08x08x08x08x08x08x08x08'
Encrypted:  ¹Ïô·öï³Æ¼ÏÛ 
Encryptedb64 oLnPmfS39u+zxrzP28KYIA==

从JS输出:

key f26e2b2b7f6e89f5a8601bd24fb15327
iv f26e2b2b7f6e89f5
Encrypted:  ¹Ïô·öï³Æ¼ÏÛ 
Encryptedb64 oLnPmfS39u+zxrzP28KYIA==

但是,从JS解密的GiveS:

{
  'sigBytes': -114, 
   'words': [-1446864399, -2036001390, 207964078, 2005241986]
}

任何想法?

非常感谢

答案

过去我在Python和Java之间有一个类似的问题,归结为在加密之前如何填充数据的不兼容性。 Python代码使用的Python模块存在缺陷(https://github.com/jeppeter/pypkcs7/issues/1),在某些情况下根本无法填充,而Java代码则期望填充。

_pad方法正确填充,但在此示例中未调用它。如果未调用此方法,而CryptoJS希望使用该垫,则可能会解释您的问题。

正如@Topaco在评论中提到的,根据编码和sha256方法的内容,可能还会发生其他事情。

以上是关于CryptJS PyCryptoDome-无法进行JS端AES解密的主要内容,如果未能解决你的问题,请参考以下文章

PyCryptodome安装使用方法

PyCrypto已放弃维护 请使用PyCryptodome

pycrypto的替代版本pycryptodome

Pythoncryptography和pycryptodome库使用

python AES加密解密 pycryptodome

TypeError:无法将字节连接到 str。 Pycrypto Aes 加密