我不是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"}
带尾随(填充)空格。
答案 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个新块的新实例。或者使用新实例加密/解密每个块。