誕生日攻撃のソースを表示
←
誕生日攻撃
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''誕生日攻撃'''(たんじょうびこうげき、{{lang-en-short|birthday attack}})は、[[暗号理論|暗号の理論]]で使われる、[[暗号]][[システム]]に対する攻撃の考え方の1つで、数理的には[[確率]]における[[誕生日のパラドックス|誕生日問題]]の応用である。[[関数 (数学)|関数]] ''f'' があるとき、<math>f(x_1) = f(x_2)</math> となるような2つの異なる入力 <math>x_1, x_2</math> を求めたい、という場合に関わる。この <math>x_1, x_2</math> のような組合せは[[衝突 (計算機科学)|衝突]]と呼ばれている<!--ため、'''衝突攻撃'''ともいう-->。 暗号学において、このような衝突を求める攻撃には2種類がある。<math>x_1</math>と<math>x_2</math>の両方を攻撃者が任意に選ぶことができる場合と、片方は外部(たとえば送信者)によって固定されており、攻撃者はもう片方について探すことしかできない場合の2種類である。前者についての強度を強衝突耐性、後者についての強度を弱衝突耐性と呼ぶこともある。この項で対象としているのは前者であり、「衝突攻撃」とも呼ぶ。後者については「[[原像攻撃]]」を参照。 攻撃者が衝突するペアを見つける方法は、無作為にまたは作為的にあるいは擬似乱数的に生成した異なる複数の入力を関数 ''f'' に与えて評価し、複数回同じ値となるまで続けるだけである。この攻撃方法は、前述した誕生日問題から、想像よりも効率的である。特に関数 <math>f(x)</math> が <math>H</math> 個の異なる出力をそれぞれ同じ確率で生成し <math>H</math> が非常に大きい場合、<math>f(x_1) = f(x_2)</math> となるような異なる入力 <math>x_1</math> と <math>x_2</math> を得るまでに ''f'' を評価する回数の平均は約 <math>1.25 \cdot \sqrt H</math> 回である。 ある暗号システムに対し、誕生日攻撃が問題となるか否かは、その暗号システムの設計と目的次第である。例えば、他のシステムに含まれていない[[暗号学的ハッシュ関数]]それ自身の評価としては、誕生日攻撃が可能であることは当然であるため、誕生日攻撃よりも効率のよい攻撃方法が存在しないことが必要である。また誕生日攻撃に耐えなければならないシステムでは、十分に長いハッシュ値を採用するなどの対策をしなければならない。一方で、たとえば本来ならば攻撃者が片方のハッシュ値を自由に選ぶことができない(つまり、本来ならば誕生日攻撃が不可能である)はずのシステムに何らかの抜け穴があり、誕生日攻撃が可能になってしまっていた場合は問題となる。 == 数理的解説 == {{Main|誕生日のパラドックス}} 次のような実験を考える。<math>H</math> 個の値の集合から <math>n</math> 個の値を一様かつ無作為に選ぶ(重複もありうる)。この実験で少なくとも1つの値が2回以上選ばれる確率を <math>p(n;H)</math> とする。この確率は次のように概算できる。 :<math> p(n;H) \approx 1 - e^{-n(n-1)/(2H)} \approx 1-e^{-n^2/(2H)}</math> 衝突を発見する確率を <math>p</math> 以上とするとき、行わなければならない試行回数の下限を <math>n(p;H)</math> とする。すると、上の式から次のような近似が得られる。 :<math>n(p;H)\approx \sqrt{2H\ln\frac{1}{1-p}}</math> 衝突発生確率を0.5とすると、次のようになる。 :<math>n(0.5;H) \approx 1.1774 \sqrt H</math> 最初の衝突が発生するまでに行わなければならない試行回数を <math>Q(H)</math> とする。この近似は次のようになる。 :<math>Q(H)\approx \sqrt{\frac{\pi}{2}H}</math> 例えば、64ビットの[[暗号学的ハッシュ関数]]を使っている場合、約 1.8 × 10<sup>19</sup> 個の異なる出力がありうる。これらが全て同じ確率で発生する場合(最良ケース)、約 5.1 × 10<sup>9</sup> 回の試行で衝突を発生させることができる。この値を '''birthday bound''' と呼び、n-ビットの符号についての birthday bound は <math>2^{n/2}</math> となる<ref>{{cite paper | author = Jacques Patarin, Audrey Montreuil | title = Benes and Butterfly schemes revisited | publisher = Université de Versailles | date = 2005 | url = http://eprint.iacr.org/2005/004 | format = [[PostScript]], [[Portable Document Format|PDF]] | accessdate = 2007-03-15 }} <!-- Replace with a better definition of the birthday bound if you find some please. --> </ref>。他の例は次のようになる。 :{| class="wikitable" style="white-space:nowrap;" |- ! rowspan="2" style="background:lightgrey;" | ビット数 ! rowspan="2" style="background:lightgrey;" | 出力の個数<br />(H) ! colspan="10" style="background:lightgrey;" | 衝突発生確率 (p) |- ! style="background:lightgrey;" | 10<sup>−18</sup> ! style="background:lightgrey;" | 10<sup>−15</sup> ! style="background:lightgrey;" | 10<sup>−12</sup> ! style="background:lightgrey;" | 10<sup>−9</sup> ! style="background:lightgrey;" | 10<sup>−6</sup> ! style="background:lightgrey;" | 0.1% ! style="background:lightgrey;" | 1% ! style="background:lightgrey;" | 25% ! style="background:lightgrey;" | 50% ! style="background:lightgrey;" | 75% |- align="center" | bgcolor="lightgrey" | 32 | bgcolor="lightgrey" | 4.3 × 10<sup>9</sup> | 2 | 2 | 2 | 2.9 | 93 | 2.9 × 10<sup>3</sup> | 9.3 × 10<sup>3</sup> | 5.0 × 10<sup>4</sup> | 7.7 × 10<sup>4</sup> | 1.1 × 10<sup>5</sup> |- align="center" | bgcolor="lightgrey" | 64 | bgcolor="lightgrey" | 1.8 × 10<sup>19</sup> | 6.1 | 1.9 × 10<sup>2</sup> | 6.1 × 10<sup>3</sup> | 1.9 × 10<sup>5</sup> | 6.1 × 10<sup>6</sup> | 1.9 × 10<sup>8</sup> | 6.1 × 10<sup>8</sup> | 3.3 × 10<sup>9</sup> | 5.1 × 10<sup>9</sup> | 7.2 × 10<sup>9</sup> |- align="center" | bgcolor="lightgrey" | 128 | bgcolor="lightgrey" | 3.4 × 10<sup>38</sup> | 2.6 × 10<sup>10</sup> | 8.2 × 10<sup>11</sup> | 2.6 × 10<sup>13</sup> | 8.2 × 10<sup>14</sup> | 2.6 × 10<sup>16</sup> | 8.3 × 10<sup>17</sup> | 2.6 × 10<sup>18</sup> | 1.4 × 10<sup>19</sup> | 2.2 × 10<sup>19</sup> | 3.1 × 10<sup>19</sup> |- align="center" | bgcolor="lightgrey" | 256 | bgcolor="lightgrey" | 1.2 × 10<sup>77</sup> | 4.8 × 10<sup>29</sup> | 1.5 × 10<sup>31</sup> | 4.8 × 10<sup>32</sup> | 1.5 × 10<sup>34</sup> | 4.8 × 10<sup>35</sup> | 1.5 × 10<sup>37</sup> | 4.8 × 10<sup>37</sup> | 2.6 × 10<sup>38</sup> | 4.0 × 10<sup>38</sup> | 5.7 × 10<sup>38</sup> |- align="center" | bgcolor="lightgrey" | 384 | bgcolor="lightgrey" | 3.9 × 10<sup>115</sup> | 8.9 × 10<sup>48</sup> | 2.8 × 10<sup>50</sup> | 8.9 × 10<sup>51</sup> | 2.8 × 10<sup>53</sup> | 8.9 × 10<sup>54</sup> | 2.8 × 10<sup>56</sup> | 8.9 × 10<sup>56</sup> | 4.8 × 10<sup>57</sup> | 7.4 × 10<sup>57</sup> | 1.0 × 10<sup>58</sup> |- align="center" | bgcolor="lightgrey" | 512 | bgcolor="lightgrey" | 1.3 × 10<sup>154</sup> | 1.6 × 10<sup>68</sup> | 5.2 × 10<sup>69</sup> | 1.6 × 10<sup>71</sup> | 5.2 × 10<sup>72</sup> | 1.6 × 10<sup>74</sup> | 5.2 × 10<sup>75</sup> | 1.6 × 10<sup>76</sup> | 8.8 × 10<sup>76</sup> | 1.4 × 10<sup>77</sup> | 1.9 × 10<sup>77</sup> |} : この表は、指定した確率で衝突を発生させるのに必要な試行回数を示している(各ハッシュ値の発生確率は等しいと仮定)。ちなみに 10<sup>−18</sup> から 10<sup>−15</sup> は一般的なハードディスクで訂正できないビット誤りが発生する確率である<ref>[https://arxiv.org/abs/cs/0701166 Empirical Measurements of Disk Failure Rates and Error Rates]</ref>。したがって、128ビットの[[MD5]]を文書のチェックサムとして使用する場合、8200億個の文書までならハードディスクでの誤り発生確率の範囲内に収まると言える(実際にはもっと多数のハッシュ値を生成できる)。 関数の出力が一様に分布しない場合、衝突をもっと早く見つけられることは容易に想像がつく。ハッシュ関数の「バランス」の観念は、誕生日攻撃への関数の耐性を定量化し、MDやSHAなどのよく知られたハッシュの脆弱性を見積もることを可能にする<ref>[http://citeseer.ist.psu.edu/bellare02hash.html Hash Function Balance and its Impact on Birthday Attacks] Bellare and Kohno, 2002</ref>。 == 例 == === デジタル署名への攻撃 === [[デジタル署名]]は誕生日攻撃の影響を受ける場合がある。多くのデジタル署名では、[[暗号学的ハッシュ関数]] <math>f</math> を使ってメッセージ <math>m</math> のハッシュ値 <math>f(m)</math> を計算し、そのハッシュ値に対して秘密鍵を適用して署名を得る。ここで[[アリスとボブ|アリスがボブを騙し]]、ニセの契約書に署名させる場合を考える。アリスはまず正しい契約書 <math>m</math> とニセの契約書 <math>m'</math> を用意する。次に <math>m</math> の意味を変えずに字面を変えた書面をコンマを挿入したり、空行を挿入したり、文の後の空白を増やしたり、同義語で置換したりしていくつも作成する。このようにすることで、正しい契約書 <math>m</math> の膨大なバリエーションを作成できる。 同様の手法でアリスはニセの契約書 <math>m'</math> についても多数のバリエーションを作成する。次にアリスは、それらの正しい契約書とニセの契約書の全バリエーションについてハッシュ関数を適用し、同じハッシュ値 <math>f(m) = f(m')</math> となるものを探す。そして、衝突した正しい方の契約書をボブに提示し署名を求める。ボブが署名したら、アリスはその署名を切り出し、ニセの(衝突した)契約書に添付する。この署名はボブがニセの契約書に署名したことを証明している。 なお,本来の誕生日問題とは若干異なり、正しい契約書間同士のペアやニセの契約書間同士のペアで衝突が見つかってもアリスには何の利益も生じない。アリスが[[詐欺]]を成功させるには、正しい契約書とニセの契約書の組み合わせのペアで衝突が発生する文面を見つける必要がある。つまり、上の説明での <math>n</math> は正しい契約書とニセの契約書のペアの個数に相当するため、アリスは実際には <math>2n</math> 回ハッシュ値生成を試行しなければならない。 このような攻撃を防ぐため、署名で使用するハッシュ関数の出力長は誕生日攻撃が事実上不可能な程度にまで十分長くなければならない。つまり、通常の[[総当り攻撃]]を防ぐのに必要なビット数の2倍を必要とする。 [[ポラード・ロー素因数分解法]]の離散対数への応用([[:en:Pollard's rho algorithm for logarithms|en]])は、[[離散対数]]の計算に誕生日攻撃を応用した例である。 === DNSキャッシュポイズニング === [[BIND]]の実装上の問題などによる、誕生日攻撃を利用した[[Domain Name System|DNS]]の[[DNSキャッシュポイズニング]]の可能性が議論されている<ref>[http://www.secureworks.com/resources/articles/other_articles/dns-cache-poisoning/ DNS Cache Poisoning - The Next Generation]</ref>。 == 脚注・出典 == {{脚注ヘルプ}} {{Reflist}} == 参考文献 == * Mihir Bellare, Tadayoshi Kohno: Hash Function Balance and Its Impact on Birthday Attacks. EUROCRYPT 2004: pp401–418 * ''Applied Cryptography, 2nd ed.'' by [[ブルース・シュナイアー|Bruce Schneier]] == 関連項目 == * [[中間一致攻撃]] == 外部リンク == * [http://www.rsasecurity.com/rsalabs/node.asp?id=2182 "What is a digital signature and what is authentication?"] [[RSAセキュリティ]]の crypto [[FAQ]]より * [http://www.certainkey.com/dnet/acmccs94.pdf "Parallel collision search with cryptanalytic applications], by Michael Wiener and Paul C. van Oorschot {{cryptography navbox|hash}} {{エクスプロイト}} {{デフォルトソート:たんしようひこうけき}} [[Category:暗号技術]] [[Category:エクスプロイト]] [[Category:暗号解読攻撃]] [[de:Kollisionsangriff#Geburtstagsangriff]]
このページで使用されているテンプレート:
テンプレート:Cite paper
(
ソースを閲覧
)
テンプレート:Cryptography navbox
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Main
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:エクスプロイト
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
誕生日攻撃
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報