2016-09-23 76 views
1

我试图用AES密码使用Python解密图像文件。我们已经给出了一个15字节的密钥,并且解密通过第一个字节运行的映像是我们的工作。Python - 连接字节到字符串切断字符串中的一些字节

什么,我至今是:

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

这是*正常*。在可能的情况下,Python字节对象将显示可打印的ASCII字符,而不是使用'\ xhh'转义序列。 *这里没有数据丢失*,你只是看着调试输出倾向于可读的文本。 –

+0

例如,7E字节是ASCII标准中的'〜'字符,因为这是一个可打印字符,所以'repr()'输出使用'〜'而不是'\ x7E'。当您的数据主要是文本时,这非常有用,因为您不必手动将字节转换为ASCII。 –

+0

@MartijnPieters,我明白了,谢谢!那么这是否意味着如果我使用7E或〜输入密钥给我的密码,它会给我相同的输出? –

回答

1

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

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 

的字节串仍然是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序列。