在Python 3.6 XOR中获取简单错误

在Python 3.6 XOR中获取简单错误,python,python-3.x,encryption,xor,Python,Python 3.x,Encryption,Xor,我正在使用Python3.6,并试图使用XOR加密一个文件。我有一个简单的代码: from itertools import cycle def xore(data, key): return ''.join(chr(a ^ ord(b)) for (a, b) in zip(data, cycle(key))) with open('C:\\Users\\saeed\\Desktop\\k.png', 'rb') as encry, open('C:\\Users\\saeed\

我正在使用Python3.6,并试图使用XOR加密一个文件。我有一个简单的代码:

from itertools import cycle


def xore(data, key):
    return ''.join(chr(a ^ ord(b)) for (a, b) in zip(data, cycle(key)))

with open('C:\\Users\\saeed\\Desktop\\k.png', 'rb') as encry, open('C:\\Users\\saeed\\Desktop\\k_enc.png', 'wb') as decry:
    decry.write(xore(encry.read(), 'anykey'))
我得到了

Traceback (most recent call last):
  File "C:/Users/saeed/IdeaProjects/xorencrypt/XORenc.py", line 8, in <module>
    decry.write(xore(encry.read(), 'anykey'))
TypeError: a bytes-like object is required, not 'str'
回溯(最近一次呼叫最后一次):
文件“C:/Users/saeed/IdeaProjects/xorencrypt/XORenc.py”,第8行,在
decry.write(xore(encry.read(),'anykey'))
TypeError:需要类似字节的对象,而不是“str”

这意味着什么,我该如何解决?还有没有办法解密文件?谢谢。

Make
xore
返回字节,而不是str

def xore(data, key):
    return bytes(a ^ ord(b) for a, b in zip(data, cycle(key)))
以二进制模式打开的写入文件对象


顺便说一句,通过传递字节文字
b'anykey'
而不是字符串文字,您不需要调用
ord
,因为迭代字节会产生
int
s:

def xore(data, key):
    return bytes(a ^ b for a, b in zip(data, cycle(key)))

with open('...', 'rb') as encry, open('...', 'wb') as decry:
    decry.write(xore(encry.read(), b'anykey'))
    #                              ^^^^^^^^^ bytes literal

非常感谢这个@falsetru!这真的很有帮助。您知道如何解密该文件吗?@SDurrani,对加密数据进行异或将为您提供原始数据。因此
以open('C:\\Users\\saeed\\Desktop\\k_enc.png','rb')作为encry,open('C:\\Users\\saeed\\Desktop\\k_dec.png','wb')作为decry:xore(xore(encry.read(),b'anykey'),b'anykey')
?@SDurrani做一次异或。执行两次将得到相同的字节。