高级 #crypto#zero-knowledge

零知识证明

零知识证明(ZKP)让证明者向验证者证明自己知道某个秘密,而不泄露秘密本身——"我能在不告诉你密码的情况下证明我知道密码"

🎭 “我知道你知道,但你不必知道我是怎么知道的”

你想登录一个网站。通常的做法是:输入密码 → 服务器验证。

但服务器存了你的密码(或哈希)——如果服务器被攻击,密码泄露了。

有没有一种办法——不告诉服务器密码,但让服务器相信”我知道密码”?

这就是零知识证明(Zero-Knowledge Proof, ZKP)——证明者能向验证者证明”我知道某个秘密”,而不泄露关于这个秘密的任何信息。

📐 零知识证明的三个性质

  1. 完整性:如果证明者真的知道秘密,她一定能成功证明
  2. 可靠性:如果证明者不知道秘密,她几乎不可能欺骗验证者
  3. 零知识:验证者除了”证明者知道秘密”之外,学不到任何其他信息

🧗 经典类比:阿里巴巴洞穴

这是理解 ZKP 最著名的故事:

阿里 Baba 知道一个洞穴深处的咒语。洞穴是个环形——有两个入口 A 和 B,
中间有一扇需要咒语才能打开的门。

证明者(Peggy)想向验证者(Victor)证明她知道咒语,但不想念出来。

协议:
1. Victor 站在洞穴外面,看不到 Peggy 进了哪个入口
2. Peggy 随机选 A 或 B 进入洞穴
3. Victor 走到洞穴入口前,喊"从 A 出来!"(或 B)
4. Peggy 必须从指定的入口出来
   — 如果她知道咒语:不管她从哪边进去的,都能从指定入口出来
   — 如果她不知道咒语:她只能从她进去的那边出来
         → 有 50% 概率蒙对(如果 Victor 恰好喊了她进去的那边)

5. 重复 20 次:
   每次 Peggy 都选不同入口进,Victor 随机喊一个出口
   → 如果 Peggy 每次都从指定出口出来了
   → 概率分析:

   如果 Peggy 不知道咒语:
     每次蒙对的概率 = 1/2
     20 次全蒙对的概率 = (1/2)^20 ≈ 0.0001%
     几乎不可能!

关键:Peggy 没有泄露咒语的任何信息——但 Victor 确信她知道。


🔬 ZKP 的数学原理

实际的零知识证明使用密码学来实现,而不是洞穴故事。最常用的技术是zk-SNARKs

证明者(P) → 生成证明 → 验证者(V) → 验证

P 知道一个"见证"(witness)——比如哈希的原像
P 构造一个证明,证明"我知道一个输入,经过某个程序后得到给定输出"
V 验证这个证明——不需要知道输入是什么

核心思想是把”我知道 xxx”转换成一个数学问题,然后证明”我能解决这个数学问题”——而不泄露解本身。


🏢 零知识证明的现实应用

1. 隐私币——Zcash

比特币的每一笔交易都是公开的——发送方、接收方、金额,所有人都能看到。

Zcash 使用 zk-SNARKs:

公开信息:
{"交易有效": true}

隐藏信息:
{"发送方": "Alice", "接收方": "Bob", "金额": 5 BTC}

通过 ZKP,矿工可以验证"这笔交易是合法的"——但不知道谁给谁转了多少钱。

2. 身份验证——不泄露密码的登录

传统登录:你告诉服务器密码 → 服务器验证。

ZKP 登录:你向服务器证明”我知道密码的哈希的原像”——但服务器验证完后,仍然不知道密码本身。

# 概念示意(不是实际实现)
# 注册时:服务器存 hash(password)
# 登录时:你向服务器证明"我知道 x,使 hash(x) = stored_hash"
#         用 ZKP 协议,不泄露 x
#         服务器验证 ZKP → 确认你知道密码 → 登录成功

3. 区块链扩容——zk-Rollup

以太坊网络每秒只能处理约 15 笔交易。zk-Rollup 的做法:

大量交易在链下处理 → 生成一个 zk 证明 → 提交到链上
链上合约验证这个证明 → 确认所有交易有效

效果:一次"验证"确认了上千笔交易——扩容到 2000+ TPS

🤔 零知识证明的种类

类型证明大小验证时间是否需要可信设置
zk-SNARKs极小(~200 字节)极快(毫秒)✅ 需要
zk-STARKs较大(~100KB)较快❌ 不需要(透明)
Bulletproofs中等较慢❌ 不需要

zk-SNARKs 在 Zcash 中使用——但它的”可信设置”有争议(设置阶段如果被操纵,可能产生假证明)。zk-STARKs 不需要可信设置,但证明更大。


📝 小结

概念一句话
零知识证明(ZKP)不泄露秘密就能证明”我知道秘密”
完整性知道秘密的人总能证明成功
可靠性不知道秘密的人几乎没法蒙混
零知识验证者除了”他知道”之外什么也学不到
zk-SNARKs短证明、快验证——但需要可信设置
应用隐私币(Zcash)、身份验证、区块链扩容

🎯 思考题:零知识证明的”零知识”到底指的是什么信息没泄露?在阿里巴巴洞穴的例子中,Victor 在 20 次验证后确信了”Peggy 知道咒语”——但 Victor 有没有学到”咒语是什么”?有没有学到”Peggy 是怎么证明的”?

为什么先学这个? ZKP 是密码学的前沿。另一个前沿方向是量子密码学——量子计算对经典密码的威胁。