0x00 写在前面
没错,又是一期的环签名,其实最近一直都在研究环签名的改进方向,论文看到现在,发现环签名或者说所有的签名机制的改进也无外乎这几个方面:时间效率(计算复杂度),签名长度(空间效率),安全性(证明方法,Random Oracle等)以及附加属性(Traceable,Linkable等等)。此外还有就是应用领域,这个就不能算是签名的改进了,但是能找到一个新的应用领域也是非常不错的。这次就从签名长度上来看,门罗币中的环签名长度是2*n,n是环中公钥的个数,后来改进成了n,这也几乎是所有现在环签名的空间效率了,但是在一个特殊的领域——基于身份加密中效率却可以达到常数级,其中所使用的方法也是十分的有趣。
0x01 准备知识
0x0101 基于身份加密(Identity-Based Encryption)
基于身份的加密和传统的公钥加密最大的不同就是用户的身份(id,例如邮箱或者用户名等)就是公钥(或者通过id来产生公钥),从而免除了公钥认证系统,但是同时也增加了一个可信的第三方密钥生成器(Private Key Generator, PKG),所有的用户都要通过这个PKG来成对应的公私钥,从而进行加密解密。基于身份的加密最开始是由Adi Shamir在《 Identity-Based Cryptosystems and Signature Schemes》中提出来的,一般而言基于身份的加密总共分为以下几个步骤:
- PKG首先公布一个Master public key,自己保留对应的Master private key(也直接称为master key)。
- 任何用户都可以使用Master public key和对应的id产生加密的公钥。
- 而产生签名的私钥,则需要用户使用自己的id向PKG进行身份认证,认证通过后PKG就使用Master private key和id来产生签名的私钥。
在实际的论文中,一般分为以下几个部分来进行描述:
- Setup(ll):PKG接收一个安全参数ll,产生master private key和master public key以及其它的一些公开参数。
- KeyGen(idid)或者Extract(idid):这个是由用户请求产生私钥时PKG运行的,这个过程需要首先认证用户的身份,并且消息传输的安全性不由这个协议来保证。
- Encrypt或者Sign:用户使用从PKG得到的私钥进行加密或者签名操作。
- Decrypt或者Verify:其它用户通过从PKG获取master public key结合用户的id计算出加密者的公钥,从而对消息进行解密或者验证签名。
整个过程都需要用户对PKG的信任,这也就使得PKG成为了攻击者的首要目标,但同时也减少了公钥的认证与分发过程。
0x0102 双线性对
本节主要介绍一下双线性对的一些主要性质,而不深究其具体实现的原理。假设G1G1是一个阶为质数qq的加法循环群,G2G2是阶同样为qq的乘法群,如果映射e:G1e:G1xG1→G2G1→G2满足以下性质:
- Bilinearlity(双线性):对于所有的P,Q∈G1,a,b∈Z∗pP,Q∈G1,a,b∈Zp∗,满足e(aP,bQ)=e(P,Q)abe(aP,bQ)=e(P,Q)ab。
- Non-degeneracy(非退化性):存在一组P,Q∈G1P,Q∈G1使得e(P,Q)≠1e(P,Q)≠1。
- Computability(可计算性):存在一个有效(多项式级)的算法能快速计算e(P,Q)e(P,Q)。
那么我们就称ee是一个双线性映射,其中的每一个元素都是双线性对。
0x0103 Accumulator
看上去这是一个比较新的概念,但其实它的原理很简单,先讲一下它的完整定义,你会发现几乎所有的论文对它的定义都一模一样,然后举个例子就明白了。所谓Accumulator就是一个多元组({Xl,Fl}),l∈N({Xl,Fl}),l∈N,其中{Xl}{Xl}是Accumulator的定义域,{Fl}{Fl}是一个函数对族,其中的每一个函数对(f,g)∈Fl(f,g)∈Fl定义为f:Uff:Uf x Xf→UfXf→Uf并且g:Uf→Ugg:Uf→Ug是一个双射函数,此外还满足以下性质:
- Efficient Generation:存在一个高效的算法输入一个安全参数,输出一个随机元素(f,g)∈Fl(f,g)∈Fl,可能还会输出一些辅助信息afaf
- Quasi commutativity(半交换性):对于所有的l∈N,(f,g)∈Fl,u∈Uf,x1,x2∈Xll∈N,(f,g)∈Fl,u∈Uf,x1,x2∈Xl都有f(f(u,x1),x2)=f(f(u,x2),x1)f(f(u,x1),x2)=f(f(u,x2),x1)。对于所有的l∈N,(f,g)∈Fll∈N,(f,g)∈Fl和X={x1,…,xq}X={x1,…,xq},我们称g(f(f(u,x1),…,xq))g(f(f(u,x1),…,xq))为集合XX在uu上的累积值,由于半交换性的存在,累积值独立于所有的xixi,我们记为f(u,X)f(u,X)。
- Efficient evaluation:存在一个多项式级别的算法能够计算g(f(u,X))g(f(u,X)),即使在没有辅助信息afaf的情况下。
介绍完了定义,可能对于这个Accumulator实际有什么作用还是一头雾水,下面我们来举个例子。假设我们定义f:(u,x)→(x+s)u,g:u→uPf:(u,x)→(x+s)u,g:u→uP,那么实际f(u,X)=u(x1+s)…(xq+s),f(u,X)∈Zpf(u,X)=u(x1+s)…(xq+s),f(u,X)∈Zp,而gg就将ZpZp上的f(u,X)f(u,X)映射到G1G1上,在实际的应用中就可以先将一个集合压缩成一个值,然后再将这个值映射到加法循环群中,从而构造双线性对。
0x02 Improved ID-based Ring Signature Scheme with Constant-size Signatures
原本还打算将几篇常数级的环签名全部介绍一下,后来觉得它们其实都一样,所以就介绍一下几篇之中保证同样安全性但效率最高的一篇,懂了这篇其它的也就顺水推舟了。
和之前介绍的ID-based身份加密一样,签名也是分为以下几个部分:
- Setup:定义一个安全参数ll,随机选s∈RZ∗P,u∈RZ∗Ps∈RZP∗,u∈RZP∗,生成一个accumulator,包括函数(f,g),t←(p,G1,G2,GT,e(.,.),ψ)(f,g),t←(p,G1,G2,GT,e(.,.),ψ)和t′←(P,Q,sQ,...,sqQ)t′←(P,Q,sQ,...,sqQ),其中qq是环中用户的个数上界,令Qpub=sQ,Ppub=ψ(Qpub)Qpub=sQ,Ppub=ψ(Qpub),H0,H1H0,H1分别是哈希函数,最后公开的参数有params←(l,t,t′,u,H0,H1,f∘g)params←(l,t,t′,u,H0,H1,f∘g),主私钥mk←smk←s。
- KeyGen:通过用户的id计算出对应的私钥sidi←1H0(idi)+sPsidi←1H0(idi)+sP, 公钥就直接使用id,用户可以通过验证e(H0(idi)Q+Qpub,sidi)=e(Q,P)e(H0(idi)Q+Qpub,sidi)=e(Q,P)是否成立来验证生成的私钥是否正确。
- MakeGPK:给定一个身份集合R=idiki=1R=idii=1k,计算集合X=H0(idi)ki=1X=H0(idi)i=1k,并且生成群公钥gpk=V←g(f(u,X))gpk=V←g(f(u,X))。
- MakeGSK:每一个用户ids∈R,R=idiki=1ids∈R,R=idii=1k生成自己的群私钥gsk=(hids,sids,W)gsk=(hids,sids,W),其中hids←H0(ids),W←g(f(u,X′)),X′=H0(idi)ki=1,i≠shids←H0(ids),W←g(f(u,X′)),X′=H0(idi)i=1,i≠sk。
- Sign:给定一个消息mm,一个身份集合RR,其中签名者的身份ids∈Rids∈R.
- 随机选择r1,r2,k1,k2,k3,k4,k5∈RZ∗Pr1,r2,k1,k2,k3,k4,k5∈RZP∗。
- 计算U1=sids+r1P,U2←W+r2QU1=sids+r1P,U2←W+r2Q。
- 计算Π1=e(Q,U1)−k5⋅e(Q,P)k2⋅e(Qpub,P)k1Π1=e(Q,U1)−k5⋅e(Q,P)k2⋅e(Qpub,P)k1, Π2=e(P,U2)−k5⋅e(P,Q)k4⋅e(Ppub,Q)k3Π2=e(P,U2)−k5⋅e(P,Q)k4⋅e(Ppub,Q)k3。
- 计算c=H1(m,U1,U2,Π1,Π2,R)c=H1(m,U1,U2,Π1,Π2,R)。
- 然后计算s1=k1+cr1,s2=k2+cr1hids,s3=k3+cr2,s4=k4+cr2hids,s5=k5+chidss1=k1+cr1,s2=k2+cr1hids,s3=k3+cr2,s4=k4+cr2hids,s5=k5+chids。
- 最终的签名就是σ=(U1,U2,Π1,Π2,s1,s2,s3,s4,s5)σ=(U1,U2,Π1,Π2,s1,s2,s3,s4,s5)
- Verify:给定一个签名σσ和一个身份集合RR
- 计算c′=H1(m,U1,U2,Π1,Π2,R)c′=H1(m,U1,U2,Π1,Π2,R)。
- 验证Π1=e(Q,U1)−s5⋅e(Q,P)s2⋅e(Qpub,P)s1⋅e(Qpub,U1)−c′⋅e(P,Q)c′Π1=e(Q,U1)−s5⋅e(Q,P)s2⋅e(Qpub,P)s1⋅e(Qpub,U1)−c′⋅e(P,Q)c′, Π2=e(P,U2)−s5⋅e(P,Q)s4⋅e(Ppub,Q)s3⋅e(Ppub,U2)−c′⋅e(P,V)c′Π2=e(P,U2)−s5⋅e(P,Q)s4⋅e(Ppub,Q)s3⋅e(Ppub,U2)−c′⋅e(P,V)c′,若成立则接受签名,否则拒绝。