前提
- この記事は2019/7/9にAIdemyのブロックチェーン発展Ⅰを受講した後、学んだことと理解に時間がかかったところ(個人的ハマりポイント)の備忘録です。
- 筆者はブロックチェーン勉強始めたばかりなので誤りがあるかもしれません。気がつけばすぐに修正します。
- AIdemyのリンク先
https://aidemy.net/courses
以下、学んだこととハマりポイント
公開鍵暗号方式の概要
公開鍵暗号方式の流れは以下の通り
- 受信者は送信者に対して公開鍵を送信する(公開する)。
- 送信者は公開鍵を使用して暗号文を作成する。
- 受信者に対して暗号文を送信する。
- 受信者は秘密鍵を使用して暗号文を復号する。
秘密鍵、公開鍵、ビットコインアドレスの生成
生成順は以下の通り
1. 秘密鍵を"暗号学的に安全な方法で"ランダムに生成する
-
秘密鍵とはランダムな数字の並びのこと
-
言語に用意されている乱数器ではダメ。ビットコインでは、osの乱数器を用いて人由来のランダム性を用いて初期化される
2. 公開鍵を秘密鍵から生成する
-
secp256k1と呼ばれる楕円曲線暗号を用いてスカラー倍算により生成する
-
公開鍵は楕円曲線上の、ある点の座標のことである(つまりx=??,y=??という形)
-
公開鍵から秘密鍵を特定することは現実的な時間では困難
ハマりポイント①
講義の中で楕円曲線の式と図が出てきて、あたかもその式が下の図を表したもののように見える(筆者には見えた)が、実は違う。
問題の箇所↓
↑数学に強い人なら式と図が対応していないことは見た瞬間違うと分かるだろうし、実際微分とかしてみれば確かめられるのだが、筆者は「なんかおかしいよなー??」という状態で30分も時間を消費してしまった。
※結局、以下のサイトの解説がとても分かり易かった↓
https://gaiax-blockchain.com/elliptic-curve-cryptography
3. 公開鍵からビットコインアドレスを生成する
-
公開鍵から公開鍵ハッシュという20byteの数字を作り出し、次にその公開鍵ハッシュをBase58Checkと呼ばれる形にエンコードすることでビットコインアドレスが得られる
-
公開鍵ハッシュを生成する際は、2回ハッシュ関数にかける
-
2回ハッシュ関数かけることを「ダブルハッシュ」と呼び、ビットコインではあらゆる場面で用いられる
-
Base58Checkという方式を用いてエンコード(一定の規則に従って符号に変換)することでビットコインアドレスを作成する
ハマりポイント②
ここで、いきなり初めて聞く「RIPEMD-160」が登場し、何のために使うのか解説もなく当たり前のように使おうとするので、「何それ??」と戸惑った。
調べた結果、RIPEMD-160は「ライプエムディー160」と呼び、SHA-256と同じハッシュ関数である。SHA-256とRIPEMD-160違いは以下の通り
SHA-256 | RIPEMD-160 | |
---|---|---|
得られるハッシュ値の長さ | 64文字(256bit) | 40文字(160bit) |
開発元 | NSA(米国標準技術局) | オープンな学術コミュニティ |
ビットコインアドレスなどの短いハッシュ値を得たいときに、SHA-256からのRIPEMD-160というダブルハッシュが用いられる。ビットコインにおいては、その他基本的にはSHA-256を2回ともかけるダブルハッシュが用いられる。
※SHA-256とRIPEMD-160については以下のサイトでより詳しく解説されている↓
https://gaiax-blockchain.com/ripemd-160
ウォレットの実装
ここからはまだ講義を受けていないので、受け次第更新する。(数日のうちに)