+ a t-2 xt-2 + … + a 0 を生成し、a 0 をシークレット値とした場合、 シェア(i, f(i))をt個集めると、多項式を再構築でき、シークレット値 a 0 が分かる秘密共有の仕組み 【ラグランジュ補間公式】 を利用して、t個シェアが集まると、 a 0 を計算可能 (x - j) は除く (i j - i j )は除く i j は除く (i j - i j )は除く ※ λ j (0)はiが事前に分かれば事前に計算可能
a 0 , a 1 , …, a t-1 を生成 2. 1のシークレットを係数とした t-1次の多項式を作成 f(x) = a t-1 xt-1 + a t-2 xt-2 + … + a 0 3. a 0 の知識を証明をするためのSchnorr署名を生成 a. ランダムなnonce kを選択し、R = kGとする b. c = H(ID || a 0 G || R)を計算 c. s = k + ca 0 を計算 d. (R, s)がSchnorr署名 4. 各係数のコミットメントを計算( C i = a i G) 5. 4のリストと、3のSchnorr署名を他の参加者に送信 6. 受信したコミットメント(=公開鍵)のリストとSchnorr署名から、署名の有効性を検証
+ a t-2 xt-2 + … + a 0 を使って、 n人の各参加者のシェア(ID, f(ID))を計算し、各参加者に送信する。 2. シェアを受信した参加者は、シェア (ID, f(ID))が正しいか検証する。 ※ 多項式の各係数は不明だが、共有されたコミットメント( C i = a i G)を使って検証可能 f(ID) = C t-1 ・IDt-1+ C t-2 ・IDt-2 + … C 0 ・ID0 3. 全参加者からシェアを受信したら、集約鍵のシェアを計算 s ID = f 1 (ID) + f 2 (ID) + … f n (ID) 4. 3から自分の公開シェアP ID = s ID Gを計算 他の参加者の公開シェアについても、全参加者のコミットメントとIDが分かるので計算可能 5. 各参加者のC ID, 0 = a ID,0 Gを合算して、集約公開鍵P = a 1,0 G + a 2,0 G + … a n,0 Gを導出 集約公開鍵Pに対応する秘密鍵は、各参加者の係数 a 0 の合算値 各参加者は集約秘密鍵のシェアを持っている状態
ID )を生成 2. nonceに対応する公開鍵のペアを生成( D ID = d id G, E ID = e id G) ↑をπ個生成して、他の参加者に送信 • 1回の署名ラウンドで使用するのは1つのみ • 最初は、DKGラウンドで一緒にやってもOK • π個すべて使用したら、前処理ラウンドを再実行
ID G, E ID G)をピックアップ • SAはピックアップしたnonceのリストと署名対象のメッセージ mをt人の参加者に送信 t人の参加者は、 1. nonceのリストが以前受信したものか検証 2. 参加者全員分のp ID = H(ID || m || (nonceのリスト)) を計算 3. 署名に使用する集約nonceを計算 4. 署名のチャレンジ c = H(P || R || m)を計算 5. 自身のシェアs ID を使って部分署名を計算し z ID = d ID + p ID e ID + c s ID λ ID 6. 部分署名をSAに送信 ※ s ID λ ID は多項式補間で復元される秘密鍵のシェアとして機能する
R ID + c λ ID P ID 成立しなかった場合、不正な振る舞いをする参加者が特定され、その参加者を除いて署名ラウンドを再実行 2. t個の部分署名を合算して、集約署名を完成させる z = z 1 + … z t 3. (R, z)が集約公開鍵Pとメッセージmに対して有効なSchnorr署名 各参加者は、署名ラウンドで実行したnonceのペア( D ID G, E ID G)を削除 ※ 署名ラウンドは、SAと各参加者間で1ラウンド(1往復)の通信で完了する nonceのコミットメントの交換を署名ラウンドに含める場合は、2ラウンド