2つの異なるメッセージAとB(サイズが重要な場合はおそらく20〜80文字のテキスト)が与えられた場合、AのMD5ダイジェストがBのMD5ダイジェストと同じである確率はどれくらいですかおよび = AのSHA1ダイジェストはBのSHA1ダイジェストと同じですか?あれは:
(MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B))
悪意がない、つまり、衝突を見つける目的でメッセージが選択されていないと想定します。これが自然に起こる確率を知りたいだけです。
「天文学的に低い」可能性は低いと思いますが、どうやって確認すればいいのかわかりません。
詳細:可能なメッセージのプールのサイズは制限されていますが、大きいです(数億)。誕生日のパラドックスの状況はまさに私が心配していることです。
ランダムな文字列に対してMD5およびSHA-1ハッシュの範囲で均一に広がると仮定し(そうではありません)、2つの文字列についてのみ話し、文字列のプールについては話していないと仮定します(したがって、誕生日のパラドックスを回避します) -タイプの複雑さ):
MD5ハッシュの幅は128ビットで、SHA-1の幅は160です。上記の仮定では、2つの文字列AとBは、両方のハッシュが衝突した場合にPと衝突する可能性があります。そう
P(both collide) = P(MD5 collides) * P(SHA-1 collides)
そして
P(MD5 collides) = 1/(2^128)
P(SHA-1 collides) = 1/(2^160)
そう
P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87
繰り返しますが、文字列のプールがあり、プールとの衝突の確率を決定しようとしている場合、あなたは 誕生日のパラドックス の領域にいます。ここで計算したこの確率は適用されません。それとハッシュは、本来あるべきほど均一ではありません。実際には、衝突率ははるかに高くなりますが、それでも小さいでしょう。
[〜#〜]編集[〜#〜]
誕生日のパラドックスの状況を扱っているので、ソリューションと同じロジックを誕生日のパラドックスに適用します。 1つのハッシュ関数の観点から見てみましょう。
N := the number of hashes in your pool (several hundred million)
S := the size of your hash space (2^288)
Therefore,
P(There are no collisions) = (S!)/(S^N * (S - N)!)
2 ^ 29(約5億3000万)のような素敵な偶数のハッシュがあるとしましょう。
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)
要するに、私はこの数を計算することさえ考えたくありません。どうすれば見積もることができるのかさえわかりません。少なくとも、死ぬことなく巨大な階乗を処理できる任意精度の計算機が必要です。
確率は、N = 1 or 2
のときはほぼ0から始まり、N >= 2^288
のときは1に達する曲線に従うことに注意してください。これは、誕生日のパラドックスのWikipediaページにあるものと似ています。
誕生日のパラドックスは、P = .5
のときにN = 23
に達します。つまり、NがSの6%の場合、衝突の確率は50%です。それがスケーリングする場合(スケールするかどうかはわかりません)、次の場合に衝突の確率は50%になることを意味します。 2 ^ 288ハッシュの6%。 2 ^ 288の6%は約2 ^ 284です。 N(数億)の値はそれに近いものではありません。 Sに比べればほとんど意味がないので、心配する必要はないと思います。衝突の可能性はほとんどありません。
ウェルボグの投稿への補遺:
大きな階乗の比率は、 スターリングの近似 を使用して、任意精度の算術を使用せずに計算できます。
n! ≈sqrt(2πn)*(n/e)n
したがって、(S!)/(S ^ N *(S-N)!)≈sqrt(2πS)/ sqrt(2π(S-N))*(S/e)S/((S-N)/ e)S-N/ SN
= sqrt(S /(S-N))*(S /(S-N))S-N * e-N
= sqrt(1 +α)*(1 +α)S-N * e-N ここで、α= N /(S-N)は小さいです。
近似(1 + a/n)nx ≈e斧 n→∞として成り立つ(または少なくとも非常に大きくなる)
**つまり、これは(1+(N /(S-N)))を意味しますS-N ≈eN S-N >> Nの場合。
だから私はそれを期待します
(S!)/(S ^ N *(S-N)!)≈sqrt(1 + N /(S-N))* eN * e-N = sqrt(1 + N /(S-N))for S-N >> N..。
これが1より大きいことを除いて...したがって、近似の1つは十分ではありません。 :p
(**警告:N/Sは小さくする必要があります:N = 22、S = 365の場合、これは2倍ずれています)
メッセージサイズが制限されていない場合、可能なメッセージの数とハッシュの数は無限であるため、確率は100%漸近的に近づきます。
(注:質問を編集すると、これは関連性が低くなります)
一般に、N個の要素をランダムに選択すると、衝突の確率よりも予想される衝突の数を計算する方が簡単です。予想される衝突の数は衝突の確率よりも小さくすることはできないため、適切な上限として頻繁に使用できます。
pは、ランダムに選択された2つの要素が衝突する確率であると想定します。 N個のランダムな要素を選択すると、N *(N-1)/ 2の要素のペアが存在するため、予想される衝突の数は次のようになります。
p * N *(N-1)/ 2。
たとえば、MD5とSHA1の両方の衝突の確率がp = 2であると仮定した場合-288 その後、ランダムに2を選んだ後でも100 私たちがまだ期待している要素は約2つだけです-89 衝突。
別の例:2を選択した場合30 ランダムな要素であり、MD5のみを計算します。 2つのMD5ハッシュ間の衝突がp = 2であると仮定します-128 これにより、予想される数は2になります。-59 衝突の数。したがって、MD5ハッシュが2つの入力に対して衝突する確率でさえ、すでに非常に小さいです。
間違った確率を使用しているため、選択した回答は正しくありません。私は今日のかなりの部分をこれの調査に費やしました(その答えへのコメントで私の思考プロセスを見ることができます)、そして実際の答えは次のとおりだと信じています(あなたが話しているものよりわずかに大きいメッセージの誕生日攻撃の場合) :
2 ^ -61 * 2 ^ -18 = 2 ^ 79に1回の衝突。
そして、それはこれらの確率を掛けるだけで大丈夫な場合です(私はそれがわかりません)。
これは、今日のスーパーコンピューターで実行可能です(数か月未満で毎年減少します)。
これは、(誕生日のパラドックスを意味のあるものにするために)十分に大きなメッセージのプールに基づいていることに注意してください。これはあなたが心配しているとあなたが言ったシナリオでもあります。
ここで、別の状況は、特定のメッセージのハッシュのペア(SHA1とMD5)の衝突を見つけることです。これはあなたをbdayパラドックスの領域から連れ出し、桁違いに困難です。それが2 ^(-61 * 2)* 2 ^(-18 * 2)なのか他の何かなのかわかりません。 誰かがそれが何であるかを知っているなら、この答えにコメントを投稿してください(非常にありがたいです!)
今あなたは尋ねます:
AとBの2つの異なるメッセージが与えられた場合(サイズが重要な場合は、おそらく20〜80文字のテキスト)
はい、サイズは重要です。 2 ^ -18の図へのリンクをクリックすると、値が2つの入力ブロックのものであることがわかります。 MD5では、入力ブロックは512バイトです。 20〜80文字のテキストはそれには小さすぎ、単一ブロックの値は2 ^ 41です。
したがって、その量のデータに対して、2 ^ -61(私は思う)* 2 ^ -41 = 2 ^ -102を取得します。
したがって、そのサイズの場合は 安全と思われます (リンクには、SHA256の現在のビットコインハッシュレートの2倍の数値が含まれています:46626.93TH /秒)。