衝突の可能性を心配することなく、MD5をハッシュとして使用できる文字列の長さはどれくらいですか?
これは、ハッシュが2回目に現れるまで(衝突)、特定の文字セット内のすべての可能な文字列に対して、長さを増やしながらMD5ハッシュを生成することによっておそらく計算されます。衝突しない文字列の最大長は、衝突するペアの最長よりも1文字短くなります。
これはすでにMD5、SHA1などでテストされていますか?
皮肉なことに、私が前の回答を投稿してから数週間後、2人の中国人研究者、Tao XieとDengguo Fengが MD5の新しいシングルブロックコリジョンを公開しました 。今までその紙を知らなかった。 1つのMD5ブロックは、入力サイズが64バイトまたは512ビットであることを意味します。入力はほとんど同じであることに注意してください2ビットのみが異なります。
彼らの方法論は2013年1月まで公開されませんが、論文の数値を使用して、衝突を検証できます。
>>> from array import array
>>> from hashlib import md5
>>> input1 = array('I', [0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,0x6503cf04,
0x854f709e,0xfb0fc034,0x874c9c65,0x2f94cc40,0x15a12deb,0x5c15f4a3,0x490786bb,
0x6d658673,0xa4341f7d,0x8fd75920,0xefd18d5a])
>>> input2 = array('I', [x^y for x,y in Zip(input1,
[0, 0, 0, 0, 0, 1<<10, 0, 0, 0, 0, 1<<31, 0, 0, 0, 0, 0])])
>>> input1 == input2
False
>>> md5(input1).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
>>> md5(input2).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
更新:この論文は2013年3月に発行されました: Tao XieおよびFanbao LiuおよびDengguo Feng-MD5への高速衝突攻撃
ただし、操作する余地がある場合は、数キロバイトの衝突の計算の方がはるかに高速です。通常のコンピュータでは、数時間以内に衝突を計算できます。
以前の最短の衝突では、少なくとも2つのMD5ブロックに相当する入力(128バイト、1024ビット)を使用しました。最初のブロックのプレフィックスは攻撃者が任意に選択でき、残りは計算されて意味不明なものとして表示されます。
これは2つの異なる衝突入力の例です。Pythonで自分で試すことができます。
>>> from binascii import unhexlify
>>> from hashlib import md5
>>> input1 = 'Oded Goldreich\nOded Goldreich\nOded Goldreich\nOded Go' + unhexlify(
... 'd8050d0019bb9318924caa96dce35cb835b349e144e98c50c22cf461244a4064bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf67c12978647f5af123de3acf844085cd025b956')
>>> len(input1)
128
>>> md5(input1).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'
>>> input2 = 'Neal Koblitz\nNeal Koblitz\nNeal Koblitz\nNeal Koblitz\n' + unhexlify(
... '75b80e0035f3d2c909af1baddce35cb835b349e144e88c50c22cf461244a40e4bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf6fc11978647f5af123de3acf84408dcd025b956')
>>> md5(input2).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'
これらの2つの特定の入力の生成には、215ノードのPlayStation 3クラスターで2日かかりました Mark Stevensによる :)
birthday paradox の数学は、衝突確率の変曲点をおおよそsqrt(N)あたりにします。ここで、Nはハッシュ関数内の個別のビンの数なので、128ビットハッシュの場合、約64ビットを取得すると、1回の衝突が発生する可能性が中程度です。ですから、私の推測では、8バイト文字列の完全なセットの場合は衝突が発生する可能性が高く、9バイト文字列の場合は非常に可能性があります。
edit:これは、MD5ハッシュアルゴリズムにより、入力バイト文字列から「ランダム」に近い出力ハッシュへのマッピングが発生すると想定しています。 (可能なハッシュのセット間で文字列をより均等に分散するものと比べて、その場合は16バイトにより近くなります。)
また、より具体的な数値の答えについては、衝突確率を計算するために 近似の1つ を見ると、次のようになります。
p(k)≈1-e-k(k-1)/(2 * 2128) ここで、k =入力可能なスペースのサイズ= 2メートル ここで、入力バイトストリングはmビット長です。
8バイト文字列のセット:p(264)≈1-e-0.5 ≈0.3935
9バイト文字列のセット:p(272)≈1-e-2144/(2 * 2128) = 1-e-215 = 1-e-32768 ≈1
また、これらはm/8バイト文字列のcompleteセットを想定していることに注意してください。英数字のみを使用する場合は、衝突が発生する可能性があるため、さらに多くのバイトが必要になります。
衝突が発生する可能性のない長さがあるかどうかは疑問です。これらのアルゴリズムは実際にはその目的には使用されません。これは、考えられるすべてのデータセットに対して一意ではなく、データのわずかな変更(破損したファイルなど)に対して一意になるようにすることを目的としています。