Python - 将字节连接到字符串,切断字符串中的一些字节

时间:2016-09-23 17:27:06

标签: python byte aes pycrypto

我尝试使用带有AES密码的Python解密图像文件。我们已经获得了一个15字节的密钥,我们的工作是解密通过第一个字节运行的图像。

到目前为止我所拥有的是:

fifteenbytes = b'\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'

for i in range(0, 256):
    ipack = pack('B', i)

    key = ipack + fifteenbytes

我希望我能像以下那样得到钥匙:

\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c

对于迭代0 - 255,但我最终得到:

b'\x00~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'

或有时退出字符和ascii值,如:

b'\t~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
b'%~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您获得了正确的输出,但您似乎对repr()值的bytes输出感到困惑。

Python为您提供了一个可以安全地复制并粘贴回Python会话的值。这有助于调试。此显示使用ASCII可打印文本尽可能表示值,但可以使用显示的内容精确再现该值。

您的预期值b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'包含几个可打印的ASCII字符,因此Python会显示这些字符而不是\xhh字节值:

>>> output = b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
>>> output 
b'\x00~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
>>> output == b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
True

bytestring仍然是16个字节长:

>>> len(output)
16

~是ASCII码点126,或十六进制的0x7E:

>>> output[1]
126
>>> hex(output[1])
'0x7e'

这同样适用于\x28(\x09\t(制表符转义序列),\x4fO,以及\x3c<

\xhh转义序列只是bytes对象文字中用于定义给定字节值的符号,但您可以使用~生成完全相同的值。同上\t,您可以表达与\x09相同的值,但Python在显示表示时更喜欢使用\t序列。