2016-09-23 26 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

これは*ノーマル*です。 '\ xhh'エスケープシーケンスを使用するのではなく、可能であれば、Pythonバイトオブジェクトが表示可能なASCII文字で表示されます。 *ここでデータが失われることはありません。*読みやすいテキストに歪んだデバッグ出力を見ているだけです。 –

+0

例えば、7EバイトはASCII標準の '〜'文字であり、それは印刷可能な文字であるため、 'repr()'出力は '\ x7E'ではなく'〜 'を使います。これは、データをASCIIテキストに変換し続ける必要がないため、データが主にテキストの場合に役立ちます。 –

+0

@MartijnPieters、ありがとう、ありがとう!つまり、7Eまたは〜を使用して暗号にキーを入力すると、同じ出力が得られますか? –

答えて

1

出力が正しくなっていますが、bytesの値の場合はrepr()の出力で混乱しているようです。

Pythonは、Pythonセッションに安全にコピーして貼り付けることができる値を与えます。これはデバッグを助けます。このディスプレイでは、可能であればASCIIの印刷可能テキストを使用して値を表しますが、値は表示されているものと正確に再現できます。バイト文字列はまだ16バイト長である

>>> 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 

:Pythonのではなく\xhhバイト値のそれを示して

あなたの期待値b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'は、印刷可能ないくつかのASCII文字が含まれている

>>> len(output) 
16 

こと~は、ASCIIコードポイント126、または16進数の0x7Eです。

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

同じことが\x28(\x09\t(タブ文字のエスケープシーケンス)、\x4fO、および\x3c<に適用されます。

\xhhエスケープシーケンスは、指定されたバイト値を定義するリテラルbytesオブジェクト内だけで表記されていますが、~とまったく同じ値を生成することができます。 Dittoの場合は\x09と同じ値を表現できますが、Pythonは表現を表示するときに\tシーケンスを使用します。

関連する問題