認証の仕組みを知ろう!ビットコインの秘密鍵と公開鍵とは
初心者向けに公開鍵暗号方式について詳しく解説しています。仮想通貨を知る上で重要な秘密鍵や公開鍵について説明し、ビットコイン取引における役割も記載しています。ビットコインの管理方法を知る上でもぜひ覚えておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
仮想通貨やブロックチェーンを理解する上で知っておきたい秘密鍵と公開鍵について解説します。
代表的な仮想通貨ビットコインにおける公開鍵と秘密鍵の役割についてどんなシーンで利用するのかなど紹介しています。公開鍵暗号とは何か理解していきましょう。
今回は公開鍵暗号方式と、そこで使われる公開鍵・秘密鍵について解説しよう。
田島メンター!公開鍵と秘密鍵はそれぞれどういったものなんですか~?
この二つについて説明する前に、まずは公開鍵暗号方式がどういう仕組みなのかについて見てみようか。
分かりました。お願いします!
目次
公開鍵暗号方式
秘密鍵と公開鍵は、「公開鍵暗号方式」という暗号化方式で利用されます。
公開鍵暗号方式とは、デジタル署名で利用される暗号化方式です。
デジタル署名とは、デジタルデータで署名を行い、本人であるかの確認をすることです。
デジタルデータで署名を行うため、本人であるかの確認は署名内容ではなく、署名とデータと公開鍵を利用して行われます。
公開鍵暗号方式のメリット
公開鍵暗号方式は非常に堅牢な暗号方式です。
理由としては、公開鍵暗号方式をハッキングしようとすると膨大な計算が必要になります。
そのため、非常に堅牢なセキュリティを保つことができます。
公開鍵暗号方式のデメリット
複雑な計算処理が必要ということは、公開鍵暗号方式を利用してデータの受け渡しをする際、巨大なデータを渡す場合、復号作業の負担も大きくなります。
そのため、大きなデータを暗号化して受け渡す場合には向いていません。
もちろん、大きなデータであっても堅牢性を高める必要がある重要なデータである場合は公開鍵暗号方式を利用したほうが良いかもしれません。
デジタル署名で公開鍵暗号方式を利用する流れ
送信者デジタル署名の流れ
- 送信者が持つデータをハッシュ関数でハッシュ値を計算することができます。
- 送信者の秘密鍵で計算したハッシュ値を暗号化することができます。
- 暗号化してから、署名を作成することができます。
- 送信者が持つデータと署名をセットにしたものと、公開鍵を受信側へ送信します。
受信者デジタル署名の流れ
- 送信者からデータと署名を受け取ります。
- 送信者から受け取ったデータを送信者と同じハッシュ関数でハッシュ化計算を行うことができます。
- ハッシュ化計算でハッシュ値を算出することができます。
- 送信者から受け取った署名を送信者の公開鍵を使用して復号することで復号データを得ます。
- 受信者が算出したハッシュ値と、受信者が復号した複合データの値を比べます。
- 比べた値が合致していることで、送られてきたデータが途中で改ざんされておらず、送信者から送られてきたものであることを確認できます。
ハッシュ関数の記事も合わせて参考にしてみてください。
公開鍵暗号方式の基本の流れだよ。
ハッシュ値と複合データを照らし合わせて、途中で改ざんなどが行われていないかを確認するんですね。
それでは次に、公開鍵と秘密鍵が実際にどのように使われていくのかを確認してみよう。
公開鍵とは
公開鍵とは、公開鍵暗号化方式で利用する鍵です。
公開鍵は不特定多数の第三者に知られてもセキュリティー上問題のない鍵です。
公開鍵はそれ単体だと特に外部から何かすることはできません。
公開鍵は秘密鍵とセットで生成されます。
ビットコインにおける公開鍵
ビットコインにおける公開鍵は、公開鍵を2回ハッシュ化し、チェックサムを行い、BASE58でフォーマットを行うことでビットコインアドレスという物を生成します。
つまり、ビットコインアドレスは、公開鍵を元にした複雑な計算結果を行い、生成されるということです。
このことは、ビットコインアドレスから公開鍵を計算することは非常に難しく、ほぼできないと考えることもできます。
つまり、公開鍵がわからない場合は、データとともに来た署名が正しいものかもわかりません。
なぜなら、ビットコインアドレスから公開鍵の値を求めることができないためです。
このことから、トランザクションに記録する際は、署名と共に公開鍵も記録します。
ビットコインの公開鍵は、楕円曲線公開鍵暗号(ECC)を利用して作成されます。
秘密鍵とは
秘密鍵は、公開鍵暗号方式で公開鍵とセットで生成される鍵です。
送金時の署名を行う際に使用します。
ビットコインにおける秘密鍵
ビットコインでも秘密鍵は使用されます。
ビットコインウォレットには、ウォレットファイルに保存されている秘密鍵が存在します。
そして、秘密鍵はウォレット用に生成された全てのビットコインアドレスと関連があります。
ビットコインにおける秘密鍵は、ユーザーがビットコインを利用する際に許可するために使用されます。
秘密鍵は、ユーザーのコンピューター内のデータとして利用できますし、紙に印刷することで利用することもできます。
紙に印刷したものをペーパーウォレットと呼びます。
また、一部のウォレットでは、トランザクションを生成すること無く、秘密鍵を利用できます。
ビットコイン取引における公開鍵と秘密鍵
1.公開鍵と秘密鍵の生成
公開鍵と秘密鍵は同時期にペアで生成されます。
記事内で記載している公開鍵や秘密鍵やアドレスやデータは例であり、実際の情報ではございません。
秘密鍵
5HpHagT65TZzG1OH3CSu74k8DbpvR8s5ip4nEB3kQsreAnchuDf
↓
secp256k1という楕円曲線公開鍵暗号(ECC)を利用して公開鍵を生成
↓
楕円曲線公開鍵暗号(ECC)を利用して生成された公開鍵
0450863AD64A87AE8A2FE83C1AF1A8003CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E00007716103ABC11A1DF38855ED6F2EE187E9C582BA6
2.公開鍵からビットコインアドレスを生成
楕円曲線公開鍵暗号(ECC)を利用して生成された公開鍵
0450863AD64A87AE8A2FE83C1AF1A8003CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E00007716103ABC11A1DF38855ED6F2EE187E9C582BA6
↓
2度ハッシュ関数を利用したハッシュ化を行い、チェックサムを行い、BASE58でフォーマットを行うことでビットコインアドレスという物を生成します。
↓
アドレス
1EHNa6Q4Jz2uvNExL000mE43ikXhwF6kZm
3.暗号化してから、署名を作成することができます。
送信者が送信データトランザクションに対し、秘密鍵を利用して署名を行います。
トランザクションの構造
Version No Input Counter Input List Output Counter Output List Locktime
解説
Version Noは4バイトで構成され、どのバージョンであるかを指定しています。現在のビットコインのバージョンは1です。
Input Counterは1-9バイトで構成され、Input Listの数を定義します。
Input Listは可変バイトで構成され、トランザクションインプット(TxIn)の数を指定します。
Output Counterは1-9バイトで構成され、Output Listの数を定義します。
Output Listは可変バイトで構成され、トランザクションアウトプット(TxOut)の数を指定します。
Locktimeは予約された日時になるまで使用禁止にする値です。500000000以上の場合は、Unixtimeで予約された日時に成るまで使用禁止になります。
500000000未満の場合はブロック高を基準にロックされます。
0の場合はロックされません。
↓
送信情報に秘密鍵を利用して署名を行います。
↓
署名済みのデータ
3045022100e81490eba1885efc2afaa7b0000650a195245d3349c62845c6742s000081e431589478152a541f6ad2w5ss54q514a84d00006515651548+95+2654qwf614saw6972
4.送信者が持つデータと署名をセットにしたものと、公開鍵を受信側へ送信します。
署名済みのデータ
3045022100e81490eba1885efc2afaa7b0000650a195245d3349c62845c6742s000081e431589478152a541f6ad2w5ss54q514a84d00006515651548+95+2654qwf614saw6972
楕円曲線公開鍵暗号(ECC)を利用して生成された公開鍵
0450863AD64A87AE8A2FE83C1AF1A8003CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E00007716103ABC11A1DF38855ED6F2EE187E9C582BA6
↓
受信者が受信
5.送信者からデータと署名を受け取ります。
署名済みのデータ
3045022100e81490eba1885efc2afaa7b0000650a195245d3349c62845c6742s000081e431589478152a541f6ad2w5ss54q514a84d00006515651548+95+2654qwf614saw6972
楕円曲線公開鍵暗号(ECC)を利用して生成された公開鍵
0450863AD64A87AE8A2FE83C1AF1A8003CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E00007716103ABC11A1DF38855ED6F2EE187E9C582BA6
6.送信者からのデータから検証データを作成
署名済みのデータをハッシュ化されたデータを作成
↓
署名済みのデータと楕円曲線公開鍵暗号(ECC)を利用して復号データを作成
7.送信者からのデータを検証
ハッシュ化されたデータと復号データが同じであれば、送信者から送られてきたデータが正しいものだと検証できます。
ここまで複雑な計算を行いデータチェックを完了できました。
つまり、公開鍵だけ保有していても何も意味しないということになります。
今回は、秘密鍵と公開鍵について解説しました。
公開鍵と秘密鍵を用いた、公開鍵暗号方式の具体的な手順について説明したよ。
公開鍵だけでは復号化ができないから、第三者がデータを見たりすることはできないという形なんですね。
そうだね。また、送信側と受信側の鍵が同じ形式である共通鍵暗号方式という仕組みも存在するんだ。セットで覚えておこう。
了解です。ありがとうございました!
この記事を監修してくれた方
中本賢吾(なかもとけんご) 開発実績:PHPフレームワークを利用した会員制SNS・ネットショップ構築、AWSや専用サーバー下でLinuxを使用したセキュアな環境構築、人工知能を利用したシステム開発、店舗検索スマホアプリ開発など。 その他にも地域の職業プログラマー育成活動を行い、2018年には小学生がUnityで開発したオリジナルAndroidアプリをGooglePlayでリリース。ゲームで遊ぶより作ろうぜ!を合言葉に、小学生でも起業できる技術力を育成可能で有ることを証明し続けている。 |