6

我只是想用多字节密钥对文件进行异或。密钥的长度可能不同。返回以下错误:

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

bytearray是...字节数组...不是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 ...我可能会做得更好。但至少似乎有效。


编辑:正如评论中所解释的,混合字节和 unicode 字符不是一个好主意。

当您在这里使用字节时,您的密钥也应该是字节。将代码简化为副作用:

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