Zero-Knowledge Proofs
秘密を明かさずに秘密を知っていることを証明する
秘密の乱数は教えないけど、自分を証明するための乱数を持っていることは信じてほしい。虫のいい話。でもこの虫のいい話が暗号数学で実現できてしまう。
封筒
僕が「ある秘密 を知っている」ことを君に証明したいとする。 自体は絶対に教えたくない。ここで封筒を持ち出そう。
を封筒に入れて封をする。君はその封筒を受け取って、封を開けずに「中身が条件を満たしているか」だけを検証できる。中身は見えていない。でも正しいことは確信できる。僕が本当に を知らなければこの封筒は作れない。
実際のZKPでは封筒の代わりにmod演算のトラップドア関数を使う。「封を開けずに中身を検証する」が一方向関数の性質で、「封筒を偽造できない」が計算量的困難性。暗号理論の定番の道具立て。
形式的には3つの性質を満たすプロトコルをゼロ知識証明と呼ぶ。完全性(正直者は必ず通る)、健全性(嘘つきはバレる)、ゼロ知識性(検証者は秘密そのものを一切学ばない)。3つ目がミソ。検証者が対話から得る「ビュー」が、証明者の助けなしにシミュレーション可能なら、検証者は新しい情報を得ていないと言える。
Fiat-Shamirの方式
1985年にGoldwasser, Micali, Rackoffが概念を出して、翌年Fiat-Shamirが実用的なプロトコルを作った。やってることは素因数分解の困難性を使った平方根パズル。
信頼できるセンターが2つの素数 を選んで を公開する。 自体は秘密。 から を逆算するのは計算量的に困難。RSAと同じ構造。
ユーザーAは公開ID を登録する。センターは を知ってるから mod での平方根 が計算できる。これがAの秘密鍵。 を知らない人間にはこの計算が不可能。ここに全ての安全性がぶら下がっている。
具体例で追ってみる。, , 。 のとき 。検算すると 。合ってる。
Aは乱数 を選んで をBに送る。次に を送る。
Bは を計算して、 を得る。。認証成功。
なぜこうなるか。展開すれば一発。
乱数 が分子と分母で消える。残るのは だけ。Bは を直接見ていない。 は乱数の2乗だからランダム、 も乱数で撹拌されてるからランダムに見える。Bはこのビューを なしで生成できる(適当な を選んで とすればいい)。シミュレーション可能。だからゼロ知識。
じゃあ攻撃者が を知らずになりすませるか? くらいなら全探索でいける。でも が100桁を超えたら無理。さらに実用プロトコルでは検証者がランダムなチャレンジビット を挟んで、なりすまし確率を に落とす。40ラウンド繰り返せば 。
非対話にする
Fiat-Shamirは対話的。AとBがリアルタイムにやり取りする。ブロックチェーンだとこれは困る。証明を一度生成したら誰でも検証できなきゃいけない。
Fiat-Shamir変換(プロトコルと名前が同じでややこしい)は、検証者のチャレンジをハッシュ関数で置き換える。。証明者は対話なしに証明を生成できる。ランダムオラクルモデルの下で安全。これで対話が不要になった。
Moneroとbulletproofs
ここから現代の話。Moneroが2018年に採用したBulletproofsは、送金額が非負であることを金額を明かさずに証明する。range proof。
なぜ金額の非負性を証明する必要があるか。暗号化された金額でトランザクションを作ると、金額が負じゃないことを保証しないと「-100 XMR送金」みたいなトリックでコインを無から生み出せてしまう。Bulletproofsはこの穴を塞ぐ。
やってることの直感はシンプル。値 が の範囲にあることを証明したい。 をビット分解して 、各 が0か1であることを証明すれば、 が範囲内だと保証される。素朴にやると 個のコミットメントが必要だけど、Bulletproofsは内積証明で に圧縮する。
Pedersen commitment の加法準同型性がカギ。 は生成元、 はブラインド因子。 を明かさずにコミットメントだけで算術関係を検証できる。Trusted setupが不要で、証明サイズが対数的。Moneroはこれでトランザクションサイズを約80%削減した。
Moneroの匿名性は3層構造になっている。リング署名が送信者を匿名化して、ステルスアドレスが受信者を匿名化して、Bulletproofsが金額を秘匿する。全部合わせて初めて「誰が誰にいくら送ったか」が完全に隠れる。
zk-SNARKsとzk-STARKs
Zcashが2016年に採用したzk-SNARKsは、証明サイズが入力に依存せず数百バイトで一定、検証がミリ秒で終わる。ただしtrusted setupが必要で、セットアップの秘密パラメータが漏れたら偽造可能。儀式的に「パラメータを生成してから破棄する」のだけど、本当に破棄されたかは信じるしかない。
zk-STARKsはtrusted setupが不要。証明サイズは数十KBとデカいけど、量子計算機にも耐性がある。SNARKsは楕円曲線に依存してるから量子に弱い。StarkNetで使われている。
トレードオフは明確。SNARKsは証明が小さいけどセットアップが必要。STARKsはセットアップ不要だけど証明がデカい。Bulletproofsはセットアップ不要で証明も小さいけど検証が遅い。銀の弾丸はない。
面白さ
Goldwasser, Micali, Rackoffが1985年にこの概念を定式化したとき、40年後にブロックチェーンの匿名送金を支えることになるとは思ってなかったんじゃないかな。 素因数分解の困難性がRSAを支えて、離散対数が楕円曲線暗号を支えて、ゼロ知識証明がMoneroのプライバシーを支えている。純粋数学が何十年後に実用になる。暗号理論はそういう世界かもしれない。
参考文献
- Goldwasser, Micali & Rackoff (1985). "The Knowledge Complexity of Interactive Proof-Systems." STOC '85
- Fiat & Shamir (1986). "How to Prove Yourself." CRYPTO '86
- Bünz et al. (2018). "Bulletproofs: Short Proofs for Confidential Transactions and More." IEEE S&P
- Ben-Sasson et al. (2014). "Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture." USENIX Security
- Noether et al. (2016). "Ring Confidential Transactions." Ledger, 1, 1-18