我将AES256加密消息作为字符串。该消息由IV(16字节HEX号码,因此字符串中总共32个字符)和64字节HEX有效载荷(128个字符)组成。因此它的单个160个字符的字符串由十六进制数字00,e0,f2等组成。为什么它是字符串?它从另一个设备接收为字符串。
现在我使用代码'iv = encrypted [:16]'将加密的消息分解为IV和有效负载。 IV仅为零(用于测试目的)。如果我使用iv = bytes.fromhex(iv)
我可以将iv打印为b'\x00\x00\x00...
,这正是我所期望的。
但是当我对以9ed57a...
开头的有效负载消息执行相同操作时,我希望获得b'\x9e\xd5\x7a...
等,而不是b'\x9e\xd5z_\xe3...
。那些额外的字符(z_)是什么意思,为什么下一个字节看起来与我在原始字符串中的完全不同?
打印当然不是问题,但是当我使用AES.decrypt
时,即使我确定在我的设置的发送端和接收端都有相同的密码,我也会得到垃圾。如果我的代码完全错误,我非常感谢帮助正确实现我在这里尝试做的事情。
编辑:
我现在一直在尝试别的东西,我正在尝试使用循环将HEXes字符串转换为字节数组。它似乎正常工作,直到它传递给解密功能。我得到了消息"ValueError: Input strings must be a multiple of 16 in length"
我不明白,因为我的输入字符串长度恰好是64个字符(打印len(msg)
时)。消息是所有奇怪的字符,但由于它是从标准的十六进制值解析,范围从0x00到0xff,为什么它不起作用?
答案 0 :(得分:0)
Python不会将可打印的字符打印为转义序列,而是打印为ASCII对应字符。当您查看ASCII表时,您会看到\x7a
或0x7a对应于小写z
。
并非所有字节都可以这种方式打印。例如,低于0x20的所有字节值都是不可打印的控制字节。