私はメッセージダイジェストの分野でいくつかの予備調査を行ってきました。具体的には、 Postscriptの例やX.509証明書の複製など、MD5やSHA-1などの暗号化ハッシュ関数の衝突攻撃。
ポストスクリプト攻撃の場合に私が知ることができることから、特定のデータが生成され、ポストスクリプトファイルのヘッダー内に埋め込まれ(レンダリング中に無視されます)、md5の内部状態が変更された文言のような状態になりましたドキュメントの最終的なMD値は、元のポストスクリプトファイルと同等になります。X.509も同様のアプローチを採用しており、証明書のコメント/空白セクション内にデータが挿入されています。
さて、ここに私の質問があります、そして私はこの質問をしている人を見つけることができないようです:
消費されているデータのみの長さが、MD計算の最後のブロックとして追加されないのはなぜですか?
X.509の場合-MDの一部として空白とコメントが考慮されるのはなぜですか?
提案された衝突攻撃を解決するには、次のいずれかのような単純なプロセスでは不十分です。
- MD(M + | M |)= xyz
- MD(M + | M | + | M | * magicseed_0 + ... + | M | * magicseed_n)= xyz
どこ :
- M:メッセージです
- | M | :メッセージのサイズ
- MD:メッセージダイジェスト関数です(例:md5、sha、whirlpoolなど)
- xyz:は、メッセージMと|M|の実際のメッセージダイジェスト値のペアです。<M、| M |>
- magicseed_ {i}:サイズが追加される前の内部状態に基づいてシードで生成されたランダムな値のセットです。
これまでのところ、このような衝突攻撃はすべて、元のメッセージにデータを追加することに依存しているため、この手法は機能するはずです。
つまり、次のような衝突メッセージの生成に伴う難易度。
- 同じMDを生成するだけではありません
- しかし、理解可能/解析可能/準拠している
- また、元のメッセージと同じサイズですが、
ほぼ不可能ではないにしても、非常に困難です。このアプローチについて議論されたことはありますか?論文などへのリンクがあればいいのですが。
さらなる質問:Uからランダムに選択されたハッシュ関数Hの共通の長さのメッセージの衝突の下限は何ですか?ここで、Uはユニバーサルハッシュ関数のセットですか?
1 / N(Nは2 ^(| M |))ですか、それとも大きいですか?それが大きい場合は、特定のHの同じMD値にマップされる長さNのメッセージが複数あることを意味します。
その場合、これらの他のメッセージを見つけることはどれほど実用的ですか?ブルートフォースはO(2 ^ N)になりますが、ブルートフォースよりも時間計算量が少ない方法はありますか?