我只是尝试使用多字节密钥对文件进行异或。钥匙的长度可能不同。返回以下错误:
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
我知道我错过了一些简单但不能放置它的东西。
答案 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])