暗号学的ハッシュ関数|詳解ビットコイン②
『詳解ビットコイン』(Kalle Rosenbaum著、オライリージャパン)を読んでいます。その個人的なまとめとして書いていきます。
暗号学的ハッシュ関数が解決する問題
ビットコインネットワークはさまざまな部分で、「暗号学的ハッシュ関数」という種類の関数を利用しています。これは、提出元のファイルが書き換えられていないことを確認するためです。
暗号学的ハッシュ関数を活用すれば、提出元のファイルが書き換えられたということが分かります。
暗号学的ハッシュ関数はささいな変化も逃しません。例えば、以下のように元データを1文字変えただけでも出力が大きく変わるので、不正な書き換えを防止することに役立ちます。
ハッシュ関数を使うメリットとして、データの容量を減らせるという点も挙げられます。
ハッシュ関数を使って処理すると、出力される値は固定の長さになります。大きなサイズのデータをハッシュ関数にかければ、小さな容量で元のデータを表すことができ、データの保存や読み込みにかかる負担を軽くできます。
ハッシュ関数とは
そもそもハッシュ関数とは、元のデータ(入力値)を特定の方法で処理し、ぐちゃぐちゃで固定の長さの値を返す関数の総称です。
例えば、「11111111」という入力値をハッシュ関数にかけると、「ee799…2c4ba1」というぐちゃぐちゃの値が出てきます。
ちなみにハッシュには、細かく切り刻んだもの、混ぜ合わせたものという意味があります。これはハッシュ関数の様子をよく表現していますね。
暗号学的ハッシュ関数とは
ハッシュ関数の中でも、特定の性質を追加で持つものは暗号学的ハッシュ関数と呼ばれています。
以下の4つの性質のうち、1つ目と2つ目はすべてのハッシュ関数に当てはまる性質です。暗号学的ハッシュ関数はこれらに加えて、3つ目および4つ目の性質も持ち合わせています。
同じ入力からは、常に同じ出力が生成される
生成されるハッシュの長さは常に同じ
入力がほんの少し違うだけでも、まったく異なるハッシュが生成される
特定のハッシュを生み出す入力を見つけることは現実的ではない
4つ目の要素により、暗号学的ハッシュ関数は一方向性関数(one-way-function)だといわれています。入力値を出力値に変換することはできますが、出力値から入力値を割り出すことは現実的に不可能だからです。
この4つ目の性質には、以下のような変種があります。暗号学的ハッシュ関数としては、この変種もすべて満たすことが望ましいとされています。
衝突耐性
原像攻撃耐性
第二原像攻撃耐性
上記の3つの性質をそれぞれ確認していきます。
衝突耐性
暗号学的ハッシュ関数の種類だけが分かっていても、同じ出力値を生成する異なる入力値を探すことができません。この性質は、衝突耐性(collision resistance)と呼ばれています。
原像攻撃耐性
原像攻撃耐性(pre-image resistance)とは、暗号学的ハッシュ関数の種類と出力が分かっている状況で、その入力(原像)を割り出すことが現実的に不可能であるという性質です。
第二原像攻撃耐性
第二原像攻撃耐性(second-pre-image resisrtance)とは、暗号学的ハッシュ関数の種類と特定の入力が与えられているときに、同じ出力を生成する異なる原像を見つけることが現実的に不可能であるという性質です。
ビットコインがよく使うSHA-256とは
ビットコインは複数の暗号学的ハッシュ関数を利用していますが、最もよく使われているのはSHA-256(Secure hash algorism with 256-bit output)です。
256ビット(2の256乗)のサイズの出力を生成します。これは16進数で64文字分の長さです。10の77乗とほぼ同じ大きさであり、あてずっぽうで原像計算をするとしたら、大変な試行回数が必要なことが分かります。
1秒に6千万個のハッシュを計算できると仮定して、1兆台のコンピュータを並列実行したとき、算出にかかる時間は「3 × 10^49」年に相当すると説明されています。
ほとんどがダブルSHA-256
ほとんどの場合、ビットコインではダブルSHA-256で処理されています。
ダブルSHA-256とは、SHA-256を2重にかける処理のことです。SHA-256にかけて得られた出力を、再度SHA-256にかけるという処理です。