ビットコインに学ぶブロックチェーンの真髄#5 暗号技術編1 ハッシュ関数・電子署名
昨今話題のブロックチェーン技術について、その概要と詳細な仕組みを10 回くらいの連載を通じて詳しめに解説していくシリーズの第5回目になります。
第4回目はこちら
シリーズ全体はこちら
前回から「頭の中でトラストレスなデジタル通貨システムを構築してみよう」というテーマのもとブロックチェーンを構成する主要技術についての解説を進めています。そして、前回の記事ではネットワークを支えるP2P技術について説明し、全てのノードが平等に繋がる分散型のネットワークを構築することができました。
さて、このネットワーク上で安心してデジタル通貨のやり取りを行うためには次に何が必要でしょうか?
このネットワーク上では、自分の資産がデジタルデータとして表現されます。当たり前のことですが、自分の資産である以上、自分以外の人がそのデータを勝手に扱えてしまってはいけません。そのような状況では、誰もそこで取引を行おうとはしないでしょう。
つまり、「自分の資産を扱えるのは自分だけである」ということを保証するような環境を作る必要があるのです。
ここで自分しか自分の資産を使えないようにするために、「誰かに資産を送るときは送り主が自分の署名をつけなければいけない」というルールを設けることにします。このルールを実現するために、ブロックチェーンにおいては電子署名というシステムが採用されています。そして電子署名の根底を支える技術が暗号技術になります。
今回から数回に渡って「電子署名とはどのような仕組みなのか」「なぜ電子署名が有効にはらたくのか」などを解説していきます
一方向性ハッシュ関数
電子署名の説明に入る前に前提知識として「一方向性ハッシュ関数」について説明します。
一方向性ハッシュ関数とは、暗号分野において主にメッセージの正真性(メッセージが改ざんされていないこと)を示すために使われる関数です。この関数に数値を渡すと、一意の長さの数列が返ってきます。
一方向性ハッシュ関数においては、入力から出力の過程で複雑な処理が行われるため、入力と出力は全く別の値になるうえに、入力を少し変更しただけでも出力は全く異なる値になって返ってきます。もちろん、関数なので入力が同じ値であれば出力も同じ値で返ってきます。
一方向性ハッシュ関数の出力をハッシュ値と呼びます。一方向性ハッシュ関数の特性として「ハッシュ値から入力された数値を逆算することが実質的に不可能」という特徴があります。つまり、Aという入力のハッシュ値aを計算することは容易ですが、ハッシュ値がaとなるような入力を見つけることは非常に難しいということです。
デジタルデータであれば、数列のみならず、文字列や画像であってもハッシュ値の計算が可能です。ファイルごとハッシュ関数にかけ、そのハッシュ値をデジタル指紋(=そのファイルに特有の番号)として利用することもあります。この場合、もしファイルが改ざんされていれば、最初に計算したハッシュ値と新しく計算したハッシュ値は全く異なる値になり、ファイルの改ざんを見抜くことができます。
実際にビットコインで使われているハッシュ関数はSHA256とREPEMD160という関数です。SHA256はどんな入力でも256ビット(64桁の16進数)で返し、REPEMD160はどんな入力でも160ビット(40桁の16進数)で返します。
実際にSHA256を使ってみましょう。
sha256('abc')⇒ ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
sha256('abd')⇒ a52d159f262b2c6ddb724a61840befc36eb30c88877a4030b65cbe86298449c9
sha256('こんにちは')⇒ 125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c
sha256('あいうえおかきくけこさしすせそたちつてと')⇒ 29182348b729227769bce6857f8074725451353d357197b263edf1e686ddf0ae
どの長さの値を入力をしても、一定の長さのハッシュ値が返ってくることが分かります。また、入力する値を「abc」から「abd」へと1文字変えただけで、ハッシュ値が大きく変わっています。
ハッシュ関数は今後説明する「アドレスの生成」と、ブロックチェーンを維持するうえで欠かせない「マイニング」という作業に使われます。そしてハッシュ関数によって生成されたアドレスが電子署名の主要な役割を果たすことになります。
電子署名
ブロックチェーンがどのように電子署名を利用しているかを説明する前に、電子署名そのものの全体像やその仕組みについて説明します。
電子署名は公開鍵暗号という暗号技術を応用したもので、これによりあるメッセージが本人から送られてきたものであると証明することが可能です。
電子署名の大まかな仕組み
たとえば、アリスがボブにメッセージを送信するとします。このとき、アリスがメッセージのみをボブに送ったとしても、受け取ったボブは「このメッセージは本当にアリスから送られてきたものである」と確信することはできません。なぜなら途中で誰か他の人にメッセージが書き換えられている可能性があるからです。
そこでアリスは「アリス本人がこのメッセージを送った」ということを証明するために、メッセージに電子署名を付けます。署名とはいえ、実際はただの数列です。アリスは秘密鍵と公開鍵という2つの鍵を事前に生成し、秘密鍵から作られる電子署名とメッセージをボブに渡します。
さて、アリスからメッセージと電子署名と公開鍵を受け取ったボブはこのメッセージが本当にアリスから送られてきたものなのか検証する必要があります。
ボブは電子署名と公開鍵、メッセージの3つを用いてある計算を行い、2つの値を導きます。そしてその2つの値が一致していれば、「このメッセージはアリスから送られたもので、途中で他人に改ざんされていない」ということが証明されます。もし途中でメッセージが誰かに改ざんされた場合、計算結果の値が一致しないのですぐに気づくことができます。
電子署名のポイントは「秘密鍵を相手に渡さなくても、公開鍵を使うだけで検証が可能である」という点です。これにより、送金の過程で秘密鍵が第三者に盗まれる心配はなくなります。
このような仕組みを用いることで「そのメッセージが本人から送られたものであるか」が明確になります。
電子署名の詳細な仕組み
上記の電子署名がどのように成り立っているのか、その詳細な仕組みを解説します。
前提として、秘密鍵と公開鍵は数学的な関係性を持っており、以下の3つの性質を持ちます。(ここでは以下のような性質を満たす値のペアを秘密鍵・公開鍵と呼びます。)
1. 秘密鍵で暗号化したメッセージは公開鍵で復号することができる
直感的に説明すると、メッセージのデータに秘密鍵の値を掛けて暗号文を作り、さらにその暗号文と公開鍵を掛けると元のメッセージに戻るという具合です。詳細は「楕円曲線DSA」の欄をご覧ください。
2. 秘密鍵から公開鍵を導くことはできるが、公開鍵から秘密鍵を導くことはできない
これは先ほど紹介したハッシュ関数と同じで、逆の計算はできないという意味です。一般に離散対数問題と呼ばれる計算になります。
3. 暗号文から元のメッセージを特定することはできない
これは秘密鍵と公開鍵に関わらず、暗号と呼ばれるものはすべて満たさないといけない性質です。
この性質を利用し、アリスは
① 秘密鍵(k)の生成
② 秘密鍵に対応する公開鍵(K)を計算
③ メッセージ(m)を秘密鍵で掛けて暗号化(暗号文 = km)
④ メッセージ(m)、公開鍵(K)、暗号文(km)をボブに送信
という手順でボブにメッセージと電子署名を送ります。このとき公開鍵と暗号文が電子署名になります。
一方でボブは以下の手順で検証を行います。
① メッセージ(m)、公開鍵(K)、暗号文(km)を受信
② 公開鍵と暗号文を掛けて値を出す(K * km = m)
③ メッセージと②で出した値を比較
④ 一致していればアリスから送られてきたものと認める。
もし途中で誰かに改ざんされていた場合、メッセージ(m)が偽メッセージ(m’)となり、③の段階で値が一致しません。
重要なポイントは、「秘密鍵はアリスの元にずっとある」ということと、「秘密鍵と対応する公開鍵でしか正しく復号できない」ということです。これにより、「アリスしか秘密鍵を知らない」かつ「公開鍵と対応する秘密鍵を持った人にしか電子署名(= 暗号文km)は作れない」という条件を満たすことが可能になり、ボブは「これはアリスによって送られたメッセージである」と認識できるのです。
ただ、「アリスしか秘密鍵を知らない」という条件を満たすには、アリスの努力が必要になります。すなわち、秘密鍵を第三者に漏らさないように厳密な管理をしなければならないということです。もし秘密鍵を第三者に盗まれてしまった場合、この条件を満たさなくなり、電子署名は全く意味をなさなくなります。
おわりに
今回はP2P通信によって実現した分散ネットワーク上にデジタル通貨システムを構築するにあたり暗号技術が必要であることを説明し、その基本的な部分(ハッシュ関数、電子署名の概要)を説明しました。
次回以降は実際に電子署名がどのようにブロックチェーンに適用されているのかを解説していきます。
このシリーズは『あたらしい経済』で私が執筆した「ブロックチェーンは今までのシステムと違って何がすごいのか〜ノンプログラマーでも解るブロックチェーン入門」シリーズを大幅に加筆修正したものになっています。
この記事が気に入ったらサポートをしてみませんか?