Lec 20 隐私与零知识证明
MIT 6.1600 · Introduction to Computer Security
TL;DR
- 零知识证明同时要求完备性、可靠性与零知识性:真命题可被接受,假证明难以通过,验证者视图又能在不知道见证时被模拟。
- Schnorr 协议用离散对数见证演示这三项性质;从两个相同承诺、不同挑战的有效响应可提取秘密,模拟器则能生成无信息增量的对话。
- Fiat–Shamir 在随机预言机模型中用哈希挑战消除交互,支撑 Schnorr 签名与部分非交互证明,但其保证依赖所用模型与具体协议。
1. 超越"全有或全无"的加密
本课程前面介绍的密码学原语都是"全有或全无"的:
- 持有密钥 k → 完全解密消息
- 不持有密钥 → 无法获取任何信息
零知识证明(Zero-Knowledge Proof) 提供更精细的语义:
证明者(Prover)可以向验证者(Verifier)证明其"知道"某个秘密,而不泄露关于该秘密的任何其他信息。
2. 零知识证明的形式化定义
设定:双方共同持有函数 f 和值 y=f(x)。证明者知道 x,想向验证者证明这一点,但不透露 x 本身。
证明系统(Proof System):证明者与验证者交互,最终验证者接受或拒绝。
(术语:秘密值 x 称为见证(Witness))
2.1 三个安全性质
完备性(Completeness):
若证明者真正知道 x,则诚实的验证者总是接受:
P[诚实证明者⇒验证者接受]=1
可靠性(Soundness):
若验证者接受,则证明者真的知道 x;欺骗的证明者无法让验证者接受:
∀ 作弊证明者: P[验证者接受]≤negl(λ)
零知识性(Zero-Knowledge):
验证者除了"y=f(x) 有解"这一事实外,什么都没学到。
形式化:验证者可以在不与真正证明者交互的情况下,模拟(Simulate)出与真实交互计算上不可区分的记录(Transcript)。
2.2 "知道"的定义:可提取性
"知道 x" 的形式化含义:存在高效的提取器(Extractor),通过与证明者交互并观察其内部状态,可高效提取 x。
3. 离散对数问题(DLP)回顾
设定:群 G,素数阶 q,生成元 g∈G。
给定 y=gx∈G(x \xleftarrow{\} \mathbb{Z}_q),∗∗离散对数问题∗∗要求求x$。
实践中 q≈2256,最优算法时间 ≈2128。
4. Schnorr 协议:离散对数的零知识证明
4.1 协议设置
- 公开:g∈G,群阶 q,验证者知道 y∈G
- 证明者知道:x∈Zq 使得 y=gx
4.2 协议流程(挑战位 c∈{0,1})
ProverR=gr, r$ZqVerifier
Proverc${0,1}Verifier
Proverz=r+cxmodqVerifier
验证:gz=?R⋅yc
验证正确性:
gz=gr+cx=gr⋅(gx)c=R⋅yc✓
4.3 为什么需要交互
证明者不能提前知道 c——否则可选 z \xleftarrow{\} \mathbb{Z}_q并令R = g^z y^{-c},无需知道x$ 即可"通过"验证。
可靠性误差:单轮协议中作弊者成功概率为 1/2。
重复 λ 次后,成功概率降至 2−λ。
4.4 完整 Schnorr 协议(挑战 c∈Zq)
将挑战扩展为 c \xleftarrow{\} \mathbb{Z}_q(而非仅{0, 1}$):
可靠性误差≈1/q≈2−256一轮即安全
代价:只满足诚实验证者零知识(Honest-Verifier ZK),不满足完整零知识性。
5. Schnorr 协议的安全性分析
构造提取器:与(可能作弊的)证明者 P∗ 交互两次,使用不同挑战:
- 运行 P∗,获得 (R,c=0,z) — 验证通过:gz=R
- 倒带(Rewind) P∗ 到发送 R 后的状态
- 重新发送挑战 c=1,获得 (R,c=1,z′) — 验证通过:gz′=R⋅y
两次同一 R,不同挑战 c:
gz=R,gz′=Ry⇒gz′−z=y⇒x=z′−zmodq
证明了若 P∗ 能以概率 1 说服验证者,则提取器能提取 x。
5.2 零知识性(通过 Simulator)
构造模拟器,无需知道 x,生成与真实交互计算上不可区分的 Transcript:
- 猜测挑战 c' \xleftarrow{\} {0, 1}$
- 选 z \xleftarrow{\} \mathbb{Z}_q,令R = g^z y^{-c'}$
- 运行验证者 V∗,输入 R,得到挑战 c
- 若 c=c′,输出 (R,c,z) 作为模拟 Transcript
- 否则重试(每次成功概率 1/2,平均 2 次成功)
关键:在真实交互中,(R,c,z) 满足 gz=Ryc;模拟器生成的 (R,c,z) 同样满足该关系,且由于 z 均匀随机,两者分布相同。
为什么真实协议中验证者学不到 x? 验证者在真实交互中不能倒带证明者,因此无法运行提取器算法。
6. Fiat-Shamir 变换:从交互到非交互
问题:Schnorr 协议需要多轮消息交换。
Fiat-Shamir 变换:用哈希函数(建模为随机预言 Random Oracle)替换验证者的随机挑战:
c=H(R∥m)(加入消息 m,形成签名方案)
证明者完全独立地计算出证明,无需与验证者交互:
- r \xleftarrow{\} \mathbb{Z}_q,\quad R = g^r$
- c=H(R∥m)
- z=r+cxmodq
- 输出 σ=(R,z)
验证:gz=?R⋅yH(R∥m)
这就是 Schnorr 签名方案!椭圆曲线版本(Ed25519)是现代最重要的签名方案之一。
7. 零知识证明的应用
7.1 认证(Authentication)
- x = 用户私钥,y = 公钥,f(x)=gx
- 证明者向验证者证明"我知道对应公钥的私钥",而不传递私钥本身
传统 MAC/签名方案也可看作一种知识证明,但不严格满足 ZK 的定义。
7.2 匿名凭证(Anonymous Credentials)
用户可以向服务证明"我是合法用户(某 CA 签发了我的证书)",而不泄露身份:
ZKP{x: Verify(vkCA, x, σ)=1}
用户知道某个被 CA 签名的证书,但选择性地只公开"我有合法证书"这一事实。
7.3 zkSNARKs(简洁非交互式知识证明)
现代 ZKP 系统可以对任意可计算函数生成简洁证明(几百字节):
ZKP{x: C(x)=y}证明大小 O(1),验证时间 O(1)
- Groth16、PLONK、STARKs:用于区块链隐私交易(Zcash)和 L2 Rollup 证明
关键公式
Schnorr 协议:
z=r+cxmodq,验证: gz=gr⋅(gx)c=R⋅yc
Fiat-Shamir(Schnorr 签名):
c=H(R∥m),z=r+cxmodq
σ=(R,z),验证: gz=?R⋅yH(R∥m)
提取器输出(两轮倒带):
x=z′−zmodq(由 gz=R, gz′=Ry 推导)
我的理解
模拟器与提取器把“没有额外泄露”和“确实知道见证”转化为可检验的构造,是理解零知识证明的两把钥匙。