Blowfish Cipher - 用P阵列对密钥进行异或异或

时间:2015-04-12 17:18:48

标签: python python-3.x blowfish

我正在尝试在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)

1 个答案:

答案 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"))

请注意,这会为您提供一个生成器,如果您处理大量数据,它将使用更少的内存。