我正在尝试在Python中实现Blowfish算法。我想我对算法有一个很好的一般理解,但是一些实现细节让我失望。
该算法涉及十六进制数组
#Note: I shortened the 18 element array for this example
PI_P_ARRAY = (0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344)
和密钥
key = 'mysecret'
来自维基百科,“秘密密钥是,逐字节,必要时循环密钥,按顺序与所有P条目进行异或。”我如何在Python中实现它?
到目前为止,我甚至无法将密钥转换为十六进制!更少循环到十六进制数组,我可以与P阵列XOR ...
#Failed attempts to convert key to hex
import binascii
binascii.hexlify(key)
key.encode('hex')
bytearray(key)
答案 0 :(得分:1)
PI_P_ARRAY
数组只是一个使用十六进制文字的整数数组,因此我认为你不需要为此而烦恼。相反,将您的密钥转换为整数序列。最简单的方法是使用bytearray
bytearray(key, "utf-8")
。然后,您可以像这样压缩列表:
zip(itertools.cycle(PI_P_ARRAY), bytearray(key, "utf-8"))
itertools.cycle
会在PI_P_ARRAY
的整个长度上重复key
。然后,您可以制作列表推导,为您提供如下的XORed值:
[p ^ k for p, k in zip(itertools.cycle(PI_P_ARRAY), bytearray(key, "utf-8"))]
这为您提供list
int
个。或者,使用地图:
map(operator.xor, itertools.cycle(PI_P_ARRAY), bytearray("secret", "utf-8"))
请注意,这会为您提供一个生成器,如果您处理大量数据,它将使用更少的内存。