我尝试使用带有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<'
有人可以解释为什么会这样吗?
答案 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
(制表符转义序列),\x4f
和O
,以及\x3c
和<
。
\xhh
转义序列只是bytes
对象文字中用于定义给定字节值的符号,但您可以使用~
生成完全相同的值。同上\t
,您可以表达与\x09
相同的值,但Python在显示表示时更喜欢使用\t
序列。