1

次の関数は、のバイナリ4バイトキーを受け入れますkeybuf4バイトキーに対して排他的論理和されるバイナリ入力です。

def four_byte_xor(buf, key):
    #key = struct.pack(b">I", key) # removed for binary processing
    buf = bytearray(buf)
    for offset in range(0, len(buf), 4):
        for i, byte in enumerate(key):
            buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
    return str(buf)

forを介してバイナリデータを指定するためにkey = struct.pack(b">I", key)から削除しました。これは、長さが4バイトで終わる場合は正常に機能します。そうでない場合は、次のエラーが発生します(以下のテストを参照)。four_byte_xor()str(p.payload.payload.payload)[:4]key

これは、00になるキーでxorされた入力で構成されるいくつかのテストで、最初のテストは成功します。

'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD'
'ABCD'

bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
'ABCD'

2番目のテストは成功せず、Aまたは1バイト余分に終了します。

'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDA'
'ABCD'
Traceback (most recent call last):
  File "./decode.py", line 36, in <module>
    process_packets()
  File "./decode.py", line 34, in process_packets
    out_buf.write(bin_four_byte_xor(pkt_payload, pkt_offset))
  File "./decode.py", line 22, in bin_four_byte_xor
    buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
IndexError: bytearray index out of range

さまざまな長さfour_byte_xor()を受け入れるように変更できますか?buf

4

1 に答える 1

3

もちろん、さまざまなキーの長さを受け入れるように関数を変更できます。たとえば、

def many_byte_xor(buf, key):
    buf = bytearray(buf)
    for i, bufbyte in enumerate(buf):
        buf[i] = chr(bufbyte ^ ord(key[i % len(key)]))
    return str(buf)

これは、キーのすべての文字を循環します(モジュラスバージョンのitertools.cycle)。これにより、

>>> many_byte_xor("AABAA", "AB")
'\x00\x03\x03\x03\x00'
>>> many_byte_xor("ABCDABCD", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDA", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDAB", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDAB", "ABC")
'\x00\x00\x00\x05\x03\x01\x02\x06\x02\x03'

どのIIUCがあなたが望むものです。

于 2012-07-16T04:24:36.323 に答える