2016-09-23 77 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序列。