目次

    全ての目次を見る
  1. ビットコインやブロックチェーンで使用されているハッシュ関数
  2. ハッシュ関数とは?
  3. ハッシュ関数の性質とは?
  4. 暗号学的ハッシュ関数の性質とはなにか?
  5. ハッシュ関数は必ずしも安全ではない!
  6. ハッシュ関数のブロックチェーンでの活用
  7. ハッシュ関数についてのまとめ
Large young woman thinking with blackboard 487756038 1245x846

この記事では暗号通貨やブロックチェーンの仕組みを語る上では欠かせないハッシュ関数について Cryptoeconomicslab監修の元、CryptoAge吉川飛空氏に解説いただいています。

ブロックチェーンについて理解しようとする際、ほぼ必ずと言って良いほど必須となる用語である暗号学的ハッシュ関数(cryptographic hash function)ですが、これについて中身をしっかり理解している人は、実は非常に少数であるように感じます。

本記事では、暗号理論の知識が全くない人でも暗号学的ハッシュ関数を理解できるよう、特徴やその攻撃方法などについて簡単に解説します。

ただし、基礎的なブロックチェーンに関する知識は既にある前提でご説明しますので、ご了承ください。

冒頭でハッシュ関数の概念そのものについて説明した後、暗号学的ハッシュ関数の解説に移ります。

その後、ビットコインにおけるそれらの活用方法について説明します。

また、これから先ハッシュ関数に関して記事を書くにあたって、アルゴリズムを用いた説明が多用されます。

そのため事前知識としてアルゴリズムについて軽く触れておきます。

アルゴリズムとは、ここでは「ある入力を受け取り、特定の処理をした出力を返す」一連の流れです。

詳しくは図①を参照してください。

<図① アルゴリズムの概念>

そもそも「ハッシュ関数とは何か?」と聞かれた時、あなたはなんと答えるでしょうか?

ハッシュ関数とは、簡潔に言い表すのであれば「任意長のメッセージを入力として受け取り、それを代表する固定長のメッセージを出力する関数」と言えます。

言い換えれば、いかなる長さの文字列を入力しても、必ず特定の長さの文字列を返してくれるということです。(例:”111”と”234567”をそれぞれ入力しても、必ず64バイトの文字列が帰ってくる)

<図② ハッシュ関数の概要>

ハッシュ(hash)とは英語で”切り刻む” ”細かくする”という意味であり、その名の通り入力を”切り刻んで”全く別のものにして出力してくれる関数です。

ハッシュ関数には大きく分けて3つの性質があります。

  1. 同じ入力からは同じ出力が得られる
    何回同じ入力を入れても、全く同じ出力が得られるという事です。
  2. 任意長のデータを入力すると固定長のデータが出力される
    先ほど書いた通り、例えば、”12345”と”999”を入れても、同じ桁数の出力が得られるという事です。
  3. 効率的に計算できる
    入力文字列が与えられたら、合理的な時間内にハッシュ関数の出力が得られる。より専門的には、nビットの文字列のハッシュ計算にかかる時間は、O(n)になるという事です。

これらの性質は、一般的なハッシュ関数、つまりハッシュテーブルなどのデータ構造を作るために使われる関数を定義するものであり、暗号通貨・ブロックチェーンの領域においては、暗号学的ハッシュ関数の性質についての理解が必要になります。

次の段落では、暗号通貨・ブロックチェーン領域で使われるハッシュ関数の性質、つまり暗号学的ハッシュ関数の性質を説明していきます。

先述のハッシュ関数の中でも、特に安全性が高いものを「暗号学的ハッシュ関数」と呼びます。

ハッシュ関数の安全性は、主に以下の項目で計られます。

  1. 一方向性(現像計算困難性)
    ハッシュ関数の出力から入力された値を特定するのが困難であるという事です。出力から入力が特定できてしまうと、本来隠したいはずの入力されたデータが第三者に見られてしまう事があります。そのような事件は避けたいので、一方向性は重要です。
  2. 第2現像計算困難性
    ある入力データと出力データがわかっている時、そのハッシュ値が出力データと同じ値となる「もう一つの入力データ」を特定するのが困難であるということです。もし同じ値を出力するメッセージが判明してしまうと、中身をすり替えられても出力を見ただけでは分からなくなってしまう可能性があります。
  3. 衝突困難性
    異なる値を入力したのに、同じ出力が得られてしまう事をハッシュの「衝突」と呼びます。その衝突が起こりにくいという事です。衝突が起こってしまうと、②と同様に入力が何か分からなくなってしまいますので、関数の安全性が大きく損なわれてしまいます。

<図③ ハッシュ関数の安全性>

これら3つの安全性が高いものを暗号学的ハッシュ関数と呼びます。

暗号学的ハッシュ関数には多くの種類があり、ビットコインではSHA2というハッシュ関数のうちの1種類であるSHA-256とRIPEMD-160、EthereumではKeccak256という暗号学的ハッシュ関数が用いられています。

SHA-256とKeccak256は256バイト、RIPEMD-160は160バイトの文字列を出力します。

この記事ではハッシュ関数の安全性を説明する際、現像計算「困難」性であるとか、衝突「困難」性であるとか、「不可能」という言葉を用いません。

それは何故でしょうか。

実は、現在発見されているハッシュ関数では、完全に衝突が起こらないようにすることは不可能なのです。

それはハッシュ関数に通すインプットの数が圧倒的にアウトプットの取りうる値よりも数が多いからです。

例えば、256バイトの出力を返すハッシュ関数があったとしましょう。

そのハッシュ関数が出力できるメッセージの数は最大2^256個(2の256乗)です(1バイトにつき0か1が入るため)。

一方、先述の通り入力は任意長であるため、入力できるメッセージの数は無限です。

これでは、そのハッシュ関数にメッセージをひたすら入力していけば、遅くとも2^256+1回目に入力したメッセージは必ず衝突してしまいます。

これは「鳩の巣理論」によってわかりやすい例えがなされます。

鳩がp匹入る巣があったとして、そこに鳩が一匹ずつ入っていくとします。

すると、p+1匹目の鳩は、もう巣が満員なので、別の場所にいくしかありません。

同様に、ハッシュ関数も最大値があり、かつ何かを出力する以外の選択肢がないので、溢れた数は衝突してしまうというわけです。

しかし、2^256+1という数の大きさは宇宙にある原子の総数レベルの数なので、現実的に256バイトのメッセージを出力するSHA-256などは、人間全員がハッシュ関数を計算するようになってもまず衝突は起こりえないだろう(※1)と思われており、衝突困難性があるとも言われているわけです。

(※1)ホモ・サピエンスが誕生したのを180万年前だと仮定し、その時代から現人口70億人がそれぞれ毎秒100回ハッシュ値を算出したとしても、その合計数は2^256の約1/(34,316,126,655,735,760*10^44)です。

上記の概要を参考に、暗号学的ハッシュ関数がブロックチェーンにおいてどのように応用されているか見て行きましょう。

この記事では、主にビットコインにおけるハッシュ関数の活用方法について解説します。

ビットコインでは、暗号的ハッシュ関数は様々な形で活用されていますが、ここでは主にアドレスに用いられる文字列の作成の際、暗号学的ハッシュ関数がどのように用いられているかについて説明します。

ビットコインアドレスの生成においては、SHA-256とRIPEMD-160と呼ばれる二つの暗号学的ハッシュ関数が使われます。

ここでは両者についての詳しい解説は行いませんが、それぞれ256ビットと160ビットの文字列を出力する暗号学的ハッシュ関数だと捉えていただいて結構です。

アドレス生成は次のようなアルゴリズムによって行われます。
(入力: k 出力: a)

  • 処理①: 公開鍵kをSHA-256に入力して、出力h1を得る
  • 処理②: h1をRIPEMD-160に入力して、出力h2を得る
  • 処理③: h2の先頭に”0x00”を付け足して、それをh2’とする
  • 処理④: h2’にSHA-256を入力し、その出力を再びSHA-256に入力し出力h3を得る 
  • 処理⑤: h3の先頭4バイトを取り、それをh3’とする
  • 処理⑥: h2’とh3’を結合し、それをh4とする
  • 処理⑦: h4をBase58(※2)で変換し、アドレスaを出力する。

(※2)Base58とは、バイナリデータを可読性に優れた形に変換するプロセスの一つです。Base58を用いると、読み間違いが起こりやすい大文字のオー(O)とゼロ(0)や、小文字のエル(l)と大文字のアイ(I)などを省いた形で変換することができます。送金先などでアドレスを記入する際読み間違いがあっては困るので、このような変換方式が採用されています。

また、ハッシュ関数はアドレス生成以外にも、Bitcoinなどではトランザクション(取引データ)の要約・検証にも使用されております。

ハッシュ関数はブロックチェーンのセキュリティ部分を司る、非常に大切な概念です。

この記事を読んだ後は是非IPUSIRON氏の著書である「暗号技術の全て」などを読んでみてください。

きっと暗号理論に対する知見がグッと深まるはずです。