コミットメント方式
値を今は隠したまま、後で「確かにその値だった」と証明できる暗号の封筒がコミットメント。隠蔽性と束縛性の原理から、ハッシュ・Pedersen・ゼロ知識での使い方まで押さえられます。
- 1.コミットメント方式は、値をいったん封じて公開し(commit)、後で開封して中身を証明する(reveal)2段階の道具。隠蔽性(hiding:開封前は中身が漏れない)と束縛性(binding:後から別の値に開き替えられない)を同時に満たす。
- 2.ハッシュコミットメント `H(m || r)` は計算量的に安全でシンプル。Pedersen コミットメント `g^m · h^r` は情報理論的な完全隠蔽と加法準同型を持ち、ゼロ知識証明・秘密分散の検証で使われる。隠蔽と束縛は片方しか完全にできない(トレードオフ)。
- 3.ゼロ知識証明では証明者を「言い逃れできない」状態に固定し、コイン投げ・封印入札・乱数生成などの公平性プロトコルでは、先に値を封じて後出しじゃんけんを封じる。ブロックチェーンの秘匿取引にも使われる。
解きたい問題:中身を今は見せず、後で「嘘をつけない」ようにする
じゃんけんを通信越しにするとき、先に手を送ったほうが不利です。相手はそれを見てから勝つ手を返せる。かといって同時送信は物理的に保証できません。先に値を封じておき、両者が出そろってから開封する――この「後出しを封じる封筒」を暗号で作るのが**コミットメント方式(commitment scheme)**です。
コミットメントは2段階で使います。コミット(commit):値 m を封じたコミットメント値 c を計算して相手に渡す。開封(reveal / open):後で m と補助情報(乱数など)を明かし、相手は c が本当に m を封じたものか検証する。この封筒には、封筒として成り立つための2つの性質が同時に要ります。
隠蔽性と束縛性:封筒に求められる2条件
- 隠蔽性(hiding):コミットメント値
cだけからは、中のmについて何も分からない。封を開けるまで中身は秘密。 - 束縛性(binding):一度
cを出したら、コミットした本人でも後から別の値m'に開き替えられない。封筒の中身は最初から確定している。
この2つが両立して初めて「封筒」になります。隠蔽性がなければ相手が中を覗けてしまい、束縛性がなければコミットした側が結果を見てから中身を差し替えられる。じゃんけんで言えば、隠蔽性は「相手に手を読ませない」、束縛性は「自分が後から手を変えない」に対応します。
両性質には「計算量的(computational)」と「情報理論的(unconditional)」の2水準があり、片方を完全(情報理論的)にすると、もう片方は計算量的仮定にしか頼れません。完全隠蔽なら c はどの m にも開き得るので、束縛性は「別の開き方を計算するのが困難」に留まる。完全束縛なら c が m を一意に決めるので、c は m の情報を必ず含み、隠蔽は計算量的になる。両方を無条件に満たすコミットメントは存在しません。用途に応じてどちらを完全にするか選びます。
最も素朴な構成:ハッシュコミットメント
一方向ハッシュ関数があれば、コミットメントはほぼそのまま作れます。値 m に**十分長い乱数 r(nonce / ブラインド)**を連結してハッシュした値をコミットメント値にします。
コミット: c = H(m || r) r は CSPRNG で選ぶ十分長い乱数
公開: c を相手に渡す
開封: (m, r) を明かす
検証: 相手は H(m || r) を再計算し c と一致するか確認
- 隠蔽性は原像計算困難性から来ます。
c = H(m || r)を見ても、rが十分ランダムならmを逆算できない。ここでrが必須なのが要点で、rを省いてc = H(m)にすると、mの候補が少ない場合(例:じゃんけんの3手、Yes/No)に総当たりで開けられてしまう。rは候補空間を隠す目くらましです。 - 束縛性は衝突困難性から来ます。同じ
cを与える別の(m', r')を見つけるのはハッシュ衝突を突く攻撃 と同じ難しさで、SHA-256 などなら計算量的に困難です。
つまりハッシュコミットメントは計算量的隠蔽・計算量的束縛です。ハッシュの安全性はその内部構造(Merkle–Damgård/スポンジ) に依存するため、H の選定がそのままコミットメントの強度になります。
Pedersen コミットメント:完全隠蔽と準同型
もう一つの代表格が Pedersen コミットメントで、離散対数の難しさを使います。位数 q の巡回群(安全な素数位数の群や楕円曲線群)に、生成元 g と、離散対数の関係が誰にも分からないもう一つの生成元 h(h = g^x の x を誰も知らない)を用意します。
公開パラメータ: 群 G(位数 q), 生成元 g, h ※ log_g(h) は未知
コミット: メッセージ m と乱数 r を選び c = g^m · h^r
開封: (m, r) を明かす
検証: g^m · h^r == c を確認
- 完全隠蔽(情報理論的):
rが一様乱数ならh^rが群を一様に覆うため、cはどのmに対しても等確率に生じ得ます。cからmの情報は1ビットも漏れません。無限の計算力があっても中身は特定できない。 - 計算量的束縛:同じ
cをm ≠ m'の2通りに開ける、つまりg^m · h^r = g^{m'} · h^{r'}を満たす別解を見つけられると、そこからlog_g(h)が計算できてしまいます。これは離散対数問題を解くことに等しく、困難だと仮定します。裏を返せば、hの離散対数を知る者はいくらでも中身を差し替えられるため、hの生成方法(誰も裏口を持たないこと)が安全性の要です。
Pedersen の強力な点は加法準同型です。コミットメント同士を掛けると、中身を足したもののコミットメントになります。
c1 = g^{m1}·h^{r1}, c2 = g^{m2}·h^{r2}
c1 · c2 = g^{m1+m2} · h^{r1+r2} ← 中身 (m1+m2) のコミットメントに一致
⇒ 値を開かないまま「合計」を検証できる
この性質は、秘密の値を開かずに「合計が0」「範囲内」などを証明する用途で決定的に効きます。検証可能秘密分散(VSS)で各シェアが正しい多項式上にあることを公開検証したり、機密取引で入出金額を隠したまま収支が合うことを示したりできます。
| 観点 | ハッシュ `H(m||r)` | Pedersen `g^m·h^r` |
|---|---|---|
| 隠蔽性 | 計算量的(原像困難) | 完全(情報理論的) |
| 束縛性 | 計算量的(衝突困難) | 計算量的(離散対数) |
| 準同型 | なし | 加法準同型あり |
| 計算コスト | 軽い(ハッシュ1回) | 重い(べき乗剰余) |
| 主な用途 | コイン投げ・封印入札・一般用途 | ZKP・VSS・秘匿取引 |
ハッシュコミットメントの r、Pedersen の r はどちらも**ブラインド(blinding factor)**と呼ばれ、隠蔽性の源です。これを省くと隠蔽が崩れます。逆に開封時は r も必ず一緒に明かす必要があり、r を紛失するとコミットメントを二度と正しく開けません。r は「封筒の中身とセットで保管すべき鍵」だと考えると扱いを誤りません。
ゼロ知識証明での役割:証明者を言い逃れできなくする
コミットメントが最も本質的に効くのがゼロ知識証明(ZKP) です。多くの対話型証明は「コミット → チャレンジ → 応答」の3手(Σプロトコル)で進みます。証明者はまず秘密に関わる値をコミットして先に固定し、検証者がランダムなチャレンジを投げ、証明者がそれに応じて開封・応答します。
ここでコミットメントの束縛性が要になります。証明者が先に値を封じているため、チャレンジを見てから都合よく答えを作り替えることができません。これが健全性(嘘の証明が通らないこと)を支えます。一方で隠蔽性は、コミットメント値からは秘密が漏れないことを保証し、ゼロ知識性(証明が秘密を明かさないこと)に寄与します。Pedersen の準同型は、値を開かないまま「和が一致する」「範囲に入る」といった関係を証明する範囲証明・算術回路の証明で多用されます。
対話型のコミット→チャレンジ→応答は、検証者のランダムチャレンジを「これまでの通信(コミットメント値を含む)のハッシュ」で置き換えることで、対話なしの署名・証明にできます(Fiat–Shamir 変換)。このときコミットメントを先にハッシュへ入れることで、証明者がチャレンジを予見して細工することを防ぎます。コミットメントの束縛性が、非対話版でも後出しを封じる役割を果たします。
公平性プロトコルでの役割:後出しじゃんけんを封じる
コミットメントは、複数者が同時に値を出すべき場面で「順番の不公平」を消します。
- コイン投げ(coin flipping):離れた2者が公平にコインを振るには、各自が乱数ビットをコミットして交換し、両方出そろってから開封し、
b1 XOR b2を結果とします。束縛性で後から自分のビットを変えられず、隠蔽性で相手のビットを見て合わせることもできない。どちらも一方的に結果を操れません。 - 封印入札(sealed-bid auction):各入札者が金額をコミットして提出し、締切後に一斉開封します。他人の額を見てから自分の額を決める後出しを封じられます。開札時に全員が
r付きで開封し、コミットメントと突き合わせて改ざんがないことを確認します。 - 検証可能な乱数(randomness beacon):複数者が各自のエントロピーをコミットしてから合成することで、最後に開封する者が結果を選び取る「last-revealer 攻撃」を防ぎます。
これらに共通するのは、「値を確定させる時点」と「値を明かす時点」を分離するという一点です。コミットメントはこの2つの時点を安全に切り離す道具に他なりません。ブロックチェーンの秘匿取引では、Pedersen コミットメントで金額を隠したまま収支の整合を検証し、認証データ構造(Merkle 木) と組み合わせて台帳全体の完全性と秘匿性を両立させます。
コミットメントは「開封を約束させる」だけで、「必ず開封させる」ことまでは保証しません。コイン投げや入札で、結果が不利だと分かった参加者が開封を拒否して途中離脱すると、プロトコルが止まる可能性があります(fairness / abort 問題)。実運用ではデポジット没収、タイムアウト、あるいは開封鍵を秘密分散して一定数で強制開封する仕組みなどを別途組み合わせ、開封拒否のインセンティブを潰す必要があります。
・コミットメントは commit → reveal の2段階。隠蔽性(開封前は漏れない)と束縛性(後で開き替えられない)を同時に満たす。
・両者は同時に完全化できない。ハッシュ H(m||r) は計算量的隠蔽・計算量的束縛、Pedersen g^m·h^r は完全隠蔽・計算量的束縛。
・ハッシュ版は r(ブラインド)が必須。省くと候補が少ない値は総当たりで開けられる。
・Pedersen は加法準同型を持ち、値を開かず和や範囲を証明できる。ZKP・VSS・秘匿取引で多用。
・ZKP では束縛性が健全性を、隠蔽性がゼロ知識性を支える。公平性プロトコルでは確定時点と開示時点の分離が本質。
まとめ
コミットメント方式は、値をいったん封じて公開し(commit)、後で開封して中身を証明する(reveal)2段階の暗号の封筒です。封筒として成り立つには隠蔽性(開封前は中身が漏れない)と束縛性(後から別の値に開き替えられない)が同時に要りますが、両方を無条件には満たせず、片方を完全にすると他方は計算量的仮定に頼ります。
ハッシュコミットメント H(m || r) は原像困難性で隠蔽・衝突困難性で束縛する軽量な計算量的方式で、r(ブラインド)が候補空間を隠す鍵になります。Pedersen コミットメント g^m · h^r は離散対数を使い、c がどの m にも等確率に生じる完全隠蔽と、コミットメント同士を掛けると中身が足される加法準同型を備え、ゼロ知識証明 や検証可能秘密分散、秘匿取引で重宝します。ZKP では束縛性が「後出しの改ざん」を封じて健全性を支え、コイン投げ・封印入札などの公平性プロトコルでは「値を確定する時点」と「明かす時点」を安全に切り離します。ハッシュの強度はハッシュ関数の内部構造、群の選び方は楕円曲線暗号の内部 と併せて押さえると、封筒の底が抜けない理由まで一本でつながります。
セキュリティ Article
コミットメント方式を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
コミットメント
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
ハッシュコミットメント `H(m || r)` は計算量的に安全でシンプル。Pedersen コミットメント `g^m · h^r` は情報理論的な完全隠蔽と加法準同型を持ち、ゼロ知識証明・秘密分散の検証で使われる。隠蔽と束縛は片方しか完全にできない(トレードオフ)。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「コミットメント / ゼロ知識証明」に近いか確認する。
- 強みである「コミットメント方式は、値をいったん封じて公開し(commit)、後で開封して中身を証明する(reveal)2段階の道具。隠蔽性(hiding:開封前は中身が漏れない)と束縛性(binding:後から別の値に開き替えられない)を同時に満たす。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。