MD5固定小数点はmd5(x)== xですか?


114

MD5変換に固定点はありますmd5(x) == xか?つまり、xは存在しますか?


8
どのmd5変換ですか?数学的なもの(任意のビット文字列から128ビットまで)または任意のバイト文字列から32文字の16進数文字列まで(実際的なもの)?...それらの両方のための答えが同じであることは明らかではありません
ラファウDowgird

4
まあ、彼らはある右、同じ答え? 128ビット長md5(x) == xであるためmd5(x) 128ビット長でないxは存在しません。したがって、128ビットドメインのmd5に固定小数点がある場合のみ、任意のサイズの入力に対してmd5に固定小数点があります。
ポール、

1
実際の32文字の16進文字列では、16進数字を大文字[AF]で表すか小文字[af]で表すかは任意の選択であるため、同じ答えだとは思いません。どちらの表現も同じ128ビット数に対応しますが、MD5への入力として提供されると、異なるハッシュが生成されます。内の固定点がある確率だからどちらかの表現のは事実である1-(1/e)*(1/e) ≈ 86.47%
斗山

回答:


138

MD5合計は128ビット長であるため、固定小数点も必ず128ビット長である必要があります。任意の文字列のMD5サムが均一にすべての可能な和に分配されると仮定すると、次に、任意の128ビットのビット列が固定点である確率は1 / 2 128

したがって、全く128ビット列が固定小数点ではない確率は(1 -であり、1 / 2 1282 128、固定点が存在する確率が1になるように- (1 - 1 / 2 1282 128

nが無限に行くように制限するので(1 - 1 / NNである1 / E、及び2 128 -最も確かに非常に多数であり、この確率は、ほぼ正確に1である1 / E ≈63.21パーセント。

もちろん、実際にランダム性が関与することはありません。固定小数点がある場合とない場合があります。しかし、定点があると63.21%確信できます。(また、この数はキースペースのサイズに依存しないことに注意してください。MD5の合計が32ビットまたは1024ビットの場合、約4または5ビットよりも大きい限り、答えは同じになります)。


11
実際に、任意の文字列のMD5合計がすべての可能な合計に均一に分散されていると想定できますか?
Ori Pessach、2009年

13
はい。大きな数とモジュラスは、ほぼランダムな分布を形成します。そうしないと、衝突が頻繁に発生します。md5の性質により、出力はランダムに分散されます。
ステファンケンドール

2
:私はこの答えのベースとしてあなたの答えを使用security.stackexchange.com/questions/3851/...
CesarB

1
ここに、金のバッジがあります。
Dennis

ただし、md5はランダムではなく確定的です。
PyRulez 2016年

13

私のブルートフォースの試みで、12のプレフィックスと12のサフィックスの一致が見つかりました。

接頭辞12:54db1011d76dc70a0a9df3ff3e0b390f-> 54db1011d76d137956603122ad86d762

サフィックス12:df12c1434cec7850a7900ce027af4b78-> b2f6053087022898fe920ce027af4b78

ブログ投稿:https : //plus.google.com/103541237243849171137/posts/SRxXrTMdrFN


リンクが機能していません。グーグルプラスは4月に閉鎖
Typewar

すみません...ブログ投稿を保存しておらず、google +バックアップが機能していません。しかし、これが私のgithubプロジェクトです:github.com/thomasegense/MD5FixPointSearch
Thomas Egense

これでよろしいですか:接頭辞12:54db1011d76dc70a0a9df3ff3e0b390f-> 54db1011d76d137956603122ad86d762 md5sumlinuxコマンドを使用しました。異なる結果が表示されました
ThunderPhoenix

正しいmd5sumを使用していることを確認してください。オンラインで確認することもできます:onlinemd5.com
Thomas Egense

11

ハッシュは元に戻せないため、これを理解するのは非常に困難です。これを解決する唯一の方法は、ハッシュの可能なすべての出力でハッシュを計算し、一致するかどうかを確認することです。

詳しく説明すると、MD5ハッシュには16バイトあります。つまり、2 ^(16 * 8)= 3.4 * 10 ^ 38の組み合わせがあることを意味します。16バイトの値のハッシュを計算するのに1ミリ秒かかった場合、すべてのハッシュを計算するのに10790283070806014188970529154.99年かかります。


2
確かに、すべてを試す必要がある場合は。しかし、すべての可能な入力を試して、不動点がないことを確認するだけで済みます。不動点がある場合(そして、Adam Rosenfieldの回答が存在する可能性があることを示唆している場合)、必要なのは1つの幸運な推測だけです。
ナフ2009年

この関数は、数学的反転がないという意味で不可逆ですが、これは、特定の出力に対して複数の入力が存在する可能性があることを意味するだけです。一般に、特定の出力の入力のスペースは無限ですが、128ビット値として開始されていることがわかっている場合は、可能性を絞り込むことができます。関数をブラックボックスとして扱わずに、仕様を読んで数学的な考え方を適用すると、「逆方向に機能する」可能性があります。
rndmcnlly 2009年

2
@Naaff:「可能なすべての入力を試すだけでよい」-これはすべてのハッシュを試すより簡単です、どうですか?複数の可能な入力が同じ出力にハッシュされる可能性があるため、まったく逆です。
Piskvorが建物

1
@Piskvor:あなたはNaaffの意味を誤解しました(私にも1分かかりました)。「不動点がない場合にのみ、2 ^ 128のスペースから)可能なすべての入力を試してみてください。言い換えれば、それ以前にうまくいかなかった場合にのみ、あらゆる可能性を試す必要があります。したがって、1.08e28年、または幸運な推測です!
Pダディ

「ハッシュの計算に1ミリ秒かかった場合」。最近のGPUは1秒あたり数十億のハッシュを計算でき、これよりもはるかに高速です。しかし、それでも非常に長い時間がかかります。
markasoftware 2017年

0

はい/いいえの答えはありませんが、私の推測は「はい」であり、さらに(文字列解釈ではなく、ビット文字列解釈のために)2 ^ 32のような固定点がある可能性があります。私はこれに積極的に取り組んでいます。それは、多くの創造性を必要とする素晴らしい簡潔なパズルのように思えるからです(もしあなたがブルートフォースの検索にすぐに満足しない場合)。

私のアプローチは次のとおりです。それを数学の問題として扱います。128個のブール変数と、(一致するはずの)入力に関して出力を表す128個の方程式があります。アルゴリズムのテーブルからすべての定数とパディングビットを挿入することで、方程式を大幅に簡略化して、128ビット入力の場合に最適化されたアルゴリズムを生成できることを願っています。これらの簡略化された方程式は、効率的な検索のためにいくつかの素晴らしい言語でプログラムすることができます。または、抽象的にもう一度処理して、一度に1ビットずつ割り当て、矛盾を監視します。あなたはそれが入力と一致していないことを知るために出力の数ビットを見る必要があるだけです!


これは本当に興味深いです。この道を進んでいく際の進捗状況を教えてください。
user230910

-1

おそらく、それを見つけるのに私たちが持っているよりも時間がかかるか、MD5の妥協が必要になるでしょう。


6
壊れていません。彼らができることは、妥当な時間内に、同じハッシュに等しい2つの文字列を生成することです。特定のハッシュに相当する文字列を生成することはまだ非常に困難です。
Kibbee

9
MD5に妥協するよりもMD5に危害を加える方法がわからない(MD5に言った場合、アルゴリズムが危うくなる)( "速い茶色のキツネは怠惰な犬を飛び越える")= 9e107d9d372bb6826bd81d3542a419d6
Kip

5
固定小数点は、おそらくMD5のより包括的な違反につながる可能性のある数学をある程度活用するでしょう。Glomekが本当に「おそらく」正当化できるとは私は確信していません。私は疑いなく「多分」を受け入れます。
ジョナサンレフラー、

-9

2つの解釈があり、いずれかを選択できる場合、固定小数点を見つける確率は81.5%に増加します。

  • 解釈1:バイナリの MD5出力のMD5はその入力と一致しますか?
  • 解釈2:16進の MD5出力のMD5はその入力と一致しますか?

13
16進数を意味するMD5アルゴリズムについては何もありません。これはバイトを操作し、バイトを生成するため、後者の解釈は無効だと思います。
ニックジョンソン

解釈1に不動点があるかどうかにかかわらず、解釈2がまだ存在する(または存在しない)可能性があります。ただし、問題を調査することに関心がある場合、解釈1は勝ったため、はるかに良い出発点と思われます。大文字小文字の区別と文字エンコーディングについて、あらゆる種類の恣意的な決定を行う必要はありません。その上、バイナリの場合はビットが少なくなります!
rndmcnlly 2009年

4
あなたはヘクスが何であるかを誤解しています。10進数、8進数、または基数3で表すことができるのと同じように、2進数を16進数で表すことができます。これは数値であり、表現が異なります。したがって、解釈1と2は同じものです。あなたが考えているのは、文字列表現です。これはまったく同じ16進数ではなく、完全に異なるバイナリ値です。実際、さまざまな文字セットでさまざまな16進文字列を使用できます。128ビットのハッシュ値は「16進数」の文字列として表すことができますが、文字列とは異なります。文字列は同じバイナリデータではありません。
定義

ダスティン、解釈2は、実際には表示文字列のMD5を意味します。
ジョシュア

4
ただし、この方法には文字エンコーディングに直接依存するという大きな問題があります。エンコーディングスキーマが異なると、結果セットもまったく異なります。プロジェクト全体とMD5がどのように動作するかのこの誤解に基づいて、それを暴く記事にもありますacodingfool.typepad.com/blog/2009/05/the-kembler-identity.htmlは
定義されて

-23

厳密に言うと、MD5の入力は512ビット長で、出力は128ビットなので、定義上それは不可能だと思います。


4
いいえ、1バイト文字列のMD5が存在します。
ジョシュア

7
入力は任意のサイズにすることができます。入力が512バイト未満の場合、パディングされますが、小さい入力も許容されます。ウィキペディアから:「MD​​5は可変長メッセージを128ビットの固定長出力に処理します。入力メッセージは512ビットブロック(16個の32ビットリトルエンディアン整数)のチャンクに分割されます。メッセージは次のように埋め込まれます。その長さは512で割り切れます。」
ナフ2009年

したがって、たとえば0000000001 = 1と仮定します。せいぜい、質問の指定が不十分であると私は主張する。
Ori Pessach、2009年

11
MD5への入力は128ビットにすることができます。MD5がその入力をパディングしたいのであれば、正直なところ、それはMD5のビジネスです。入力はまだ明確に定義されています。同様に、出力は明確に定義された128ビットです。(明確な)入力と(明確な)出力が両方とも同じ場合、MD5(x)= xです。
ナフ2009年

2
@Joshua空の文字列(つまり0バイト)のMD5も存在します
Kip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.