与えられた課題にいくつか問題があります。要点は、「カーフォップ」に虹の攻撃をしなければならないということです。ジェネレーター テーブルを使用すると、RainbowAttack.py
スクリプトは次のようになります。
- キーは車にブロードキャストします (この場合は敵対者)
- カー/イブはチャレンジで応答し
u
ます。 - キーは、
MD5(s||u)
. - Eve は、Rainbow テーブルを使用して
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
とにかく、スクリプトを実行すると、すべてのサクセサーを計算し、それらをレインボーテーブルのエンドポイントと比較します。一致が見つかった場合は、コリジョンの開始ポイントを取得し、キーがチェーンにあるかどうかを確認します始点から終点まで、ここにあるキーの 1 つが fop から得た応答と同じであれば、前のキーが車のドアを開けるための秘密であることがわかります。
現時点では、レインボー テーブルの開始位置または終了位置にあるキーのみを実際に見つけることができ、チェーン内にある場合は見つかりません。次のループのコードは、successors をチェックし、successor のいずれかがレインボーテーブルにあるかどうかをチェックし、もしそうなら、カー 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に変更))