暗号の基本⚓︎
ここでは、Symbol の技術を支える基本的な暗号の概念を解説します。
ハッシュ⚓︎
- ハッシュ
- 暗号ハッシュとは、任意のサイズの入力データを固定長の文字列に変換する数学関数 (ハッシュ関数)によって生成される文字列のことです。
代表的な関数として SHA-512 や RIPEMD-160 などがありますが、 いずれも次の共通する特性を持っています。
- 決定性:同じ入力からは必ず同じハッシュが生成されます。
- 衝突耐性:異なる入力から同じハッシュを作ることは極めて困難です。
- 不可逆性:ハッシュから元の入力データを復元することはできません。
これらの性質により、データの完全性や認証の検証、 およびブロックチェーンにおける ブロック の連結が保証されます。
キー⚓︎
- 秘密キー
- 非常に長い数値であり、厳重に秘匿すべき情報です。 値そのものに意味はなく、第三者に推測されることは想定されていません。 通常はランダムに生成され、同じキーが偶然に生成されることはほぼありません。
- 公開キー
秘密キー に対応する公開識別子として機能する長い数値です。 広く共有できますが、秘密キーを明かすことなく その保有を証明するために利用されます。
公開キーは数学的に秘密キーから導かれますが、 現在の技術では逆算して秘密キーを求めることは実質的に不可能です。
- キーペア
- 1 組の 秘密キー と対応する 公開キー のセットです。 秘密キーは所有者のみが保持し、公開キーは誰でも閲覧できます。 これにより、デジタル署名や暗号化などの安全な処理が可能になります。
Symbol では、用途に応じて複数のキーペアが使われます。
- メインキー
- 各 アカウント に紐づく キーペア。所有者を識別します。
- リモートキー
- 各 リモートハーベスティング アカウントに紐づく キーペア。
- VRF キー
- ハーベスティング ノードが出力を予測不可能にするために使用する キーペア。
- 投票キー
- ファイナライズ プロセスに参加するノードが必要とする キーペア。
- トランスポートキー
- TLS による安全な通信に用いられる キーペア。
キーの安全性
秘密キー は常に厳重に保護する必要があります。
ただし、キーが漏えいした際の影響は用途によって異なります。
| キーの種類 | 重大度 | 影響 |
|---|---|---|
| メインキー | 🔴 高 | アカウント内の資産が流出する可能性があります。 |
| リモートキー | 🟠 中 | アカウントやノードには影響しません。別のリモートアカウントをリンクすれば簡単に復旧可能です。多数のリモートキーを奪われると、攻撃者がブロック生成に影響を与える可能性があります。 |
| VRF キー | 🟡 低 | ハーベスティング用のキーがなければ無害です。 |
| 投票キー | 🟠 中 | アカウントやノードには影響しません。別の投票アカウントをリンクすれば簡単に復旧可能です。ネットワーク全体の投票キーの 50% 以上を奪われると、ファイナライズに影響を与える恐れがあります。 |
| トランスポートキー | 🟡 低 | 攻撃者がハーベスティングの委任を奪う可能性はありますが、その他の影響はありません。 |
Symbol では、秘密キーと公開キーはいずれも 256 ビット(32 バイト)の整数です。 公開キーは 楕円曲線暗号 を用いて ツイステッド・エドワーズ曲線 から導出されます。
署名⚓︎
署名はアカウントの 秘密キー を使って文書を処理することで生成されます。 対応する公開キーを持つ誰でも、その署名が文書に一致するかを検証できますが、 同一の署名を作成できるのは秘密キーの所有者のみです。
Symbol ではすべてのトランザクションが署名されますが、 必要な署名の数はトランザクションの種類と参加者によって異なります。 たとえば、1 人の所有者から別のアカウントへ資産を送る場合は、 送信元アカウントの秘密キーによる署名 1 つだけで十分です。
一方で、マルチシグアカウント から送金する場合は あらかじめ設定された全ての署名者の承認が必要であり、 複数の署名を収集して初めて有効となります。
Symbol の署名は 512 ビット(64 バイト)で、 Ed25519 および SHA-512 アルゴリズムを使用して生成されます。
アドレス⚓︎
キー(秘密キー・公開キー)はバイナリデータであり、印刷や共有には不便です。 一方、アドレスは英数字のみで構成されるため、共有が容易です。
Symbol のキーは 32 バイト(16 進数で 64 文字)を必要としますが、 アドレスは 39 文字で表され、長さと実用性のバランスを保っています。
Symbol では、アドレスは公開キーから次の手順で生成されます。
-
生アドレス(24 バイト) を生成します。構成は次のとおりです。
- ネットワーク ID(1 バイト):メインネットは
N、テストネットはT。 - 公開キーの RIPEMD-160 ハッシュ(20 バイト)。
- チェックサム(3 バイト):タイプミス検出用。
例:
0x78,0xD0,0x44,0xED,0xC3,0xDC,0x8B,0x86... - ネットワーク ID(1 バイト):メインネットは
-
エンコード済みアドレス(39 文字) を生成します。 生アドレスを Base32 でエンコードします。 英大文字と数字のみを使用するため、共有に適しています。 例:
PDIEJ3OD3SFYNZCQUSEWKY4NRRZUI5LMJPSVLPQ -
整形アドレス(45 文字)(任意)を生成します。 6 文字ごとにハイフンを追加して読みやすくします。 例:
PDIEJ3-OD3SFY-NZCQUS-EWKY4N-RRZUI5-LMJPSV-LPQ
アドレスの生成はオフラインで行われます
アドレスの生成にブロックチェーンとの通信は不要です。 実際に Symbol がアドレスや公開キーを追跡するのは、 それらがトランザクションに初めて登場した時点からです。
バニティアドレス⚓︎
通常、キーおよびそれに対応する アドレス はランダムに生成されますが、 特定のパターンやプレフィックスを含む バニティアドレス を作ることもできます。
これは、条件を満たすアドレスが得られるまで キーペア を繰り返し生成する手法です。 求める文字列が複雑になるほど、より多くの時間と計算が必要になります。
バニティアドレスはブランド名や個人の識別などに便利ですが、 セキュリティ上の利点はありません。