如何将AES加密输出字节转换为字符串,反之亦然

时间:2017-11-17 14:39:43

标签: python encryption pycrypto

我想使用PyCrypto AES加密文本并将输出密文写入文本文件。如您所知,encrypt()输出返回字节,因此我必须先将其解码为unicode才能被write()方法接受。我的问题是str()decode()方法都抛出相同的错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 0: invalid continuation byte

这是加密文本的一部分,我试图解码为utf-8:

... \xa5- \xd9\x14_\x02\x18\x96\xde\xbb\xad\xb57>\xe5i\x82H\x9b\xcc\x19y\x0f\x89\x0c~\x81\xb5(\xcc|6\x0b\x1c\xa3\x93E\x91d\xa4\x01\xb3\x98C\xb4,\x94@,\xb0\xb0\xd7\xe2\xf7\xf6U\x129B\xd6#u\x02\xc3\xe4l\xa3\x05V\x143\xe6\x85-\x88\x7f\x14\xc0\x1e\x1d\x19vQ\xbe\xc3\xda8\x06\xaf\xb9\xb7F\x91\xa6\xba&\xcb\xd7\xd0\x12\xed\xfd\xd3n\x06\xb6\x8fZ\xccpO\x05f\x ...

2 个答案:

答案 0 :(得分:3)

如果您正在写二进制文件(类似)

binfile = open('bin.out', 'wb')

wb是关键,然后您可以致电write

如果您要写入文本文件,则需要使用base64或类似的内容以可包含在文本中的格式进行编码。 base64hex是常见选项。

要在base64中进行编码,请执行

之类的操作
import base64
b64_string = str(base64.b64encode(bytes_obj),'utf-8')

然后使用b64decode获取字符串

答案 1 :(得分:0)

AES加密可以输出所有1字节十六进制数(0x00到0xFF),但是UTF8要求每个字符的最后一个字节在0x00到0x7F范围内。这意味着会有许多AES字符没有相应的UTF-8翻译,这似乎是你得到的错误。

事实上,如果仔细查看给出的示例文本,它已经是unicode-8。看看你的例子的开头:

\ xa5- \ xd9 \ x14 _

此表达式包含unicode-8连字符,空格和下划线。显示的其他原始字节是Python无法找到相应的unicode-8转换的字节。 有一个连字符,