暗号鍵
XRP Ledgerでは、トランザクションによる一連の具体的なアクションの実行が承認されていることを、デジタル署名によって証明します。署名されたトランザクションのみがネットワークに送信され、検証済みレジャーに含まれます。
すべてのデジタル署名は、トランザクションの送信側アカウントに関連付けられている暗号鍵ペアに基づいています。キーペアはXRP Ledgerでサポートされている暗号化署名アルゴリズムを使用して生成できます。キーペアの生成に使用されたアルゴリズムの種類にかかわらず、キーペアはマスターキーペア、レギュラーキーペア、または署名者リストのメンバーとして使用できます。
キーの生成
多くのクライアントライブラリやアプリケーションは、XRP Ledgerでの使用に合わせてキーペアを生成できます。もちろん、信頼できるデバイスやソフトウェアで生成されたキーペアのみを使用する必要があります。悪意のあるアプリケーションは、あなたの秘密情報を悪意のあるユーザに公開する可能性があり、そのユーザはあなたのアカウントから後でトランザクションを送信することができます。
注:ツールによってデフォルト値が異なります。多くのクライアントライブラリ(xrpl.jsなど)は、デフォルトの暗号化アルゴリズムとしてEd25519を使用していますが、rippledの管理者向けRPCコマンドであるwallet_proposeは、デフォルトとしてsecp256k1を使用しています。つまり、アルゴリズムを明示的に指定しない限り、同じシードから別のツールを使用してウォレットを生成すると、異なるアドレスが生成される可能性があります。
キーの構成要素
暗号鍵ペアは、鍵の導出プロセスを通じて数学的に関連づけられる秘密鍵と公開鍵のことです。秘密鍵は、強力なランダム性によって決定されなければなりません。暗号化署名アルゴリズムは、鍵の導出プロセスを定義し、暗号鍵となり得る数値の制限を設定します。
XRP Ledgerを扱う場合、パスフレーズ、シード、アカウントID、アドレスなど、いくつかの関連する値を使用することもあります。
パスフレーズ、シード、秘密鍵は秘密情報であり、あるアカウントのこれらの値のいずれかを知っていれば、有効な署名を行うことができ、そのアカウントを完全に制御することができます。もしあなたがアカウントを所有しているのであれば、アカウントの秘密情報には細心の注意を払ってください。もしあなたがそれらを持っていないなら、あなたは自分のアカウントを利用することはできません。もし他の誰かがそれらにアクセスすることができれば、彼らはあなたのアカウントをコントロールすることができます。
公開鍵、アカウントID、アドレスは公開情報です。一時的に公開鍵を秘密にするような状況もありますが、最終的にはトランザクションの一部として公開し、XRP Ledgerが署名を検証してトランザクションを処理できるようにすることが必要です。
鍵の導出の仕組みの技術的な詳細については、鍵の導出をご覧ください。
パスフレーズ
オプションとして、パスフレーズやその他の情報を、シードや秘密鍵の決定方法として使用することができます。これは、完全にランダムにシードや秘密鍵を選択するよりも安全性が低いですが、これを行いたいレアケースもあります。(例えば、2018年に「XRPuzzler」が最初にパズルを解いた人にXRPをプレゼントしました。彼はパズルの解答を、賞品のXRPを保有するアカウントへのパスフレーズとして使用しました)
パスフレーズは秘密情報であるため、厳重に保管する必要があります。アドレスのパスフレーズを知った人は、そのアドレスを実質的に完全にコントロールすることができます。
シード
シード 値は、アカウントの実際の秘密鍵と公開鍵を導出するために使用される、コンパクトな値です。wallet_proposeメソッドのレスポンスでは、master_key
,master_seed
,master_seed_hex
はすべて同一のシード値を様々な形式で表現します。これらの形式はいずれも、rippled
APIやいくつかの他のXRP Ledgerソフトウェアでトランザクションの署名に使用することができます。master_
という接頭辞がついていますが、このシードが表す鍵は必ずしもアカウントのマスターキーではありません。この鍵ペアはレギュラーキーとして、あるいはマルチシグリストのメンバーとして使用することもできます。
シード値は秘密情報であるため、非常に厳重に保管する必要があります。あるアドレスのシード値を知っている人は、そのアドレスを実質的に完全にコントロールすることができます。
秘密鍵
秘密鍵 は、デジタル署名を作成するために使用される値です。ほとんどのXRP Ledgerソフトウェアは、秘密鍵を明示的に表示せず、必要に応じてシード値から秘密鍵の導出を行っています。シードの代わりに秘密鍵を保存し、それを使ってトランザクションに直接署名することは技術的には可能ですが、この使い方はレアケースです。
シードと同様、秘密鍵は秘密情報であるため、厳重に保管する必要があります。あるアドレスの秘密鍵を知っている人は、そのアドレスを事実上完全にコントロールすることができます。
公開鍵
公開鍵は、電子署名の正当性を検証するために使用される値です。公開鍵は、鍵の導出の一部として秘密鍵から導出されます。wallet_proposeメソッドのレスポンスでは、public_key
とpublic_key_hex
は両方とも同じ公開鍵の値を表します。
XRP Ledgerのトランザクションには、ネットワークがトランザクションの署名を検証できるように、公開鍵が含まれている必要があります。公開鍵は有効な署名を作成するために使用することはできないので、公開しても問題はありません。
アカウントIDとアドレス
アカウントIDは、アカウントまたはキーペアの中核となる識別子です。これは公開鍵から派生します。XRP Ledgerのプロトコルでは、アカウントIDは20バイトのバイナリデータです。ほとんどのXRP Ledger APIは、アカウントIDをアドレスとして表現し、次の2つのフォーマットのうちの1つで表現します。
- 「クラシックアドレス」は、base58にチェックサム付きでアカウントIDを書きます。wallet_proposeメソッドのレスポンスでは、これが
account_id
の値となります。 - 「X-Address」は、アカウントIDと宛先タグを組み合わせ、チェックサムとともにbase58にその値を書き込みます。
どちらの形式でもチェックサムがあるため、わずかな変更でアドレスが無効になり、他の有効なアカウントと入れ替わる可能性はありません。これにより、タイプミスや送信エラーが発生しても、間違った場所に送金されることはありません。
すべてのアカウントID(またはアドレス)が台帳のアカウントを参照しているわけではないことを知っておくことが重要です。キーとアドレスの導出は、純粋に数学的な操作です。アカウントがXRP Ledgerに情報を持つには、XRPの支払いを受け、準備金を満たす必要があります。アカウントは、資金が供給されるまでトランザクションを送信することはできません。
アカウントIDやアドレスが資金提供されたアカウントを指していない場合でも、そのアカウントIDやアドレスを使用して、レギュラーキーペアや署名者リストのメンバーを表すことはできます。
キーの種類
XRP Ledgerは、複数の暗号署名アルゴリズムをサポートしています。任意のキーペアは、特定の暗号化署名アルゴリズムに対してのみ有効です。いくつかの秘密鍵は、技術的には複数のアルゴリズムに対して有効な鍵として適格かもしれませんが、それらの秘密鍵は各アルゴリズムに対して異なる公開鍵を持つことになり、いずれにしても秘密鍵を再利用すべきではありません。
wallet_proposeメソッドのkey_type
フィールドは、使用する暗号化署名アルゴリズムを指します。
マスターキーペア
マスターキーペアは、秘密鍵と公開鍵で構成されています。アカウントのアドレスは、そのアカウントのマスターキーペアから得られるので、両者は本質的な関係となります。マスターキーペアの変更・削除はできませんが、無効にすることはできます。
wallet_proposeメソッドは、マスターキーペアを生成する方法の1つです。このメソッドからのレスポンスには、アカウントのシード、アドレス、マスター公開鍵が一緒に表示されます。マスターキーペアを設定する他の方法については、安全な署名の設定をご覧ください。
マスターキーペアは変更できないため、漏えいが発生した場合には無効化せざるを得ません。マスターキーペアをオフラインで保管し、代わりにアカウントのトランザクションの署名用にレギュラーキーペアを設定することを強くお勧めします。マスターキーペアを有効にしておきながらオンラインで使用することで、インターネットを使用してマスターキーペアにアクセスすることはできませんが、緊急時にマスターキーペアを使うことが可能になります。
マスターキーペアをオフラインで保管する際には、不正使用者がアクセスできる場所に秘密情報(パスフレーズ、シード、秘密鍵)を保管しないようにします。たとえば、インターネットに一切接続されない物理的に隔離されたマシンに保管したり、紙に記入して安全な場所に保管します。一般的には、インターネットと相互にやり取りをするコンピュータプログラムがアクセスできる範囲内には保管しません。マスターキーペアは、緊急時(漏えいの恐れがある場合や実際に漏えいが発生した場合にレギュラーキーペアを変更するなど)に限り、最も信頼できるデバイスでのみ使用することが理想的です。
特殊な権限
マスターキーペアのみが、ある特定の処理を行うトランザクションを承認することができます。
アカウントの最初のトランザクションを送信する。アカウントはその他の方法でトランザクションを承認して初期化することができないからです。
マスターキーペアを無効化する。
凍結の機能を永久に放棄する。
トランザクションコスト0XRPの特別なキーリセットトランザクションを送信する。
レギュラーキーやマルチシグは、マスターキーペアと同じようにその他の処理を行うことができます。特に、マスターキーペアを無効にした後、レギュラーキーペアやマルチシグを使用して再び有効にすることができます。また、削除の条件を満たしていれば、アカウントの削除を行うことも可能です。
レギュラーキーペア
XRP Ledgerアカウントは、レギュラーキーペア と呼ばれるセカンダリキーペアを許可することができます。そうすると、マスターキーペアとレギュラーキーのどちらかを使ってトランザクションを承認することができるようになります。レギュラーキーペアは、アカウントの他の部分を変更することなく、いつでも削除または変更することができます。
レギュラーキーペアは、マスターキーペアと同じ種類のトランザクションのほとんどを承認することができますが、特定の例外があります。例えば、レギュラーキーペアは、レギュラーキーペアを変更するトランザクションを 承認 することができます。
マスター秘密鍵はオフラインの場所に保存し、ほとんどの時間、レギュラーキーペアを使用することがセキュリティ上推奨されます。万一の備えとして、レギュラーキーペアを定期的に変更するのもよいでしょう。悪意のあるユーザにレギュラーの秘密鍵を知られてしまった場合、マスターキーペアをオフラインで保存し、それを使ってレギュラーキーペアを変更または削除することができます。こうすることで、アカウントの制御を取り戻すことができます。悪意のあるユーザにお金を盗まれるのを阻止するほどのスピードがなかったとしても、少なくとも、新しいアカウントに移行して、すべての設定や人間関係を一から作り直す必要はありません。
レギュラーキーペアは、マスターキーペアと同じ形式です。生成方法も同じです(例えば、wallet_proposeメソッドを使用します)。唯一の違いは、レギュラーキーペアは、トランザクションに署名するアカウントと本質的に結びついていないことです。あるアカウントのマスターキーペアを別のアカウントの通常キーペアとして使用することは可能です(ただし、推奨されるものではありません)。
SetRegularKeyトランザクションは、アカウントのレギュラーキーペアを割り当てたり変更したりします。レギュラーキーペアの割り当てまたは変更に関するチュートリアルは、レギュラーキーペアの割り当てをご覧ください
署名アルゴリズム
暗号鍵ペアは常に特定の署名アルゴリズムに関連付けられています。署名アルゴリズムは、秘密鍵と公開鍵の間の数学的関係を定義します。暗号化署名アルゴリズムには、現在の暗号技術では、秘密鍵を使用して対応する公開鍵を「簡単に」計算できるものの、公開鍵から対応する秘密鍵を計算することは実質的に不可能であるという特性があります。
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キーペアでは同一です。
将来のアルゴリズム
今後、暗号技術の発展に対応するため、XRP Ledgerには新しい暗号化署名アルゴリズムが必要になるでしょう。例えば、Shorのアルゴリズム(または類似のアルゴリズム)を使用する量子コンピュータの実用化が間近となり、楕円曲線暗号が解読される可能性が生じた場合、XRP Ledger開発者は容易に解読できない暗号化署名アルゴリズムを追加できます。2019年半ばの時点で、確実な第一選択肢となる「耐量子」署名アルゴリズムはなく、量子コンピュータはまだ脅威となるほど実用的ではないため、現時点では特定のアルゴリズムを追加する予定はありません。
鍵導出
キーペアを導出するプロセスは、署名アルゴリズムによって異なります。いずれの場合も、キーは長さが16バイト(128ビット)の シード 値から生成されます。シード値は完全にランダムにする(推奨)か、SHA-512ハッシュを取得して最初の16バイトを保持することで特定のパスフレーズから導出することができます(SHA-512ハーフと同様ですが、出力の256ビットではなく128ビットのみを保持します)。
サンプルコード
ここで説明する鍵導出プロセスは、さまざまなプログラミング言語で複数の場所に実装されています。
- C++:
rippled
コードベース: - 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
を使用します。アカウントの公開鍵からそのアドレスに変換するための情報とサンプルコードについては、アドレスのエンコードをご覧ください。