雷锋网出版社:原标题为《zkSNARKs in a nutshell》,作者是以太坊智能契约语言Solidity的发明者Christian Reitwiessner。译者杨文涛,授权转载自作者之虎专栏。
ZKsnarks(Zero-Knowledge Succint Non-Interactive Arguments of Knowledge)的成功实现给我们留下了深刻的印象,因为你不需要执行它,甚至不需要知道执行的具体内容,就可以确定一个计算的结果是否正确。你知道的唯一信息就是已经正确完成了。不幸的是,大多数关于zkSNARKs的解释都是肤浅的,并且暗示只有最聪明的人才能理解它是如何工作的。其实zkSNARKs可以总结为四种简单的技术,本博客将对这些技术逐一进行解释。任何了解RSA加密系统工作原理的人都会对目前使用的zkSNARKs有更好的了解。
我们目前使用的zkSNARKs由四个主要部分组成:
a)编码成多项式问题。把要验证的程序写成一个二次多项式方程:t(x) h(x)=w(x) v(x)。这个方程当且仅当程序的计算结果正确时才成立。证明者需要说服验证者这个等式成立。
b)简单随机抽样验证器会选择一个私有的评估点S,将多项式乘法和验证多项式函数相等的问题简化为简单乘法和验证方程t(s)h(s)=w(s)v(s)的问题。这不仅可以减少证书的大小,还可以大大减少验证所需的时间。
c)同态编码/加密译者注:1978年,Ron Rivest、Leonard Adleman和Michael L. Dertouzos基于银行的应用背景提出了同态加密的概念。当时用的词是同态,也就是和抽象代数的同态是同一个词。目前普遍采用的是同态加密,国内密码学界也称之为同态加密。罗恩里维斯特(Ron Rivest)和伦纳德阿德曼(Leonard Adleman)分别是著名的RSA算法中的R和A(另一个是阿迪萨莫尔)。
补充(来自白老师):同胚和同态在数学上不是一个意思。同胚是指连续变形下的不变性,同态是指映射下代数运算关系的保持性。
我们用一个编码/加密函数E,它具有一些同态性质(不完全同态,至少有一部分在实际使用中不是同态)。这个函数允许证明者在不知道s的情况下计算e (t (s))、e (h (s))、e (w (s))和e (v (s)),她只知道E(s)和一些其他有用的加密信息。
d)零知识证明者通过将e (t (s),e (h (s)),e (w (s))和e (v (s))乘以一个数来替换它们的值,使得验证者可以在不知道真实编码值的情况下验证它们的正确结构。
困难的问题是对于一个随机的私有数k(k不等于0),验证t(s)h(s)=w(s)v(s)和验证t(s)h(s) k=w(s)v(s)几乎是相同的,但不同的是如果你只收到(t (s) v (s)
当然,这些只是基础部分,意在帮助读者更好地理解zkSNARKs的精髓。接下来,我们将开始详细讲解这些知识点。
和RSA零知识证明。现在让我们快速回忆一下RSA是如何工作的,不考虑那些琐碎的细节。想想看,我们经常用一个数对一些数取模,并不是所有的整数。这里的等式“a b c (mod n)”等价于“(a b)% n=c% n”。注意,“(mod n)”的这部分不是应用于“C”,而是应用于“”和其他的“”,等式相同。虽然很难读,但我保证尽量少用。那么让我们回到RSA:
p,Q:两个随机私有素数
n :=p q
d:1
e:d e 1 (mod (p-1)(q-1))
公钥是(e,n),私钥是D.质数p和q可以舍弃,但不能暴露。
消息m通过以下公式加密:
C=E(m)由以下公式解密:
因为
m的指数是对这组数(p-1)(q-1)取模,所以我们得到
(译者注:可以从费马小定理和中国剩余定理推导出来)。而RSA的安全性是建立在假设n不能被简单有效地因式分解,d不能被e计算(例如