当密钥和IV是字节的Java数组

时间:2017-06-26 08:12:32

标签: java python encryption aes

我有以下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'

0 个答案:

没有答案