6

マルチバイトキーでファイルを XOR しようとしているだけです。キーの長さは異なる場合があります。次のエラーが返されます。

TypeError: ord() expected string of length 1, but int found

これが私が今取り組んでいるものです。

def xor(data, key):
    l = len(key)

    decoded = ""
    for i in range(0, len(data)):
        decoded += chr(ord(data[i]) ^ ord(key[i % l]))
    return decoded

data = bytearray(open('myfile.bin', 'rb').read())

key = '\x2a\x2b\x2c\x5e\x25\x44'
a = xor(data, key)
print a

シンプルなものが欠けていることはわかっていますが、配置できません。

4

1 に答える 1

7

bytearrayare ...バイトの配列... charではありません。

ord()バイトでは使用できません。これには意味がありません。

代わりにそれを試してください:

def xor(data, key):
    l = len(key)

    decoded = ""
    for i in range(0, len(data)):
            decoded += chr(data[i] ^ ord(key[i % l]))


    return decoded

あまりPythonicではありません...おそらくもっとうまくできたでしょう。しかし、少なくともうまくいくようです。


編集:コメントで説明されているように、バイトとユニコード文字を混在させることはお勧めできません。

ここでバイトを扱っているので、キーもバイトである必要があります。副作用としてコードを単純化する:

def xor(data, key):
    l = len(key)
    return bytearray((
        (data[i] ^ key[i % l]) for i in range(0,len(data))
    ))


data = bytearray(open('myfile.bin', 'rb').read())

key = bytearray([0x2a,0x2b,0x2c,0x5e,0x25,0x44])
于 2013-06-22T17:06:28.603 に答える