web-dev-qa-db-ja.com

独自のMD5衝突を作成する

MD5の衝突についてのプレゼンテーションを行っています。衝突の可能性を人々に教えたいと思います。

同じものにハッシュする2つのテキストブロックを用意し、衝突が発生する前に[a-zA-Z]の組み合わせがいくつ必要だったかを説明するとよいでしょう。

明白な答えは、2つのハッシュが同じになるまで、可能なすべての組み合わせをハッシュすることです。では、これをどのようにコーディングすればよいでしょうか。簡単な実験として、[A-Z]の5列のすべての組み合わせをハッシュして、これを.netハッシュテーブルに格納し、衝突例外をキャッチしてみました。これに関する2つの問題-ハッシュテーブルは最終的にタイムアウトになり、さらに多くの文字が必要になると確信しています。

明らかに、このデータ構造はメモリで処理するには大きすぎるため、データベースを使用する必要があります。また、Azureをテストするための良いプロジェクトのように聞こえます- these guys のようです。

誰かが私にこれを行う効率的な方法の方向を向くことができますか?

43
russau

次の2つの異なる128バイトシーケンスは、同じものにハッシュされます。

MD5ハッシュ:79054025255fb1a26e4bc422aef54eb4

以下の違いが強調表示されています(太字)。すみません、ちょっと見づらいです。

 d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 
 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b 
 d8823e3156348f5bae6dacd436c919c6 dd53e2b 487da03fd02396306d248cda0 
 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70 

そして

 d131dd02c5e6eec4693d9a0698aff95c 2fcab5712467eab4004583eb8fb7f89 
 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b 
 d8823e3156348f5bae6dacd436c919c6 dd53e23 487da03fd02396306d248cda0 
 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70 

衝突/ブロックの視覚化1(ソース: Links.Org

alt text

衝突/ブロック2の視覚化(ソース: Links.Org

alt text

51
Alex

私の知る限り、テキストファイルだけでそれを行うのは困難です。 someの衝突が発生する可能性がありますが、[a-zA-Z]だけからの衝突も(まだ)簡単ではありません。

一方、同じハッシュで「意味のある」ように見える2つのファイルが必要な場合は、たとえばPostScript:異なるバイナリBLOBを使用して衝突を引き起こし、条件式を使用して異なる出力を表示できます。それに応じて。

たとえば、 この問題 (H2部分)および ソリューション 。たとえば、 this PS filethis one は同じMD5sumを持っていますが、どちらも、開いたときにまったく異なるテキストを含む整形式のPostScriptファイルです。

3
ShreevatsaR

単純な衝突がどれほど可能性が高いかについて話している場合-故意に衝突を引き起こそうとしない場合-がっかりするでしょう:期待する前に、平均2 ^ 64平文を生成する必要があります。衝突が発生します。これは、妥当な(実際には、_un_reasonableな)時間で実行できるよりも大幅に多くなります。

意図的に衝突を作成することの難しさを実証するために探しているなら、他の回答がすでにそれを実証しています。ただし、文字列が完全にテキストである必要があるという追加の制約により、これらのアプローチでさえもほとんど実用的ではありません。

2
Nick Johnson

Hashcash を見てみましょう。 md5のような効果的なハッシュアルゴリズムを使用すると、ビット数の指数関数に対する衝突を計算する時間。 Hashcashが行うことは、部分的な衝突を計算することです。つまり、ハッシュの下位16ビットと一致します。下位16ビットを一致させるには、平均で2 ^ 15の異なる組み合わせをハッシュ化する必要があります。 16、24、または32ビットの衝突が発生するまでにかかる時間を知っている場合は、ビット数が多い場合の時間を簡単に計算できます。

1
brianegge