
安全增强的基于RSA可验证门限签名方案.doc
9页平安增强的基于RSA可验证门限签名方案 摘要本文提出一种验证功能完善、平安性更高的门限RSA签名方案该门限签名方案利用有理数域上的插值公式,Shair机密共享方案以及改进的门限RSA签名方案等理论,解决了在中对元素求逆和代数构造扩张的问题以及共享效劳器合谋的问题 关键词门限密码体制,门限签名,RSA算法,门限RSA签名方案 1引言 门限签名是门限密码学的主要研究内容之一,最初由Desedt和Frankel等人引进的,并基于ElGaal密码方案建立了第一个(t,n)门限密码体制在(t,n)门限签名方案中,n个成员共享群体的签名密钥,使得任何不少于t个成员的子集可以代表群体产生签名,而任何少于t个成员的子集那么不能产生签名门限签名方案的根本假设是:在系统生命周期中,至少有(t-1)个非老实成员由于RSA算法满足构成门限密码体制的同态性要求,并且在A中被广泛使用,所以这里选择基于RSA的门限签名方案 但是对于RSA密码系统,情况要复杂一些首先剩余环不是域,其中的元素未必都可逆,于是不能利用一般的机密共享方法共享签名密钥d;其次,为了保护RSA模数N的因子分解,不能让参与签名的成员知道,因此给在上建立机密共享方案和建立门限签名方案都带来了困难。
另外一个需要解决的问题是由于采用Shair机密共享方案共享签名私钥,任意t个或更多个成员共享的密钥就是签名私钥,所以他们合谋可以恢复出机密密钥,从而假冒系统生成有效的群签名这些问题都是我们在设计门限签名方案时应该考虑的 本文以基于有理数域上插值公式的Shair的机密共享方案为根底,将改进的门限RSA签名体制、两方共享与(t,n)门限方案相结合,提出了一个需要可信任中心的平安性增强的基于门限RSA签名方案利用由hash函数建立的特殊形式的RSA签名体制,很好解决了在中对元素求逆和代数构造扩张的问题,为实现带来了方便同时在签名过程中对分发的子密钥、部分签名以及签名都进展了验证,保证子密钥和签名的正确性;保证在签名过程中不会被敌人入侵和欺诈,同时也防止了共享效劳器合谋的危险因此是一个平安性更高的门限签名方案 2门限机密共享方案分析 通过前面的分析我们知道门限机密共享方案是构成门限签名方案的基矗现有的许多门限签名方案采用的是ITT工程中的方案,采用随机和的拆分方法,也就是将机密密钥d按多种(t,t)共享方案分割,每种分割称为一种结合,每种结合含有t份子密钥,这t份子密钥分别存储在n个效劳器中的t个不同共享效劳器上,不同的子密钥结合对应不同的t个共享效劳器组合。
这种方案具有方法简单,运算效率高的特点,但是它的子密钥分发和管理都比较困难它需要客户机或是组合者指定共享效劳器而不具有任意性,对于客户机的要求很高,实现起来比较困难 本文采用有理数域上的插值公式和经典的Shair(t,n)机密共享方案作为构造门限签名方案的理论基矗这是因为Shair门限体制具有以下特点: (1)增加新的子密钥不用改变已有的子密钥在参与者P1,P2,…,Pn中成员总数不超过q的条件下可以增加新的成员而不用重新撤销以前分发的子密钥当系统需要增加共享效劳器时,我们只需要对新增加的效劳器分发新的子密钥,而不需要将已经分发的子密钥一起交换掉,这样可以减少系统的工作,进步系统效率 (2)可以通过选用常数项不变的另一〔t-1〕次新的多项式,将某个成员的子密钥作废当某个共享效劳器被攻破时,需要作废它的子密钥,我们可以采用这种方法 (3)组合者可以任意选择共享效劳器的子密钥进展密钥恢复而不需要指定它们这是我们选择Shair(t,n)机密共享方案的一个重要原因当共享效劳器完成部分签名后组合者biner可以在n个效劳器中任意选择t个进展最后的组合,而不需要去指定由某些效劳器的部分签名构成最后的签名。
这里我们给出这样一个假设:任意t个共享组件所构成的信息与n个共享组件所构成的信息应该是完全等价的在此根底上给出本文的基于RSA门限签名方案 3基于RSA门限签名方案设计 3.1密钥初始化 定义5-1可信任中心A(Adinistratr)指将签名私钥分给n个机密共享者的组件可信任暗含了A一定能确保机密信息不会被泄漏,并且在执行完密钥的分发后将签名私钥和其它信息一起销毁 (1)假设可信任中心A选择好RSA模数N,公钥e和私钥d以及,使得其中,模数N为两个平安大素数p,q的乘积 (2)取定一个固定的正整数k及值域包含于(指中最高两个比特为0的数构成的集合)的适当的hash函数h(如D5),H由得到,由于对N的分解是困难的,所以H()是强无碰撞的、单向的函数 (3)d1为随机数,,如今可信任中心A欲将d2分发给n个共享效劳器ShareServeri,将d1发给密钥效劳器K这里签名私钥d由d1和d2组成,各共享效劳器共享私钥d2 3.2子密钥的生成与验证 可信任中心A按如下步骤将签名密钥d2分发给n个共享效劳器ShareServeri (1)A随机选取多项式使f(0)=a0=d2,计算下式: 其中g是可信任中心A随机选取的信息样本。
A将d2i机密地发送给ShareServeri,而将N,n,e,h公开,将所有的g,i,yi播送给各ShareServeri,p,q不再使用将其销毁 (2)各共享效劳器ShareServeri(i=1,2,…,n)收到可信任中心A发送来的子密钥d2i后,利用已播送的公开信息验证子密钥d2i的正确性,方法如下: ①每个共享效劳器ShareServeri判断下面的式子是否成立: ②由于(5-4)式是所有共享效劳器都收到的,因此方案中任何的组件都可以验证,故称为公开验证部分;式(5-5)由每个共享效劳器自己验证,故称为机密验证部分对于ShareServeri来说,机密验证就是用自己的子密钥d2i和收到的g计算yi并与从可信中心A发送的yi比较是否一致来判断d2i的正确性 ③公开验证的正确性说明如下: 当公开验证和机密验证中有一个不成立就认为验证失败,ShareServeri宣布可信任中心A发放的子密钥是错误的,于是可信任中心A被认为是不合格的,协议至此中止可信任中心A将重新选择N和密钥对(d,e)重复上面的步骤发放新的密钥,否那么可信任中心A分发密钥成功,可以进展下面步骤这时可信任中心A销毁所分发的密钥,以防止密钥泄露。
3.3部分签名的生成与验证 首先密钥效劳器K利用密钥d1对消息的hash函数值进展签名然后各共享效劳器ShareServeri利用自己的子密钥d2i对消息的摘要进展签名,如下所示并播送其部分签名: 共享效劳器ShareServeri生成对消息的部分签名后,本文借助交互验证协议来验证ShareServeri的部分签名是否正确在交互验证协议中可以由任何一方来验证部分签名的正确性,这里为了方便后面系统设计故规定共享效劳器ShareServeri的部分签名是由ShareServeri+1来验证假设协议成功,那么ShareServeri+1确信ShareServeri的部分签名S2i是正确的;否那么S2i是不正确的方法如下: (1)ShareServeri+1任意选取a,b∈R[1,N],计算出并将R发送给ShareServeri; (2)ShareServeri收到R后,计算出并将发送给ShareServeri+1; (3)ShareServeri+1收到后,根据下式是否成立来判断S2i是否为ShareServeri之部分签名; 下面我们来说明协议的平安性,假设N为两个平安素数p,q之积。
假设非老实验证者P不能攻破RSA系统,那么上述验证RSA部分签名的交互式协议满足以下性质: (1)完备性假设P,ShareServeri都是老实的,那么ShareServeri总是承受P的证明 (2)合理性非老实证明者P使ShareServeri承受不正确部分签名的成功率是可忽略的 (3)零知识性非老实验证者除了能知道部分签名是正确外,不能获得其他任何信息 因此由这样的交互式协议验证为正确的部分签名根本可以认为是正确的 转贴于论文联盟.ll. 3.4签名的生成与验证 假设已有t个部分签名通过正确性验证,那么由biner(组合效劳器)可以计算出共享效劳器对消息的门限RSA签名S (1)biner将xi(i=1,2,…,t)看作整数环Z上的元素,在整数环Z上计算 (2)各共享效劳器的门限签名S2的计算公式如下: 最后系统的签名为 (3)接着biner利用公开密钥e,按下式来验证门限签名(,S)的正确性,假设成立那么承受S为的合法签名 3.5签名算法 这里给出了门限签名方案的实现算法,其中需要运用java.i.*;java.seurity.*;java.ath.*;javax.rypt.*;javax.rypt.spe.*;java.seurity.spe.*;java.seurity.interfaes.*;java.util.*;javax.rypt.interfaes.*等系统提供的类和方法。
(1)RSA签名私钥生成算法: publilassRSA{ KeyPairGeneratrkpg=KeyPairGeneratr.getInstane("RSA"); kpg.initialize(1024); KeyPairkp=kpg.genKeyPair(); PubliKeypbkey=kp.getPubli(); PrivateKeyprkey=kp.getPrivate(); //保存RSA公钥 FileutputStreaf1=neFileutputStrea("skey_RSA_pub.dat"); bjetutputStreab1=nebjetutputStrea(f1); b1.ritebjet(pbkey); //保存RSA私钥 FileutputStreaf2=neFileutputStrea("skey_RSA_priv.dat"); bjetutputStreab2=nebjetutputStrea(f2); b2.ritebjet(prkey); } (2)子密钥生成算法: publilassshareRSA{//读取私钥d及RSA参数 FilEinputStreaf=neFilEInputStrea("skey_RSA_priv.dat"); bjetInputStreab=nebjetInputStrea(f); RSAPrivateKeyprk=(RSAPrivateKey)b.readbjet(); BigIntegerd=prk.getPrivateExpnent(); BigIntegern=prk.getdulus(); byte[]x=nebyte[16]; Randd1=neRand(); d1.nextBytes(x); BigInteger=neBigInteger(x); BigInteger=.d(n); BigIntegerd2=d.subtrat(); //保存机密密钥d1 FileutputStreaf1=neFileutputStrea("partkey1_RSA.dat"); bjetutputStreab1=nebjetutputStrea(f1); b1.ritebjet(d1); //保存机密密钥d2 FileutputStreaf2=neFileutputStrea("p。












