ブロックチェーンを支える技術(1): 暗号技術編

ブロックチェーンを学ぼうとしたら、前提知識が足りていませんでした。

## 概要
ブロックチェーンは、様々な技術が前提となっている技術です。また、それらはブロックチェーンに限らず広く利用されている技術でもあります。

ブロックチェーンについて学ぶ準備をするとともにブロックチェーンをきっかけとして基礎的な技術に関する知識をざっくり確認しようというシリーズです。

今回はブロックチェーンに使われている暗号技術について取り上げます。

## ブロックチェーンで使われている暗号技術

- ハッシュ関数
    [GPUがマイニングで重宝されるのは何故？](https://qiita.com/BAMV/items/2b4dbf5f7b773ac3cbd9) でも紹介しましたように、ブロックチェーンでは、各ブロックに１つ前のブロックからハッシュ関数を用いて生成されたハッシュ値を持たせることで取引履歴の改竄を困難にしています。
    
- デジタル署名(電子署名)
    ブロックチェーン上にはすべての取引履歴(トランザクション)が記録されますが、記録されるのが送金元、送金先、金額のみだとしたら、送金者の意思に反して不正に作成された場合に検出できません。
ブロックチェーン上の取引では、送金者の意思で取引が作成されたことを確認するために、デジタル署名を使用しています。
    
ブロックチェーンに記録された取引は [blockchain.com](https://www.blockchain.com) 等のwebサイトで誰でも見ることができます。
例: [https://www.blockchain.com/btc/tx/0c9074f65fda2d7b70dc1ccb28e17becd3892a630e3ff919a523c963ef696994](https://www.blockchain.com/btc/tx/0c9074f65fda2d7b70dc1ccb28e17becd3892a630e3ff919a523c963ef696994)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/d6efdcc6-90b6-fbc6-7727-3e9a03edf3ee.png)


## ハッシュ関数とは

ハッシュ関数とは、以下のような性質を持つ関数です。
- 任意の長さの入力データ(メッセージ)から短い固定長の出力データ(ハッシュ値)を返す
    - 例: SHA-256の場合は256ビット
- 入力データが同じであれば常に同じ結果を返す
- ハッシュ値を高速に計算できる
- あるデータを一方向にしか変換できず、ハッシュ化されたデータから元のデータを復元することができない(一方向性)
- 衝突耐性を持つ

ビットコインではSHA-256とRIPEMD-160というハッシュ関数が使われています。

### 衝突耐性とは

もしデータを書き換えてもそこから生成されるハッシュ値が変更前と同じ値になる場合、データの改竄を検知できなくなってしまいます。2つの異なるデータから生成されるハッシュ値が同じになることを**衝突**と呼びます。ハッシュ関数でデータが改竄されていないことを確認するには、衝突を起こすデータを見つけることが困難である必要があります。
衝突を見つけることが困難である性質を衝突耐性と呼びます。衝突耐性には、弱衝突耐性と強衝突耐性があります。

1文字でも異なると全く異なるハッシュ値が生成される
| メッセージ | ハッシュ値(SHA-256) |
| --- | --- |
| qiita | e54e4c85c3aab2dfe3782e6bee5742d39899e227edc1b437d7fd30b1f1f7c3a8 |
| qiite | ad6b074a22e0078fb9cb327934aac52f53ef8129c57e94dd74a361872a7bd0eb |



#### 弱衝突耐性とは

あるメッセージとそのメッセージのハッシュ値が与えられたとき、そのハッシュ値を持つ別のメッセージを見つけることが困難である性質のことです。

#### 強衝突耐性とは

ハッシュ値が一致するような異なる２つのメッセージを見つけ出すことが困難である性質のことです。

#### 誕生日のパラドックス

弱衝突耐性に比べて強衝突耐性が破られやすいということが知られています。その理由は「誕生日のパラドックス」として知られています。

> 何人集まれば、その中に誕生日が同一の2人（以上）がいる確率が、50%を超えるか?

n人の誕生日が全員異なる確率1からを引くことで確率を計算できるのですが、23人いればこの確率が約50.7%となり50%を超えます。
参考: [誕生日が一致する確率](https://keisan.casio.jp/exec/system/1161228814)

一方、23人の中に誕生日が特定の日付の人(例: あなたと同じ誕生日の人)がいる確率は、約6.1%となります。
細かい計算式は省略しますが、特定のハッシュ値になるメッセージを見つけるよりも、同じハッシュ値になる２つのメッセージを見つける方が簡単であることが分かると思います。
強衝突耐性が破られているハッシュ関数にはMD5,SHA-1等があります。
ビットコインで使われているSHA-256とRIPEMD-160はまだ破られていません。

#### ブロックチェーンでの利用
ハッシュ値のビット長が長ければ長いほどハッシュ値のパターンが多くなるため衝突の確率が低くなりますが、ビットコインでは計算速度などのバランスを考慮してSHA-256が使われています。

ブロックチェーンのあるブロックの内容書き換えたとすると、それを元に生成されるハッシュ値が変わってしまうため、後続のブロックも書き換える必要があり、それを書き換えるとさらにその後続もというように、それ以降の全てのブロックを書き換えなければならなくなります。それによってブロックチェーンの記録改竄を困難にしています。
![ブロックチェーン概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/16a60925-19ea-c5c6-33be-d6a7afcb7fe2.png)

## デジタル署名とは
デジタル署名とは、ハッシュ関数と公開鍵暗号の仕組みを用いた以下のような仕組みです。

<!-- TODO: 公開鍵暗号の説明を追加するかもしれません --> 

1. 送信者Aは公開鍵と秘密鍵のペアを用意し、メッセージのハッシュ値を送信者しか知らない秘密鍵で暗号化したデータをデジタル署名としてメッセージに添付して受信者Bに送る
2. 受信者BはAの公開鍵を用いてデジタル署名を復号化することでメッセージのハッシュ値を得る。
3. メッセージからハッシュ値を算出し、デジタル署名から復号したハッシュ値と一致するか検証する。

ビットコインでは、楕円曲線暗号という、「楕円曲線上の離散対数問題」の難しさを利用した暗号が使われています。一方の鍵で暗号化したものは、もう一方の鍵でなければ復号化することができません。公開鍵で復号化できるということは、唯一のペアである秘密鍵で暗号化したものであり、鍵の持ち主によって作成されたものであると検証できるということです。

デジタル署名の暗号化・復号化の流れを、公開鍵暗号と比較すると、逆のプロセスになっています。公開鍵暗号は誰でも暗号化できる仕組みで、デジタル署名は誰でも復号化（検証）ができる仕組みです。
![名称未設定ファイル.drawio(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/5aac2739-fdd8-9e21-4bcd-c73423745520.png)

## おわりに
今回はブロックチェーンに使われている技術のうち、暗号技術について取り上げました。暗号技術は身の回りの様々なところで使われているので、勉強しておいて損はないと思いました。しかし、やはりそう簡単に全て理解できるものではないということもわかったので、少しずつ理解を深めていこうと思っています。
後日、別の技術についても取り上げる予定ですので、よろしくお願いします。

## 参考文献

- [暗号資産（仮想通貨）とは何ですか?](https://www.boj.or.jp/announcements/education/oshiete/money/c27.htm/)
- [Bitcoinの仕組み](https://bitcoin.peryaudo.org/design.html)
- [ブロックチェーンの仕組み
](https://www.nttdata.com/jp/ja/services/blockchain/002/)
- [誕生日が一致する確率](https://keisan.casio.jp/exec/system/1161228814)
- 結城 浩,[『暗号技術入門』](https://www.sbcr.jp/product/4797382228/),第3版,SBクリエイティブ,2015年