Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

セットアップフェーズ

最終更新 Markdown で表示Agent セットアップ

drand のセットアップフェーズでは、𝑛 人の参加者で共有する集団の秘密鍵と公開鍵のペアを作成します。これは 𝑡-of-𝑛 の分散鍵生成(DKG)で行い、各参加者は集団公開鍵のコピーと、集団秘密鍵の秘密鍵シェアを受け取ります。どのノードも集団の秘密鍵そのものは知りません。各秘密鍵シェアは、しきい値署名などの暗号学的なしきい値計算に使えます。集団としての処理を完了するには、個々の秘密鍵シェアを使って作った寄与が少なくとも 𝑡 個必要です。

DKG は完全に分散して実行するため、単一障害点を避けられます。これは、drand の DKG 実装を構成する各部品の概要です。

秘密分散

秘密分散は、多くの高度なしきい値暗号の仕組みが依拠する重要な手法です。

秘密分散では、秘密値 𝑠𝑛 個のシェア 𝑠1,…,𝑠𝑛 に分割し、しきい値 𝑡 個のシェアが揃ったときだけ 𝑠 を再構成できるようにします。

Shamir の秘密分散(SSS)

SSS 方式は、もっともよく知られ広く使われている秘密分散のひとつで、drand の中核部品です。SSS は任意の有限体上で動作しますが、単純化すると素数 𝑝 を法とする整数、つまり ℤ𝑝 を使います。共有する秘密を 𝑠∈ℤ𝑝 とします。

シェアの配布

𝑠 を共有するため、ディーラーはまず多項式 𝑞(𝑥)=𝑎0+𝑎1𝑥+⋯+𝑎𝑡−1𝑥𝑡−1 を作ります。ここで 𝑎0=𝑠𝑖=1,…,𝑡−1 に対する 𝑎𝑖∈ℤ𝑝 は(ランダムに)選びます。続けて、各参加者 𝑖 について 𝑞(𝑥) を整数 𝑖 で評価し、𝑠𝑖=(𝑖,𝑞(𝑖)) としてシェア 𝑠𝑖 を作ります。

秘密の再構成

秘密 𝑠 を復元するには、少なくとも 𝑡 個のシェアを集め、ラグランジュ補間で 𝑞(𝑥) を一意に再構成し、𝑠𝑠=𝑎0=𝑞(0) として得ます。

ラグランジュ補間を行い 𝑠 を一意に決めるには、𝑡-of-𝑛 シェアの任意の部分集合を使えます。ただし、𝑡 個未満のシェアでは 𝑠 について何も分かりません。

検証可能秘密分散

SSS 方式はディーラーが誠実であることを前提にしますが、実際にはそうならない場合があります。検証可能秘密分散(VSS)方式は、悪意あるディーラーから守るために、参加者が自分のシェアが他ノードへ配られたシェアと一貫しているかを検証できるようにします。これにより、あとから共有した秘密を正しく再構成できます。

drand は Feldman’s VSS 方式を使います。これは SSS の拡張です。𝔾 を、離散対数の計算が困難な素数位数 𝑝 の巡回群とします。巡回群 とは、生成元 𝑔 が存在し、任意の要素 𝑥∈𝔾𝑥=𝑔𝑎(ただし 𝑎∈{0,…,𝑝−1})と書けることを意味します。

シェアの配布

ディーラーは、秘密のシェアを参加者へ配ることに加え、多項式 𝑞(𝑥) の係数へのコミットメント (𝐴0,𝐴1,…,𝐴𝑡−1)=(𝑔𝑠,𝑔𝑎1,…,𝑔𝑎𝑡−1) もブロードキャストします。これらのコミットメントにより、各参加者 𝑖 は自分のシェア 𝑠𝑖=(𝑖,𝑞(𝑖)) が多項式 𝑞(𝑥) と一貫しているかを、𝑔𝑞(𝑖)=∏𝑡−1𝑗=0(𝐴𝑗)𝑖𝑗 が成り立つかで検証できます。

秘密の再構成

秘密 𝑠 の復元は通常の SSS と同じですが、妥当と検証されたシェアだけを使います。

分散鍵生成(DKG)

VSS 方式は悪意あるディーラーから守れますが、ディーラーは依然として秘密を知っています。どのノードも情報を得ない形で集団の共有秘密 𝑠 を作るため、参加者は DKG プロトコルを使えます。drand は Pedersen の DKG 方式を使います。Feldman’s VSS を 𝑛 インスタンス並列に実行し、その上に追加の検証ステップを重ねます。

シェアの配布

各参加者 𝑖 は(ランダムな)秘密 𝑠𝑖∈ℤ𝑝 を作り、VSS ですべての参加者に共有します。各 𝑗 へシェア 𝑠𝑖,𝑗 を送り、コミットメントの一覧 (𝐴𝑖,0,𝐴𝑖,1,…,𝐴𝑖,𝑡−1) を全員へブロードキャストします。

シェアの検証

𝑗 は、Feldman’s VSS 方式の定めどおり、受け取ったシェアを検証します。𝑗𝑖 から無効なシェア 𝑠𝑖,𝑗 を受け取った場合、𝑗 は苦情をブロードキャストします。𝑖 は正しいシェア 𝑠𝑖,𝑗 を開示しなければ、無効なディーラーとみなされます。

シェアの確定

プロトコルの最後に、𝑖 の最終シェアは、検証フェーズで除外されなかったすべての妥当な参加者 𝑗 について 𝑠𝑖=∑𝑗𝑠𝑗,𝑖 となります。

妥当なシェアに対応する集団公開鍵は、すべての妥当な 𝑗 について 𝑆=∑𝑗𝐴𝑗,0 として計算できます。

注: Pedersen の DKG で作った秘密には偏りがあり得ますが、Rabin らの示すとおり、しきい値署名には安全に使えます。

役に立ちましたか?