重构此块密码键控函数

2024-09-28 18:51:41 发布

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

我找到了一个简单的纯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')?请告诉我有更好的办法。在

难道没有一种方法可以重构它来使用实际的整数类型而不是字符串中的十六进制值吗?在


Tags: andtokeyinposforoutputif
2条回答

不要使用此代码,更不要尝试改进它。

使用互联网上发现的密码可能会导致软件出现严重的安全故障。请参阅Jeff Atwood's little series主题。在

最好在最高抽象级别使用经过验证的加密库。理想情况下,一个在C中实现所有密钥处理并在使用后销毁关键材料的程序。在

在Python中进行加密的一个问题是,由于Python字符串的性质和垃圾收集过程,您无法控制内存中密钥材料的扩散。在

是的。使用以16为基数的int()。在

>>> int('ffffffff',16)
4294967295L

所以:

^{pr2}$

应该做同样的事情而不需要评估。在

[Edit]事实上,如果给定一个整数,通常根本没有理由需要转换为字符串表示形式—您可以简单地通过与0xffffffff进行and运算,然后在循环中将密钥右移32位,从而提取出每个32位的值。例如:

subkeys = []
while key:
    subkeys.append(key & 0xffffffff)
    key >>= 32

if not subkeys: subkeys = [0] # Handle 0 case
subkeys.reverse() # Use same order as before (BUT SEE BELOW)

但是,这个初始化过程似乎有点奇怪-它使用从左边开始的十六进制数字,没有零填充来舍入为8个十六进制数字的倍数(因此,0x123456789将被拆分为0x12345678和{},而不是更常用的0x00000001和{}。它也重复这些数字,而不是把它当作一个单一的大数字。您应该检查此代码是否实际执行了正确的算法。在

相关问题 更多 >