Python 在密钥生成函数中使用yield而不是return时,xor不支持的操作数错误
我有一个脚本,它接受一个文件,并考虑到它的大小(在下面的代码中小于416字节),使用一系列哈希操作,生成一个掩码(使用下面的keygen函数)与输入文件(下面的密码函数)进行异或。我希望能够根据需要生成密钥,以提高内存效率。但在keygen函数中,当我使用yield而不是return时,我的密码函数返回错误:Python 在密钥生成函数中使用yield而不是return时,xor不支持的操作数错误,python,encryption,xor,Python,Encryption,Xor,我有一个脚本,它接受一个文件,并考虑到它的大小(在下面的代码中小于416字节),使用一系列哈希操作,生成一个掩码(使用下面的keygen函数)与输入文件(下面的密码函数)进行异或。我希望能够根据需要生成密钥,以提高内存效率。但在keygen函数中,当我使用yield而不是return时,我的密码函数返回错误: CD = bytearray((x ^ y for (x, y) in zip(file, key))) TypeError: unsupported operand type(s) fo
CD = bytearray((x ^ y for (x, y) in zip(file, key)))
TypeError: unsupported operand type(s) for ^: 'int' and 'bytearray'
代码如下:
from hashlib import md5
def keygen(f, pk): #takes file f as input (here data size is less than 4126bytes)
ck=bytearray(b'')
l=len(f)
if l <= 28*16:
for i in pk:
a=md5(i.encode())
ck += a.digest()
yield ck
在我的脚本末尾,我有:
if __name__=='__main__':
file = bytearray(open('C:\\code\\Test.txt', 'rb').read())
pk = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
key = keygen(file, pk)
output = cipher(file, key)
final=open('out.data', 'wb')
final.write(output)
final.close()
如果我在keygen函数中使用return而不是yield,那么整个过程都可以正常工作,但在其他情况下会失败。
考虑到密码函数中的数据大小,我希望按需生成密钥。但是如果我使用收益率而不是收益率,那么keygen函数似乎不兼容
我读取了bytearray格式的文件,并在keygen中将ck定义为bytearray。在年,我在keygen中尝试了屈服bytearray(ck),但这也不起作用
我错过了什么?考虑到数据大小,如何按需生成密钥 长话短说:
def keygen(f, pk): #takes file f as input (here data size is less than 4126bytes)
l=len(f)
if l <= 28*16:
for i in pk:
a=md5(i.encode())
yield a.digest()
def keygen(f,pk):#将文件f作为输入(此处数据大小小于4126字节)
l=len(f)
如果我不认为收益率做你认为它做的事。据我所知,收益率返回一个生成器,因此可以根据需要获得结果。我的目标是,在密码函数文件中,用每个字节生成的密钥流进行异或运算。你有什么想法吗?使用yield
可以使函数成为生成器,但yield返回的对象(通常)不是生成器。@PM 2Ring:据我所知,这没关系,你的确切意思是什么?@Kebin:我寻求的目标有什么解决方案吗?@Miind:请查看Python文档,以便了解如何使用生成器。如
def keygen(f, pk): #takes file f as input (here data size is less than 4126bytes)
l=len(f)
if l <= 28*16:
for i in pk:
a=md5(i.encode())
yield a.digest()
from hashlib import md5
def keygen(f, pk):
if len(f) > len(pk)*16:
pk = ''
return (ord(ch) for letter in pk for ch in md5(letter).digest())