将十六进制数字的字符串转换为十六进制用于pycrypto(Python 3.4)

时间:2015-09-11 17:57:07

标签: python character-encoding hex python-3.4

我将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,为什么它不起作用?

1 个答案:

答案 0 :(得分:0)

Python不会将可打印的字符打印为转义序列,而是打印为ASCII对应字符。当您查看ASCII表时,您会看到\x7a或0x7a对应于小写z

并非所有字节都可以这种方式打印。例如,低于0x20的所有字节值都是不可打印的控制字节。