Python 2.7 通过python查找的Rainbow攻击失败。

Python 2.7 通过python查找的Rainbow攻击失败。,python-2.7,rainbowtable,rainbowattack,Python 2.7,Rainbowtable,Rainbowattack,我对分配给我的任务有一些问题。要点是我必须对一辆“汽车fop”进行彩虹攻击。 使用生成器表,RainbowAttack.py脚本将执行以下操作: 按键向car广播(在本例中为对手) car/eve响应挑战u 然后,该键以一个由MD5(s | | u)组成的散列来响应 Eve现在使用彩虹表破解s 我们使用MD5散列我们的响应和密钥 然后我们在散列上使用我们的缩减函数,取前28位 f_i(x)=(f(x)+i)模式2^28。 我的hash和redcution函数 def f(s, i=0): ""

我对分配给我的任务有一些问题。要点是我必须对一辆“汽车fop”进行彩虹攻击。 使用生成器表,RainbowAttack.py脚本将执行以下操作:

  • 按键向car广播(在本例中为对手
  • car/eve响应挑战
    u
  • 然后,该键以一个由
    MD5(s | | u)
    组成的散列来响应
  • Eve现在使用彩虹表破解
    s
  • 我们使用MD5散列我们的响应和密钥 然后我们在散列上使用我们的缩减函数,取前28位
    f_i(x)=(f(x)+i)模式2^28。

    我的hash和redcution函数

    def f(s, i=0): 
    """Lowest 28 bits of (MD5(s||u) % i)"""  
    
       digest = '0x' + md5.new(str(s) + str(u)).hexdigest()
       result = hex((int(digest, 16) + i) % 2**BIT_SIZE)[:BIT_SIZE/4+2]
       return result
    
    不管怎样,当我们运行脚本时,我们收到响应,我们计算所有后继项,并将它们与彩虹表中的端点进行比较,如果找到匹配项,我们得到碰撞的起点,现在我们检查从起点到终点的链中是否有键,如果这里的一个键与我们从fop得到的响应相同我们知道前一把钥匙是打开车门的秘密

    目前,我们只能在彩虹表的起始位置或结束位置找到钥匙,而不是在链中。 下面是循环的代码,用于检查成功者,检查我们的继任者是否在彩虹表中,如果他们在彩虹表中,我们检查来自汽车fop的响应是否在那里,如果是,我们有我们的钥匙

    这可能是我们计算后继键时产生的问题,因为还原函数将不同于键上使用的函数(我将递增,使链中所有键的还原函数略有不同)

    可以找到彩虹表和文件(github)

    (derp.py(彩虹攻击)和table1.csv(将名称更改为table.csv))

    def find_key(table, r):
    """Search for matching respons in Rainbow-table"""
        succ = [r]
        print r
        for i in xrange(1, CHAIN_LEN):
            succ.append(f(succ[i-1],i))
    
        for key, value in table.iteritems():
            if value in succ:
                print "\tCollition: %s -> %s" % (key, value)
                ss = key
    
                for i in xrange(0, CHAIN_LEN):
                    rs = f(ss, i)
                    if rs==r:
                        return ss
                ss = rs
    return -1