web-dev-qa-db-ja.com

暗号化ハッシュ関数のプロパティ

ビットコインコースのコースの第1週の講義では、暗号化ハッシュ関数の3つの特性についての議論があります。

衝突耐性:ハッシュ関数Hは、xとyの2つの値を見つけることが不可能で、x!= yでありながらH(x)= H(y)である場合、衝突耐性があると言われます。

非表示:ハッシュ関数Hは、次の場合に非表示になります。秘密値rが高いエントロピーを持つ確率分布から選択された場合、H(r‖x)が与えられると、xを見つけることが不可能になります。 ‖は、2つの文字列の連結を意味します。

パズルの親しみやすさ。ハッシュ関数Hは、可能なすべてのnビット出力値yに対して、エントロピーの高い分布からkを選択した場合、H(k friendly x)= yとなるようなxを見つけることが不可能である場合、パズルに適すると言われています。やがて2 ^ nを大幅に下回る。

パズルの親しみやすさは、非表示のより詳細な説明のようです。 2つの間に大きな違いはありますか?両方ではなく1つのプロパティを持つハッシュ関数はありますか?

23
user2191332

私は同じ考えを持っていました、そしてその違いは確かに微妙です。しばらく考えてみました。

BadHashというハッシュがあるとしましょう。 x 'とランダムなノンスr'を選択し、y '= BadHash(r' | x ')を計算して、y'を与えます。 x 'がUTF8でエンコードされた英語のテキストである場合、x'が何であったかを伝えることができます(厳密には必要ではありませんが)、r 'を伝えることさえできます。 x 'が偶然ランダムなビット文字列である場合、私は運が悪いでしょう。しかし、とにかく、これは明らかに隠れたハッシュではありません。

ここでパズル:値Y 'とランダムに選択された値R'(たとえば、 "11110011 ... 100")を指定し、BadHash(R '| x)= Y'となるようなxを見つけるように求めます。 Y '= BadHash(00101 ... 0001 | UTF8( "Bitcoin is deflationary"))であることがわかりました。したがって、BadHashは非表示ではない(プラス)ので、R(つまり00101 ... 0001)、およびx(つまりUTF8( "Bitcoin is deflationary"))を決定して、BadHash(R | x)= Yとすることができます。 'しかし、これはあなたを助けません。なぜなら、パズルは別のR、つまり "11110011 ... 100"で機能するxが必要であると指定したからです。だからあなたはパズルを解いていない。

次に、2つのプロパティは同等ではないことがわかります。確かに、一方のプロパティにはハッシュがあり、もう一方にはハッシュがないかどうかについては、わかりません。

7
David

定義を再構築したことで、少しわかりやすくなりました。

衝突抵抗:

与えられた:xとh(x)

見つけるのが難しい:yはxとは異なり、h(y)= h(x)です。

隠蔽:

与えられた:h(r | x)

シークレット:xと、非常に低くランダムに選択されたr

見つけにくい:h(y)= h(r | x)のようなy。

これは、y = r | xであるかどうかに関係なく、衝突抵抗とは異なります。

パズルの親しみやすさ:

与えられた:zと非常に低くランダムに選択されたr

見つけるのが難しい:h(r | x)= zであるx(ただし、存在するはずです)。

これは、衝突抵抗とは異なります。衝突yを見つけるアルゴリズムがあっても、解がrで始まる必要があるという制約により、yが解にならない場合があります。

同様に、これは非表示とは異なります。rはパズルに優しいソリューションの制約ですが、その場合、yはr | xと等しい必要がないため、非表示プロパティの制約ではありません。また、パズルの親しみやすさのために、xは事前に誰にも知られていません(パズルの提案者でさえも)。

10
user2191332

持ってみましょう:y = H(x|r)。ここで、出力はyであり、入力はrおよびx

非表示プロパティ:

ハッシュ関数の出力(y)が与えられた場合、入力(x)を見つけるのは実行不可能です。 注、rは指定されていません。

パズル向けプロパティ:

ハッシュ関数の出力(y)と入力の一部(r)を考えると、入力(x)を見つけるのはdifficultです。

7
DeveScie

このコースは非常にわかりにくく、不十分に書かれています。

隠れ問題では、値H(r | x)を知っている(そしてもちろんHを知っている)xを見つけようとしています。しかし、あなたはrを知りません!たとえば、xのセットは{0,1}にすることができますが、xに秘密のrを追加すると、すべての可能なハッシュが混在するため、0または1を決定できません。

パズルフレンドリーな問題では、k(またはr)が与えられます!ここでの問題は、正しいハッシュyを与えるものを見つけるまで、可能なすべてのxを試すことです。そのため、いずれかを見つけることになりますが、時間がかかります。 (定義にk(またはr)を含める理由は紛らわしいです。これは、以前にHを逆にしたことで不正行為ができないことを意味します)。

以前にHに対して可能なすべてのrとxを試したとしても、隠れ問題では。 H(r '| x')= H(r '' | x '')となるr '、x'、r ''、x ''が見つかる可能性があるため、機能しません。また、rのどの値が正しいかわからないため、xを見つけることはできません。

5
borilla

Xがコイントスの結果であると仮定します。 xは0または1です。与えられたH(x)だと、xを見つけることができるはずはありませんが... y = H(x)が与えられると、攻撃者はxを簡単に見つけることができます可能なハッシュ値は2つだけです。彼はH(0)およびH(1)を計算し、どれがyに等しいかをチェックします。

ここで、xに大きなランダムキーを付加し、H(k x)を計算するとします。キーが秘密である場合、攻撃者は多くの可能な秘密キーを試さなければならないため、xを簡単に見つけることができません。

これは実際にはコースのスライドにあります:-)、しかし実際には言葉で説明されていません。

0
J. Schneider

このアルゴリズムについて考えてみましょう。テキストファイルを取り、a = 1、b = 2、c = 3などと仮定し、すべての文字の合計を計算します。正味合計が5未満の場合、賞を獲得します。最初に勝ったわけではないので、勝つまでこのファイルの最後に任意のテキストを追加し(nonce)、この計算を繰り返します。

このアルゴはパズルフレンドリーですが、ナンスが出力に与える影響を簡単に推測できるため、非表示には向いていません。

0
Kang