如何将 AES 加密输出字节转换为字符串,反之亦然
How to convert AES encrypt output bytes to string and vise versa
我想使用 PyCrypto AES 加密文本并将输出密文写入文本文件。如您所知,encrypt()
输出 returns 字节,因此我必须先将其解码为 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
...
如果您正在写入二进制文件(类似于)
binfile = open('bin.out', 'wb')
wb
是关键,那么你可以调用write
.
如果您正在写入文本文件,则需要使用 base64
或类似的东西以可以包含在文本中的格式进行编码。 base64
和 hex
是常用选项。
要使用 base64 进行编码,请执行以下操作
import base64
b64_string = str(base64.b64encode(bytes_obj),'utf-8')
然后使用b64decode
取回一个字符串
AES 加密可以输出所有 1 字节的十六进制数字(0x00 到 0xFF),但是 UTF8 要求每个字符的最后一个字节在 0x00 到 0x7F 范围内。这意味着会有许多 AES 字符没有相应的 UTF-8 翻译,这似乎是您遇到的错误。
事实上,如果您仔细查看给定的示例文本,它已经是 unicode-8 格式了。查看示例的开头:
\xa5- \xd9\x14_
此表达式包含一个 unicode-8 连字符、space 和下划线。显示的其他原始字节是 Python 找不到相应的 unicode-8 翻译的字节。
有一个连字符,一个
我想使用 PyCrypto AES 加密文本并将输出密文写入文本文件。如您所知,encrypt()
输出 returns 字节,因此我必须先将其解码为 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
...
如果您正在写入二进制文件(类似于)
binfile = open('bin.out', 'wb')
wb
是关键,那么你可以调用write
.
如果您正在写入文本文件,则需要使用 base64
或类似的东西以可以包含在文本中的格式进行编码。 base64
和 hex
是常用选项。
要使用 base64 进行编码,请执行以下操作
import base64
b64_string = str(base64.b64encode(bytes_obj),'utf-8')
然后使用b64decode
取回一个字符串
AES 加密可以输出所有 1 字节的十六进制数字(0x00 到 0xFF),但是 UTF8 要求每个字符的最后一个字节在 0x00 到 0x7F 范围内。这意味着会有许多 AES 字符没有相应的 UTF-8 翻译,这似乎是您遇到的错误。
事实上,如果您仔细查看给定的示例文本,它已经是 unicode-8 格式了。查看示例的开头:
\xa5- \xd9\x14_
此表达式包含一个 unicode-8 连字符、space 和下划线。显示的其他原始字节是 Python 找不到相应的 unicode-8 翻译的字节。 有一个连字符,一个