Archipelago

Lec 20隐私与零知识证明

讲义完成更新于 2026-09-16

Lec 20 隐私与零知识证明

MIT 6.1600 · Introduction to Computer Security

TL;DR

  • 零知识证明同时要求完备性、可靠性与零知识性:真命题可被接受,假证明难以通过,验证者视图又能在不知道见证时被模拟。
  • Schnorr 协议用离散对数见证演示这三项性质;从两个相同承诺、不同挑战的有效响应可提取秘密,模拟器则能生成无信息增量的对话。
  • Fiat–Shamir 在随机预言机模型中用哈希挑战消除交互,支撑 Schnorr 签名与部分非交互证明,但其保证依赖所用模型与具体协议。

1. 超越"全有或全无"的加密

本课程前面介绍的密码学原语都是"全有或全无"的:

  • 持有密钥 kk → 完全解密消息
  • 不持有密钥 → 无法获取任何信息

零知识证明(Zero-Knowledge Proof) 提供更精细的语义:

证明者(Prover)可以向验证者(Verifier)证明其"知道"某个秘密,而不泄露关于该秘密的任何其他信息。

2. 零知识证明的形式化定义

设定:双方共同持有函数 ff 和值 y=f(x)y = f(x)。证明者知道 xx,想向验证者证明这一点,但不透露 xx 本身。

证明系统(Proof System):证明者与验证者交互,最终验证者接受或拒绝。

(术语:秘密值 xx 称为见证(Witness))

2.1 三个安全性质

完备性(Completeness):
若证明者真正知道 xx,则诚实的验证者总是接受:

P[诚实证明者⇒验证者接受]=1P[\text{诚实证明者} \Rightarrow \text{验证者接受}] = 1

可靠性(Soundness):
若验证者接受,则证明者真的知道 xx;欺骗的证明者无法让验证者接受:

∀ 作弊证明者: P[验证者接受]≤negl(λ)\forall\ \text{作弊证明者}:\ P[\text{验证者接受}] \leq \mathrm{negl}(\lambda)

零知识性(Zero-Knowledge): 验证者除了"y=f(x)y = f(x) 有解"这一事实外,什么都没学到。
形式化:验证者可以在不与真正证明者交互的情况下,模拟(Simulate)出与真实交互计算上不可区分的记录(Transcript)。

2.2 "知道"的定义:可提取性

"知道 xx" 的形式化含义:存在高效的提取器(Extractor),通过与证明者交互并观察其内部状态,可高效提取 xx。

3. 离散对数问题(DLP)回顾

设定:群 G\mathbb{G},素数阶 qq,生成元 g∈Gg \in \mathbb{G}。

给定 y=gx∈Gy = g^x \in \mathbb{G}(x \xleftarrow{\} \mathbb{Z}_q),∗∗离散对数问题∗∗要求求),**离散对数问题**要求求 x$。

实践中 q≈2256q \approx 2^{256},最优算法时间 ≈2128\approx 2^{128}。

4. Schnorr 协议:离散对数的零知识证明

4.1 协议设置

  • 公开:g∈Gg \in \mathbb{G},群阶 qq,验证者知道 y∈Gy \in \mathbb{G}
  • 证明者知道:x∈Zqx \in \mathbb{Z}_q 使得 y=gxy = g^x

4.2 协议流程(挑战位 c∈{0,1}c \in \{0, 1\})

Prover→R=gr, r←$ZqVerifier\text{Prover} \xrightarrow{R = g^r,\ r \xleftarrow{\$} \mathbb{Z}_q} \text{Verifier} Prover←c←${0,1}Verifier\text{Prover} \xleftarrow{c \xleftarrow{\$} \{0,1\}} \text{Verifier} Prover→z=r+cx mod qVerifier\text{Prover} \xrightarrow{z = r + cx \bmod q} \text{Verifier}

验证:gz=?R⋅ycg^z \stackrel{?}{=} R \cdot y^c

验证正确性:

gz=gr+cx=gr⋅(gx)c=R⋅yc✓g^z = g^{r+cx} = g^r \cdot (g^x)^c = R \cdot y^c \quad \checkmark

4.3 为什么需要交互

证明者不能提前知道 cc——否则可选 z \xleftarrow{\} \mathbb{Z}_q并令并令R = g^z y^{-c},无需知道,无需知道 x$ 即可"通过"验证。

可靠性误差:单轮协议中作弊者成功概率为 1/21/2。
重复 λ\lambda 次后,成功概率降至 2−λ2^{-\lambda}。

4.4 完整 Schnorr 协议(挑战 c∈Zqc \in \mathbb{Z}_q)

将挑战扩展为 c \xleftarrow{\} \mathbb{Z}_q(而非仅(而非仅 {0, 1}$):

可靠性误差≈1/q≈2−256一轮即安全\text{可靠性误差} \approx 1/q \approx 2^{-256} \quad \text{一轮即安全}

代价:只满足诚实验证者零知识(Honest-Verifier ZK),不满足完整零知识性。

5. Schnorr 协议的安全性分析

5.1 可靠性(通过 Extractor)

构造提取器:与(可能作弊的)证明者 P∗P^* 交互两次,使用不同挑战:

  1. 运行 P∗P^*,获得 (R,c=0,z)(R, c=0, z) — 验证通过:gz=Rg^z = R
  2. 倒带(Rewind) P∗P^* 到发送 RR 后的状态
  3. 重新发送挑战 c=1c=1,获得 (R,c=1,z′)(R, c=1, z') — 验证通过:gz′=R⋅yg^{z'} = R \cdot y

两次同一 RR,不同挑战 cc:

gz=R,gz′=Ry⇒gz′−z=y⇒x=z′−z mod qg^z = R,\quad g^{z'} = Ry \Rightarrow g^{z'-z} = y \Rightarrow x = z' - z \bmod q

证明了若 P∗P^* 能以概率 1 说服验证者,则提取器能提取 xx。

5.2 零知识性(通过 Simulator)

构造模拟器,无需知道 xx,生成与真实交互计算上不可区分的 Transcript:

  1. 猜测挑战 c' \xleftarrow{\} {0, 1}$
  2. 选 z \xleftarrow{\} \mathbb{Z}_q,令,令 R = g^z y^{-c'}$
  3. 运行验证者 V∗V^*,输入 RR,得到挑战 cc
  4. 若 c=c′c = c',输出 (R,c,z)(R, c, z) 作为模拟 Transcript
  5. 否则重试(每次成功概率 1/21/2,平均 2 次成功)

关键:在真实交互中,(R,c,z)(R, c, z) 满足 gz=Rycg^z = Ry^c;模拟器生成的 (R,c,z)(R, c, z) 同样满足该关系,且由于 zz 均匀随机,两者分布相同。

为什么真实协议中验证者学不到 xx? 验证者在真实交互中不能倒带证明者,因此无法运行提取器算法。

6. Fiat-Shamir 变换:从交互到非交互

问题:Schnorr 协议需要多轮消息交换。

Fiat-Shamir 变换:用哈希函数(建模为随机预言 Random Oracle)替换验证者的随机挑战:

c=H(R∥m)(加入消息 m,形成签名方案)c = H(R \| m) \quad \text{(加入消息 $m$,形成签名方案)}

证明者完全独立地计算出证明,无需与验证者交互:

  1. r \xleftarrow{\} \mathbb{Z}_q,\quad R = g^r$
  2. c=H(R∥m)c = H(R \| m)
  3. z=r+cx mod qz = r + cx \bmod q
  4. 输出 σ=(R,z)\sigma = (R, z)

验证:gz=?R⋅yH(R∥m)g^z \stackrel{?}{=} R \cdot y^{H(R \| m)}

这就是 Schnorr 签名方案!椭圆曲线版本(Ed25519)是现代最重要的签名方案之一。

7. 零知识证明的应用

7.1 认证(Authentication)

  • xx = 用户私钥,yy = 公钥,f(x)=gxf(x) = g^x
  • 证明者向验证者证明"我知道对应公钥的私钥",而不传递私钥本身

传统 MAC/签名方案也可看作一种知识证明,但不严格满足 ZK 的定义。

7.2 匿名凭证(Anonymous Credentials)

用户可以向服务证明"我是合法用户(某 CA 签发了我的证书)",而不泄露身份:

ZKP{x: Verify(vkCA, x, σ)=1}\text{ZKP}\{x:\ \text{Verify}(vk_\text{CA},\ x,\ \sigma) = 1\}

用户知道某个被 CA 签名的证书,但选择性地只公开"我有合法证书"这一事实。

7.3 zkSNARKs(简洁非交互式知识证明)

现代 ZKP 系统可以对任意可计算函数生成简洁证明(几百字节):

ZKP{x: C(x)=y}证明大小 O(1),验证时间 O(1)\text{ZKP}\{x:\ C(x) = y\} \quad \text{证明大小 O(1),验证时间 O(1)}

  • Groth16、PLONK、STARKs:用于区块链隐私交易(Zcash)和 L2 Rollup 证明

关键公式

Schnorr 协议:

z=r+cx mod q,验证: gz=gr⋅(gx)c=R⋅ycz = r + cx \bmod q,\quad \text{验证:}\ g^z = g^r \cdot (g^x)^c = R \cdot y^c

Fiat-Shamir(Schnorr 签名):

c=H(R∥m),z=r+cx mod qc = H(R \| m),\quad z = r + cx \bmod q σ=(R,z),验证: gz=?R⋅yH(R∥m)\sigma = (R, z),\quad \text{验证:}\ g^z \stackrel{?}{=} R \cdot y^{H(R \| m)}

提取器输出(两轮倒带):

x=z′−z mod q(由 gz=R, gz′=Ry 推导)x = z' - z \bmod q \quad \text{(由 } g^z = R,\ g^{z'} = Ry \text{ 推导)}

我的理解

模拟器与提取器把“没有额外泄露”和“确实知道见证”转化为可检验的构造,是理解零知识证明的两把钥匙。