「暗号技術入門 秘密の国のアリス」 (5) 第7章 一方向ハッシュ関数

暗号技術入門 第3版

暗号技術入門 第3版

第7章 一方向ハッシュ関数

この章から、「第二部 認証」にはいる。一方向ハッシュ関数ではメッセージの「指紋」を取ることができる。メッセージが改ざんされていれば、異なるハッシュが得られ改ざんされていることがわかる。

一方向ハッシュ関数

ファイルが本物であるかどうか、正真性または完全性を調べる際に用いる。想定しているファイルと1ビットたりとも異なっていないことを確かめるために用いる。

一方向ハッシュ関数は、メッセージを入力されるとハッシュ値という出力を返す関数である。ハッシュ値ハッシュ関数によって長さが決まっており、メッセージの長さとは関係ない。

一方向ハッシュ関数には次のような性質が必要である。

  • 任意の長さのメッセージから固定長のハッシュ値を出力する
  • ハッシュ値の計算が高速
  • メッセージが異なればハッシュ値は異なる(衝突耐性)
  • 出力から入力を得ることはできない(一方向性)

ちなみに、衝突耐性には二種類ある。

  • 弱衝突耐性: あるハッシュ値を持つ別のメッセージを見つけ出すことが困難
  • 強衝突耐性: どんなハッシュ値に対しても、そのハッシュを持つ別のメッセージを見つけ出すことが困難

使われている一方向ハッシュ関数

  • MD4, MD5
    すでに衝突を見つける方法が見つかっており、安全ではない。

  • SHA-1
    すでに強衝突耐性は破られており、利用は推奨されていない。

  • SHA-2
    SHA-256,384,512 の総称。メッセージの長さに上限がある。 これは今でも安全と考えられている。

  • RIPEMD-160
    ビットコインで用いられている。

  • SHA-3 後述

SHA-3(KECCAK)

KECCAKというアルゴリズムはSHA-3に採択されている。

KECCAKではスポンジ構造が使われており、メッセージを吸収し出力を搾出する仕組みをとる。

入力フェーズでは、次のように処理が進む。

  1. 入力メッセージをパディングし、rビットごとの入力ブロックに分割
  2. 内部状態のrビットと入力ブロック1のXORをとり、関数fへの入力とする
  3. 関数fの出力rビットと入力ブロック2のXORをとり、関数fへの入力とする
  4. 入力ブロックがなくなるまで続ける

入力ブロックが終わると、搾出フェーズへ。

  1. 関数fの出力のうちrビットを出力ブロック1として記録し、出力全体は関数fへの入力とする
  2. 関数fの出力のうちrビットを出力ブロック2として記録し、出力全体は関数fへの入力とする
  3. 必要な出力ビット数が得られるまで続ける

これはSHA-1、SHA-2といったこれまでのものとは大きく異る構造をしている。

一方向ハッシュ関数を使う

SHA-2またはSHA-3を使いましょう。