密码协议学习笔记(6):零知识证明
零知识证明
基本概念:
(这部分书上讲的实在是太难懂了,因此博客内容参考了零知识证明Zero-Knowledge Proof介绍 - 知乎 (zhihu.com))
想象这样的应用场景:甲指着报纸上一道超难的数独题,说:"我知道这道数独题的答案",并且需要向乙证明这一点.于是甲做了一堆上面写着数字1-9的小卡片,背面朝上地盖在数独题的空格上,乙随机指出某一行,某一列或者某个九宫格,甲则取出这些位置上的卡片,打乱顺序给乙看,乙发现这些被打乱顺序的卡片,加上题面原有的数字正好是1-9,便在不知道答案到底是什么的情况下,相信了甲拥有答案.
在安全协议中的零知识证明是,对于某个困难问题(比如NP完全问题或NP难问题),证明者(Prover)要向验证者(Verifier)证明自己有解决该问题的能力,但又不能泄露自己用于解决问题拥有的信息.
(博主注:把这里的"证明"理解成"证据"是不是更容易理解一些)
零知识证明的要求是:
- 完备性(completeness) 若证明者知道答案,则能在多项式时间内给出证明 (知道答案
能给出证明) -
可靠性(soundness) 如果证明方给出的证明是错误的,验证者能在多项式时间内发现 (能给出证明
注意这里的可靠性和完备性与数理逻辑中的可靠性与完备性是相似的 知道答案) - 零知识性(zeroknowledge) 证明过程不会泄露证明者拥有的,用于解决该问题的信息
零知识证明的构造思路是:
- 证明方发送给验证方一份"交底信息"(一般是加密或哈希后的原问题答案,比如数独例子中的背面朝上摆放在题目上的数字卡片)
- 验证方生成一个"挑战(Challenge)"(理解成"提问"会不会更好一些),发送给证明方(例子中是随便指定了某行,某列或某九宫格)
- 证明方根据Challenge生成一个证明,发送给验证方(例子中是拿下指定位置的卡片,并打乱顺序)
- 验证方参照交底信息(看卡片是不是从题目上取下来的)和挑战信息(看卡片是不是来自自己指定的位置),判定证明方的证明是否合法,若是,则认可证明方的证明.
来看另外一个零知识证明例子:
大质数
Prover | Verifier | |
生成一个随机数 |
作为交底信息 |
|
作为挑战信息 |
生成一个随机数 |
|
计算 |
|
|
|
验证 是否成立 |
交互式零知识证明:
假设某证明者知道某个难解性问题的解答,但验证者需要证明者给出证据来确信证明者确实拥有该NP问题的解答,同时证明者又不希望验证者也获得解答此问题的能力,这时就可以使用交互式零知识证明.
上面举的例子就是典型的交互式零知识证明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)