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解密的主要内容,如果未能解决你的问题,请参考以下文章