【ビットコイン・仕組み】ビットコインアドレスの作り方
あなたの銀行口座から
- 家族間
- 友達同士
- 仕事の取引相手 等々
に銀行送金する場合、送金相手の口座番号が分からなければ、あなたは銀行送金する事が出来ません。
ビットコイン取引の送受信も銀行送金と同様に、送受信先の「口座番号」が分からなければ、ビットコインの送受信は出来ません。
ビットコイン取引における、銀行の「口座番号」にあたるのはビットコインアドレスになります。
この記事では、このビットコインアドレスの作り方を図解で説明していきます。
ビットコインアドレスの作り方
ビットコイン取引を
- 個人同士
- 取引所・販売所
を通して行う場合、ウォレットという物が必要になります。
ウォレットに含まれている情報には
- 秘密鍵
- 公開鍵
- ビットコインアドレス
があります。
- 公開鍵
- 秘密鍵
は公開鍵暗号方式という暗号技術によって生成されたもので、
- 公開鍵・・・暗号文を復号
- 秘密鍵でしか開錠出来ない錠みたいなもの
- 秘密鍵により複数作成可能
- 秘密鍵・・・平文を暗号化
- 公開鍵を作成出来る鍵みたいなもの
- 公開鍵を開錠出来る唯一の手段
という特徴をそれぞれ持っています。
これら「鍵」は、暗号化・復号化する為の手段であり、インターネット上で、実際に物理的(有形)な「鍵」が存在するわけではありません。
実際の「鍵」の正体は、「鍵」のような役割を果たす無形資産(データ)です。
公開鍵暗号方式に関する記事はこちら
ビットコインアドレスは公開鍵から派生して生成されるモノであり、
- 公開鍵
- 秘密鍵
- ビットコインアドレス
それぞれの役割を銀行取引に例えると、
- 公開鍵・・・通帳
- 秘密鍵・・・暗証番号
- ビットコインアドレス・・・口座番号
になります。
秘密鍵・公開鍵・ビットコインアドレスの生成手順
ビットコインアドレスを生成するまでの大まかな流れは、
- 暗号的乱数器を利用し秘密鍵を生成
- 秘密鍵から楕円曲線暗号を利用して公開鍵を生成
- 公開鍵を二重ハッシュ化
- 最後に、Base58エンコードという仕組みを使用してビットコインアドレスを生成
となります。
それでは、秘密鍵からビットコインアドレス生成までの流れを見てみましょう。
秘密鍵
ビットコイン取引における秘密鍵は、ブロックチェーンのトランザクション(取引)に取引者本人が暗号化(電子署名)する際に利用されます。
秘密鍵で暗号化した暗号文は、
- ペアとなる公開鍵でしか復号出来ない
- 公開鍵から秘密鍵を割り出すことは不可能
秘密鍵の生成
ビットコイン取引での秘密鍵の長さには厳格な制限はありません。
- 512 ビット(64バイト)128 文字
- 128 ビット(16バイト)32文字
- 256 ビット(32バイト)64文字
どの長さを選んでも構いませんが、最も一般的なビットコインの秘密鍵は、256ビット(64文字)になります。
ビット・バイトに関する記事はこちら
256ビットの整数がどの位、大きな数字かと言うと、
- 256ビット・・・2256
ですので、10進数では
78桁の非常に大きい数字になります。
このように非常に大きな数から、一つの数字を秘密鍵とします。
つまり下記の様に、どの数字も秘密鍵になるのです。
- 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(公開鍵)を求めることは困難
となります。
例えば、
- 2
- 3
- 5
- 7
- ・・・
- ・・・
- 3413
- 3571
- ・・・
- ・・・
これらの数字は全て素数です。
modとは、moduloの略で、ある数値を別の数値で除算し、余りを取得する演算の事です。
modを掻い摘んで言うと、「割り算の余り」になります。
整数aを整数bで割った余りがcであることを表します。
例えば、
- 7 を 3 で割った余りは 1
7 mod 3 = 1 - 8 を 3 で割った余りは 2
8 mod 3 = 2 - 9 を 3 で割った余りは 0
9 mod 3 = 0
余りは必ず、0 から b-1 の値のどれかになる性質があります。
離散対数問題を実際に具体的な数字を代入して計算してみましょう。
y = gx mod p
1)以下の条件で、yの値を求めてみましょう。
- 素数 p・・・5
- 定数 g・・・2
- x・・・4
2 の 4乗は 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
2 の 10乗は 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の値が四桁ではなく、
- 10桁
- 30桁
- 50桁
では、どうでしょうか。冷静沈着なコンピュータですら面倒臭くなって投げ出すかもしれません。(そんな事は有りません。答えが出るまで計算し続けます)
これが先程述べた
- 素数 p
- 定数 g
が与えられたとき、y = gx mod pを
- xから計算することは容易
- yからxを求めることは困難
である離散対数問題なのです。
楕円曲線暗号
楕円曲線暗号(Elliptic Curve Cryptography:ECC)とは、楕円曲線上の離散対数問題の困難性を安全性の根拠とする暗号です。
楕円曲線の一般式は、 y2 = x3 + ax + b になります。
また、関数グラフで表すと下記の様になります。
・一次関数のグラフ・・・y = ax + b
・二次関数のグラフ・・・y= a・x2 + b・x + c
・三次関数のグラフ・・・y= a・x3 + b・x2 + c・x + d
・四次関数のグラフ・・・y= a・x4 + b・x3 + c・x2 + d・x + e
ビットコインでは、楕円曲線の一般式である y2 = x3 + ax + b に
- a = 0
- b = 7
- mod p
を代入した、Secp256k1という特殊な楕円曲線を使用しています。
つまり、楕円曲線暗号・Secp256k1の式は下記の通りになります。
この式の楕円曲線上で離散対数問題を利用して、
- 64文字(32バイト)の秘密鍵から
- 130文字(65バイト)のx(公開鍵)
を実際に生成します。
ビットコインアドレス
ビットコインアドレスとは、ビットコインを
- 送信
- 受信
する際の宛先として利用されるものです。
ビットコインアドレスの生成
公開鍵からビットコインアドレスを生成するまで
- SHA-256を利用したハッシュ化
- RIPEMD-160を利用したハッシュ化
- プレフィックスの付加
- チェックサムを生成
- Base58エンコードを通す
という流れになります。
SHA-256
この工程では、
- 130文字(65バイト)の公開鍵を
- SHA-256を使って、64文字(32バイト)のハッシュ値
に、変換します。
SHA-256とは、ハッシュ関数の1つです。
ハッシュ関数とは、任意長のビット列から規則性のない固定長のビット列を生成する関数の事です。
ハッシュ関数は、アルゴリズムによって
- MD5
- SHA-256
- SHA-512
- RIPEMD-160 等々
が、あります。
アルゴリズム | MD5 | SHA-256 | SHA-512 | RIPEMD-160 |
---|---|---|---|---|
ビット長(bit) | 128 | 256 | 512 | 160 |
バイト長(Byte) | 16 | 32 | 64 | 20 |
ハッシュ値の長さ(桁) | 32 | 64 | 128 | 40 |
SHA-256・ハッシュ関数に関する記事はこちら
RIPEMD-160とプレフィックス
この工程では、先ず
- 64文字(32バイト)のハッシュ値を
- RIPEMD-160を使って、40文字(20バイト)のハッシュ値
に変換します。
- 前工程のSHA-256を利用したハッシュ化
- この工程のRIPEMD-160を利用したハッシュ化
これらの工程は、二重ハッシュ化と呼ばれています。
二重ハッシュ化により生成されたハッシュ値の先頭に、プレフィックス(Prefix:接頭辞)を加えます。
プレフィックスは、16進数で識別されています。
例えば、
- 0x00(メインネット)・・・価格の付いているビットコインの所有・送信が可能
- 0x6F(テストネット)・・・ビットコインの送信等の試行が可能
等々、あります。
Version prefix | 種類 |
---|---|
0x00 | 公開鍵ハッシュ(P2PKH) |
0x05 | スクリプトハッシュ(P2SH) |
0x80 | 秘密鍵WIF形式 |
0x80 | 秘密鍵圧縮WIF形式 |
0x0142 | BIP38暗号化秘密鍵 |
0x0488B21E | BIP32拡張公開鍵 |
チェックサム
この工程では、前工程で生成された、
- プレフィックス
- RIPEMD-160・ハッシュ関数を利用して生成されたペイロード(データ)
これらを組み合わせた文字列に、SHA-256のハッシュ関数を二回利用して、チェックサムを生成します。
先ず、SHA-256のハッシュ関数を二回利用して、ハッシュ値を生成
- 42文字(21バイト)のハッシュ値を
- SHA-256を使って、64文字(32バイト)のハッシュ値に変換
- 再度、SHA-256を使って、64文字(32バイト)のハッシュ値
に変換します。
生成されたハッシュ値の先頭4バイト(8文字)をチェックサムとして抽出します。
抽出したチェックサムを
- プレフィックス
- ペイロード(データ)
の後尾に付加します。
Base58エンコード
これが最後の工程となり、
- プレフィックス
- ペイロード(データ)
- チェックサム
これらが一つになった文字列にBase58エンコードを通してビットコインアドレスを生成します。
Base58エンコードとは可読性や送信アドレスの間違いを防止する機能を持った、ビットコインの為に開発されたエンコード形式になります。
Base58エンコードには、
- 0 ~ 9
- a ~ z
- A ~ Z
これら62種類の文字列から
- 0(ゼロ)
- O(大文字のオー)
- l(小文字のエル)
- I(大文字のアイ)
を除いた58種類の文字と数字を使います。
Base58エンコードを利用後のプレフィックスは以下の様になります。
Version prefix | Base58変換後のprefix |
---|---|
0x00 | 1 |
0x05 | 3 |
0x80 | 5 |
0x80 | K or L |
0x0142 | 6P |
0x0488B21E | Xpub |
以上、ビットコインアドレスの作り方についての説明になります。
コメント