零知识证明详解一:同态隐藏

时间:2024-03-18 18:24:58

 

简介:本文翻译自zcash官方博客,讲解zcash中所使用的zk-SNARKs的原理第一章节,此处是原文链接。友情提示:本系列文章偏技术化,适合对技术和数学非常感兴趣的同学阅读。
zkSNARK是zero-knowledge succint non-interactive arguments of knowledge的简称,意思是:简洁的非交互式的零知识证明。
(本文授权BH好文好报群摘编、转载以及相关转授权推文行为)

正文

要理解zk-SNARKs,需要先理解其他的一些知识点,而要完全理解这些知识点,需要花点时间和耐心。

如果非要我选择一个最重要的知识点,那么我会选择同态隐藏[1]。在这个文章中我将会详细解释同态隐藏,并给出一个例子。

同态隐藏的定义:E(x)x的函数,该函数满足:

  • 通过E(x)很难推算出x
  • 不同的x会得到不同的E(x)
  • 如果知道E(x)E(y),那么就可以计算出E(x+y)

为什么同态隐藏很有用呢?假设Alice想向Bob证明她知道xy这两个数字,并且x+y=7,可以这么做:

  1. Alice把E(x)E(y)发送给Bob
  2. Bob通过上面两个值,计算出E(x+y)。(因为E是同态隐藏函数,并且Bob也知道这个函数,所以Bob可以从E(x)E(y)计算出E(x+y))
  3. Bob也计算出E(7),如果E(x+y) == E(7),那么Bob就承认Alice知道xy

因为不同的输入,会经由E函数产生不同的结果(由于这个结果相当于隐藏了原来的输入,后面我把这种结果叫做隐藏数),因此Bob仅仅在收到了Alice发送过来的xy以及x+y的隐藏数之后,才能接受Alice提供的证据。也就是说,Bob不需要知道x,y,他只需要知道它们的隐藏数即可。

现在,我们看看这种隐藏数是如何得到的。常规的整数加法确实没办法,不过我们可以看下有限群。

n是整数。当我们对整数 A 写下 A mod n 时,我们的意思是在 A 除以 n 后取余数。比如 9 mod 7 = 213 mod 12 = 1。我们可以用mod n在集合{0, ..., n-1}上定义一个加法:我们先做常规加法,然后拿结果mod n,那么这个结果也在集合{0, ..., n-1}当中。我们有时会把(mod n)写在右边,这样可以清楚的表示我们在做这种类型的加法。例如: 2+3=1(mod 4)。 我们把这个集合{0, ..., n-1}以及这种加法运算合在一起,称作 群零知识证明详解一:同态隐藏

对于一个质数p,我们也可以使用mod p{1, ..., p-1}上面定义一个乘法:我们拿常规乘法的结果,做mod p操作,那么他的结果也会在集合{1, ..., p-1}[2]。例如, 2*4 = 1(mod 7)

零知识证明详解一:同态隐藏

通过这些特性,我可以构造一个加法的同态隐藏——也就是说,我们可以通过E(x)E(y)计算出E(x+y)

零知识证明详解一:同态隐藏

早赞声明:为方便早赞、避免乱赞,“BH好文好报群”为点赞者、写作者牵线搭桥,实行“先审后赞、定时发表”的规则,也让作品脱颖而出、速登热门!加群微信:we01230123(天平)。


  1. 同态隐藏并不是密码学中常用的短语,在这里出于解释说明的目的被引入。它与知名的短语“可计算的隐藏承诺”意思相近,但没有后者短语语义强烈。它们的不同点在于,HH 是由输入决定的函数,而承诺则使用了额外的随机性。因此,HH 可以基本“隐藏绝大部分 x”,而承诺则可以“隐藏每一个x”。 

  2. 当 p 不是质数时,用以上的方式定义乘法是有问题的。其中的一个问题是即便两个参数都不为零,乘积的结果仍可能为零。比如当 p = 4 是,我们可以得到 2*2=0 (mod 4)。