简单的Python AES解密,用于更长的密文

时间:2017-11-14 16:26:35

标签: python python-2.7 unicode pycrypto

我不是AES方面的专家,而且我必须将解密功能提供给非常有限的Python 2环境。

我有一个32字节的和一个16字节的初始化向量以及一个64字节的测试密码消息 - 所有输入str。 AES以密码块链接模式运行。

使用pycrypto一切正常,我得到一个类型为unicode的64符号解密消息。

from Crypto.Cipher import AES

cipher = AES.new(key, AES.MODE_CBC, vector)
decryption = cipher.decrypt(message).decode()
print(decryption)

不幸的是,pycrypto本身在最终环境中不受支持,因为我认为它对AES有一些奇特的编译依赖性。 有一个名为pyaes的纯Python替代方案:

import pyaes

cipher = pyaes.AESModeOfOperationCBC(key, vector)
decryption = cipher.decrypt(message[0:16]).decode()
print(decryption)

请注意,我切了前16个字节并正确获得了解密消息的前16个符号(类型为unicode)。

然而,一旦我尝试完整的消息,我得到了 ValueError: ciphertext block must be 16 bytes

即使我切片message[16:32],我也会 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb8 in position 0: ordinal not in range(128)

那么如何在我的案例中使用pyaes并解密更长的密文?

秘密明文看起来像这样

{"valueInt":123, "valueFloat":1.23, "valueString":"123"}

带尾随(填充)空格。

1 个答案:

答案 0 :(得分:0)

可能性1.消息[16:32]的情况是未加密文本的第一部分可能有多字节字符,因此在占用16个字节后,1 +字节泄漏到原始的第二部分/未加密串。虽然只有在使用多字节字符时才会这样。

如果您也在加密它们,如果您的编码是utf8,您可以尝试先将文本转换为二进制文件:

route.navigate

并反过来

cipher.encrypt(mystring.encode('utf8'))

Possiblity 2.如果您使用相同的AESModeOfOperationCFB进行解密,则应尝试使用新实例进行解密。以下代码无法解密包含无效ascii字节的正确文本。

cipher.decrypt(mystring.decode('utf8'))

但如果你这样做:

cipher = pyaes.AESModeOfOperationCBC(key, vector)
encrypted = cipher.decrypt('Hello world')
print(encrypted)
# ?Eg?m??K?(|
decrypted = cipher.decrypt(encrypted)
print(decrypted)
# ?XL=?-QE??Y?=k

如果要使用相同的实例加密2个块然后连接它们,则需要一个解密2个新块的新实例。或者使用新实例加密/解密每个块。