質問

私は、MD5ハッシュに関するWikipediaの記事を読んで、私はまだハッシュが元のテキストに背を「再構成」することができない方法を理解することはできません。

誰かがどのようにこの作品の暗号についてはほとんど知っている人に説明してもらえますか?機能のどのような部分は、それ一方通行のでしょうか?

役に立ちましたか?

解決

誰もが今まで単にハッシュ関数が何であったか定義されているので、

、私は噛まされます。

は、一方向関数は、単にハッシュ関数ではない - の情報を失う機能 - しかしための機能f、画像y(「SE」または既存の回答294)が与えられると、見つけることは困難ですプレ画像Xようf(x)=y

これは、なぜ彼らが呼ばれている一方通行:あなたが画像を計算することができますが、あなたが与えられた画像のためのプレ画像を見つけることができません。

既存の答えに、今まで提案されている通常のハッシュ関数はいずれもこの特性を持っていません。それらのどれも、一方向暗号化ハッシュ関数ではありません。例えば、所与の「SE」は、簡単入力「SXXXE」、プロパティで入力を拾うことができるX-コード(「SXXXE」)= SE

何の「シンプル」一方向関数はありません。彼らはとてもよくするだけでなく、あなたが、出力にはまったくの入力を認識しませんが、を使用すると、別の入力を認識しないことを、それらの入力をミックスしなければならないのいずれか。

、SHA-1およびMD5は、人気の一方向関数であるために使用されるが、彼らは両方ともほぼ壊れた(与えられた画像のために事前にイメージを作成するにはどのように専門家のノウハウ、またはほぼそうすることができます)です。 SHA-命名される新しい標準のものを、選択する進行中のコンテストがあります3 のます。

一方向関数を反転させる明白なアプローチは、多くの画像を計算し、各画像にそれを作製プレ画像を関連付けるテーブルでそれらを維持するであろう。実際には、これは不可能にするために、すべての一方向関数が大きな出力を持って、少なくとも64ビットではなく、おそらくはるかに大きい(最大512ビット、たとえば、へ)。

EDIT:?どのようにほとんどの暗号ハッシュ関数の作業を行います。

通常彼らはコアにビットのブロック(ブロック暗号に変換を複雑ない単一の機能を有しますを)。機能はほぼ全単射でなければなりません(それは後で弱点を引き起こすので、それは、同じ画像にあまりにも多くのシーケンスをマッピングするべきではありません)が、それは正確に全単射である必要はありません。そして、この関数は認識することは不可能で入力(または任意の可能な入力)を作るのに十分な一定の回数を、反復されます。

かせに、SHA-3のコンテキストのための強力な候補の一つの例を見てみましょう。そのコア機能は、72回繰り返されます。機能のノウハウのクリエイターが、時にはいくつかの入力に出力を関連付けるためにどのようにそのための反復の数だけでは彼らはそれが2.9の「安全係数」を持っていると言う25です。

他のヒント

本当に基本的なハッシュを考える - 入力文字列のために、各文字のASCII値の合計を返します。

hash( 'abc' ) = ascii('a')+ascii('b')+ascii('c')
              = 97 + 98 + 99
              = 294

さて、294のハッシュ値を考えると、あなたは元の文字列が何であったかわかりますか?明らかではない、なぜなら「ABC」と「CBA」(および無数の他)同じハッシュ値を与えます。

暗号ハッシュ関数は明らかにアルゴリズムがはるかに複雑であることを除いて、同じように動作します。またsにハッシュすることを別の文字列は、の構造のに(「計算不可能」)があり、常に衝突になるだろうされていますが、hに文字列のhハッシュを知っていれば、それは非常に困難である必要があります。

複雑な説明をするのではなく、ここでは、単純なアナロジーのために射撃ます。

二つの部分、一方向の操作やハッシュへのダウン対象とレッツ・ブレークを起動するには、

。どのような一方向の操作であり、なぜあなたは1をしたいですか?

一つの方法操作は、それらが可逆的ではないためということと呼ばれています。剰余除算を逆にすることはできませんしながら、加算や乗算などのほとんどの一般的な操作を逆にすることができます。なぜそれが重要なのでしょうか?あなたは、元の入力と2なしで複製することは困難である1)の出力値を提供したいので)出力から入力を把握する方法を提供していません。

リバーシブル

追加

4 + 3 = 7  

これは和をとると加数のいずれかを減算することによって反転させることができる

7 - 3 = 4  

を乗算

4 * 5 = 20  

これは要因の一つによって生成物を取り出し、分割することにより反転させることができる

20 / 4 = 5

未リバーシブル

モジュロ除算する

22 % 7 = 1  
あなたが除数(またはその逆)を再構成する商と配当に行うことができます何も操作がないため、

これが逆転することはできません。

あなたはどこに埋めるために運転見つけることができます「を?」ありますか?

1  ?  7 = 22  
1  ?  22 = 7
そのされた状態で

は、一方向ハッシュ関数は、モジュロ除算と同じ数学的な品質を持っている、と述べました。

は、なぜこの重要なのですか?

私はあなたに千個のロッカーを持ってバスターミナルでロッカーの鍵を与え、私の銀行家にそれを提供するために、あなたを尋ねたとしましょう。あなたがいない不審言及し、あるスマートな男なので、あなたはすぐにロッカー番号がキーに書かれているかを見るために、キーになります。これを知って、私はいくつかのよこしまな事をやりました。第Iは、第Iが有するバスターミナルを選択し、モジュロ除算を用いて分割が私に1〜1000の範囲の数を与えたときに、第Iは、元番号を消去し、その上に数字の組から除数を書いていること二つの数字を発見しました唯一の人々は、彼は彼が余り出て数学やフィギュアを行うと、開くためにどのロッカー知ることができるキーを取得したときに第三バンカーがまだ配当を知って、自分のキーで1つのロッカー日を試すせることにより、悪党からロッカーを保護守ります。

私は賢明オペランドを選択した場合は、私はあなたがそれぞれのロッカーをしようとする勢力商と配当との間に1対1の関係に近い得ることができますので、回答スプレッド希望番号の範囲を超える可能な入力の結果、ターミナルで利用できるロッカー。基本的に、それはあなたが、オペランドのいずれかを知っている場合でも、残りの部分についての知識を習得できないことを意味します。

だから、今私は、「信頼」は、あなたが簡単にそれが属するロッカーに推測できることを気にせずにその正当な所有者への鍵を提供することができます。確かに、あなたはすべてのロッカーを検索力をブルートことができますが、それは、ほぼ3年の私の銀行家の鍵を使用してロッカーを空にするための十分な時間を取るだろう。

異なるハッシュ関数の詳細仕様については他の回答を参照してください。

ここでは非常に簡単な例です。私は最初の暗号研究だと仮定し、私は以下のことを行い、ハッシュ関数を作成します:

int SimpleHash(file) {
    return 0 if file.length is even;
    return 1 if file.length is odd;
}

が今ここにテストがあります。SimpleHash(specialFile)が0であるの

?私の元のファイルは何でした (あなたはおそらく私のハッシュがファイルの長さに基づいていることをかなり簡単に発見することができますが)

はもちろん、知る方法はありません。ハッシュが私のファイルがやったことのすべてを含んでいないので、ハッシュに基づいて、私のファイル「再形成」する方法はありません。

のハッシュは(非常に)非可逆符号化である。

X-エンコーディングと呼ばれる5文字の単語の架空の2文字のエンコーディングを想像して、あなたにシンプルな例を与えるために。 X-エンコーディングのためのアルゴリズムは単純です:単語の最初と最後の文字を取る

だから、

X-encode( SAUCE ) = SE
X-encode( BLOCK ) = BK
明らかに、あなたはそのエンコーディングSEからSAUCEを再構築することはできません(可能な入力の私達の範囲を想定し、すべての5文字の単語です)。言葉は同じように簡単にSPACE可能性があります。

余談として、

、SAUCEとSPACEのエンコーディングとして、両方の農産物SEは、をの衝突と呼ばれているという事実は、あなたはX-ecodingは非常に良いハッシュをすることはないだろうことがわかります。 :)

簡単に言えば、ハッシュ関数は、入力データの大きなもつれた混乱を作ることによって動作します。

たとえば MD5 のを参照してください。これは、512ビットのブロックによって入力データを処理します。各ブロックは16の32ビットワードに分割されます。 64段階、16入力ワードのいずれかを使用して、各ステップがあります。だから、それぞれの単語は、アルゴリズムのコースの中に4回使用されています。一方向性がどこから来るかである:任意の入力ビットは、いくつかの場所で入力され、一緒にすべての二つのそのような入力機能ミックス現在のデータとの間のように、ほとんどの128ビットの走行状態の各入力ビットの影響。データの一部だけを見ることで、機能を反転、または衝突の計算からこれを防止できます。あなたは全体の128ビットを見ていると、128ビットのブロックのスペースには、ウォークスルー、効率的であるには余りにも広います。

その関数の衝突が見つけることができるので、

さてMD5は、それで良い仕事をしません。ビューの暗号研究の点からは、MD5が回転し、暗号化機能です。 1個のメッセージブロックM(512ビット)の処理は、入力状態V(128ビット値)を使用し、「V」として新しい状態Vを計算= 『+』は、言葉のあるV + E(M、V)賢明加え、そして「E」は暗号化されるメッセージとキーとVとしてMを使用して(「ブロック暗号」別名)対称暗号化関数であることを起こります。詳しく見てからは、E缶は、四方の代わりに、二つの半分で、DESブロック暗号と同様に、「Feistel構造を拡張」の一種です。詳細はここでは重要ではありません。私のポイントは、(「マークル-Damgård」と呼ばれる)は、その構造を使用するハッシュ関数の中で「良い」ハッシュ関数を、作るもの、ブロック暗号「セキュア」を作るものに類似していることです。 MD5利用差分解読法で成功衝突攻撃、最初の場所でブロック暗号を攻撃するように設計されたツールます。

良いブロック暗号から良いハッシュ関数に、却下されるべきでないステップがあります。マークル-Damgård構造では、ハッシュ関数は、基礎となるブロック暗号は、対称暗号化のために、関連する主要な攻撃はほとんどすべての実用的なを持っているので、ブロック暗号はほとんど強化されていない、これに対して、むしろ無名のプロパティ「関連鍵攻撃」に耐性がある場合には安全です影響。例えば、AES暗号化がために望んだことができ、これは一般的なパニックをトリガしませんでしたとして、関連する主要な攻撃に耐性のようにではない判明しました。その抵抗は、AESが設計されたときのために求められたプロパティの一部ではなかったです。それはちょうど、ハッシュ関数にAESを回して防ぐことができます。ラインダールの誘導体の上に構築ワールプールと呼ばれるハッシュ関数は、あり、「Rijndaelの」AESになったものの最初の名前であること。しかし、ワールプールは、関連する主要な攻撃に弱いラインダールの部分を修正するために世話をします。

また、ハッシュ関数を構築するために使用することができる他の構造があります。現在の標準関数(MD5、SHA-1、及び "SHA-2" ファミリー、SHA-224別名、SHA-256、SHA-384およびSHA-512)は、マークル・Damgård関数であるが、多くは、あろう後継者ではありません。 「SHA-3」と名付けられ、新しい標準ハッシュ関数を選択するためのNIST(物事のようなものを扱う米国連邦機関)主催の継続的な競争が、あります。詳細については、このページ rel="noreferrer"> から14件の候補にダウンしています

レッツは今より概念的な顔をしています。 Oracleは、入力として、メッセージ M を与えられたとき、回答 H(Mを出力し、ブラックボックスである:セキュアハッシュ関数は ランダムオラクルのようになります)(出力空間内に、一様に、ランダムに選択され、すなわち、すべての N のビット列のハッシュ関数の出力長が N の)。同じメッセージ M の指定された場合、再度入力と、Oracleは、以前と同じ値を出力します。それ以外に制限から、非以前に使用した入力のOracleの出力 Mはは予測不可能です。彼は彼の神託の契約を尊重するように一つは、サイコロを投げるGNOME用のコンテナとしてOracleを想像して、慎重に大きな本で入力メッセージとそれに対応する出力を記録することができます。 GNOME自身がそれを知らないので、次の出力がどうなるかを予測する方法はありません。

ランダムオラクルが存在する場合は、

は、その後、ハッシュ関数を反転することは、コスト、の2 ^ n個を持っている:1つの利回りが期待されるまで、指定された出力を持つために、異なる入力メッセージを使用するよりは良い戦略ではありません値。一様ランダム選択のために、成功の確率は各試行で 1 /(2 ^ N)は、平均への要求の数ダイススローGNOMEがあること 2 ^ Nであろうの。衝突(同じハッシュ値が得られる二つの別個の入力を求める)ため、コストが(N / 2)*(約我々ができ、* 1.4 * 2 ^(N / 2)*を出力して、話す^ 2 * 1.4 *程度であります 2 ^ n個の出力ののペア、同じ出力を有する2つの別個の入力を有するマッチングの 1 /(2 ^ N)の確率をそれぞれ有する、IE)について組み立てます。これらは、ランダムオラクルで行うことができる最高です。

そこで、私たちはランダムオラクルとして良好とされているハッシュ関数を探します。彼らは我々がより効率的に、それは単に機能のinvoke のに費用がかかるものよりも衝突を見つけることができないような方法で入力されたデータを混在させる必要があります2 ^(N / 2)の回。ハッシュ関数の悩みの種は、数学的構造、すなわち、攻撃者は、ハッシュ関数の内部状態を表示することを可能にするショートカットである(大きい少なくとも N のビット)Aに住んで数学的対象のバリエーションとしてはるかに短いスペース。対称暗号化システムでの公的研究の30年を適用することができる概念とツール(拡散、雪崩、格差、直線...)の全体の道具を生産しています。ボトムラインは、しかし、我々はランダムオラクルが実際に存在しうるという証拠を持っていないということです。私たちはは攻撃することはできません。のハッシュ関数たいです。私たちは、を何を持っているのいかなる攻撃が現在ありませんいるハッシュ関数の候補は、あるの知られているの、そして、やや良く、我々はいくつかの機能を持っている<はem>のいくつかの
の種類について攻撃のない仕事に証明することができます。

は、まだやるべきこといくつかの研究があります。

配列
 いくつか目を細めで、連想配列は、非常に多くのハッシュのように見えます。大きな違いは、ハッシュ名の%記号の欠如だった、と1しか彼らに一度に一つのキーを割り当てることができること。このように、一つは$foo{'key'} = 1;を言うだろうが、唯一の@keys = keys(foo);。彼らは今(および削除はPerlの2で追加されました)として働いていた各、キー、および値などのおなじみの機能ます。

のPerl 3三の全体のデータ・タイプを持っていた:それは(今タイの非推奨)全体ハッシュを一度に割り当てることが許され、そしてdbmopen加え、ハッシュ名の%シンボルを有していました。 Perlの(今よりよい配列参照して処理される)多次元配列をエミュレートするために使用される4カンマで区切られたハッシュキー

のPerl 5は、ハッシュとして連想配列を参照の大きな飛躍を取りました。 (私の知る限り、むしろ「ハッシュテーブル」または同様の何かよりも、このようなデータ構造を参照している最初の言語である。)やや皮肉なことに、それはまたhv.c.にhash.cから関連するコードを移動しました

命名
辞書には、先に説明したように、一意キーでインデックス付け値の順不同の集合です。彼らは時々連想配列またはマップと呼ばれています。彼らはいくつかの方法で、ハッシュ・テーブルと呼ばれるデータ構造を使用して(これはPerlがハッシュというものである)であるのいずれかで実施することができる。

ハッシュ関数の出力はまた、時々(特に暗号の文脈で)ハッシュと呼ばれているので、ハッシュテーブルは通常、どこでもハッシュと呼ばれていないため、用語「ハッシュ」のPerlの使用は、いくつかの潜在的な混乱の源であります他ます。

は、ハッシュテーブルなどのデータ構造を参照して、安全側にある、とのみ明らか、Perlの固有の文脈において、用語「ハッシュ」を使用する。

scroll top