Schnorr
Schnorr 协议是一个经典的零知识证明协议,旨在证明证明者(Prover)知道某个秘密信息(比如离散对数),而不会泄露任何关于该信息的实际内容。Schnorr 协议本质上是一个互动证明协议,用于验证者确认证明者是否知道某个秘密 w,而不暴露该秘密。
1. 问题背景和设定
Schnorr 协议常用于证明离散对数问题的知识。假设我们有以下公钥参数:
- p 是一个大素数。
- q 是 p−1 的一个因子。
- g 是一个生成元,属于模 p 的群 Fp∗。
- y=gwmodp,其中 w 是一个秘密离散对数(即我们想要证明的秘密)。
问题:给定公钥 (p,q,g,y),证明者希望向验证者证明她知道某个离散对数 w,使得 gw=ymodp。
2. Schnorr 协议流程
Schnorr 协议是一个互动证明协议,由以下四个步骤组成:
步骤 1:初始化
- 公钥 (p,q,g,y) 被公开,证明者拥有秘密 w,即离散对数 w 满足 gw=ymodp。
- 验证者没有关于 w 的任何信息,但知道公共参数 (p,q,g,y)。
步骤 2:承诺阶段(Commitment)
- 证明者选择一个随机数 r(该随机数的选择确保了证明的“零知识性”),计算 t=grmodp。
- 证明者将计算结果 t 发送给验证者。这个过程称为“承诺”,因为证明者通过 t 向验证者承诺某个值,而这个值是与 r 和 w 密切相关的。
步骤 3:挑战阶段(Challenge)
- 验证者生成一个随机挑战值 c,通常是从某个预定义的范围(比如 c∈Zq)中选择的。
- 验证者将这个挑战值 c 发送给证明者。
步骤 4:响应阶段(Response)
- 证明者计算响应值 s=r+c⋅wmodq,并将 s 发送给验证者。
- r 是她在承诺阶段选择的随机数。
- c 是验证者在挑战阶段发送的随机数。
- w 是证明者要证明她知道的秘密离散对数。
步骤 5:验证阶段(Verification)
3. 数学背景和验证
Schnorr 协议的安全性依赖于离散对数问题的困难性,即给定 g,y 和 p,没有有效的算法可以高效地计算出 w,即 y=gwmodp 的解。
让我们看看为什么验证阶段的条件成立的数学推导:
- 在承诺阶段,证明者发送了 t=grmodp。
- 在响应阶段,证明者发送了 s=r+c⋅wmodq。
- 在验证阶段,验证者检查条件:
gs≡?t⋅ycmodp
将 s=r+c⋅w 代入:gr+c⋅w=gr⋅gc⋅wmodp
由于 gr≡tmodp,以及 y=gwmodp,可以得到:gr+c⋅w=gr⋅(gw)c=t⋅ycmodp
因此,验证者验证的条件 gs≡t⋅ycmodp 成立。
Schnorr例子
参数设置:
- p=23 (模数,素数)
- g=5 (生成元)
- w=6 (秘密离散对数)
- y=gwmodp (公钥,证明者的公开信息)
- 证明者和验证者之间的协议。
步骤 1: 计算公钥 y
证明者知道她的秘密 w=6,她计算公钥 y:
y=gwmodp=56mod23=15625mod23=8
因此,证明者的公钥是 y=8。
步骤 2: 承诺阶段
证明者选择一个随机数 r=4,然后计算承诺值 t:
t=grmodp=54mod23
首先计算 54mod23:
52=25mod23=2
54=(52)2=22=4mod23
因此,承诺值是 t=4。
步骤 3: 挑战阶段
验证者生成一个随机挑战值 c=3。
步骤 4: 响应阶段
证明者计算响应 s:
s=r+c⋅wmod(p−1)=4+3⋅6mod22=4+18mod22=22mod22=0
因此,响应值是 s=0。
步骤 5: 验证阶段
验证者需要验证以下条件:
gs≡t⋅ycmodp
我们将进行验证:
- 计算 gsmodp=50mod23:
gsmodp=50mod23=1
计算 t⋅ycmodp=4⋅83mod23:
先计算 83mod23:
82=64mod23=18
83=8⋅18=144mod23=6
然后计算 t⋅ycmodp:
4⋅6=24mod23=1
最终结果
我们得到:
gsmodp=1与t⋅ycmodp=1
因为 gsmodp=t⋅ycmodp,所以验证通过,证明者成功地证明她知道离散对数 w。