【ビットコイン・仕組み】ビットコインアドレスの作り方

ビットコインアドレスの作り方を図解で説明してみる




【ビットコイン・仕組み】ビットコインアドレスの作り方

あなたの銀行口座から

  • 家族間
  • 友達同士
  • 仕事の取引相手 等々

に銀行送金する場合、送金相手の口座番号が分からなければ、あなたは銀行送金する事が出来ません。

ビットコイン取引の送受信も銀行送金と同様に、送受信先の「口座番号」が分からなければ、ビットコインの送受信は出来ません。

ビットコイン取引における、銀行の「口座番号」にあたるのはビットコインアドレスになります。

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

この記事では、このビットコインアドレスの作り方を図解で説明していきます。

ビットコインアドレスの作り方

ビットコインアドレスの作り方

ビットコイン取引を

  • 個人同士
  • 取引所・販売所

を通して行う場合、ウォレットという物が必要になります。

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

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

があります。

  • 公開鍵
  • 秘密鍵

は公開鍵暗号方式という暗号技術によって生成されたもので、

  • 公開鍵・・・暗号文を復号
    • 秘密鍵でしか開錠出来ない錠みたいなもの
    • 秘密鍵により複数作成可能
  • 秘密鍵・・・平文を暗号化
    • 公開鍵を作成出来る鍵みたいなもの
    • 公開鍵を開錠出来る唯一の手段

という特徴をそれぞれ持っています。

これら「鍵」は、暗号化・復号化する為の手段であり、インターネット上で、実際に物理的(有形)な「鍵」が存在するわけではありません。

実際の「鍵」の正体は、「鍵」のような役割を果たす無形資産(データ)です。

暗号化・・・第三者が通信文を見ても特別な知識なしでは読めないように変換するセキュア通信の手法

復号化・・・デジタルデータを特定の方法で、元の通信文・データに戻す変換を加えること

暗号化・復号化

公開鍵暗号方式

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

【図解】共通鍵暗号方式と公開鍵暗号方式の仕組み・特徴
【図解】共通鍵暗号方式と公開鍵暗号方式の仕組み・特徴 インターネットの世界では 色々な情報を瞬時に検索可能 実際に店舗に行かずにオンラインショッピングが可能 インターネットに繋がっている端末さえ保有していれば誰とでも通信可能 という大きなメ...

ビットコインアドレスは公開鍵から派生して生成されるモノであり、

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

それぞれの役割を銀行取引に例えると、

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

になります。

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

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

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

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

となります。

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

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

秘密鍵

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

ブロックチェーン

秘密鍵で暗号化した暗号文は、

  • ペアとなる公開鍵でしか復号出来ない
  • 公開鍵から秘密鍵を割り出すことは不可能

秘密鍵

秘密鍵の生成

秘密鍵の生成

ビットコイン取引での秘密鍵の長さには厳格な制限はありません。

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

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

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

1バイトは何ビット?16進数から10進数・2進数に変換
1バイトは何ビット?16進数から10進数・2進数に変換 私たちが生活している世界では10進数が利用される事が多く、2進数にあまり馴染みがありません。 しかし、今や生活に欠かす事の出来ないコンピュータは2進数を利用しています。 人間の世界・・...

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(公開鍵)を求めることは困難

となります。

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

例えば、

  • 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 になります。

また、関数グラフで表すと下記の様になります。

楕円曲線のグラフ


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

・一次関数のグラフ・・・y = ax + b

1次関数のグラフ

・二次関数のグラフ・・・y= a・x2 + b・x + c

2次関数のグラフ

・三次関数のグラフ・・・y= a・x3 + b・x2 + c・x + d

3次関数のグラフ

・四次関数のグラフ・・・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の式は下記の通りになります。

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

  1. 64文字(32バイト)の秘密鍵から
  2. 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-256SHA-512RIPEMD-160
ビット長(bit)128256512160
バイト長(Byte)16326420
ハッシュ値の長さ(桁)326412840

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

ハッシュ関数とは?ハッシュ関数のアルゴリズムと種類
ハッシュ関数とは?ハッシュ関数のアルゴリズムと種類 ブロックチェーン技術・仮想通貨の盛り上がりに乗じて、注目を浴びているハッシュ関数。 ハッシュ(hash)は英単語ですが、 ハッシュド・ポテト(hashed potato) ハッシュド・ビー...
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拡張公開鍵

チェックサム

SHA-256 × 2

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

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

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

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

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

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

に変換します。

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

チェックサム

抽出したチェックサムを

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

の後尾に付加します。

チェックサム

Base58エンコード

Base58エンコード

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

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

これらが一つになった文字列に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

以上、ビットコインアドレスの作り方についての説明になります。

コメント