-1

我的问题是,当我使用 pycryptodome 在 Python 3.6 中使用以下代码解密字符串时:

from Crypto.Cipher import AES
from Crypto import Random

key = "133BBB3212332231"
key_bytestring = key.encode("utf-8")
iv = Random.new().read(AES.block_size)
cipher = AES.new(key_bytestring, AES.MODE_CFB, iv)
encrypted_string = 'ý\x82iq\x193\x1aÙË\x04Û£¥\x8dbBOW}Vû\x01\x86zÕ¼Ó)áôO\x14'
encrypted_bytes = encrypted_string.encode("utf-8")
decrypted_bytes = cipher.decrypt(encrypted_bytes)
decrypted_string = decrypted_bytes.decode("utf-8")
print(decrypted_string )

Python 抛出此错误: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 1: invalid start byte

在这一行:

decrypted_string = decrypted_bytes.decode("utf-8")

我正在从 Python 2.7 更新一些代码,并且 pycrypto 已更改为 pycryptdodome。在 python 2.7 中,这就像 pycrypto 的魅力(我发明了密钥,所以字符串不能很好地解密,但 Python 不会抛出任何错误):

from Crypto.Cipher import AES
from Crypto import Random

key = "133BBB3212332231"
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
encrypted_string = 'ý\x82iq\x193\x1aÙË\x04Û£¥\x8dbBOW}Vû\x01\x86zÕ¼Ó)áôO\x14'
decrypted_string = cipher.decrypt(encrypted_string)
print(decrypted_string)

我怎样才能解决这个问题?我很绝望,因为我已经尝试了很长时间,但我什么也没做。先感谢您!

4

2 回答 2

1

首先,您应该知道 Python 3 处理字符串的方式与 Python 2 不同。

在 Python 2 中,""是一个字节数组,但在 Python 3 中,它是一个 unicode 字符串。两者都cipher.encrypt期望cipher.decrypt字节数组。

因此,即使在两段代码中,参数的类型都很好。您在 Python 3 中的问题在于调用str.encode. 通过查看字符串长度很容易看出它确实引起了变化:

>>> len(encrypted_string)
10
>>> len(encrypted_string.encode('utf-8'))
14

解决方案:

首先请注意,在 Python 2 中:

>>> "¨vóîÄdX|@9" == '\xc2\xa8v\xc3\xb3\xc3\xae\xc3\x84dX|@9'
True

在 Python 3 中,您需要使用二进制前缀 ( b"") 标记您的字符串,您的新定义应使用:encrypted_bytes = b'\xc2\xa8v\xc3\xb3\xc3\xae\xc3\x84dX|@9'

因此,您的解决方案应该是:

from Crypto.Cipher import AES
from Crypto import Random

key = "18945BKJVO9W834G"
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
encrypted_bytes = b'\xc2\xa8v\xc3\xb3\xc3\xae\xc3\x84dX|@9'
decrypted_bytes = cipher.decrypt(encrypted_bytes)
print(decrypted_bytes)
于 2018-01-31T08:58:54.180 回答
0

像这样 :

from Crypto.Cipher import AES
from Crypto import Random

key = "18945BKJVO9W834G"
key_bytestring = key
iv = Random.new().read(AES.block_size)
cipher = AES.new(key_bytestring, AES.MODE_CFB, iv)
encrypted_string = "¨vóîÄdX|@9"
encrypted_bytes = encrypted_string 
decrypted_bytes = cipher.decrypt(encrypted_bytes)
decrypted_string = decrypted_bytes
print(repr(decrypted_string))

简短描述:ByteString得到相同的模式,不需要任何更正。如果您执行任何编码操作,请考虑如何感知系统。密码逻辑是基于字节的函数,这对于您使用的编码系统不是很重要。如果输入/输出或输出/输入对您很重要,为什么要更改字符的编码设置? 电脑不能读写!

于 2018-01-31T09:04:25.237 回答