ゼロ知識証明(Zero-Knowledge Proof、略称ZKP)とは、ある情報を持っていることや、ある主張が正しいことを、その情報そのものを明かさずに証明する暗号技術です。
この記事では、証明者・検証者という用語、洞窟の例え、3つの性質、対話型と非対話型の違い、ブロックチェーンでの使われ方、歴史の順に整理します。
証明者と検証者:ゼロ知識証明に出てくる2つの立場
ゼロ知識証明には2つの立場が登場します。証明者(Prover)は「自分は秘密を知っている」と主張する側です。検証者(Verifier)はその主張が本当かどうかを確かめる側です。
証明者は、秘密を知っていることを検証者に示せます。一方で検証者は、秘密が何であるかについての情報は一切得られない、と説明されています(日立製作所 研究開発グループの解説)。
ethereum.orgでは、証明者を「プルーバー」と表記し、請求を証明しようとする当事者としています。検証者は請求を検証する責任を負う側です(ethereum.org「ゼロ知識証明」)。
なお、ゼロ知識証明で証明できる主張は「命題に関する知識」だとされています。たとえば「2023の素因数分解を知っている」は対象になり得る主張ですが、「2023は大きい」のように主観が入るものは命題ではないため対象外です(NTTデータの解説)。
「20歳以上である」ことを生年月日なしで示すイメージ
身近な例として、年齢確認があります。「20歳以上だ」と示すとき、運転免許証やマイナンバーカードなどの身分証明書を出すのが一般的ですが、それでは証明したい点以外の情報まで漏れてしまいます。ゼロ知識証明は、これを防ぐための技術だと説明されています(日立製作所 研究開発グループの解説)。
ethereum.orgも、パスポートや運転免許証などの証拠を出す方法にはプライバシーの欠如という問題があると説明しています。ゼロ知識証明は、請求の有効性を証明するために情報を明らかにする必要性を排除するものとされています(ethereum.org「ゼロ知識証明」)。
洞窟の問題(アリババの洞窟)で仕組みを理解する
ゼロ知識証明の仕組みを直感的につかむための例え話が「洞窟の問題」で、「アリババの洞窟」とも呼ばれます。ジャン=ジャック・キスケータらの論文「我が子にゼロ知識証明をどう教えるか」で例示されたものです(Wikipedia「ゼロ知識証明」)。
設定は次のとおりです。洞窟の奥に魔法の扉があり、そこへ至る道はAとBの2つあります。合言葉を知っていれば扉を開けて、AからBへ、またその逆へ移動できます(Wikipedia「ゼロ知識証明」)。
証明者Pさんは合言葉を教えずに「知っている」ことを示したく、検証者Vさんは本当に知っているか確かめたい、という状況です。手順は次のとおりです。
- Vさんは洞窟の外で待ち、Pさんだけが入ります。PさんはAかBのどちらかの道をランダムに選んで奥に入ります。
- Vさんは分かれ道の入り口まで行き、AかBをランダムに選んで、その道から出てくるようPさんに大声で伝えます。VさんはPさんがどちらから入ったかを知りません。
- Pさんは指定された道から出てきます。これを繰り返します。
以上の手順は、Wikipedia「ゼロ知識証明」の記述に基づきます。
合言葉を知っている場合と知らない場合で何が違うのか
Pさんが合言葉を知っている場合、Vさんにどちらの道を指定されても出てくるのは簡単です。自分が入った道を指定されればそのまま戻り、反対側なら合言葉で扉を開けて反対の道から出てくればよいからです(Wikipedia「ゼロ知識証明」)。
合言葉を知らない場合、Pさんは入った道からしか出てこられません。Vさんがランダムに道を選ぶので、要求に応えられるのは50%の確率です(Wikipedia「ゼロ知識証明」)。
このときVさんは、合言葉そのものについての知識を得られません。秘密を知っている証拠は示すが、秘密そのものは守られる、というのがこの例え話のポイントです(日立製作所 研究開発グループの解説)。
20回繰り返すと、知らない人が通り抜ける確率はどうなるのか
合言葉を知らない人が毎回正解できる確率は、1回あたり50%です。試行を繰り返すほど、すべてに応えられる確率は小さくなります。
| 繰り返す回数 | 知らない人がすべて正解できる確率 | 出どころ |
|---|---|---|
| 20回 | 約0.0001% | Wikipedia「ゼロ知識証明」 |
| 30回 | 約0.0000001% | NTTデータの解説 |
試行回数をさらに増やせば、検証者は自分がだまされる確率を0%に望むだけ近づけられます。その間も、検証者は合言葉に関する知識を何も得ていません(NTTデータの解説)。
ゼロ知識証明が満たす3つの性質

ゼロ知識証明が成り立つには、3つの性質を満たす必要があります。完全性・健全性・ゼロ知識性の3つです(NRIセキュアの用語解説)。
前の2つは、ゼロ知識証明に限らず対話型証明システムに共通の性質です。最後のゼロ知識性があって初めてゼロ知識証明になる、と説明されています(Wikipedia「ゼロ知識証明」)。
洞窟の例えでは、Pさんが合言葉を知っている場合が完全性、知らない場合が健全性、Vさんが合言葉の知識を得ないことがゼロ知識性に対応します(NTTデータの解説)。
完全性・健全性・ゼロ知識性とは
| 性質 | 内容 |
|---|---|
| 完全性(completeness) | 証明者の主張が正しい場合、検証者はそれを正しいと確認できる |
| 健全性(soundness) | 証明者が嘘をついている場合、検証者は高い確率でそれを見抜ける |
| ゼロ知識性(zero-knowledge) | 検証者は証明者の主張が正しいこと以外の情報を得られない |
上の表はNRIセキュアの用語解説の記述に沿っています。
ゼロ知識性については、検証者が不正をして証明者から知識を盗もうとしても、「命題が真である」以外の何の知識も得られないこと、とも説明されています(Wikipedia「ゼロ知識証明」)。
ゼロ知識証明の「証明」は確率的な証明
ゼロ知識証明における「証明」は、数学上の証明とは異なり、確定的な証明ではなく確率的な証明です。
証明者の命題が偽であるのに、検証者が真だと誤って判定してしまうこともあり得ます(健全性のエラー)。ただし、このエラーが起きる確率を実用的に十分小さくできることを意味する、と説明されています(Wikipedia「ゼロ知識証明」)。
対話型と非対話型の違い

ゼロ知識証明には、対話型と非対話型の2つがあります。洞窟の例えは、証明者と検証者が何度もやりとりする対話型にあたり、現在のブロックチェーンなどで主流なのは非対話型です(日立製作所 研究開発グループの解説)。
対話型は、洞窟の例えのように、証明者と検証者が何度もやり取りを繰り返して証明を行う方式です。
非対話型は、証明者が証明のデータを作成して送り、検証者がそれを確認して正しさを判断する方式です。やり取りは一度で済みます(日立製作所 研究開発グループの解説)。
| 方式 | やり取り | 例 |
|---|---|---|
| 対話型 | 何度も繰り返す | アリババの洞窟 |
| 非対話型 | 1回で済む | zk-SNARK |
ブロックチェーンで非対話型(zk-SNARKなど)が使われる理由
非対話型の中でも、データサイズの小さいものが zk-SNARK(Zero-Knowledge Succinct Non-interactive Argument of Knowledge)と呼ばれています。証明者は「証明(proof)」と呼ばれる短いデータを作成して送り、検証者はそれをチェックするだけで真か偽かを判定できます(日立製作所 研究開発グループの解説)。
ブロックチェーンは、サーバーを介さずに直接通信するP2Pネットワーク上の不特定多数が検証者になります。そのため、証明者との対話を行うことは非現実的だとされています。同解説は、ブロックチェーンに活用する際にはzk-SNARKが必須条件だとしています(日立製作所 研究開発グループの解説)。
ブロックチェーン・暗号資産でのゼロ知識証明の使われ方

ブロックチェーンは取引情報が分散台帳に記録され、ネットワーク上の全参加者に共有されるため、透明性が高い仕組みです。一方で、透明性とプライバシーは相反する面があります(日立製作所 研究開発グループの解説)。
ゼロ知識証明を活用すると、取引の正当性を証明しつつ、取引金額や送金アドレスなど隠したい情報を保護できるようになるとされています(日立製作所 研究開発グループの解説)。
この記事では、ゼロ知識証明が秘匿送金や分散型アイデンティティといった場面でどう使われているかを見ていきます。
取引の中身を隠したまま正当性を示す(秘匿送金)
ほとんどの暗号資産の取引はパブリックなブロックチェーン上で公開されています(ethereum.org)。ユーザーのアイデンティティは多くの場合仮名ですが、データ分析によって現実世界のアイデンティティと関連付けられる場合もあります(ethereum.org「ゼロ知識証明」)。
完全に匿名な取引のために設計された「プライバシーコイン」として、ZcashやMoneroが挙げられています。これらのプライバシーに焦点を当てたブロックチェーンは、送信者・受信者のアドレス、資産の種類、数量、取引のタイムラインなどの詳細を隠すとされています(ethereum.org「ゼロ知識証明」)。
NRIセキュアの用語解説でも、ゼロ知識証明は秘匿送金を可能にし、ユーザーのプライバシーを守りながら取引の正当性を証明できると紹介されています。
ethereum.orgは、Tornado Cashのような「オプトイン」型のプライバシーツールが違法行為と関連付けられてきたと述べています。そのうえで、最終的にはパブリックなブロックチェーン上でプライバシーが標準になる必要があるとしています(ethereum.org「ゼロ知識証明」)。
なお、暗号化されたままでは第三者が取引の正当性を検証できません。ゼロ知識証明を用いると、暗号化されたデータがプロトコルに従って正しく作成されたことを、データを明かさずに証明できるとされています(日立製作所 研究開発グループの解説)。
分散型アイデンティティと選択的開示
分散型アイデンティティ(DID)は「自己主権型アイデンティティ」とも呼ばれ、個人が個人識別子へのアクセスを制御できるようにする考え方です。納税者番号やパスポートの詳細を明らかにせずに市民権を証明することが、ゼロ知識技術の良い例として挙げられています(ethereum.org「ゼロ知識証明」)。
実例として、ethereum.orgはイーサリアム上に構築されたブータン王国の国家デジタルID(NDI)を紹介しています。ID上の機密な個人データを明かさずに、「私は市民です」や「私は18歳以上です」といった事実を暗号技術的に証明できるようにするものです。
日本銀行金融研究所のディスカッションペーパーでは、効率証明付き署名とゼロ知識証明技術を活用することで、検証可能クレデンシャルに記述された属性のうち必要なものだけを開示できるとされています。これが選択的開示です(日本銀行 金融研究所「分散型デジタルアイデンティティとは?」)。
同論文では、個人の識別子の管理方法として、ブロックチェーンなどを用いた分散型識別子(DID)による方法も検討されているとしています。なお、掲載内容は執筆者個人の見解であり、日本銀行や金融研究所の公式見解を示すものではないと明記されています。
ゼロ知識証明の歴史と注目される背景
ゼロ知識証明は新しい技術ではなく、1980年代に暗号研究の中で生まれたアイディアです(NTTデータの解説)。
日立製作所の研究者は、ゼロ知識証明は暗号の分野で長年研究されてきた技術だが、ブロックチェーンに取り込まれてから一気に進んだと語っています(日立製作所 研究開発グループの解説)。
1985年の論文から、2019年の世界経済フォーラムまで
ゼロ知識対話証明は、1985年のGoldwasser、Micali、Rackoffの論文「The Knowledge Complexity of Interactive Proof-Systems」によって最初に定式化されました(Wikipedia「ゼロ知識証明」)。
2019年9月には、世界経済フォーラムが金融分野に新たな価値をもたらす五つのプライバシー強化技術を公表し、ゼロ知識証明はそのうちの一つとして紹介されました(NTTデータの解説)。
一方、NRIセキュアの用語解説は、理論や実用性は概ね確立されているものの、スケーラビリティや効率性の課題が残り、導入の難易度の高さもあって、広く普及するには至っていないとしています。
