我想使用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
...
答案 0 :(得分:3)
如果您正在写二进制文件(类似)
binfile = open('bin.out', 'wb')
wb
是关键,然后您可以致电write
。
如果您要写入文本文件,则需要使用base64
或类似的内容以可包含在文本中的格式进行编码。 base64
和hex
是常见选项。
要在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。看看你的例子的开头:
此表达式包含unicode-8连字符,空格和下划线。显示的其他原始字节是Python无法找到相应的unicode-8转换的字节。 有一个连字符,