MD5変換に不動点はありますか?つまり、md5(x) == x
などのxが存在しますか?
MD5の合計は128ビット長であるため、固定小数点も128ビット長でなければなりません。任意の文字列のMD5合計がすべての可能な合計にわたって均一に分布していると仮定すると、特定の128ビット文字列が固定小数点である確率は 1/2128。
したがって、128ビット文字列が固定小数点ではない確率は(1 − 1/2128)2128、したがって、不動点が存在する確率は11- 1---(/2128)2128。
Nとしての制限は(1- 1/n)n は 1/e、および2128 確かに非常に大きな数であり、この確率はほぼ正確に1です- 1/e ≈63.21%。
もちろん、実際に関与するランダム性はありません。不動点が存在するか、存在しないかのどちらかです。しかし、固定点があると確信できるのは63.21%です。 (また、この数値はキースペースのサイズに依存しないことに注意してください。MD5の合計が32ビットまたは1024ビットであれば、約4または5ビットよりも大きい限り、答えは同じになります)。
私のブルートフォースの試みでは、12のプレフィックスと12のサフィックスが一致することがわかりました。
プレフィックス12:54db1011d76dc70a0a9df3ff3e0b390f-> 54db1011d76d137956603122ad86d762
サフィックス12:df12c1434cec7850a7900ce027af4b78-> b2f6053087022898fe920ce027af4b78
ブログ投稿: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN
ハッシュは元に戻せないため、これを把握するのは非常に困難です。これを解決する唯一の方法は、ハッシュのすべての可能な出力でハッシュを計算し、一致するかどうかを確認することです。
詳述すると、MD5ハッシュには16バイトがあります。つまり、2 ^(16 * 8)= 3.4 * 10 ^ 38の組み合わせがあります。 16バイト値でハッシュを計算するのに1ミリ秒かかった場合、それらのすべてのハッシュを計算するには10790283070806014188970529154.99年かかります。
私はyes/noの答えを持っていませんが、私の推測は「yes」であり、さらに2 ^ 32個のそのような固定小数点があるかもしれません(文字列の解釈ではなくビット文字列の解釈のため)。私はこれに積極的に取り組んでいます。なぜなら、多くの創造性を必要とする素晴らしく簡潔なパズルのように見えるからです(すぐにブルートフォース検索に落ち着かない場合)。
私のアプローチは次のとおりです。数学の問題として扱います。 128個のブール変数と、入力(一致することになっている)に関して出力を記述する128個の方程式があります。アルゴリズムのテーブルのすべての定数とパディングビットをプラグインすることで、128ビット入力の場合に最適化されたアルゴリズムを生成するために方程式を大幅に簡略化できることを期待しています。これらの簡略化された方程式は、効率的な検索のためにニース言語でプログラミングしたり、一度に1ビットずつ割り当てたり、矛盾に注意したりして抽象的に処理することができます。入力と一致していないことを知るために、出力の数ビットを見るだけです!
x =e215962017
md5(x x)== => true PHPゆるいコンパレータなので。