【図解】秘密鍵・公開鍵・ビットコインアドレスの関係性




【図解】秘密鍵・公開鍵・ビットコインアドレスの関係性

仮想通貨(暗号資産)の根幹を成している「ブロックチェーン技術

このブロックチェーン技術は、

  • 公開鍵暗号方式
  • P2P(peer-to-peer)
  • ハッシュ関数

これら3つの技術を組み合わせた物になります。

公開鍵暗号方式に関する記事はこちら

【図解】共通鍵暗号方式と公開鍵暗号方式の仕組みと特徴
【図解】共通鍵暗号方式と公開鍵暗号方式の仕組みと特徴 現代生活で、切っても切れ離せないのが「インターネット」。 スマート・フォン、ノートパソコンを使ってインターネット接続しない日は、ほとんど無いと思われます。 そのインターネッ...

P2P(peer-to-peer)に関する記事はこちら

【図解あり】P2P(peer-to-peer)モデルとは
【図解あり】P2P(peer-to-peer)モデルとは P2P(peer-to-peer:ピア・ツー・ピア)モデルとは、複数の端末間で通信を行う際のコンピュータのネットワーク・アーキテクチャの一つです。 peer(ピア)・・・...

ハッシュ関数に関する記事はこちら

ハッシュ関数を分かりやすく説明する
ハッシュ関数を分かりやすく説明する ブロックチェーン技術・仮想通貨の盛り上がりに乗じて、注目を浴びているハッシュ関数。 ハッシュ関数は、用途等によって チェックサム 誤り訂正符号 暗号学的ハッシュ関数 等々 異...

公開鍵暗号方式

この記事では、ブロックチェーン技術1つである公開鍵暗号方式で使われる

  • 公開鍵
  • 秘密鍵

更に、公開鍵から派生して生成されるビットコインアドレスに注目してみたいと思います。

秘密鍵公開鍵ビットコインアドレスの関係性を解説後、

  • 公開鍵
  • 秘密鍵
  • ビットコインアドレス

それぞれの生成手順について説明していきます。

秘密鍵・公開鍵・ビットコインアドレスの関係

秘密鍵・公開鍵・ビットコインアドレスの関係

個人間や取引所を通して、仮想通貨(暗号資産)のトランザクション(取引)を行う場合、ウォレットという物が必要になります。

ウォレットに含まれている情報には

  • 秘密鍵
  • 公開鍵
  • ビットコインアドレス

が、あります。

それぞれの役割を銀行預金に例えるとすると、

  • 秘密鍵・・・暗証番号
  • 公開鍵・・・通帳
  • ビットコインアドレス・・・口座番号

と、なります。

仮想通貨
(暗号資産)
公開鍵

公開鍵
秘密鍵

秘密鍵
ビットコインアドレス

ビットコインアドレス
銀行預金通帳
暗証番号
取引暗証番号
口座番号
預金口座番号
ここで言う「通帳」は、「通帳」のみを使用したATMからの出金が不可のものであり、

  • 取引履歴
  • 口座番号

が、記載されている「通帳」を指します。

秘密鍵・公開鍵・ビットコインアドレスの生成手順

秘密鍵・公開鍵・ビットコインアドレスの生成手順

ビットコインアドレスを生成するまでの大まか流れは、

  1. 暗号的乱数器を利用し秘密鍵を生成
  2. 秘密鍵から楕円曲線暗号を利用して公開鍵を生成
  3. 公開鍵二重ハッシュ化
  4. 最後に、Base58エンコードという仕組みを使用してビットコインアドレスを生成します

秘密鍵・公開鍵・ビットコインアドレス

それでは、秘密鍵からビットコインアドレスの生成までの手順を見てみましょう。

秘密鍵

ビットコイン取引における秘密鍵は、ブロックチェーンの中のトランザクション(取引)に取引者本人が暗号化(電子署名)する際に使用されます。

ブロックチェーン

秘密鍵で暗号化した暗号文は、ペアとなる公開鍵でしか復号出来ず、公開鍵から秘密鍵を割り出すことは出来ません。

秘密鍵

秘密鍵の生成

秘密鍵の生成

ビットコイン秘密鍵には厳格な制限はありません。

  • 512 ビット(64 バイト) 128 文字
  • 128 ビット(16 バイト) 32文字
  • 256 ビット(32 バイト) 64文字

ビット・バイトに関する記事はこちら

コンピュータが動く仕組み【ビット・バイト】
コンピュータが動く仕組み【ビット・バイト】 コンピュータが動く仕組みは2進数が基本です。 2進数についてはこちら 僕たちが普段生活している世界では10進数を使っているので、2進数はしっくりこないと思います。 ...

どの長さを選んでも構いませんが、最も一般的なビットコイン秘密鍵は、256ビット(64文字)になります。

256ビットの整数がどの位、大きな数字かと言うと、

  • 256ビット ➡︎ 2256

ですので、10進数では

78桁の非常に大きい数字になります。

10進数に関する記事はこちら

コンピュータが動く仕組み【2進数・10進数を理解する】
コンピュータが動く仕組み【2進数・10進数を理解する】 コンピュータが動く仕組みを知る為には、2進数を知る事でより理解が深まります。 コンピュータのエネルギー源は電気です。 コンピュータの中の電気が枯渇してしまう(バッテリー切...

このように非常に大きな数から、1つの数字を秘密鍵とします。

つまり、下記の様に、どの数字も秘密鍵になるのです。

  • 1
  • 7
  • 28
  • 172
  • ・・・
  • ・・・
  • 115792089237316195423570985008687907853269984665640564039457584007913129639936

上記の秘密鍵は10進数ですが、実際のビットコイン秘密鍵は、16進数です。

暗号学的乱数を利用して256ビット(64文字)の秘密鍵を生成します。

公開鍵

ビットコイン取引における公開鍵は、ブロックチェーンの中の秘密鍵を使って暗号化(電子署名)したトランザクション(取引情報)が本当に正しいのかを復号(検証)する際に使用されます。

公開鍵の生成

公開鍵の生成

ビットコイン取引における公開鍵は、、秘密鍵から計算される際に、Secp256k1という楕円曲線暗号を用いたデジタル署名アルゴリズムを使います。

この短い文章の中に、難解な単語が頻発しましたので、僕が理解出来ている範囲で説明します。

アルゴリズム・・・

  • 数学
  • コンピューティング
  • 言語学
  • あるいは関連する分野

において、問題を解くための手順を定式化した形で表現したもの

このアルゴリズムの説明を見ると、少し難しそうです。

アルゴリズムを分かりやすく説明する為に、例を出します。

アルゴリズム

上記の文字列は、僕が即席で作った暗号文です。

このままだと意味のある文章になっていません。

この文字列を平文にする為には、暗号文に書かれているアルファベットをアルファベット順で1つ前のアルファベットに置換します。

アルゴリズム

すると、理解出来る文章に変わりました。

アルゴリズム

つまり、平文「アルファベット順で1つ前のアルファベットに置換する」という、法則・規則(アルゴリズム)を使って暗号文に変換したのです。

アルゴリズム

デジタル署名アルゴリズム

デジタル署名アルゴリズム(Digital Signature Algorithm : DSA)・・・離散対数問題と呼ばれる数学上の問題を安全性の根拠とするデジタル署名方式の一つ。

離散対数問題

離散対数問題とは、公開鍵暗号方式の原理となる数学的性質のひとつです。

公開鍵暗号方式とは

  • 秘密鍵を使って暗号化(電子署名)
  • 公開鍵を使って復号(検証)

が出来る暗号技術の事です。

公開鍵暗号方式に関する記事はこちら

【図解】共通鍵暗号方式と公開鍵暗号方式の仕組みと特徴
【図解】共通鍵暗号方式と公開鍵暗号方式の仕組みと特徴 現代生活で、切っても切れ離せないのが「インターネット」。 スマート・フォン、ノートパソコンを使ってインターネット接続しない日は、ほとんど無いと思われます。 そのインターネッ...

離散対数問題とは、

  • 素数 p
  • 定数 g

が与えられたとき、y = gx mod pは

  • xから計算することは容易
  • yからxを求めることは困難

という問題です。

公開鍵暗号方式離散対数問題に準えると、

  • x(公開鍵)から計算することは容易
  • y(秘密鍵)からx(公開鍵)を求めることは困難

となります。

素数・・・1と自分自身以外に正の約数を持たない自然数で、1でない数の事を指します。

例えば、

  • 2
  • 3
  • 5
  • 7
  • ・・・
  • ・・・
  • 3413
  • 3571
  • ・・・
  • ・・・

これらの数字は全て素数です。

modとは、moduloの略で、ある数値を別の数値で除算し、余りを取得する演算の事です。

modを掻い摘んで言うと、「割り算の余り」です。

整数aを整数bで割った余りがcであることを表します。

例えば、

73 で割った余りは 1
7 mod 3 = 1

83 で割った余りは 2
8 mod 3 = 2

93 で割った余りは 0
9 mod 3 = 0

余りは必ず、0 から b-1 の値のどれかになる性質があります。

離散対数問題を実際に具体的な数字を代入して計算してみましょう。

y = gx mod p

1 )以下の条件で、yの値を求めてみましょう。

  • 素数 p・・・5
  • 定数 g・・・2
  • x・・・4

24乗は 16 です。
16 ÷ 5 = 3 余り 1

yの値は、1 です。

次に以下の条件で、xの値を求めてみましょう。

  • 素数 p・・・5
  • 定数 g・・・2
  • y・・・1

数が小さいので、地道にxに1から順に代入して計算していけば、

  • x = 1 の場合、y = 2
  • x = 2 の場合、y = 4
  • x = 3 の場合、y = 3
  • x = 4 の場合、y = 1

xの値は、4 と意外と簡単に求められてしまいます。

2 )以下の条件で、yの値を求めてみましょう。

  • 素数 p・・・17
  • 定数 g・・・2
  • x・・・10

210乗は 1,024です。
1,024 ÷ 17 = 60 余り 4

yの値は、4 です。

次に以下の条件で、xの値を求めてみましょう。

  • 素数 p・・・17
  • 定数 g・・・2
  • y・・・4

xの値を求める為には、地道にxに数字を代入していくしかありません。

  • x = 1 の場合、y = 2
  • x = 2 の場合、y = 4
  • x = 3 の場合、y = 8
  • x = 4 の場合、y = 16
  • x = 5 の場合、y = 15
  • x = 6 の場合、y = 13
  • x = 7 の場合、y = 9
  • x = 8 の場合、y = 1
  • x = 9 の場合、y = 2
  • x = 10 の場合、y = 4

xの値は、10 でした。

上記、

  • 1 )
  • 2 )

2つの例題は数字が小さいので、地道に計算する事でxの値は求める事が出来ました。

次は、少し数字の桁数を増やしてみます。

3 )以下の条件で、yの値を求めてみましょう。

  • 素数 p・・・38501
  • 定数 g・・・2
  • x・・・1024

yを求めるのは、人間の力だと時間が掛かるので

  • 関数電卓
  • パソコン

の機能を利用して求めてみます。

離散対数問題

離散対数問題

yの値は、7586 でした。

次に以下の条件で、xの値を求めてみましょう。

  • 素数 p・・・38501
  • 定数 g・・・2
  • y・・・7586

xの値を求める為の機能は、

  • 関数電卓
  • パソコン

には備わっていない為、パソコンですらxを求める為には、地道にxに数字を代入して求めるしかありません。(総当たり)

  • x = 1 の場合、y = 2
  • x = 2 の場合、y = 4
  • x = 3 の場合、y = 8
  • ・・・
  • ・・・
  • x = 1024 の場合、y = 7586

xの値を求める為に、xに 1 から順に代入して x = 1,024 の時に求める事が出来ました。

しかし、このxの値が4桁ではなく、

  • 10桁
  • 30桁
  • 50桁

では、どうでしょうか。冷静沈着なコンピュータですら面倒臭くなって投げ出すかもしれません。(そんな事は有りません。答えが出るまで計算し続けます)

これが、先程述べた

  • 素数 p
  • 定数 g

が与えられたとき、y = gx mod pを

  • xから計算することは容易
  • yからxを求めることは困難

であると言う離散対数問題なのです。

デジタル署名

デジタル署名は、電子署名の事を指します。

電子署名に関する記事はこちら

【図解】電子署名のメリットと仕組みを分かり易く解説
【図解】電子署名のメリットと仕組みを分かり易く解説 電子署名とは、電子取引や電子ファイル(PDF 等々)の取引者・作成者を証明する技術のことです。 現在、企業・個人間で行われる契約書・稟議書等々の紙媒体への、 直筆の書名 ...
楕円曲線暗号

楕円曲線暗号(Elliptic Curve Cryptography: ECC)・・・楕円曲線上の離散対数問題の困難性を安全性の根拠とする暗号

楕円曲線の一般式は下記の通りです。

y2 = x3 + ax + b

また、どの様な関数グラフになるかと言うと、

楕円曲線のグラフ


出典:wikipedia
参考までに、1次から4次関数のグラフを載せてみます。

1次関数のグラフ

y = ax + b

1次関数のグラフ
2次関数のグラフ

y= a・x2 + b・x + c

2次関数のグラフ
3次関数のグラフ

y= a・x3 + b・x2 + c・x + d

3次関数のグラフ
4次関数のグラフ

y= a・x4 + b・x3 + c・x2 + d・x + e

4次関数のグラフ

ビットコインでは、楕円曲線の一般式である

y2 = x3 + ax + b

この一般式に

  • a = 0
  • b = 7
  • mod p

を代入した、Secp256k1という特殊な楕円曲線を使用しています。

Secp256k1の素数であるpには、2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1 が代入されます。

つまり、楕円曲線暗号Secp256k1の式は下記の通りになります。

この式の楕円曲線上で離散対数問題を利用して、

  • 64文字(32バイト)の秘密鍵から
  • 130文字(65バイト)のx(公開鍵)

を生成します。

ビットコインアドレス

ビットコインアドレスとは、ビットコイン

  • 送信
  • 受信

する際の宛先として利用されるものです。

ビットコインアドレスの生成

ビットコインアドレスの生成

公開鍵からビットコインアドレスを生成するまで

  1. SHA-256を利用したハッシュ化
  2. RIPEMD-160を利用したハッシュ化
  3. プレフィックスの付加
  4. チェックサムを生成
  5. Base58エンコードを通す

この様な手順を踏む事になります。

SHA-256

SHA-256

この工程では、

  • 130文字(65バイト)の公開鍵
  • SHA-256を使って、64文字(32バイト)のハッシュ値

に、変換します。

SHA-256とは、ハッシュ関数の1つです。

ハッシュ関数・・・
任意長のビット列から規則性のない固定長のビット列を生成する関数

ハッシュ関数は、アルゴリズムによって

  • MD5
  • SHA-256
  • SHA-512
  • RIPEMD-160 等々

が、あります。

アルゴリズムMD5SHA-256 SHA-512RIPEMD-160
ビット長(bit) 128256512160
バイト長(Byte) 16326420
ハッシュ値の長さ(桁) 326412840

SHA-256ハッシュ関数に関する記事はこちら

ハッシュ関数を分かりやすく説明する
ハッシュ関数を分かりやすく説明する ブロックチェーン技術・仮想通貨の盛り上がりに乗じて、注目を浴びているハッシュ関数。 ハッシュ関数は、用途等によって チェックサム 誤り訂正符号 暗号学的ハッシュ関数 等々 異...
RIPEMD-160とプレフィックス

RIPEMD-160 + 0x00

この工程では、先ず

  • 64文字(32バイト)のハッシュ値
  • RIPEMD-160を使って、40文字(20バイト)のハッシュ値

に変換します。

  • 前工程のSHA-256を利用したハッシュ化
  • この工程のRIPEMD-160を利用したハッシュ化

これらの工程は、二重ハッシュ化と呼ばれています。

二重ハッシュ化により生成されたハッシュ値の先頭に、プレフィックス(Prefix:接頭辞)を加えます。

プレフィックスビットコインアドレスの識別子の役割を担います。

プレフィックスは、16進数で識別されています。

例えば、

  • 0x00 (メインネット)・・・価格の付いているビットコインの所有・送信が可能
  • 0x6F (テストネット)・・・ビットコインの送信等の試行が可能

等々、あります。

Version prefix種類
0x00 公開鍵ハッシュ(P2PKH)
0x05 スクリプトハッシュ(P2SH)
0x80
秘密鍵WIF形式
0x80秘密鍵圧縮WIF形式
0x0142BIP38暗号化秘密鍵
0x0488B21EBIP32拡張公開鍵

RIPEMD-160に関する記事はこちら

ハッシュ関数を分かりやすく説明する
ハッシュ関数を分かりやすく説明する ブロックチェーン技術・仮想通貨の盛り上がりに乗じて、注目を浴びているハッシュ関数。 ハッシュ関数は、用途等によって チェックサム 誤り訂正符号 暗号学的ハッシュ関数 等々 異...
チェックサム

SHA-256 × 2

この工程では、前工程で生成された、

  • プレフィックス
  • RIPEMD-160ハッシュ関数を利用して生成されたペイロード(データ)

これらを組み合わせた文字列に、SHA-256ハッシュ関数2回利用して、チェックサムを生成します。

チェックサム・・・最終的にビットコインアドレスが正しい形式かどうか検証するための認証コードのようなもの。

先ず、SHA-256ハッシュ関数2回利用して、ハッシュ値を生成。

  • 42文字(21バイト)のハッシュ値
  • SHA-256を使って、64文字(32バイト)のハッシュ値に変換
  • 再度、SHA-256を使って、64文字(32バイト)のハッシュ値

に変換します。

生成されたハッシュ値の先頭4バイト(8文字)をチェックサムとして抽出します。

チェックサム

抽出したチェックサム

  • プレフィックス
  • ペイロード(データ)

の後尾に付加します。

チェックサム

Base58エンコード

Base58エンコード

これが最後の工程となり、

  • プレフィックス
  • ペイロード(データ)
  • チェックサム

これらが1つになった文字列にBase58エンコードを通してビットコインアドレスを生成します。

Base58エンコード・・・可読性や送信アドレスの間違いを防止する機能を持った、ビットコインの為に開発されたエンコード形式。

Base58エンコードには、

  • 0 ~ 9
  • a ~ z
  • A ~ Z

これら、62種類の文字列から

  • 0(ゼロ)
  • O(大文字のオー)
  • l(小文字のエル)
  • I(大文字のアイ)

を除いた58種類の文字と数字を使います。

Base58エンコードを利用後のプレフィックスは以下の様になります。

Version prefixBase58変換後のprefix
0x00 1
0x05 3
0x80
5
0x80K or L
0x01426P
0x0488B21EXpub

コメント