用于较长密文的简单Python-AES解密

2024-06-16 10:44:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我不是AES方面的专家,而且我必须在非常有限的python2环境中提供解密功能。在

我有一个32字节的密钥和一个16字节的初始化向量,以及一个64字节的测试密码消息。AES以密码块链模式工作。在

使用pycrypto它都可以工作,我得到一个64符号解密的unicode类型的消息。在

from Crypto.Cipher import AES

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

不幸的是,pycrypto本身在最终环境中不受支持,因为我相信它对AES有一些奇特的编译依赖关系。 有一个纯粹的Python替代方法称为pyaes

^{pr2}$

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

然而,一旦我尝试了我得到的全部信息 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"}

带尾随空格。在


Tags: in消息密码类型message字节环境unicode
1条回答
网友
1楼 · 发布于 2024-06-16 10:44:58

可能性1。消息[16:32]的情况是,未加密文本的第一部分可能有多字节字符,因此在获取16个字节之后,1+字节会泄漏到原始/未加密字符串的第二部分。不过,这只是在你使用多字节字符的情况下。在

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

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

反之亦然

^{pr2}$

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

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

但如果你这样做:

encrypter = pyaes.AESModeOfOperationCBC(key, vector)
encrypted = cipher.encrypt('Hello world !!!!')
print(encrypted)
# ?Eg?m??K?(|
decrypter = pyaes.AESModeOfOperationCBC(key, vector)
decrypted = decrypter.decrypt(encrypted)
# Hello world !!!!

如果您使用相同的实例加密2个块,然后将它们串联起来,则需要一个新实例来解密2个新块。或者用一个新的实例对每个块进行加密/解密。在

相关问题 更多 >