news 2026/4/15 6:01:05

零知识证明 (ZK) 科普:如何在不泄露密码的情况下证明“我知道密码”?(附 Python 示例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零知识证明 (ZK) 科普:如何在不泄露密码的情况下证明“我知道密码”?(附 Python 示例)

标签:#密码学 #ZeroKnowledge #Python #区块链 #隐私计算 #Web3


🚪 一、 核心隐喻:阿里巴巴的山洞

如果不使用数学公式,如何向别人解释 ZK?最经典的例子是“阿里巴巴与四十大盗的山洞”

场景设定
  • Peggy (证明者):声称自己知道打开密门的咒语(密码)。
  • Victor (验证者):想验证 Peggy 是否在吹牛,但他不能听到咒语。
  • 山洞:是一个环形,入口分叉为A 通道B 通道。深处有一道石门,只有念咒语才能打开,连通 A 和 B。
验证流程
  1. 承诺 (Commitment):Victor 站在洞口背过身。Peggy 随机走进 A 或 B 通道(比如进了 A)。
  2. 挑战 (Challenge):Victor 转过身,大喊:“Peggy,从B 通道出来!”
  3. 响应 (Response)
  • 如果 Peggy真的知道咒语:她打开石门,从 B 出来(即使她刚才是从 A 进去的)。
  • 如果 Peggy不知道咒语:她只能祈祷自己刚才恰好走进了 B。如果她进了 A,她就过不去了,验证失败。
为什么有效?
  • 一次实验,Peggy 靠运气骗过 Victor 的概率是 50%。
  • 连续重复20 次,Peggy 全靠运气的概率是 。
  • 只要次数足够多,Victor 就能以极高的置信度相信 Peggy 知道密码,且整个过程 Victor从未听到过咒语

交互式证明流程图 (Mermaid):

Victor (验证者)Peggy (证明者)Victor (验证者)Peggy (证明者)轮次 1验证通过 (置信度 50%)... 重复 N 轮 ...轮次 N验证通过 (置信度 99.99%)随机选择路径 A我进去了 (承诺)请从 B 出来! (挑战)打开密门,走到 B从 B 走出 (响应)随机选择路径 B我进去了请从 A 出来!打开密门,走到 A从 A 走出

🧮 二、 数学原理:Schnorr 协议

隐喻只能讲逻辑,真正在计算机里跑的是数学。
最简单的 ZK 实现是基于离散对数难题的 Schnorr 身份认证协议。

核心公式

假设:

  • 是生成元, 是大质数(公开常数)。
  • 私钥(Peggy 的秘密)。
  • 公钥,满足 (Victor 知道 ,但算不出 )。

证明过程(三步走):

  1. Commitment (承诺):
    Peggy 生成一个随机数 ,计算 。
    把 发给 Victor。(相当于“我进洞了”)
  2. Challenge (挑战):
    Victor 生成一个随机数 (挑战值)。
    把 发给 Peggy。(相当于“从 B 出来”)
  3. Response (响应):
    Peggy 计算 。
    把 发给 Victor。
  4. Verification (验证):
    Victor 验证等式: 是否成立。

为什么能验证?

如果等式成立,说明 Peggy 确实用了 来计算 ,但 Victor 只看到了 ,这三个数混在一起,无法反推出 。


💻 三、 Python 代码实战

让我们用 Python 模拟这个过程。

importrandomclassZKProofSystem:def__init__(self):# 0. 公共参数 (模拟的小质数,实际应用中非常大)self.p=7919# 大质数self.g=2# 生成元defgenerate_keypair(self):"""生成私钥和公钥"""private_key=random.randint(1,self.p-1)# x (秘密)public_key=pow(self.g,private_key,self.p)# y = g^x mod preturnprivate_key,public_key# --- 角色扮演 ---classProver:def__init__(self,sys,x):self.sys=sys self.x=x# 私钥,绝对不能泄露self.r=0# 临时随机数defcreate_commitment(self):"""第一步:生成承诺 t = g^r"""self.r=random.randint(1,self.sys.p-1)t=pow(self.sys.g,self.r,self.sys.p)returntdefcreate_response(self,c):"""第三步:计算响应 z = r + c * x"""# 注意:这里是在指数层面的计算,严格来说应该模 (p-1),但为了演示简化逻辑# 实际 Schnorr 协议中 z = (r + c * x) mod (p-1)z=self.r+c*self.xreturnzclassVerifier:def__init__(self,sys,y):self.sys=sys self.y=y# 只知道公钥defcreate_challenge(self):"""第二步:生成随机挑战 c"""returnrandom.randint(1,100)defverify(self,t,c,z):"""第四步:验证 g^z == t * y^c"""# 左边 = g^zlhs=pow(self.sys.g,z,self.sys.p)# 右边 = t * y^crhs=(t*pow(self.y,c,self.sys.p))%self.sys.preturnlhs==rhs# --- 运行模拟 ---if__name__=="__main__":# 初始化系统zk=ZKProofSystem()print(f"[*] 系统参数: p={zk.p}, g={zk.g}")# 1. 密钥生成secret_password,public_id=zk.generate_keypair()print(f"[*] Peggy 的秘密 (x):{secret_password}")print(f"[*] Victor 知道的公钥 (y):{public_id}")print("-"*30)# 2. 实例化角色peggy=Prover(zk,secret_password)victor=Verifier(zk,public_id)# 3. 开始交互# Step 1: 承诺commitment_t=peggy.create_commitment()print(f"[1] Peggy 发送承诺 t:{commitment_t}")# Step 2: 挑战challenge_c=victor.create_challenge()print(f"[2] Victor 发送挑战 c:{challenge_c}")# Step 3: 响应response_z=peggy.create_response(challenge_c)print(f"[3] Peggy 发送响应 z:{response_z}")# Step 4: 验证result=victor.verify(commitment_t,challenge_c,response_z)ifresult:print("\n✅ 验证成功!Victor 确信 Peggy 知道密码,但他依然不知道密码是多少。")else:print("\n❌ 验证失败!")

🚀 四、 零知识证明的未来

上面的 Schnorr 协议是交互式的(需要一来一回)。
在区块链中,我们更多使用非交互式零知识证明 (NIZK),如zk-SNARKs。它通过复杂的数学变换(多项式承诺),让 Peggy 直接生成一段 Proof,Victor 随时随地都能验证,无需实时在线。

ZK 的应用场景:

  1. Layer 2 扩容 (zk-Rollup):链下计算几千笔交易,只把一个轻量的 ZK 证明提交到以太坊主网,Gas 费降低 90%。
  2. 隐私交易:转账时隐藏发送方、接收方和金额(如 Tornado Cash)。
  3. 身份认证:证明“我已满 18 岁”,而无需出示写有出生年月日和家庭住址的身份证。

🎯 总结

零知识证明看似悖论,实则是概率与数论的完美结合。
它解决了数字世界中**“信任”与“隐私”**的终极矛盾。
如果你看懂了上面的 Python 代码,恭喜你,你已经迈入了 Web3 最硬核技术的大门。

Next Step:
尝试了解Circom语言和SnarkJS。这是一个可以让你编写电路逻辑并生成真实 zk-SNARK 证明的开发工具栈,试着写一个“证明我知道方程 的解,但不告诉你是 3”的小程序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 13:52:04

Redis 协议兼容:编写一个支持 RESP 协议的 KV Server

标签: #Redis #RESP #Go语言 #网络编程 #中间件开发 #Socket📜 一、 破译 RESP:Redis 的通信语言 RESP 是一个基于文本的协议,极其简单且高效。它主要由 前缀符号 和 CRLF (\r\n) 组成。 客户端发送给服务端的,永远是一…

作者头像 李华
网站建设 2026/4/10 20:33:11

12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现

12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现 12.1.1 引言:人形机器人全身控制的范式转变 传统工业机械臂的控制通常围绕单一的末端执行器任务(如轨迹跟踪)展开,其控制目标明确且自由度有限。然而,人形机器人是一个具有高度运动冗余(通常拥有30个以…

作者头像 李华
网站建设 2026/4/10 6:11:27

【开题答辩全过程】以 宜居房屋交易系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/4/9 18:21:56

ssm474的高校运动会管理网站

目录高校运动会管理网站(SSM474)摘要开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!高校运动会管理网站(SSM474)摘要 高校运动会管理网站基于SSM框架(SpringSpringMV…

作者头像 李华
网站建设 2026/4/7 10:31:10

Python 使用 Chainlit + Ollama 快速搭建本地 AI 聊天应用

使用 Chainlit Ollama 快速搭建本地 AI 聊天应用 大家好!今天分享一个超级简单的本地 AI 聊天界面实现方案:Chainlit Ollama。 无需部署复杂的后端,只需本地运行 Ollama,再用几行 Python 代码,就能拥有一个支持模型切…

作者头像 李华