暗号鍵
XRP Ledgerでは、トランザクションによる一連の具体的なアクションの実行が承認されていることを、デジタル署名によって証明します。署名されたトランザクションのみがネットワークに送信され、検証済みレジャーに含まれます。
すべてのデジタル署名は、トランザクションの送信側アカウントに関連付けられている暗号鍵ペアに基づいています。キーペアはXRP Ledgerでサポートされている暗号化署名アルゴリズムを使用して生成できます。キーペアの生成に使用されたアルゴリズムの種類にかかわらず、キーペアはマスターキーペア、レギュラーキーペア、または署名者リストのメンバーとして使用できます。
警告: 秘密鍵のセキュリティを適切に維持することが重要です。デジタル署名は、あなたがトランザクション送信する権限を有していることをXRP Ledgerに対して検証できる唯一の手段であり、レジャーに提出されたトランザクションの取り消しや無効化を行う権限を有する管理者は存在しません。お使いのXRP Ledgerアカウントの秘密鍵があなた以外の何者かに知られた場合、その人物はあなたと同様にデジタル署名を作成し、トランザクションを承認することができます。
キーの生成
wallet_propose
メソッドを使用してキーペアを生成します。以下は、wallet_propose
の応答例です。
{
"result": {
"account_id": "rDGnaDqJczDAjrKHKdhGRJh2G7zJfZhj5q",
"key_type": "secp256k1",
"master_key": "COON WARN AWE LUCK TILE WIRE ELI SNUG TO COVE SHAM NAT",
"master_seed": "sstV9YX8k7yTRzxkRFAHmX7EVqMfX",
"master_seed_hex": "559EDD35041D3C11F9BBCED912F4DE6A",
"public_key": "aBQXEw1vZD3guCX3rHL8qy8ooDomdFuxZcWrbRZKZjdDkUoUjGVS",
"public_key_hex": "0351BDFB30E7924993C625687AE6127034C4A5EBA78A01E9C58B0C46E04E3A4948"
},
"status": "success",
"type": "response"
}
この応答には、キーペア(さまざまなフォーマットのシードと公開鍵)とaccount_id
が含まれています。
シード
シード 値は、アカウントの実際の秘密鍵(および公開鍵)を導出するために使用されるコンパクトな値です。master_key
、master_seed
、およびmaster_seed_hex
はすべて、同じシード値を表しますが、フォーマットが異なります。これらのいずれのフォーマットも、rippled
APIやその他のXRPLソフトウェアでトランザクションに署名するときに使用することができます。キーの先頭にmaster_
が付いていますが、このシードが表すキーが必ずしもアカウントのマスターキーであるとは限りません。キーペアは、レギュラーキーだけでなく、マルチ署名のリストのメンバーとしても使用できます。
シード値はアカウントのその他のあらゆる情報の基盤であるため、慎重に保護する必要があります。アドレスのシード値を知っている人なら誰でも、事実上そのアドレスを完全に制御できます。
秘密鍵
wallet_propose
応答には、秘密鍵( プライベートキー とも呼ばれます)の値が明示的に示されていません。トランザクションに署名できるソフトウェアであれば、シード値から秘密鍵を導出可能であると考えられます。
公開鍵
public_key
とpublic_key_hex
はいずれも、同一値の公開鍵を表します。公開鍵は、鍵導出の一環として秘密鍵から導出されます。公開鍵を使用すると、トランザクション署名の真正性を検証できますが、それ以上の署名を作成することはできません。
account_id
account_id
は公開鍵から生成され、アカウントがXRP Ledgerに作成される可能性を示します。account_id
が存在していても、account_id
が最初の XRPでの支払いを受領するまでは、実際のアカウントはXRP Ledgerに存在しません。さらにaccount_id
は、資金を供給するトランザクションを受領して、アカウントが作成されるまでは、トランザクションを送信することができません。
ただし、(資金供給されたアカウントのない)account_id
は、既存の別のアカウントのトランザクションを承認する際にレギュラーキーまたは署名者リストのメンバーとして使用できます。
資金供給されたアカウントを作成してレジャーに保管するには、account_id
が、必要準備金を満たすのに十分なXRPを供給するPayment
トランザクションを受領する必要があります。
wallet_propose
応答についての詳細は、wallet_propose
を参照してください。
生成されたキーペアは、マスターキーペア、レギュラーキーペア、または署名者リストメンバーのいずれかとして使用できます。
キータイプ
key_type
フィールドは、このキーペアの生成に使用された暗号化署名アルゴリズムを示します。wallet_proposeメソッドを使用したキーペアの生成を要求するときに、key_type
を指定できます。
マスターキーペア
マスターキーペアは秘密鍵と公開鍵で構成されます。マスターキーペアの秘密鍵は、レギュラーキーペアで署名できるすべてのトランザクションに署名できるほか、以下の操作の実行に使用できる唯一の鍵でもあります。
-
凍結機能を永久に放棄する。
-
トランザクションコストが0のKey Resetトランザクションを送信する。
アカウントのマスターキーペアは、マスターキーペアによるトランザクションへの署名が承認されているアカウントのaccount_id
と同じwallet_propose
応答にて生成されます。マスターキーペアは同じ応答内で生成されるため、アドレスに固有に関連付けられています。このアドレスは、公開鍵から導出されます。
これは、同様にwallet_propose
メソッドを使用して生成されても、レギュラーキーペアとしてアカウントに明示的に割り当てられる必要があるレギュラーキーペアとは対照的です。レギュラーキーペアは明示的に割り当てられるため、トランザクションの署名が承認されているアカウントのアドレスには固有に関連付けられません。詳細は、レギュラーキーペアを参照してください。
注意: マスターキーペアは変更できませんが、無効にできます。つまり、マスターシードまたは秘密鍵が漏えいした場合は、変更するのではなく、無効にする必要があります。
マスターキーペアは変更できないため、漏えいが発生した場合には無効化せざるを得ません。マスターキーペアをオフラインで保管し、代わりにアカウントのトランザクションの署名用にレギュラーキーペアを設定することを強くお勧めします。
マスターキーペアをオフラインで保管する際には、不正使用者がアクセスできる場所にマスター秘密鍵を保管しないようにします。たとえば、インターネットに一切接続されない物理的に隔離されたマシンに保管したり、紙に記入して安全な場所に保管します。一般的には、インターネットと相互にやり取りをするコンピュータプログラムがアクセスできる範囲内には保管しません。マスターキーペアは、緊急時(漏えいの恐れがある場合や実際に漏えいが発生した場合にレギュラーキーペアを変更するなど)に限り、最も信頼できるデバイスでのみ使用することが理想的です。
レギュラーキーペア
XRP Ledgerでは、アカウントのマスターキーペアをオフラインで保管し、その後のトランザクションには レギュラーキーペア と呼ばれるセカンダリキーペアで署名することができます。レギュラーキーペアのシードまたは秘密鍵が漏えいした場合は、キーペアを削除または交換できます。その際に、アカウントのキーペア以外の設定を変更する必要はありません。これにより、アカウントの設定や他のアカウントとの関係を再設定する手間が省けます。レギュラーキーペアを積極的にローテーションすることも可能です。(アカウントのアドレスに固有に関連付けられているアカウントのマスターキーペアでは、このような操作は実行できません。)
レギュラーキーペアとして使用するキーペアは、wallet_propose
メソッドを使用して生成します。ただし、サポートするアカウントのaccount_id
と同時に生成され、それに固有に関連付けられているマスターキーペアとは異なり、レギュラーキーペアと、このキーペアがトランザクションの署名に使用されるアカウントとの関係を明示的に作成する必要があります。レギュラーキーペアをアカウントに割り当てるには、SetRegularKey
メソッドを使用します。
レギュラーキーペアの割り当てに関するチュートリアルについては、レギュラーキーペアの割り当てを参照してください。
レギュラーキーペアを割り当てたアカウントには、次の2つのキーペアが関連付けられることになります。
- アカウントの
account_id
に固有に関連付けられるマスターキーペア。オフラインで保管します。 - アカウントに明示的に割り当てられ、アカウントのトランザクションの署名に使用されるレギュラーキーペア。
レギュラーキーペアをアカウントに割り当てて、マスターキーペアで署名されるトランザクションを除く、すべてのトランザクションの署名にそのレギュラーキーペアを使用できます。
レギュラーキーペアはいつでも削除または変更できます。つまり、レギュラーキーペアの秘密鍵が漏えいした(ただしマスターキーペアの秘密鍵の漏えいは発生していない)場合、レギュラーキーペアを削除または変更するだけでアカウントの制御を取り戻すことができます。
レギュラーキーペアの変更または削除のチュートリアルについては、レギュラーキーペアの割り当てを参照してください。
署名アルゴリズム
暗号鍵ペアは常に特定の署名アルゴリズムに関連付けられています。署名アルゴリズムは、秘密鍵と公開鍵の間の数学的関係を定義します。暗号化署名アルゴリズムには、現在の暗号技術では、秘密鍵を使用して対応する公開鍵を「簡単に」計算できるものの、公開鍵から対応する秘密鍵を計算することは実質的に不可能であるという特性があります。
XRP Ledgerでは次の暗号化署名アルゴリズムがサポートされています。
キータイプ | アルゴリズム | 説明 |
---|---|---|
secp256k1 |
楕円曲線secp256k1 を使用するECDSA | これはBitcoinで使用されているスキームです。XRP Ledgerではデフォルトでこのキータイプが使用されます。 |
ed25519 |
楕円曲線Ed25519 を使用するEdDSA | パフォーマンスに優れ、その他の便利な特性を備えた新しいアルゴリズムです。Ed25519公開鍵はsecp256k1鍵よりも1バイト短いため、rippled ではEd25519公開鍵の先頭に0xED バイトが追加されます。これにより、両方の公開鍵タイプは33バイトになります。 |
wallet_proposeメソッドを使用してキーペアを生成するときには、キーの生成に使用する暗号化署名アルゴリズムを選択するためkey_type
を指定できます。デフォルト以外のキータイプを生成した場合は、トランザクションに署名する際にkey_type
も指定する必要があります。
XRP Ledgerでは、サポートされているさまざまなタイプのキーペアは、マスターキーペア、レギュラーキーペア、署名者リストメンバーとして互換的に使用できます。アドレス生成プロセスは、secp256k1キーペアとEd25519キーペアでは同一です。
注記: 現時点では、Ed25519キーでPayment Channelクレームに署名することはできません。これはバグです。
将来のアルゴリズム
今後、暗号技術の発展に対応するため、XRP Ledgerには新しい暗号化署名アルゴリズムが必要になるでしょう。例えば、Shorのアルゴリズム (または類似のアルゴリズム)を使用する量子コンピューターの実用化が間近となり、楕円曲線暗号が解読される可能性が生じた場合、XRP Ledger開発者は容易に解読できない暗号化署名アルゴリズムを追加できます。2019年半ばの時点で、確実な第一選択肢となる「耐量子」署名アルゴリズムはなく、量子コンピューターはまだ脅威となるほど実用的ではないため、現時点では特定のアルゴリズムを追加する予定はありません。
鍵導出
キーペアを導出するプロセスは、署名アルゴリズムによって異なります。いずれの場合も、キーは長さが16バイト(128ビット)の シード 値から生成されます。シード値は完全にランダムにする(推奨)か、SHA-512ハッシュを取得して最初の16バイトを保持することで特定のパスフレーズから導出することができます(SHA-512ハーフと同様ですが、出力の256ビットではなく128ビットのみを保持します)。
サンプルコード
ここで説明する鍵導出プロセスは、さまざまなプログラミング言語で複数の場所に実装されています。
- C++:
rippled
コードベース: - シード定義
- 汎用キー & Ed25519鍵導出
- secp256k1鍵導出
- Python 3: このリポジトリのコードサンプルセクション 。
- JavaScript:
ripple-keypairs
パッケージ。
Ed25519鍵導出
- シード値のSHA-512ハーフを計算します。32バイトの秘密鍵が導出されます。
ヒント: 32バイトの数値はすべて、有効なEd25519秘密鍵です。ただし、秘密鍵として使用する上で安全なのは、十分ランダムに選択された数値のみです。
- Ed25519公開鍵を計算するには、Ed25519 の標準公開鍵を導出して、32バイトの公開鍵を導出します。
注意: 暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。例えば、OpenSSL には、コア関数であるEd25519やsecp256k1が実装されています。
- Ed25519公開鍵を示すには、32バイトの公開鍵の前にシングルバイトのプレフィクス
0xED
を付加し、33バイトにします。
トランザクションに署名するコードを実装している場合は、プレフィクス0xED
を削除し、実際の署名プロセスに32バイトキーを使用します。
- アカウントの公開鍵をbase58にシリアル化する場合は、アカウントの公開鍵プレフィクス
0x23
を使用します。
バリデータの一時キーにEd25519を使用することはできません。
secp256k1鍵導出
XRP Ledgerアカウントキーでのsecp256k1鍵導出に、Ed25519鍵導出よりも多くの手順が含まれる理由は次のとおりです。
- 32バイトの数値がすべて、有効なsecp256k1秘密鍵であるとは限りません。
- XRP Ledgerのリファレンス実装には、単一のシード値からキーペアのファミリーを導出するための、未使用の不完全なフレームワークがあります。
シード値からXRP Ledgerのsecp256k1アカウントキーペアを導出する手順は次のとおりです。
-
次のように、シード値から「ルートキーペア」を計算します。
-
以下を順番に連結して、合計20バイトにします。
- シード値(16バイト)
- 「ルートシーケンス」値(4バイト)。ビッグエンディアンの符号なし整数。ルートシーケンスの開始値として0を使用します。
-
連結された(シード+ルートシーケンス)値のSHA-512ハーフを計算します。
-
結果が有効なsecp256k1秘密鍵でない場合は、ルートシーケンスを1増やして最初からやり直します。[ソース]
有効なsecp256k1鍵は0であってはならず、 secp256k1グループ の数値順よりも低くなければなりません。secp256k1グループの順序は、定数
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
です。 -
有効なsecp256k1秘密鍵を使用して、secp256k1曲線で標準ECDSA公開鍵を導出し、ルート公開鍵を導出します。(暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。例えば、OpenSSL には、コア関数であるEd25519およびsecp256k1が実装されています。)
ヒント: バリデータではこのルートキーペアを使用します。バリデータのキーペアを計算する場合は、ここで停止できます。この2つのタイプの公開鍵を区別するには、バリデータの公開鍵のbase58シリアル化でプレフィクス0x1c
を使用します。
- ルート公開鍵を33バイトの圧縮形式に変換します。
ECDSA公開鍵の非圧縮形式は、32バイト整数のペア(X座標とY座標)で構成されます。圧縮形式は、X座標と1バイトのプレフィクスのみで構成されます。Y座標が偶数の場合は0x02
、Y座標が奇数の場合は0x03
です。
非圧縮形式の公開鍵を圧縮形式に変換するには、openssl
コマンドラインツールを使用します。例えば、非圧縮の公開鍵がファイルec-pub.pem
にある場合は、次のような圧縮形式を出力できます。
$ openssl ec -in ec-pub.pem -pubin -text -noout -conv_form compressed
-
次のように、圧縮されたルート公開鍵から「仲介銀行(機関)キーペア」を導出します。
-
以下を順番に連結して、合計40バイトにします。
- 圧縮されたルート公開鍵(33バイト)
0x00000000000000000000000000000000
(4バイトのゼロ)(この値は、同じファミリーの異なるメンバーの導出に使用することを目的としていましたが、実際には値0のみが使用されます。)- 「キーシーケンス」値(4バイト)。ビッグエンディアンの符号なし整数。キーシーケンスの開始値として0を使用します。
-
連結された値のSHA-512ハーフを計算します。
-
結果が有効なsecp256k1秘密鍵でない場合は、キーシーケンスを1増やし、アカウントの仲介銀行(機関)キーペアの導出をやり直します。
-
有効なsecp256k1秘密鍵を使用して、secp256k1曲線で標準ECDSA公開鍵を導出し、仲介銀行(機関)公開鍵を導出します。(暗号化アルゴリズムの場合と同様に、可能な場合は必ず、公的に監査された既知の標準実装を使用します。例えば、OpenSSL には、コア関数であるEd25519およびsecp256k1が実装されています。)
-
仲介銀行(機関)公開鍵をルート公開鍵に追加して、マスター公開鍵ペアを導出します。同様に、仲介銀行(機関)秘密鍵をルート秘密鍵に追加して秘密鍵を導出します。
-
ECDSA秘密鍵は非常に大きな整数値であるため、secp256k1グループ順序を法として2つの秘密鍵を合計することで、2つの秘密鍵の合計を計算できます。
-
ECDSA公開鍵は楕円曲線上の点であるため、楕円曲線の数値を使用して点の合計値を計算する必要があります。
-
以前と同様に、マスター公開鍵を33バイトの圧縮形式に変換します。
-
アカウントの公開鍵をbase58形式にシリアル化する場合は、アカウントの公開鍵プレフィクス
0x23
を使用します。
アカウントの公開鍵からそのアドレスに変換するための情報とサンプルコードについては、アドレスのエンコードを参照してください。
関連項目
- コンセプト:
- 発行アドレスと運用アドレス
- チュートリアル:
- レギュラーキーペアの割り当て
- レギュラーキーペアの変更または削除
- リファレンス:
- SetRegularKeyトランザクション
- AccountRootレジャーオブジェクト
- wallet_proposeメソッド
- account_infoメソッド