本发明涉及一种基于sm2签名算法的门限签名方法。
背景技术:
国家密码管理局于2010年12月17日发布了sm2椭圆曲线公钥密码算法。sm2算法旨在保障各类信息系统的安全,对我国商用密码产品和信息安全体系建设意义重大。其中,sm2椭圆曲线公钥密码算法包括了数字签名算法、密钥交换协议和公钥加密算法。
普通的签名算法中,私钥仅由1个用户持有。如果该用户私钥被攻击者窃取,则攻击者可以伪造签名。为了避免该风险,desmedt等人提出了门限签名的思想。在门限签名中,私钥由n个用户组成的群体共享,任意t或更多个成员合作能生成代表群的有效签名,少于t个成员的合作则不能产生代表群的有效签名。
2014年,尚铭等人提出基于sm2算法的门限签名算法。但是,该算法存在以下局限性:(1)群总成员数n必须至少大于等于2t+1。因此不适合(2,3),(2,2)等区块链签名场景。(2)群中每个用户给出的签名的合法性无法验证,仅能通过最后结果认证。如果签名结果不正确,无法确定出非诚实用户。
技术实现要素:
为了克服现有技术的上述缺点,本发明提供了一种基于sm2签名算法的门限签名方法。
本发明解决其技术问题所采用的技术方案是:一种基于sm2签名算法的门限签名方法,包括系统建立阶段、签名阶段和验证签名阶段,其中:在系统建立阶段,参与的多个用户联合生成dsa密钥对(x,y=gx),其中y是公开值,x在用户之间共享;在生成签名阶段,采用dsa的签名算法,dsa签名中的随机数k由n个用户共同产生,然后通过同态性加密的性质共同计算得到dsa签名的加密值,最后对该值解密就生成消息摘要的签名。
与现有技术相比,本发明的积极效果是:
本发明提出一种新的基于sm2算法的门限签名方法,该方法中总成员数n仅要求大于等于t+1,且用户输出的每一步中间结果都可以验证。
因此,本发明提出的门限签名方法尚铭等人提出门限签名方案更加灵活,应用范围更广。
本发明方法可以应用在区块链系统中支持各类应用,例如:
(1)用户将数字资产存放在合成地址中,双方各掌握一把私钥,不能独自支配资产。在交易资产时双方都需要为交易签名。
(2)例如在一笔交易中,三方分别来自购买方、销售方和仲裁方,每次交易需要购买方、销售方和仲裁方三方签名才能完成交易。
具体实施方式
本方法提出的基于sm2签名算法的门限签名包含三个阶段:系统建立阶段,签名阶段,和验证签名阶段。
在本方法中,引用了以下三个文献中的技术来构造我们的方案。
引用文献“c.hazay,g.l.mikkelsen,t.rabin,t.toft.anda.a.nicolosi:efficientrsakeygenerationandthresholdpaillierinthetwo-partysetting.”中的门限同态加密方案的密钥产生方法生成门限同态加密方案用户私钥和方案公钥,并引用该文献中的门限加密和解密算法作为本方案中的加密算法e和d;本方法中引用文献中的记法,×e表示同态乘法。
引用文献“r.gennaro.multi-trapdoorcommitmentsandtheirapplicationstoproofsofknowledgesecureunderconcurrentman-in-the-middleattacks.proc.ofcrypto’04,springerlncs3152,pp.220–236.”中描述的承诺算法和承诺验证算法作为本方案中的com算法和ver算法。
引用文献“r.gennaro,s.goldfeder,narayanana.threshold-optimaldsa/ecdsasignaturesandanapplicationtobitcoinwalletsecurity[j].2016.”中的方法来产生和验证零知识证据。
本方法的具体构造过程如下:
一、系统建立
在本过程中,主要的目的是参与的多个用户联合生成dsa密钥对(x,y=gx),其中y是公开值,x在用户之间共享。首先生成用于加性同态加密方案e的公钥n,以及在用户之间以共享形式的秘密密钥d。其次是每个用户选择各自的私钥xi,生成公钥yi,并计算签名公钥y;然后对xi用e加密,根据加法同态的性质可以得到值α=e(x)公开。注意,α是x的隐式(t,n)秘密共享,因为e的解密密钥d在用户之间共享,只有≥t个用户才能恢复出密钥d。
第一步、每个用户采用门限同态加密方案的密钥产生方法生成门限同态加密方案用户私钥和方案公钥。
方案公钥生成:
n个用户共同生成rsa的公钥n;其组成形式为
1)用户各自生成rsa组合对:
n个用户共同生成一个elgamal公钥;在生成原为g,阶为q的群中,各方pi选取随机数x′i∈zq,广播
2)计算方案公钥n:
主要思想是对于任意的两个用户pi和pj,参与协议获得
具体步骤为:
–对于1≤i,j≤n,pj广播均匀随机值
–对于1≤i,j≤n,pi发送pi的paillier加密值
–对于1≤i,j≤n,pj在密钥为ni下计算paillier加密:
其中rij是随机数。将
–对于1≤i,j≤n,pi解密
–对于1≤i,j≤n,各用户确认每个人确实致力于产生pi·qj的份额。
基于qj的加密,用户pi计算并广播pi·qj的新加密;然后所有各方利用同态性计算elgamal加密
–对于1≤i,j≤n,所有用户利用同态性计算
–对于1≤i,j≤n,最后用户计算
用户私钥生成:
在用户私钥生成时,首先计算d的加法共享di,通过用户共同计算得
第二步:
1)每个用户随机选择xi,计算yi=xi*g,αi=e(xi),计算[ci,di]=com(yi);
2)每个用户广播ci。
第三步:
1)每个用户计算零知识证据π(0,i)
证明
2)每个用户广播di,αi,π(0,i)。
第四步:
1)每个用户验证其他用户承诺yi=ver(ci,di)
2)每个用户验证其他用户零知识证据
3)每个用户计算e(α),其中
4)算法公钥为y
二、生成签名
主要的方法是应用dsa的签名算法。dsa签名中的随机数k由n个用户共同产生;即参与的每个用户选择一个随机数后计算得到k,通过同态性加密的性质共同计算得到dsa签名的加密值。对该值解密就生成消息摘要的签名。
第一步:
每个用户pi
1)选择ρi∈rzq
2)计算ui=e(ρi),vi=ρi×eα=e(ρix)
3)计算[c1,i,d1,i]=com([ui,vi])
4)计算零知识证据π(1,i),
证明
5)广播c1,i
第二步、每个用户pi广播d1,i,零知识证据π(1,i)
第三步:
每个用户pi
1)打开其他用户承诺,通过计算[uj,vj]=ver(c1,j,d1,j)
2)验证其他用户零知识证据π(1,j)
3)验证通过,则计算u=e(ρ)andv=e(ρx)其中
第四步:
每个用户pi
1)选择ki∈rzqandci∈r[-q6,q6]
2)计算ri=ki*g,
3)计算wi=(ki×eu)+ee(ciq)=e(kiρ+ciq)
4)计算[c2,i,d2,i]=com(ri,wi)
5)计算零知识证据π(2,i),(确保ui和vi是正确设置的)
证明
6)广播c2,i(确保每个ki的独立性)
第五步、每个用户pi广播d2,i,零知识证据π(2,i)
第六步:
每个用户pi
1)打开其他用户承诺,通过计算[rj,wj]=ver(c2,j,d2,j)
2)验证其他用户零知识证据π(2,j)
3)验证通过,则计算w=e(kρ+cq),其中
4)计算
第七步:
每个用户pi
1)门限解密v得到d(v)=η∈[-q7,q7],并且ηmodq=kxmodqandψ=η-1modq
2)计算σ=ψ×e[w+e(r×eu)]=ψ×e[e(kρ+cq)+ee(rρ)]
=(ρ-1x-1)×ee(kρ+cq+rρ)=e(x-1(k+r))
3)门限解密σ,计算s=d(v)-rmodq
第八步、得到签名(r,s)。
三、验证签名
验证签名步骤与验证sm2签名步骤一致。