Python 在密钥生成函数中使用yield而不是return时,xor不支持的操作数错误

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

我有一个脚本,它接受一个文件,并考虑到它的大小(在下面的代码中小于416字节),使用一系列哈希操作,生成一个掩码(使用下面的keygen函数)与输入文件(下面的密码函数)进行异或。我希望能够根据需要生成密钥,以提高内存效率。但在keygen函数中,当我使用yield而不是return时,我的密码函数返回错误:

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())