日常生活中,我们经常要向说服他人相信某件事是真的,但除了这一具体陈述是真实的事实以外,又不想透露任何额外的信息。例如,Alice对Bob说,她能分辨茅台和五粮液的口味,但是她不愿意把具体分辨的方法告诉Bob,那么Alice要怎么让Bob相信自己说的是真的?Bob又怎么验证Alice说的是否是真的?和Alice和Bob类似的例子还有门禁系统的身份认证,访客想要验证自己是合法的用户,但是又不想把自己的密码等敏感信息交出来,因为访客怕门禁系统被黑了,导致自己的敏感信息泄露。
针对这类情况,可由零知识证明算法作为解决方案,所谓的零知识证明(zero-knowledge proof)指的是证明者能够在不向验证者泄露任何有用信息情况下, 使验证者相信某个论断是正确的。零知识证明的概念最初是由Shafi Goldwasser,Charles Rackoff和Silvio Micali在1985年引入,后来三人因该理论获得1993年哥德尔奖。
我们来看Alice和Bob如何利用零知识证明协议来验证Alice所说的是否为真:
- Bob让Alice转过身之后,然后他抛硬币决定:当正面向上时,他在杯子里倒入茅台,当反面向上时,他在杯子里倒入五粮液,这个过程中,一是要保证抛硬币的随机性,二是确保Alice没看到倒酒的过程;
- 倒好了之后,让Alice分辨杯子里酒的品种;
- Bob验证Alice是否辨别正确。
假设第一轮验证过程下来,Alice正确分辨了酒的品种,但Bob不敢确定Alice是否真的能分辨还是瞎蒙的,因为蒙对的概率是1/2,这个概率可不小。于是Bob要求进行十轮验证,如果Alice在10轮验证中都辨认正确,则Bob有很大的概率确定Alice没有欺骗她,Bob基本确认了Alice说的是真的,Alice则在不透露自己的辨酒诀窍的情况下,让Bob相信了自己,令人的目标都达到了,为什么Bob基本相信Alice的话呢?假如Alice不知道分辨的诀窍,完全依靠瞎蒙,那么10轮验证过程蒙对的概率只有,这是几乎不可能事件,不过Bob也只是基本相信Alice说的话是真的,没有十分肯定,因为概率为0(不可能事件)和概率很小(几乎不可能事件)是两回事,这也是为什么零知识证明算法是一种不确定性正确算法---证明者可以一个非常小的概率成功欺骗验证者。
虽然零知识证明是一种不确定正确的算法,但仍是当今应用密码学中引人入胜的概念之一,在安全通信,身份验证和隐私保护等都有其身影,而得到广泛应用正是因为其“零知识”属性,上述的例子中,虽然Bob最后相信Alice掌握辨别酒类的诀窍,但Alice并没有把辨别诀窍透露给他,Bob从验证过程中得到的“知识”为“零”,他本以为偷走Alice的诀窍,这样他就能据为己有了。
零知识证明通常要求满足下述3个条件:
- 完备性– 如果证明者的陈述都是真的, 那么诚实的证明者能使严格执行协议的验证者相信某个论断,换句话说,只要Alice说的是实话,Bob最终以高概率几乎完全相信Alice说的是实话;
- 可靠性– 如果证明者的陈述是假的(即他可能不知道秘密信息), 那么证明者成功欺骗严格执行协议的验证者的概率非常小;
- 零知识– 在验证过程中, 验证者除了相信证明者拥有某个秘密信息外,无法再获得额外的任何信息,也因此,验证者不可能向第三方证实他拥有该秘密。
品酒的验证协议满足了这三个条件,但品酒的例子只能了解零知识证明的基本思路,为了更严格的描述过程,需要借助数学上的方法,下面的Feige-Fiat-Shamir识别方案(以下简称Shamir识别方案)的例子说明零知识证明协议在密码学上的实现,Shamir识别方案的例子同样是Alice和Bob,同样是Alice掌握一个秘密,又想让Bob相信她掌握这个秘密,但又不能直接告诉他,但这个时候秘密不能是利用味觉辨别酒类诀窍那样难以量化的东西了,而是得是可量化的难题,即Alice的秘密很难被别人猜到,又能一定程度上能够量化这个难度,这样秘密可用密码学上常见的大数分解难题,离散对数难题等,而Shamir识别方案使用的难题是模平方根难解假设:
p和q是两个大素数,n=p.q,对于(mod n),称为模n的二次剩余,如果知道p和q,计算s很容易,如果不知道s,很难在合理的时间内计算s,s也就是Alice掌握的秘密,只要p和q不公开,在其他n和v都公开的情况下,其他人也很难反推出Alice的秘密s,模平方根难题也是Shamir的零知识证明协议的安全性的基础。
Shamir的零知识证明协议流程如下:
Alice掌握的秘密s,使得(mod n),其中n=p.q,p和q为大素数,和n公开,s不公开。现在Alice要说服Bob她掌握这个秘密。
(1)证明者Alice随机选取r满足r<n,计算x = (mod n),并将x发送给验证者Bob;
(2)验证者Bob 将随机位b发送给证明者Alice,b 只能是0或1,这个过程类似品酒例子的抛硬币;
(3)证明者Alice根据y = (mod n) 计算出y,将y送给验证者Bob;
(4)验证者Bob 检验=(mod n)是否满足
A.如果b=0,=x(mod n):
证明过程:b=0时,Alice发送给Bob的数据是y=r(mod n),则=(mod n),即和关于模n同余,而在第一步中,
Alice发送过来x = (mod n),即x和关于模n同余,因此和x关于模n同余);
B.如果b=1,=x.v(mod n):
证明过程:b=1时,Alice发送给Bob的数据是y = r.s(mod n),=,而x = (mod n),v=(mod n),因此和x.v关于
模n同余)
上面协议的4步形成一个循环, 完成一次验证,重复步骤1 ~ 4 多次,如果多次执行验证,Alice能通过次数越多,则证明Alice掌握秘密s的可信度越高,协议执行直至验证者Bob愿意相信证明者Alice拥有秘密信息的概率。
在算法中,如果Bob没有采用抛硬币协议,每次固定发送b=0给Alice,则Alice在没有掌握秘密s的情况下也能通过测试,因为b=0的时候,Alice发送的数据只包含随机选择出来的r,那是否意味着,b=0的情况是多余的呢?如果Bob固定发送b=1是否可行?事实上,如果Bob固定发b=1,Alice同样可以在没有掌握秘密的s的情况下造数据通过测试,我们看一下在Bob固定发送b=1的情况下蒙混过关的流程:
- Alice同样随机选取r满足r<n,计算x = .(mod n),将x发送给验证者Bob,注意到相对于正常流程,Alice计算x的时候在右边多加了;
- Bob总是发送b=1给Alice;
- 因Alice没有掌握秘密s,她发送第一步随机选择出来的y=r给Bob;
- 因为b=1时,Bob需要验证=x.v(mod n),而因为y=r,x = .(mod n),得到==x.v(mod n),满足了验证等式要求,这样Alice可以在没有掌握s的情况下蒙混过关。如果Bob随机发送b=0或者1,Alice有1/2的概率碰到b=0,此时因x = .(mod n),无法满足=x(mod n)等式要求。
Bob固定发送b=0不行,因为无法验证Alice是否掌握秘密,同样固定发送b=1也不行,Alice同样可以造数据造假,如果Alice猜对了Bob发送b的值的规律,同样可以过关,因此b必须是随机的,这样每次验证时不掌握秘密s的人只有1/2的概率通过验证(例如Alice一直发送r),而为了增强安全性,防止Alice蒙混过关,需要进行多次验证,直到Bob认为Alice能蒙混过关的概率足够小。
以上即是Feige-Fiat-Shamir识别方案的说明,事实上Shamir方案只是利用零知识证明算法一个较为简单的例子,自零知识证明的概念被提出以来,人们不断将其理论进行完善和发展,同时也将其应用到各个领域,例如身份认证系统,数据共享,数字货币甚至核裁军等,这充分体现了零知识证明技术的魅力,在隐私越来越受关注的今天,有理由相信零知识证明会更多的应用中大放异彩。