密码协议学习笔记(6):零知识证明

零知识证明

基本概念:

(这部分书上讲的实在是太难懂了,因此博客内容参考了零知识证明Zero-Knowledge Proof介绍 - 知乎 (zhihu.com))

想象这样的应用场景:甲指着报纸上一道超难的数独题,说:"我知道这道数独题的答案",并且需要向乙证明这一点.于是甲做了一堆上面写着数字1-9的小卡片,背面朝上地盖在数独题的空格上,乙随机指出某一行,某一列或者某个九宫格,甲则取出这些位置上的卡片,打乱顺序给乙看,乙发现这些被打乱顺序的卡片,加上题面原有的数字正好是1-9,便在不知道答案到底是什么的情况下,相信了甲拥有答案.

在安全协议中的零知识证明是,对于某个困难问题(比如NP完全问题或NP难问题),证明者(Prover)要向验证者(Verifier)证明自己有解决该问题的能力,但又不能泄露自己用于解决问题拥有的信息.

(博主注:把这里的"证明"理解成"证据"是不是更容易理解一些)

零知识证明的要求是:

  1. 完备性(completeness) 若证明者知道答案,则能在多项式时间内给出证明 (知道答案 $\Rightarrow$ 能给出证明)
  2. 可靠性(soundness) 如果证明方给出的证明是错误的,验证者能在多项式时间内发现 (能给出证明 $\Rightarrow$ 知道答案)

    注意这里的可靠性和完备性与数理逻辑中的可靠性与完备性是相似的
  3. 零知识性(zeroknowledge) 证明过程不会泄露证明者拥有的,用于解决该问题的信息

零知识证明的构造思路是:

  1. 证明方发送给验证方一份"交底信息"(一般是加密或哈希后的原问题答案,比如数独例子中的背面朝上摆放在题目上的数字卡片)
  2. 验证方生成一个"挑战(Challenge)"(理解成"提问"会不会更好一些),发送给证明方(例子中是随便指定了某行,某列或某九宫格)
  3. 证明方根据Challenge生成一个证明,发送给验证方(例子中是拿下指定位置的卡片,并打乱顺序)
  4. 验证方参照交底信息(看卡片是不是从题目上取下来的)和挑战信息(看卡片是不是来自自己指定的位置),判定证明方的证明是否合法,若是,则认可证明方的证明.

来看另外一个零知识证明例子:

大质数$p$和生成元$g$是公开信息,模$p$群上的离散对数问题是难解的,而验证者要证明它知道某数$y$的离散对数$\log_py$,即知道$x$使得$g^x=y$,但又不能透露$x$的值,可采用如下的步骤:

Prover   Verifier
生成一个随机数$u$,计算$v=g^u$

$v \rightarrow$

作为交底信息 

 
 

$e \leftarrow$

作为挑战信息

生成一个随机数$e$
计算$t=ex+u$

$t \rightarrow$

 
 

 

验证

$g^t=v\cdot y^e$

是否成立

$$\begin{aligned}
g^t=&g^{ex+u}\\
   =&(g^x)^e\cdot g^u \\
   =&y^e\cdot v
\end{aligned}$$

交互式零知识证明:

假设某证明者知道某个难解性问题的解答,但验证者需要证明者给出证据来确信证明者确实拥有该NP问题的解答,同时证明者又不希望验证者也获得解答此问题的能力,这时就可以使用交互式零知识证明.

上面举的例子就是典型的交互式零知识证明

posted @ 2023-09-25 16:53  Isakovsky  阅读(34)  评论(0编辑  收藏  举报