具有多字节密钥的XORing文件

时间:2013-06-22 16:51:35

标签: python 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

我知道我错过了一些简单但不能放置它的东西。

1 个答案:

答案 0 :(得分:5)

bytearray bytes 的数组......不是 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])