🏠 总目录📚 本教程 21 · 零知识证明
📑 本页目录(点开跳转)

21 · 零知识证明

28 分钟 | ⭐⭐ 密码学里最反直觉的结果


🎯 一句话

我能让你确信"我知道某个秘密",而你除了"他确实知道"之外,什么都学不到。 听起来自相矛盾 —— 但它不仅可能,而且任何 NP 问题都能做到。

证明者 P知道秘密 x验证者 V不知道 x① 承诺 t = g^r② 随机挑战 c③ 响应 s = r + c·x验证:g^s ≟ t · y^cV 确信 P 知道 x —— 但 V 学不到 x 的任何信息关键在②:挑战是 V 【事后】才给的,P 无法提前编好答案⭐ 三个性质缺一不可:完备性(真的能证)、可靠性(假的证不了)、零知识(学不到别的)
关键在第②步:挑战是验证者事后才给的,证明者无法提前编好答案。⭐ 重复多轮之后,蒙对的概率低到可以忽略 —— 而验证者始终没拿到 x 本身

🎨 一、先建直觉:色盲朋友与两个球

   你有两个球,除了颜色(一红一绿)完全相同。
   你的朋友是色盲,他不信这两个球颜色不同。

   ⭐ 怎么让他相信,又不告诉他哪个是红的?

   ① 他两手各拿一个球,背到身后
   ② 他【自己决定】要不要交换,然后伸出来
   ③ 你说"换了"还是"没换"

   如果球真的不同色 → 你每次都答对
   如果球其实同色   → 你只能猜,答对概率 1/2

   ⭐ 重复 n 次,你还全对 ⟹ 蒙对概率 2⁻ⁿ
      而他【始终不知道哪个是红的】 ✅

三条性质,正好对应零知识证明的定义

性质 含义 在例子里
完备性 真的话,诚实证明者能说服验证者 球真不同色就每次都对
可靠性 假的话,骗子几乎不可能蒙混过关 同色时蒙对概率 2⁻ⁿ
零知识 验证者学不到秘密本身 他始终不知道哪个是红的

📐 二、零知识严格是什么意思

模拟器(Simulator)定义: 存在一个不知道秘密的模拟器,它能生成一份和真实交互 在统计上不可区分的"交互记录"。

💡 人话翻译

验证者看到的一切,他自己在家就能编出来 —— 既然能自己编,那这段交互显然没有传递任何信息 ✅

   ⚠️ 注意这个定义的巧妙之处:
   它不是说"信息没被传出去"(那很难定义),
   而是说"这段记录你不需要我也能造出来" ⭐

🔢 三、一个能算的例子:Schnorr 身份认证

目标:证明我知道 $x$,使 $y = g^x$(离散对数),但不泄露 $x$。

   ① 证明者:选随机 r,发承诺 t = g^r
   ② 验证者:发随机挑战 c
   ③ 证明者:回 s = r + c·x
   ④ 验证者:检查 g^s ≟ t · y^c
📐 三条性质怎么成立(想看再点)

完备性:$g^s = g^{r+cx} = g^r(g^x)^c = t\cdot y^c$ ✅

可靠性(特殊可靠性):若同一个 $t$ 能对两个不同挑战 $c_1\ne c_2$ 给出合法 $s_1, s_2$:

$$s_1 - s_2 = (c_1-c_2)x \;\Longrightarrow\; x = \frac{s_1-s_2}{c_1-c_2}$$

⭐ 说明能回答两个挑战的人,一定真的知道 x —— 这叫知识提取(extraction)

零知识(诚实验证者下):模拟器不知道 $x$,但可以倒着来: 先随机选 $c$ 和 $s$,再令 $t = g^s \cdot y^{-c}$。 这样 $(t,c,s)$ 天然满足验证等式,且分布和真实交互一致 ✅

🔑 注意可靠性证明的形状: 它说的是"如果你能回答两个不同挑战,我就能从你身上把 x 提取出来"。 这正是第 17 章 ECDSA/Schnorr 中 k 重复会泄露私钥的同一个数学 —— 一体两面:证明安全时它叫"知识提取",实现出错时它叫"私钥泄露"。

⚡ 变成非交互:Fiat–Shamir

   把验证者的随机挑战 c 换成 c = H(y ‖ t ‖ 消息)
   → 不需要交互了 → 这就是 Schnorr 签名 ⭐

🔗 第 17 章已经见过这个转换。 签名和零知识证明,本质上是同一个东西的两种用法。


🚀 四、zk-SNARK:从"证明我知道 x"到"证明任意计算"

   S uccinct   ⭐ 证明【极短】(几百字节),且【验证极快】(毫秒)
   N on-interactive  不需要来回交互
   AR gument   计算受限的攻击者无法伪造
   K nowledge  证明者确实"知道"那个输入

能做什么(这才是它震撼的地方):

   ⭐ 证明"我正确执行了一段任意程序",
      而验证者【不需要重新执行】,也【看不到输入】

   例:
   · 我知道一个 SHA-256 的原像 → 不告诉你原像
   · 这 1000 笔交易我都验过了 → 你只验一个 300 字节的证明
   · 我的年龄 > 18 → 不告诉你生日

大致怎么做到的(不需要记)

   程序 → 算术电路 → R1CS 约束组 → QAP 多项式
        → 用【多项式承诺】把"我满足所有约束"压成几个群元素

💡 一个关键直觉

把"检查几百万个约束"变成"在一个随机点上检查几个多项式等式"。 因为两个不同的多项式在随机点上相等的概率极小(Schwartz–Zippel 引理)—— 所以抽查一个点就够了。

⚠️ 可信设置(Trusted Setup):最大的实践包袱

   很多 SNARK 需要一次性生成公共参数,
   过程中产生的随机数被称为【毒废料 toxic waste】

   💀 谁留着它,谁就能【伪造任意证明】

   ✅ 缓解:多方仪式(MPC ceremony)
      —— 几十上百人接力,只要【有一个人】销毁了自己那份,整体就安全 ⭐
      (以太坊 KZG 仪式有 14 万人参与)
方案 可信设置 证明大小 特点
Groth16 ⚠️ 每个电路都要 ~200 B 最小最快
PLONK 通用(一次可复用) ~500 B 灵活
STARK 不需要 ~50–200 KB 抗量子(只依赖哈希)⭐
Bulletproofs ✅ 不需要 ~1–2 KB 验证较慢,适合范围证明

💡 STARK 只依赖哈希函数(不用椭圆曲线/配对), 所以它天然抗量子第 23 章)—— 代价是证明大得多。


🌍 五、真实用途

场景 做什么
隐私币(Zcash) 隐藏收付款方和金额,仍能证明"没有凭空造币"
zk-Rollup 把上千笔交易压成一个证明发上主链 → 扩容
身份证明 证明"我是某国公民/已成年",不出示证件
可验证计算 把计算外包给云,用证明确认它没算错(第 22 章
合规审计 证明"我的储备金 ≥ 负债",不公开具体账目

💡 zk-Rollup 的经济学很清楚: 主链验证一个 300 字节的证明,比重新执行 1000 笔交易便宜几个数量级。 "验证比计算便宜"这个不对称性,就是它全部的价值。


⚠️ 六、常见误解

❌ 误解 ✅ 真相
「零知识 = 匿名」 是两回事。ZKP 保护证明内容,匿名要靠网络层
「有 ZKP 就绝对隐私」 元数据(时间、金额模式、IP)照样泄露
「STARK 一定比 SNARK 好」 证明大 100 倍,链上成本更高
「可信设置做完就没事了」 电路本身有 bug 一样完蛋 —— 约束写少了 = 能造假证明

💥 "约束写少了"是 zk 领域最危险的 bug 类型(under-constrained circuit): 电路少写一条约束 → 攻击者能构造出通过验证但语义错误的证明。 这类 bug 无法通过测试发现(正常输入全都正常),只能靠形式化验证和审计。


🔗 和站内其他章的关系

相关的地方 和这一章的关系
第 17 章 Fiat–Shamir 把交互式 ZKP 变成非交互式
第 17 章 k 重复泄露私钥 ⭐ 和"知识提取"是同一个数学
第 16 章配对 SNARK 的底层
第 9 章哈希 STARK 的唯一假设
第 12 章 Merkle 树 STARK 的承诺方案
第 3 章完美保密 零知识是它的"证明版":都是"看到的东西不含信息" ⭐
模型上线之后 · 合规审计与模型卡 审计要回答「上线的到底是不是审过的那个模型」——zkML 是唯一不用把模型交出去也能回答的方案,也是 ZKP 现在最认真的落地方向 ⭐
大模型 · 合规与伦理 那边隐私清单里的差分隐私是最好的对照组:DP 允许泄露 ε 并把它量化,ZK 要求泄露恰好为 0——两条底线,成本差好几个数量级

✅ 检查点

  1. 零知识证明的三条性质是什么?用色盲球的例子说明。
  2. "零知识"的严格定义为什么要用模拟器?它巧妙在哪?
  3. 写出 Schnorr 身份认证的四步和验证等式。
  4. 可靠性证明里的"知识提取"是什么?它和第 17 章哪个事故是同一个数学?
  5. 模拟器怎么在不知道 x 的情况下造出合法记录?
  6. zk-SNARK 四个字母各代表什么?它最震撼的能力是什么?
  7. "抽查一个随机点就够了"背后是什么引理?
  8. 什么是毒废料?多方仪式为什么能缓解?
  9. STARK 为什么天然抗量子?代价是什么?
  10. under-constrained circuit 为什么特别危险?
👀 答案
  1. 完备性(真的能说服)、可靠性(假的蒙不过,n 轮后 2⁻ⁿ)、零知识(学不到秘密)。色盲球:真不同色就每次答对;同色只能猜;他始终不知道哪个是红的。
  2. 因为"信息没被传出去"很难直接定义。模拟器定义说的是"这段交互记录,验证者自己在家就能编出来"——既然能自己编,就说明没传递任何信息。
  3. ①发承诺 t = g^r ②验证者发挑战 c ③回 s = r + c·x ④验证 g^s ≟ t·y^c
  4. 若同一个 t 能对两个不同挑战给出合法响应,则 x = (s₁−s₂)/(c₁−c₂),即能从证明者身上把秘密提取出来。和第 17 章 ECDSA k 重复泄露私钥是同一个数学——证明安全时叫"知识提取",实现出错时叫"私钥泄露"。
  5. 倒着来:先随机选 c 和 s,再令 t = g^s·y^(−c)。这样天然满足验证等式,且分布与真实交互一致。
  6. Succinct(证明极短、验证极快)、Non-interactive、ARgument(计算受限下不可伪造)、Knowledge。能力:证明"我正确执行了一段任意程序",验证者不需重新执行也看不到输入
  7. Schwartz–Zippel 引理——两个不同的多项式在随机点上相等的概率极小,所以抽查一个点就能高概率确认等式成立。
  8. 可信设置过程中产生的随机数,谁留着它谁就能伪造任意证明。多方仪式让几十上百人接力,只要有一个人销毁了自己那份,整体就安全(以太坊 KZG 仪式 14 万人参与)。
  9. 因为它只依赖哈希函数,不用椭圆曲线或配对,而哈希不受 Shor 算法威胁。代价:证明大 100 倍(50–200 KB vs 200 B),链上成本更高。
  10. 电路少写一条约束,攻击者就能构造出通过验证但语义错误的证明。危险在于无法通过测试发现——正常输入全都表现正常,只能靠形式化验证和审计。

🛑 可以停在这里

走神救援

ZKP = 让你确信我知道秘密,而你除此之外什么都学不到,且任何 NP 问题都能做到。三性质:完备性/可靠性/零知识(色盲球例子:真不同色每次答对,同色只能猜,n 轮后蒙对概率 2⁻ⁿ,而他始终不知道哪个红)。⭐"零知识"用模拟器定义:存在不知道秘密的模拟器能造出统计不可区分的交互记录 —— 验证者看到的一切他自己在家就能编出来,所以没传递信息。Schnorr 身份认证:t=g^r → 挑战 c → s=r+cx → 验 g^s ≟ t·y^c。⭐可靠性靠知识提取:能对两个不同挑战作答 ⟹ x=(s₁−s₂)/(c₁−c₂) —— 这和第 17 章 ECDSA k 重复泄露私钥是同一个数学,一体两面零知识靠倒着造:先选 c 和 s,再令 t=g^s·y^(−c)。Fiat–Shamir 把挑战换成哈希 → 非交互 → 就是 Schnorr 签名(签名和 ZKP 本质同一个东西)。⭐zk-SNARK = Succinct(证明几百字节、验证毫秒)+Non-interactive+ARgument+Knowledge,能力是证明"我正确执行了任意程序"而验证者不必重跑也看不到输入。原理直觉:把检查几百万约束变成在一个随机点上检查多项式等式Schwartz–Zippel:不同多项式在随机点相等的概率极小)。⚠️可信设置的毒废料:谁留着谁能伪造任意证明 → 多方仪式,只要一个人销毁自己那份就安全(以太坊 KZG 14 万人)。方案:Groth16(~200B 每电路要设置)、PLONK(通用)、⭐STARK(不需设置、只依赖哈希所以抗量子,但证明大 100 倍)、Bulletproofs。用途:隐私币、⭐zk-Rollup验证 300 字节证明比重跑 1000 笔交易便宜几个数量级,"验证比计算便宜"就是全部价值)、身份证明、可验证计算。⚠️误解:零知识≠匿名(元数据照样泄露);💥⭐under-constrained circuit(约束写少了)是最危险的 bug——能造出通过验证但语义错误的证明,且测试发现不了,只能靠形式化验证。

下一节 👉 22-云密码学.md

打卡记录保存在你的浏览器里,首页能看到总进度