零知识证明
交互式证明系统由两方参与,分别为证明者(Prover)和验证者 (Verifier)。证明者掌握某一秘密,证明者需要让验证者相信自己掌握该秘密。
交互式证明过程需要多轮,最典型的是每一轮验证者向证明者发送一个询问信息(挑战,Challenge),证明者对询问信息进行计算,并回复信息响应(Response)。
验证者根据证明者每一轮的回复信息决定是否相信证明者。在交互式证明系统中,通信信道是必须的。交互式证明系统满足:
完备性:如果证明者知道某一秘密,验证者将接受证明的证明。
可靠性:如果证明者能以一定的概率使验证者相信证明者的证明,则证明者知道相应的秘密。
零知识证明(Zero-Knowledge Proof),是指证明者在不让验证者掌握秘密信息的前提下,使得验证者确信自己确实掌握了这些信息。验证者除了知道证明者能证明某一事实外,不能得到其他任何信息。
例如,Alice宣称知道一个能够对抛硬币正反面的诀窍。Bob要验证Alice的宣称,只需要当着Alice的面抛硬币。
Bob抛一次硬币Alice能猜中结果的概率为1/2,连续抛两次硬币Alice都能猜中结果的概率为1/4,连续抛𝑛次硬币Alice都能猜中结果的概率为1/\( 2^𝑛 \),当𝑛足够大时,就可以认为Alice全都正确猜中是不可能事件。
那么如果Alice真的全都猜对了,Bob就可以相信Alice的宣称。
另一个经典的例子是有一个简单的迷宫:
C和D之间有一扇需要秘密口令才能打开的门,证明者要向验证者证明自己能够打开这扇门,又不想泄露秘密口令。可以采用如下所述的证明协议:
1. 验证者在协议开始时停留在位置 A
2. 证明者一直走到迷宫内部的位置 C 或者位置 D 处
3. 在证明者消失之后,验证者走到位置 B 处,然后命令证明者从某个出口处出来
4. 证明者根据验证者的命令,从对应出口处出来
5. 证明者和验证者重复以上过程𝑛轮
只有证明者知道口令,每次验证者要求证明者从指定路口出来时,证明者才能根据命令打开门穿过去或者原路返回,从指定路口出来。
如果证明者不知道打开门的秘密口令,则证明者只能原路返回。因此不知道口令的证明者只能在一开始猜测验证者要求的路口,并从该路口进入,一轮猜对的概率是1/2,重复𝑛轮后,证明者都能猜对概率为1/\( 2^𝑛 \),重复的轮数𝑛足够多时,验证者就可相信证明者拥有打开门的秘密口令。
接下来介绍Schnorr零知识证明协议:
令𝐺 =<𝑔>是𝑞阶群,𝑞为大素数,证明者拥有秘密知识𝑥 ∈𝑍𝑛,并公开系统公钥\( 𝑦=𝑔^𝑥 \) 。
1. 证明者产生一个随机数𝑢∈𝑍𝑛,计算\( 𝑎=𝑔^𝑢 \)并发送给验证者。
2. 验证者Bob产生一个随机数𝑐∈{0,1}并发送给证明者Alice。
3. 如果𝑐=0,证明者计算𝑠=𝑢;如果𝑐=1,证明者计算𝑠=𝑢+𝑥。之后证明者将𝑠发送给验证者。
4. 若𝑐=0,证明者验证𝑔𝑠=𝑎;如果𝑐=1,证明者计算\( 𝑔^𝑠=𝑎𝑦 \)。
公钥\( 𝑦=𝑔^𝑥 \),由于离散对数分解困难,因此无法直接根据\( 𝑔^𝑥 \)计算出𝑥。因为证明者根据𝑐的值选择发送𝑢+𝑥或者𝑢,若证明者不知道𝑥的值,那么当验证者发送𝑐=1时,证明者无法发出正确的𝑠=𝑢+𝑥,验证者在验证\( 𝑔^𝑠=𝑔^{𝑢+𝑥}=𝑔^𝑢· 𝑔^𝑥=𝑎·𝑦 \)时就会验证失败。
想象一个攻击者Tom,他知道Bob之后产生的𝑐为什么值。则Tom可以任𝑠(𝑔)意构造𝑠,若𝑐=0则让\( 𝑎=𝑔^𝑠 \);若𝑐=1则让𝑎=𝑦 。即只要攻击者知道Bob之后产生的𝑐具体为什么值,Tom都可构造一个𝑎,使得Bob认为Tom知道𝑥的值,虽然Tom其实并不知道𝑥,只知道Bob会产生的𝑐的值,即Bob并不知道𝑥的任何信息,所以无法区分出Alice和Tom。
比特承诺
比特承诺(Bit Commitment),最早在1995年由图灵奖获得者Blum首先提出。
比特承诺分为两个阶段,第一个阶段为承诺阶段,承诺者向验证者承诺秘密值𝑥,并向验证者发送对验证者保密的秘密值𝑥。
第二个阶段是揭示阶段,承诺者向验证者揭示第一个阶段承诺的确实是𝑥,同时验证者得知秘密值𝑥的内容。也可以简单理解成承诺阶段,承诺方将一个消息锁进一个盒子里,再将该消息发送给验证方。
验证阶段,承诺方将盒子打开,向验证方展示盒子里的内容,以证明自己确实将消息锁在盒子里发送给了验证方。
接下来介绍一个基于强单向函数(哈希函数)的承诺方案,将该强单向函数记为𝐻𝑎𝑠ℎ(𝑥)(满足找出任意两个𝑥和𝑦,使得𝐻(𝑥)=𝐻(𝑦)不可行;已知𝐻(𝑥),无法求出𝑥;任意两个不同的𝑥和𝑦,无法区分出𝐻(𝑥)和𝐻(𝑦)哪个的原像是𝑥):
承诺阶段:
1. Alice产生两个随机数\( 𝑟_1,𝑟_2 \)。
2. Alice将随机数\( 𝑟_1,𝑟_2 \)与自己将要承诺的消息M进行连接,记为\( 𝑟_1,𝑟_2,𝑚 \)。
3. Alice计算\( 𝑟_1,𝑟_2,𝑚 \)的哈希值\( 𝑐=𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚) \),并将𝑐和\( 𝑟_1 \)发送给Bob,作为Alice对消息m的承诺。
揭示阶段:
1. Alice将\( 𝑟_1,𝑟_2,𝑚 \)告知Bob
2. Bob 计算\( 𝑟_1,𝑟_2,𝑚 \)的哈希值𝑐′,并将𝑐′的值与𝑐进行比较,如果匹配,则承诺有效。
由于Hash的抗一次原像性(preimage resistance),Bob无法根据𝐻𝑎𝑠ℎ(𝑟1,𝑟2,𝑚)计算出𝑚,保证了计算意义上的隐藏性,Bob的计算力无法计算出𝑚。
若Hash满足对于任意𝑚,函数\( ℎ_𝑚(𝑟_1,𝑟_2) = 𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚) \)都是规则的(即每个像的原像个数都相同),那么\( 𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚) \)在信息论意义上隐藏了𝑚,因为𝑚的取值与\( 𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚) \)是独立的,即对于任意𝑚!=𝑚′,任意取值𝑣都满足
\( 𝑃𝑟[𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚)=𝑣]=𝑃𝑟[𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚′) = 𝑣] \)
通俗的说,Bob即使有无限的计算力,计算出满足\( 𝐻𝑎𝑠ℎ(𝑦)=𝐻𝑎𝑠ℎ(𝑟_1,𝑟_2,𝑚) \)的所有𝑦的集合𝑌,𝑌中任意一个元素是(\( 𝑟_1,𝑟_2,𝑚 \))的概率也都相同,Bob猜对的概率只有1/|𝑌|。
在实际中,我们通常可假设Hash(*)是一个随机预言机(random oracle),且\( 𝑟_1 \)和\( 𝑟_2 \)足够长,保证ℎ𝑚是接近规则的,在统计意义上隐藏了𝑚的信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。