我找到了一个简单的纯python blowfish实现,它满足了我对特定项目的需求。在
有一点让我很困扰:
def initialize(key):
"""
Use key to setup subkeys -- requires 521 encryptions
to set p and s boxes. key is a hex number corresponding
to a string of 32 up to 448 1s and 0s -- keylen says
how long
"""
# Note that parray and sboxes are globals that have been pre-initialized.
hexkey = hex(key)[2:]
if hexkey[-1]=='L':
hexkey = hexkey[:-1]
if len(hexkey)%2==1:
hexkey = '0'+hexkey
lenkey = len(hexkey)/8
if lenkey==0:
pos=0
# XOR key segments with P-boxes
for i in range(18):
if lenkey>0:
pos = (i%lenkey)*8 # offset into key gives subkey
subkey = eval('0x'+hexkey[pos:pos+8]+'L')
parray[i] ^= subkey # immediate XOR -- Python 2.0+ syntax
# encrypt 0-data, then keep re-encrypting and reassigning P-boxes
output = 0L
for i in range(0,17,2):
output = bfencrypt(output)
parray[i], parray[i+1] = output>>32, output & 0xFFFFFFFFL
# re-encrypt and reassign through all the S-boxes
for i in range(4):
for j in range(0,255,2):
output = bfencrypt(output)
sbox[i][j],sbox[i][j+1] = output>>32, output & 0xFFFFFFFFL
# print "Initialization complete"
subkey = eval('0x'+hexkey[pos:pos+8]+'L')
?请告诉我有更好的办法。在
难道没有一种方法可以重构它来使用实际的整数类型而不是字符串中的十六进制值吗?在
不要使用此代码,更不要尝试改进它。
使用互联网上发现的密码可能会导致软件出现严重的安全故障。请参阅Jeff Atwood's little series主题。在
最好在最高抽象级别使用经过验证的加密库。理想情况下,一个在C中实现所有密钥处理并在使用后销毁关键材料的程序。在
在Python中进行加密的一个问题是,由于Python字符串的性质和垃圾收集过程,您无法控制内存中密钥材料的扩散。在
是的。使用以16为基数的int()。在
所以:
^{pr2}$应该做同样的事情而不需要评估。在
[Edit]事实上,如果给定一个整数,通常根本没有理由需要转换为字符串表示形式—您可以简单地通过与
0xffffffff
进行and运算,然后在循环中将密钥右移32位,从而提取出每个32位的值。例如:但是,这个初始化过程似乎有点奇怪-它使用从左边开始的十六进制数字,没有零填充来舍入为8个十六进制数字的倍数(因此,},而不是更常用的}。它也重复这些数字,而不是把它当作一个单一的大数字。您应该检查此代码是否实际执行了正确的算法。在
0x123456789
将被拆分为0x12345678
和{0x00000001
和{相关问题 更多 >
编程相关推荐