我对已分配的作业有一些问题。要点是我必须对“汽车 fop”进行彩虹攻击。使用生成器表,RainbowAttack.py
脚本如下:
- 密钥广播给汽车(在这种情况下是对手)
- car/eve 以挑战回应
u
。 - 然后,该键以由 组成的散列响应
MD5(s||u)
。 - Eve 现在使用 Rainbow-table 来破解
s
。
我们使用 MD5 对我们的响应和我们的密钥进行哈希处理然后我们对哈希使用我们的归约函数并获取前 28 位
f_i(x) = (f(x)+i) mod 2^28.
我的哈希和归约函数
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 的响应是否在那里,如果我们有我们的钥匙。
这可能是我们计算后继函数时引起的问题,因为归约函数将不同于键上使用的函数(我将递增,使链中所有键的归约函数略有不同)
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
彩虹表和文件可以在这里找到 (github)
(derp.py(彩虹攻击)和table1.csv(更改名称为table.csv))