閾値署名とマルチパーティ署名(MPC ウォレット)の原理
秘密鍵を一度も組み立てずに署名できれば、鍵を盗む単一の標的が消える。閾値 ECDSA/Schnorr・FROST・DKG の仕組みと、マルチシグやコールドウォレットとの違いを原理から解説します。
- 1.閾値署名は (t,n) のうち t 人が協調すると、単一の秘密鍵を一度も復元せずに通常の1個の署名を作る方式。検証側はMPCで作られたことを区別できず、オンチェーンでもただの普通の署名に見える。
- 2.Schnorr は線形なので部分署名を足すだけで合成でき FROST が定番。ECDSA は s に逆数 k^(-1) が入り非線形なため、乗算三つ組や準同型暗号を使う重いプロトコルが必要になる。
- 3.マルチシグはn個の独立した署名と公開鍵をオンチェーンに晒すが、MPCウォレットは1鍵に見える。DKGで誰も完全鍵を持たず、カストディやコールドウォレットの内部不正・単一障害点を消せる。
解きたい問題:署名鍵そのものを一度も組み立てたくない
デジタル署名の運用には、署名スキームの強さとは別の急所があります。署名する瞬間、完全な秘密鍵がどこか1か所のメモリに現れることです。カストディ業者やコールドウォレットがいくら鍵を分割保管しても、署名時に1台のマシンへ鍵を集めて復元するなら、その瞬間・その1台が単一障害点になります。鍵を抜けば全資産を動かせるため、内部不正者にも外部攻撃者にも「狙うべき1点」を与えてしまう。
Shamir 秘密分散 は分割保管の機密性と可用性を両立しますが、それ単体では「使うとき復元する」問題を解けません。閾値署名(threshold signature)はここを埋めます。鍵を分割したまま、各保有者が自分のシェアで部分署名だけを作り、それらを合成して1個の正規署名を得る。完全な秘密鍵はどの瞬間も、どのマシンにも存在しません。これを汎用的に支えるのが**マルチパーティ計算(MPC)**で、入力(鍵シェア)を秘匿したまま共同で関数(署名)を評価します。
閾値署名の定義:(t,n) で「普通の1署名」を作る
(t,n) 閾値署名は、n 人の参加者に鍵シェアを配り、そのうち任意の t 人以上が協調したときだけ署名を作れる方式です。本質的な性質が二つあります。
第一に、出力は単一の秘密鍵で作った1個の署名と完全に一致します。検証側は通常の Verify(公開鍵, m, σ) を回すだけで、それが1人で作られたのか100人で作られたのかを区別できません。第二に、t 人未満では署名できず、かつ鍵シェアからも秘密鍵についての情報が漏れない(秘密分散の情報理論的秘匿を引き継ぐ)。
(t,n) 閾値署名の構造:
鍵生成 : 1個の公開鍵 PK と、n 個の鍵シェア sk_1..sk_n を作る
※ 対応する秘密鍵 sk は「概念上」存在するが、どこにも実体化しない
部分署名 : 参加者 i が自分の sk_i で σ_i を計算
合成 : t 個の σ_i を集約 → 単一署名 σ(PK で普通に検証可能)
検証 : Verify(PK, m, σ) ← 単一鍵署名と区別不能
t を上げると不正に署名するために結託すべき人数が増え機密性が上がりますが、t 人集まらないと署名できず可用性は下がります。逆に n - t 人までの鍵シェア紛失・脱落に耐えます。可用性目標から n - t を、耐結託性から t を逆算します。カストディでは (2,3) や (3,5)、大規模運用で (11,15) のような構成が使われます。
なぜ Schnorr は簡単で ECDSA は難しいのか
閾値化の難易度は、署名式が線形かどうかで決まります。各署名スキームの内部で見た式を、合成のしやすさという観点で読み直します。
Schnorr 署名の核は s = r + e·x(x が秘密鍵、r がnonce、e がチャレンジ)という完全に線形な式です。秘密鍵 x を x = Σ λ_i·x_i(ラグランジュ係数 λ_i で重み付けしたシェアの和)と分散しておくと、各人が s_i = r_i + e·λ_i·x_i を計算し、ただ足し合わせるだけで s = Σ s_i がそのまま正規署名になります。秘密鍵もnonceも一度も集まりません。これが閾値 Schnorr が軽い理由です。
ECDSA の式は s = k^(-1)·(e + r·x) で、nonce の逆数 k^(-1) と秘密鍵 x が掛け算で同居します。分散された k の逆数を、k を復元せずに計算し、さらにそれを分散された x と掛ける——この秘密×秘密の乗算が分散環境では本質的に難しい。加算は各自のシェアを足せば済みますが、乗算は参加者間の相互作用(後述の乗算三つ組や準同型暗号)を必要とします。
| 観点 | 閾値 Schnorr / EdDSA | 閾値 ECDSA |
|---|---|---|
| 署名式の性質 | 線形(s = r + e·x) | 非線形(s に k^(-1) が掛かる) |
| 合成の方法 | 部分署名を加算するだけ | 秘密×秘密の分散乗算が必要 |
| プロトコル重さ | 軽い(FROST は2ラウンド) | 重い(乗算三つ組・準同型暗号・ゼロ知識証明) |
| 代表方式 | FROST (RFC 9591) | GG18/GG20, CMP/CGGMP, Lindell17 |
| 主な用途 | 新規設計・BTC Taproot・分散検証 | 既存の secp256k1/Ethereum 互換が必須な場面 |
FROST:2ラウンドの閾値 Schnorr
FROST(Flexible Round-Optimized Schnorr Threshold signatures、RFC 9591)は、閾値 Schnorr の事実上の標準です。素朴な閾値 Schnorr にはnonce にまつわる罠があり、FROST はそこを設計で塞ぎました。
危険なのは、攻撃者が複数の署名セッションを並行させ、各参加者が出すnonceコミットメント R_i を見てから署名対象メッセージやチャレンジを適応的に選べる場合です。これによりチャレンジ間に線形関係を作り込んで偽造に至るDrijvers 攻撃(ROS 問題の求解に帰着する一群の攻撃)が、素朴な多ラウンド Schnorr では成立し得ます。FROST はこれを、各参加者が2つのnonce (d_i, e_i) をコミットし、全員のコミットメントを束ねたものから導くバインディング係数 ρ_i で R_i = D_i + ρ_i·E_i と縛ることで防ぎます。これにより、署名対象のメッセージと全参加者のコミットメント集合に各nonceが結びつき、別セッションの応答を組み合わせる操作が無効化されます。
FROST の2ラウンド(コーディネータ Cと署名者集合 S, |S| = t):
Round 1 (事前処理・メッセージ非依存):
各 i: nonce ペア (d_i, e_i) を生成し、コミット (D_i, E_i) = (d_i·G, e_i·G) を C へ
Round 2 (メッセージ m が決まってから):
C: コミットメント束 B = {(i, D_i, E_i)} と m を配布
各 i: ρ_i = Hash(i, m, B) # バインディング係数
R = Σ_j (D_j + ρ_j·E_j) # 集約 nonce 点
c = Hash(R, PK, m) # チャレンジ
z_i = d_i + ρ_i·e_i + c·λ_i·x_i # 部分署名(λ_i はラグランジュ係数)
C: z = Σ z_i, 署名 σ = (R, z) # 通常の Schnorr 署名として検証可能
Round 1 はメッセージに依存しないため事前に大量に作り置きでき、実署名時は1ラウンドで済みます。出力は素の Schnorr 署名なので、BIP-340(Bitcoin Taproot)の検証器でそのまま通ります。
Schnorr には署名を1個にまとめる発想として MuSig2(マルチシグネチャ:n 人全員の協調が必要)と、FROST(閾値:t 人いればよい)があります。MuSig2 は全員一致型なので欠席者がいると署名できず、FROST は n - t 人の脱落に耐えます。カストディのように「鍵保有者の一部が常に稼働とは限らない」運用では、可用性のために閾値型の FROST が選ばれます。
閾値 ECDSA:非線形性をどう越えるか
Bitcoin・Ethereum は secp256k1 上の ECDSA を使うため、互換性の制約から閾値 ECDSA の需要が大きい。問題は前述の k^(-1) と x の分散乗算です。主要な解法は二系統あります。
一つは加法準同型暗号(Paillier 暗号)を使う系統(Lindell17、GG18/GG20)。ある参加者が暗号文 Enc(k_a) を相手に渡し、相手が暗号文上で x_b を掛けて返す——準同型性により平文を見せずに積の項を計算できます。もう一つは OT(Oblivious Transfer)ベースの乗算を使う系統(DKLs)で、準同型暗号の重い剰余演算を避けつつ分散積を作ります。いずれも「秘密×秘密」を、いずれの秘密も復元せずに計算する点が肝です。
閾値 ECDSA が分散で計算したい量(k も x も分散済み):
s = k^(-1)·(e + r·x) mod n
必要な秘密同士の積: k^(-1)·x に相当する項
→ これを Paillier 準同型 もしくは OT ベース乗算で
「k も x も平文にせず」算出する
各参加者は s の自分のシェア s_i を出し、Σ s_i = s(合成)
閾値 ECDSA のプロトコルは相互作用が多く、悪意ある参加者が途中で不正な値を注入すると、最終署名が壊れるだけでなく、過去に漏れたnonce の偏りと同様に鍵漏洩につながる脆弱性が複数発見されてきました(GG18/GG20 への一連の攻撃)。実用方式は各ステップにゼロ知識証明を挿し、誰が不正をしたか特定して中断できる identifiable abort を備えます(CMP/CGGMP 系)。新規実装で自作プロトコルを使うのは禁物で、監査済みライブラリと proactive な鍵リフレッシュが前提です。
分散鍵生成(DKG):ディーラさえ信用しない
閾値署名でも、最初に1人のディーラが完全な秘密鍵を作って分割するなら、その瞬間にディーラが単一信頼点になります。**分散鍵生成(DKG)**はこれを排除します。誰も完全な秘密鍵を一度も知らないまま、参加者全員の協調で (PK, sk_1..sk_n) を生成する仕組みです。
仕組みは Shamir 分散 の重ね合わせです。各参加者 i が自分の乱数秘密 s_i を自前の多項式で分散し、互いにシェアを配り合う。最終的な秘密鍵は各 s_i の総和 Σ s_i に対応し、各人の鍵シェアもその総和の形になります。どの単独参加者も全体の秘密鍵を計算できず、公開鍵だけが全員に共有されます。Pedersen DKG が古典的構成で、配るシェアが正しい多項式上にあることを g^{a_i} のコミットメントで公開検証する**検証可能秘密分散(VSS)**を併用して、不正なシェアを弾きます。DKG は本質的に 秘密計算(MPC) の一種です。
長期運用では、攻撃者が時間をかけて少しずつシェアを盗む可能性があります。t 個未満なら安全ですが、何年もかければ閾値に達しかねません。これを防ぐのが鍵リフレッシュで、公開鍵 PK を変えずに鍵シェアだけを定期的に作り直します(Σ がゼロの新しい多項式を重ねる)。リフレッシュ前に盗まれた古いシェアは、リフレッシュ後のシェアと組み合わせても無意味になり、攻撃者は「同一期間内に t 個」を要求されます。鍵管理ライフサイクルの鍵ローテーションを、鍵を露出させずに行う版だと言えます。
マルチシグとの違い:オンチェーンに何が見えるか
閾値署名(MPC)とマルチシグ(multisig)は「複数人で承認する」点が似ていますが、層がまったく違います。マルチシグはプロトコル/スクリプト層の仕組みで、n 個の独立した公開鍵を登録し、t 個の独立した署名を提示して検証します(Bitcoin の OP_CHECKMULTISIG、Ethereum の Gnosis Safe 等)。閾値署名は暗号プリミティブ層で、最初から1個の公開鍵・1個の署名にまとめます。
この差は実務に直結します。マルチシグは t-of-n の構造とすべての署名者の公開鍵がオンチェーンに露出し、トランザクションサイズ(=手数料)も署名者数に比例して増えます。MPCウォレットは外形上ただの普通の1鍵アドレスに見えるため、ポリシーのプライバシーが保たれ、手数料も一定。一方マルチシグは検証ロジックがチェーン上にあり監査しやすく、対応していないチェーンが少ない利点があります。
| 観点 | マルチシグ(multisig) | 閾値署名 / MPC ウォレット |
|---|---|---|
| 層 | プロトコル・スクリプト層 | 暗号プリミティブ層 |
| 公開鍵・署名の数 | n 個の鍵 / t 個の署名を提示 | 1 個の鍵 / 1 個の署名 |
| オンチェーンの見え方 | t-of-n 構造と全署名者が露出 | 通常の単一鍵アドレスと区別不能 |
| 手数料・サイズ | 署名者数に比例して増加 | 単一署名と同じ(一定) |
| チェーン依存 | チェーンの対応スクリプトが必要 | 鍵の曲線が同じなら原理上チェーン非依存 |
| 承認ポリシー変更 | オンチェーン操作(再デプロイ等) | オフチェーンで鍵リフレッシュ可 |
カストディ・コールドウォレットへの応用
MPCウォレットの本命用途が、**機関カストディとコールドウォレット**です。鍵シェアを地理的・組織的に分離した複数のサーバーや HSM に配り、署名時も鍵を1か所に集めません。これにより、(1) 1台が侵害されても署名できない(外部攻撃耐性)、(2) 1人の運用者が単独で資産を動かせない(内部不正対策)、(3) どのマシンにも完全鍵が現れない(メモリダンプ・コールドブート耐性)を同時に満たします。
運用設計では、署名ポリシー(金額閾値・宛先ホワイトリスト・時間帯)を鍵シェアを持つノード側で強制し、t 人の合意なしには通らないようにします。鍵シェアを定期的にリフレッシュすれば、長期の少しずつ盗む攻撃も無効化できます。コールドウォレットでは一部の鍵シェアをオフライン・エアギャップ環境に置き、署名時だけ部分署名を持ち出す運用で、利便性と隔離を両立させます。
・閾値署名は秘密鍵を一度も復元せず、出力は単一鍵の署名と区別不能。これが SSS(復元してから使う)との決定的な違い。
・Schnorr は線形→足すだけ(FROST)、ECDSA は非線形→分散乗算が必要で重い。線形性が閾値化コストを決める。
・マルチシグ=プロトコル層・n鍵n署名が露出、MPC=暗号層・1鍵1署名で隠蔽。層が違う。
・DKG はディーラを排除し誰も完全鍵を持たない。鍵リフレッシュで長期の漸進的窃取を無効化。
まとめ
閾値署名は、(t,n) のうち t 人が協調すると、単一の秘密鍵を一度も組み立てずに通常の1個の署名を作る方式です。検証側はMPCで作られたことを区別できず、署名鍵を盗むべき「単一の標的」が運用から消えます。Schnorr は s = r + e·x が線形なので部分署名を足すだけで合成でき、FROST(RFC 9591)が2ラウンドの定番。ECDSA は s に k^(-1) が掛かる非線形ゆえ、準同型暗号やOTベースの分散乗算とゼロ知識証明を要する重いプロトコルになります。
ディーラを排除する DKG で誰も完全鍵を持たず、鍵リフレッシュで長期の漸進的窃取を無効化します。n 鍵・n 署名をオンチェーンに晒すマルチシグと違い、MPCウォレットは単一鍵に見えるため、カストディやコールドウォレットの内部不正・単一障害点を消せます。数理の土台は 署名スキームの内部 と ECC の原理、鍵の保護と運用は HSM と 鍵管理ライフサイクル と併せて押さえると、MPCウォレット選定の根拠が原理から判断できます。
セキュリティ Article
閾値署名とマルチパーティ署名(MPC ウォレット)の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
閾値署名
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
Schnorr は線形なので部分署名を足すだけで合成でき FROST が定番。ECDSA は s に逆数 k^(-1) が入り非線形なため、乗算三つ組や準同型暗号を使う重いプロトコルが必要になる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「閾値署名 / MPC」に近いか確認する。
- 強みである「閾値署名は (t,n) のうち t 人が協調すると、単一の秘密鍵を一度も復元せずに通常の1個の署名を作る方式。検証側はMPCで作られたことを区別できず、オンチェーンでもただの普通の署名に見える。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。