0

ファイル (encoded_data.bin) をキー ストリーム (key.bin) で XOR しようとしていますが、「配列インデックスが範囲外です」というエラーが発生し続けます。キー ファイルはデータ ファイルよりも長くなっています。どんな助けでも大歓迎です。私はpython btwにかなり慣れていません-まだ明らかでない場合。

import array
k=open("key.bin", "rb")
s=open("encoded_data.bin", "rb")
t=k.read()
r=s.read()
a1 = array.array('B', (t))
a2 = array.array('B', (r))
for i in range(len(a1)):
   a1[i] ^= a2[i]

   print a1.tostring()

   k.close
   s.close
4

3 に答える 3

1

これは、あなたが言ったようにキーファイルが長く、キーファイルの各バイトに対してループしているために発生しています:

for i in range(len(a1)):
    a1[i] ^= a2[i]

Once iis equal to len(a2)fetch しようとすると、配列の境界外であるため、a2[i]この例外が発生します。i

あなたの質問に基づいて正しい解決策が何であるかは明確ではありませんが、データが常にキーよりも小さいことがわかっている場合は、代わりにデータの長さを使用してください。

for i in range(len(a2)):

データがキーよりも大きいときにキーを繰り返すことが目標である場合、ソリューションはもう少し複雑になります。

于 2013-01-02T18:46:45.447 に答える
0

実際に組み込みzip関数を使用できます。一度に 2 つのイテラブルをループすることができます。これは、あなたのケースに適しています。

plaintext = []
for key_byte, ciphertext_byte in zip(a1, a2):
    plaintext.append(chr(ord(key_byte) ^ ord(ciphertext_byte)))

print ''.join(plaintext)

暗号文に余分なバイトがある場合、それらは破棄されます。キーに余分なバイトがある場合、それらは使用されません。


ワンタイムパッドを実装していると思います。ここでbytearraysを使用することをお勧めします。

key = byterray(k.read())
ciphertext = bytearray(s.read())
plaintext = bytearray()

for key_byte, ciphertext_byte in zip(key, ciphertext):
    plaintext.append(key_byte ^ ciphertext_byte)

print plaintext
于 2013-01-02T18:49:38.933 に答える
0

このような解決策は、あなたのケースで機能し、データがキーよりも長い場合に機能します (もちろん、これは主要な暗号化のノーノーです!):

def xorloop(l, xors):
    return [l[i] ^ xors[i % len(xors)] for i in xrange(len(l))]

次のように、XOR 可能な値のイテラブルを使用します。

>>> xorloop([1, 2, 3, 4, 5], [6, 7, 8])
[7, 5, 11, 2, 2]

例にあるように、これを文字列にかなり簡単に適応させることができarrayます。

于 2013-01-02T18:55:27.340 に答える