用P数组对密钥进行位异或运算的Blowfish密码

2024-04-29 11:07:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python实现Blowfish算法。我想我对算法有一个相当好的总体理解,但是一些实现细节让我不知所措。你知道吗

该算法包含一个十六进制数组

#Note: I shortened the 18 element array for this example
PI_P_ARRAY = (0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344) 

还有一把秘密钥匙

key = 'mysecret'

在Wikipedia中,“密钥是一个字节一个字节地循环密钥,如果必要的话,将所有p项按顺序进行XORed。”我如何在Python中实现这一点?你知道吗

到目前为止,我甚至不能将密钥转换为十六进制!更不用说把它循环成一个十六进制数组,我可以用P数组进行异或。。。你知道吗

#Failed attempts to convert key to hex

import binascii
binascii.hexlify(key)

key.encode('hex')

bytearray(key)

Tags: thetokey算法字节密钥数组element
1条回答
网友
1楼 · 发布于 2024-04-29 11:07:53

PI_P_ARRAY数组只是一个使用十六进制文字的整数数组,因此我认为您不必为此而使用十六进制。相反,将密钥转换为整数序列。最简单的方法是使用类似bytearraybytearray(key, "utf-8")。然后,您可以按如下方式压缩列表:

zip(itertools.cycle(PI_P_ARRAY), bytearray(key, "utf-8"))

itertools.cycle将对key的整个长度重复PI_P_ARRAY。然后,您可以创建一个列表来给出XORed值,如下所示:

[p ^ k for p, k in zip(itertools.cycle(PI_P_ARRAY), bytearray(key, "utf-8"))]

这会给您一个listint。或者,使用地图:

map(operator.xor, itertools.cycle(PI_P_ARRAY), bytearray("secret", "utf-8"))

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

相关问题 更多 >