我有以下2个值: AES密钥 它是一个字节的Java数组
64,67,-65,88,-19,-118,-16,-53,-81,-98,44,-83,82,-90,124,112,-120,42,92,67,104,23 ,44,8,2,-96,-106,-28,57,99,76,73
IV 也是一个字节的Java数组
50,52,3,36,-90,81,109,-56,24,122,-3,27,-96,56,118,-60
加密模式为: AES / CBC / PKCS5PADDING
现在我需要使用这两个值来使用python解密我的密文。我正在尝试使用 pycrypto ,但我也在探索其他选项。 现在因为Java的字节数组已经签名并且(看起来像)python(2.7)无法识别带符号的字节数组,所以我无法进行此解密。
我确实找到了围绕类似主题的一堆SO讨论,但是大多数都在生成IV和密钥,而不是真正使用现有的,例如。
所以上面的解决方案并没有对我有用,除非我根据需要调整它们时做了一些根本性的错误。
这是我的一次尝试(从上面提到的SO讨论中得到的点点滴滴)
from Crypto import Random
from Crypto.Cipher import AES
import base64
key =
[64,67,-65,88,-19,-118,-16,-53,-81,-98,44,-83,82,-90,124,112,-120,42,92,67,104,23,44,8,2,-96,-106,-28,57,99,76,73]
iv = [50,52,3,36,-90,81,109,-56,24,122,-3,27,-96,56,118,-60]
aes_key = ''.join(map(lambda x: chr(x % 256), key))
iv_data = ''.join(map(lambda x: chr(x % 256), iv))
def pad(s):
return s + b"\0" * (AES.block_size - len(s) % AES.block_size)
def decrypt(ciphertext, key):
ciphertext = base64.b64decode(ciphertext)
iv = ciphertext[:AES.block_size]
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext[AES.block_size:])
return plaintext.rstrip(b"\0")
然后将 decrypt()称为:
decrypt('HaCiIld192v2QE3/zcuAxhpr39HRXvsHQYSJE/VT9FuWWK7envVDRaaDR6gpmh0zmw09/440O7UAtVb5qBLddZH37TASWUMXAN0Idy7B0VtpgPgMHOLGJG6axWCHgieaTleFDaRKP+z7WN+4fj5RGw==', aes_key)
将输出显示为:
缺货[9]: “\ XDD \ X99 \ XAB \ x8bI \ XCB \ XF0 \ XCD
\x1c\x1eb\x109\xe8c\xc0\x105\xa6\xdb\xe4\xdb\x08\xc7\xdbHT\x08.\x10\x9e\xe1g\xfe\xd1\xc2\x92\xdbH\x8e\x9bV\xae^\r:\x98%\x8d\x06\xdf\xaf\t\xb5m\xfb\xf3Q+
的“CK \ XF4 \ XC2 \ XE7 \ XD2 \ XFD \ xfdq \ XCC)\ XCF \ X99&安培;?\ xffj \ XC4 \ XC1 \ X1A $ ML \ xe9 \ XE7(\ XEF \ X1C \ x81vx \ xf56'
我试过了:
a = b'\xdd\x99\xab\x8bI\xcb\xf0?\xcd`\x1c\x1eb\x109\xe8c\xc0\x105\xa6\xdb\xe4\xdb\x08\xc7\xdbHT\x08.\x10\x9e\xe1g\xfe\xd1\xc2\x92\xdbH\x8e\x9bV\xae^\r:\x98%\x8d\x06\xdf\xaf\t\xb5m\xfb\xf3Q+`s"CK\xf4\xc2\xe7\xd2\xfd\xfdq\xcc)\xcf\x99&\xffj\xc4\xc1\x1a$ML\xe9\xe7(\xef\x1c\x81vx\xf56'
a.encode("hex")
,输出为:
'dd99ab8b49cbf03fcd601c1e621039e863c01035a6dbe4db08c7db4854082e109ee167fed1c292db488e9b56ae5e0d3a98258d06dfaf09b56dfbf3512b607322434bf4c2e7d2fdfd71cc29cf9926ff6ac4c11a244d4ce9e728ef1c817678f536'
这绝对不是我期待的纯文本。 所以我需要帮助解决这个问题,关于如何解密(使用Python 2.7)一个AES加密的密文,给定密钥和IV作为Java字节数组?
根据以下评论中的建议(@MaartenBodewes谢谢),我试过这个:
所以,我在java中检查了bytearray的base64, key :
byte arr[] = new byte[] {64,67,-65,88,-19,-118,-16,-53,-81,-98,44,-83,82,-90,124,112,-120,42,92,67,104,23,44,8,2,-96,-106,-28,57,99,76,73};
String base64 = new String(Base64.encodeBase64(arr));
然后在python中实现相同的功能,对上面的python代码进行了一些更改,以执行相同的操作:(我意识到java将字节数组视为已签名的2s补码数据的数组,来自{{3}的精彩讨论所以必须适应python中的那个)
key = [64,67,-65,88,-19,-118,-16,-53,-81,-98,44,-83,82,-90,124,112,-120,42,92,67,104,23,44,8,2,-96,-106,-28,57,99,76,73]
b64encode(bytearray([(lambda x:int((bin(x & 0xff)),2))(x) for x in key]))
这两个产生的结果与:
相同QEO / WO2K8MuvniytUqZ8cIgqXENoFywIAqCW5DljTEk =
我认为并不是说我确信这两个密钥(Java和python)是相同的,解密应该有效。因此我再次尝试:
decrypt('HaCiIld192v2QE3/zcuAxhpr39HRXvsHQYSJE/VT9FuWWK7envVDRaaDR6gpmh0zmw09/440O7UAtVb5qBLddZH37TASWUMXAN0Idy7B0VtpgPgMHOLGJG6axWCHgieaTleFDaRKP+z7WN+4fj5RGw==', str(aes_key))
我得到了与之前完全相同的输出:
'\ XDD \ X99 \ XAB \ x8bI \ XCB \ XF0 \ XCD
\x1c\x1eb\x109\xe8c\xc0\x105\xa6\xdb\xe4\xdb\x08\xc7\xdbHT\x08.\x10\x9e\xe1g\xfe\xd1\xc2\x92\xdbH\x8e\x9bV\xae^\r:\x98%\x8d\x06\xdf\xaf\t\xb5m\xfb\xf3Q+
的“CK \ XF4 \ XC2 \ XE7 \ XD2 \ XFD \ xfdq \ XCC)\ XCF \ X99&安培;?\ xffj \ XC4 \ XC1 \ X1A $ ML \ xe9 \ XE7(\ XEF \ X1C \ x81vx \ xf56'