Schnorr身份识别协议是又一个零知识证明协议,相比Fiamt协议有两点不同,一是其安全性依赖于离散对数的困难性,二是该方案使用乘法群,从而可以提前计算了一些参数,减小了证明者实时计算开销,特别适合计算能力有限的环境下运行,例如嵌入式设备,介绍Schnorr之前,先对Schnorr所依据的乘法群和离散对数的背景进行介绍。
1.首先理解一下群(goup)的概念
现在我们的微信和qq上有各种群,如同事群、校友群、摄影群或者其他临时发起的群,群的一个特点是成员具有某种程度上的相似性,例如同事群是所有成员在一个公司工作,摄影群成员则是成员有共同的爱好,但群不仅是成员的简单集合,还可以描述群成员之间的关系,例如同事群中有些成员是其他成员的领导从而可以指挥其他成员,这种对象之间的互相作用我们称之为操作或者运算。
再来看数学上的群概念,其实和生活中的微信群有那么一点点相似之处,既包括元素的集合,也包括了元素的运算或者相互之间的操作,举一个乘法群作为例子,其定义如下:
设G为某种元素组成的一个非空集合,若在G内定义一个称为乘法的运算“·”,满足以下条件:
(1)(封闭性),有;
(2)(结合性),有a·(b·c)=(a·b)·c;
(3)在G中有一个元素e,对G中任意元素g,有e·g=g·e=g,元素e称为单位元;
(4)对G中任一元素g都存在G中的一个元素g',使得g·g'=g'·g=e,g称为可逆元,g'称为g的逆元,记作,
则称G关于“·”形成一个群(Group),记作(G,·)。
这个定义看起来就很数学,很让人头晕。逐条来看一下,首先是G,G表示元素的集合,这比较容易理解,这里用全体非零实数R*集合作为例子,再来看四个条件,第一个是封闭性,意思是说集合里的元素相乘后还是在群里,例如2.2=4,而4还是属于非零实数集合,用通俗的话理解封闭性就是肥水不流外人田,群成员按照规则相互(这里的规则是相乘)仍在群里;第二个是结合性,例如(2.3).4=2.(3.4),比较容易理解;第三个是存在单位元,这个单位元跟谁作用都得到这个成员本身,非零实数乘法群的单位元就是1,因为其他数和1相乘仍得到它本身,什么都没变,如果是加法群,那么单位元就是0,因为任何数和0相加等于没加;最后一个条件是逆元,元素和元素的逆元相乘后得到单位元,例如,。
因为四个条件都满足,因此全体非零实数R*对于的乘法形成一个群。数学家定义了群的概念后,就可以围绕着群做更多深入研究(玩出花了),这里再补充两个概念:
1.有限群和无限群。群G中元素的个数称为G的阶,记作|G|,如果个数无限,则称群G为无限群,例如全体非零实数R*集合乘法群是一个无限群,反过来如果个数有限,则称群G为有限群,有限群得到的研究更多,“吾生也有涯,而知也无涯。以有涯随无涯,殆已”,先把有限的研究明白再说无限吧;
2.循环群。说到研究明白,循环群是目前已被完全解决了的—类群,循环群的定义是当一个群G由一个元素a生成时,称为循环群(Cyclic Group),记为G=<a>,a被称为生成元(generator)。先举一个不太严谨的例子,按照老子的宇宙论理论,假设万物是一个群的话,那么这个万物群是一个循环群,而这个循环群的生成元就是老子指的道,因为“道生一,一生二,二生三,三生万物”
再举一个严谨的例子,模5乘法群=<2>=<4>,即为4阶循环群,2和4均为其生成元。事实上,由群中乘法定义知:
=2 mod 5=2 =4 mod 5=4
=4 mod 5=4 =16 mod 5=1
=8 mod 5=3 =64 mod 5= 3
=16 mod 5=1 =256 mod 5=2
可以看出,由2可以生成群,由4也可以生成群,因此2和4均是群的生成元。
群还有同构...等一下,本文不是介绍Schnorr身份识别方案吗,怎么在群论上狂奔了?另外群论和本文主题有啥关系?正如前文提了一下,Schnorr身份识别方案基于整数模p的阶为q的乘法循环群,因为群是元素和运算的集合,也就是说其中的元素和运算规则都确定了,因此给定了一个群,证明者和验证者都以此为基础,减少了双方需要沟通交流确定协议参数的时间,从而改进了效率。
2.离散对数的困难性
离散对数也使用了循环群的概念:给定一个素数p,有限乘法群上的一个生成元g和群里的一个元素,找到整数x,其中,满足(mod p),x就是要求的值,因为可以写作,因此被称为离散对数,注意这里的对数运算符和普通对数运算符不一样,因为这里是同余计算,不是通常所理解的等号。
另外“”符号这里表示同余,意思是对p求余和对p求余相等,例如p=11,生成元g=2,β=9,有(mod 11)。
那么离散对数困难性又是什么难题?其指的是当已知大素数p和它的一个生成元g,(mod p),对于给定的β,计算x被认为是很困难的,而给定x计算β却相对容易,目前普遍认为离散对数难题被认为比大数分解还难一点,和大数分解一样,这类难题被称为陷阱函数:正向计算容易,反向计算困难,和生活中的各种陷阱一样,例如一些培训机构交钱容易退钱困难,正是陷阱函数的困难性保证了运用陷阱函数的各类加密算法的安全性。
3.Schnorr 身份识别协议
介绍了群的概念和离散对数困难性的背景知识后,可以来了解Schnorr身份协议了。为了方便理解 Schnorr 身份识别协议,再次请出Alice和Bob,同样的Alice作为一个拥有众多秘密的女子,她拥有一个私钥,并想向Bob证明这一点,但是又不能透露自己的私钥给Bob,他们再次运用零知识证明协议完成这个过程,这里的零知识证明协议是Schnorr算法。
在开始之前,他们要先确定一些公共参数
- p = 任何的素数;
- q = p-1 的因数,即q整除p-1;
- 生成元g;
- 公钥(mod p),其中s是Alice拥有的私钥, 0<s<q;
{p,q,g,v}四个参数是全局变量,Alice和Bob都知道,s是Alice的秘密,只有Alice知道。
a.首先Alice使用她的私钥s加密一条消息 "M",并发送给Bob,过程如下:
Alice选择一个随机数 r,其中0<r<q,计算得到X值: X = (mod p)
,接着 Alice 将 X 值与她要发送的消息"M"连接起来,得到 (M||X),然后对 (M||X) 进行哈希运算,得到相应哈希值 e = Hash(M||X)
,其中Hash()是哈希函数,但工作还没结束,Alice还要计算一个值y= r + s*e,最后Alice
将下列信息发送给Bob:
- 消息M
- 数字签名 e 和 y
b.Bob对接收到消息进行验证,过程如下:
Bob从 Alice 那儿拿到了消息M 和数字签名(e 和 y),除此之外,Bob 同样知道公共参数,分别是:
- 公钥 "v";
- 素数 "p";
- 素数"q";
- 生成元"g"。
现在 Bob 计算 X'= (mod p)
,如果X'=X,则Bob确认Alice说的为真,否则为假;
验证过程如下:
因为(mod p),代入X'的等式的互换:X'=(mod p)=(mod p)
又因为y=r+s*e,得r=y-s*e,代入该值得到X'=(mod p),因此X=X'。
得到了X'后,Bob可以进一步计算消息
e' = H ( M||X')
并和Alice发送过来的e是否相等。
如果Alice没有私钥,她很难构造私钥以便通过Bob的验证,因为离散对数的困难性,而Bob也很难反推出Alice的私钥,因为Alice并没有发送随机数r给Bob,同样因为离散对数的困难性,Bob不能从X = (mod p)
反推出r从而想通过y=r+s*e反推出Alice的私钥s。