- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/08/26
- メディア: 単行本
- この商品を含むブログ (19件) を見る
第7章 一方向ハッシュ関数
この章から、「第二部 認証」にはいる。一方向ハッシュ関数ではメッセージの「指紋」を取ることができる。メッセージが改ざんされていれば、異なるハッシュが得られ改ざんされていることがわかる。
一方向ハッシュ関数
ファイルが本物であるかどうか、正真性または完全性を調べる際に用いる。想定しているファイルと1ビットたりとも異なっていないことを確かめるために用いる。
一方向ハッシュ関数は、メッセージを入力されるとハッシュ値という出力を返す関数である。ハッシュ値はハッシュ関数によって長さが決まっており、メッセージの長さとは関係ない。
一方向ハッシュ関数には次のような性質が必要である。
- 任意の長さのメッセージから固定長のハッシュ値を出力する
- ハッシュ値の計算が高速
- メッセージが異なればハッシュ値は異なる(衝突耐性)
- 出力から入力を得ることはできない(一方向性)
ちなみに、衝突耐性には二種類ある。
- 弱衝突耐性: あるハッシュ値を持つ別のメッセージを見つけ出すことが困難
- 強衝突耐性: どんなハッシュ値に対しても、そのハッシュを持つ別のメッセージを見つけ出すことが困難
使われている一方向ハッシュ関数
MD4, MD5
すでに衝突を見つける方法が見つかっており、安全ではない。SHA-1
すでに強衝突耐性は破られており、利用は推奨されていない。SHA-2
SHA-256,384,512 の総称。メッセージの長さに上限がある。 これは今でも安全と考えられている。RIPEMD-160
ビットコインで用いられている。SHA-3 後述
SHA-3(KECCAK)
KECCAKというアルゴリズムはSHA-3に採択されている。
KECCAKではスポンジ構造が使われており、メッセージを吸収し出力を搾出する仕組みをとる。
入力フェーズでは、次のように処理が進む。
- 入力メッセージをパディングし、rビットごとの入力ブロックに分割
- 内部状態のrビットと入力ブロック1のXORをとり、関数fへの入力とする
- 関数fの出力rビットと入力ブロック2のXORをとり、関数fへの入力とする
- 入力ブロックがなくなるまで続ける
入力ブロックが終わると、搾出フェーズへ。
- 関数fの出力のうちrビットを出力ブロック1として記録し、出力全体は関数fへの入力とする
- 関数fの出力のうちrビットを出力ブロック2として記録し、出力全体は関数fへの入力とする
- 必要な出力ビット数が得られるまで続ける
これはSHA-1、SHA-2といったこれまでのものとは大きく異る構造をしている。
一方向ハッシュ関数を使う
SHA-2またはSHA-3を使いましょう。