java aes iv 24位_当key和IV是Java字节数组时,用python进行AES解密

我有以下两个值:

AES key它是一个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)不能识别有符号的字节数组,所以我在解密时遇到了麻烦。在

我确实发现了很多关于类似主题的讨论,但大多数都是生成IV和key,而不是真正使用已经存在的

所以以上的解决方案对我来说并不管用,除非我做了一些根本性的错误,同时根据我的需要对它们进行了调整。在

这是我的一个尝试(从上面提到的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()作为:

^{pr2}$

输出如下:Out[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+s"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'

这绝对不是我期望的纯文本。

所以我需要帮助来解决这个问题,比如如何解密(使用python2.7)AES加密的密码文本,并将其作为Java字节数组?在

根据以下评论中的建议(@MaartenBodewes thanks),我尝试了:

因此,我检查了java中bytearray的base64,键,如下所示: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 byte array contains negative numbers上的一篇精彩讨论中了解到,java将字节数组视为有符号2s补码数据的数组,因此必须在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+s"CK\xf4\xc2\xe7\xd2\xfd\xfdq\xcc)\xcf\x99&\xffj\xc4\xc1\x1a$ML\xe9\xe7(\xef\x1c\x81vx\xf56'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值