简单的Schnorr协议
首先要介绍一下椭圆曲线、有限域和循环群。
用Zq这个符号表示有限域,其中素数q是指有限域的大小,它是指从0,1,2,…,q-1这个整数集合。在椭圆曲线有一种基点G,G可以产生一个循环群0G,1G,2G,…,(q-1)G。任意两个曲线点都能相加,且最后一个点是(q-1)G,再加一个G就回卷到群的第一个元素0G。椭圆曲线和有限域存在一种同态映射关系,给定一个有限域的整数r,我们就可以在循环群众找到已给对应的点rG或r*G,但是通过rG和G很难算出r的,这是一个密码学难题(离散对数难题)。
例如Alice有个私钥sk(secret key)=a和公钥pk(public key)=aG,Bob有个公钥pk=aG。那么Alice如何向Bob证明她拥有pk对应的私钥sk?
如果单纯的Alice把自己的私钥sk=a发送给Bob,那么Bob通过验证a*G=aG=pk,知道了Alice的私钥a,但是这对Alice的安全不起作用了,因为现在Bob知道了Alice的私钥sk了。
第一步,Alice不能发送a,显然她发送了一个类似于a的数r(random),r可以映射到椭圆曲线群上,R=rG。
第二步:Bob要提供一个随机数c进行挑战。
第三步:Alice根据挑战数计算z=r+a*c,同时把z发给Bob,Bob通过下面的公式检验
zG ?= R+cpk =rG + c*(aG)
Bob可以在不知道私钥a的情况下即可证明Alice确实有私钥a。
Alice在不知道随机数c的情况下,不可能仿造个z’与公式z=r+a*c相等,所以Alice不得不使用私钥a。