陕西理工学院毕业论文(设计)
然后Ui发送部分的签名(Ti,mi,Di,fi)给签名者Ui?1. Ui?1计算
i hi=H (Ci), Ti*?Diefihi?1(modn),mi*?H(M,Ti*).
mUi?1通过比较mi*和mi的值来验证第i部分签名的有效性,如果mi*等于mi,那么那部分签名
是正确的,否则是错误的。
步骤3:Ui?1创建下一部分签名。以上过程重复执行直到签名者Uk创建签名(Tk,mk,Dk,fk)并且将其发送给多重签名接收者UR,这个接收者计算: hk?H(Ck), Tk*?Dkefkhkmn(modn), mk*?H(M,Tk*).
UR通过比较mk*和mk的值验证签名的有效性,最终的多重签名是(Tk,mk,Dk,fk).
2.张等人的连续多重签名方案的加密分析
当接收者UR在使用签名(Tk,mk,Dk,fk)时,他应该说服第三方,这是k个签名者的正确签署。第三方计算hk?H(Ck) and Tk*?Dkefkhk在来验证这个多重签名的有效性。
这个签名只有用Uk的公钥而不是所有k个签名者共有的公钥来验证。因此,第三方不能区分这个签名是由k个签名者共同签署还是由第k个签名者一个人签署。如果签名者想说服第三方,他必须用所有签名者的公钥来验证这个多重签名。尽管fk?h11h22...hkmmmkmn是否存(modn),并且通过判断等式mk*?H(M,Tk*)
能够被公众的计算以显示这个
多重签名是由k个签名者所签署,但验证者必须知道所有k部分的签名,这违反了连续多重签名的定义。验证的计算量随着签名者的数目呈线性增加。因此,我们在这儿提出一种改进的方案,后面解决这个问题是基于参考文献【2,5,6,7】中的方案。 3 基于RSA改进的连续多重签名方案 3.1 初始化阶段
e签名者U1 选择一个随机数r1(1?r1?n),计算 T1?r1(modn),并且发送T1给U2.相似地, 每
个签名者Ui(1?i?k)选择一个随机数ri(1?ri?n),计算Ti?Ti?1rie且发送Ti给签名者Ui?1. 最后,
Uk计算Tk?Tk?1rk2(modn),且发送Tk给接收者UR.然后,UR计算m=H (M, Tk)且公布m.
3.2 产生连续多重签名的部分签名
m步骤1 签名者U1使用随机数r1 且计算D1?r1s1(modn). 因为在初始化阶段U1已经发送T1给签
名者U2了,所以现在他只需发送D1给 U2。
U2计算h1?H(C1) 和T1*?D1eh1m(modn),且通过比较T1* 和T1验证 (T1,D1).如果T1*等于T1,则U1那部分签名是正确的.否则,它是错误的,且U2需要U1让位直到那部分签名满足验证方程。
m步骤2 假定第(i-1)部分签名是正确的(1
后Ui发送那部分签名(Ti,Di)给签名者Ui?1.Ui?1计算h1?H(C1), h2?H(C2),...,hi?H(Ci),及
Ti*?Die(h1h2...hi)m(modn).Ui?1通过比较Ti*和Ti验证 (Ti,Di)的有效性。
第37页 共41页
陕西理工学院毕业论文(设计)
步骤3 签名者Ui?1创建下一部分签名。以上过程重复执行直到签名者Uk创建最后部分的签名Dk并且将其发送给多重签名接收者UR.
UR计算h1?H(C1), h2?H(C2),...,hk?H(Ck), 及Tk*?Dke(h1h2...hi)m(modn).
最终多重签名是由k签名者共同签署的,即UR通过比较Tk*和Tk来验证(Tk,Dk)的有效性,
(Tk,Dk,m). 3.3 作证有效性
任何人都可以通过计算Tk*且比较Tk*和Tk来验证多重签名的有效性.多重签名由k个签名者签署是正确的。
证明 从连续多重签名的过程中可以知道
?k?eeTk?Tk?1rk?TT12...Tk?1?(r1r2...rk)???rj?(modn)
?j?1?eDk?Dk?1rksk?(rs)(r2s2)...(rksk)??rjsjm(modn)
mm11mmj?1k当接收者或者第三方验证这个多重签名时,他计算
?k??k?kem?k?*emmmTk?Dk(h1h2...hk)???rjsj?(h1h2...hk)???rj?(?sj)??hj?(modn)
?j?1??j?1?j?1?j?1?因为sj?hj那么
?deem(modn),我们得到sje?(hj?d)e?(hjed)?1?hj?1(modn)。
?k??k??k??k?*rj(mod n) Tk???rj???h???h?j????j?j?1??j?1??j?1??j?1?当且仅当Tk*等于Tk时,签名正确。 4 安全性分析
张等人【2】细节性的分析了他们的原始方案的安全性。在这儿,我们只分析了安全性相关的修改部分。
(1) 验证者知道这个多重签名的签署者。在改进方案中,每个签名者Ui的凭证被公开,并
且验证者为了验证,必须用h1,h2,?, hi 来计算Ti*,所以,他能够区分开那个签名是由k个签名者签署还是由第k个签名者签署。
(2) 在初始化阶段,Ti的发布是安全的。在张等人的原始方案中,Ti在签名者之间被连续传
递。而在这儿,Ti在初始化阶段被计算出。即使一个破坏者知道Ti且能够计算出rie的值,但他也不能由Ti得到ri。
(3) 多重签名能抵抗伪造攻击。如果攻击者想伪造Ui部分的签名,他必须要伪造一个有效
第38页 共41页
e?mme 陕西理工学院毕业论文(设计)
的(T'i,D'i)满足那个验证公式。然而,Ti是在初始化阶段被公开的,并且不能被伪造,所以,他必须取得一个D'i使其满足公式
Ti*?(D'i)e(h1h2...hi)m(modn).
这是一个基于大整数分解的难题。
(4) 所有的签名者必须按照特定的次序。一个接一个签名者Ui(i=2,?,k)通过Ti?1的值验证那部分签名,这个过程是在初始化阶段产生的。任何个体签名者的障碍将导致创建多重签名过程的终止。例如,如果签名者Ui在接到签名Ti?1部分之前创建部分签名,那么Ti*≠Ti 将导致随后的验证阶段和创建多重签名过程的终止 5 性能分析
定义符号Tm,Te和Th作为建立多重签名所消耗的时间,分别进行模幂和散列运算。在我们的方案中,来验证前面部分的签名所消耗的平均时间是2Te?产生将消耗的时间是
n(Tm?Th)2,但是,h1直到hi及它们的
n(Tm?Th)2,这可以预先计算。部分签名的计算时间是2Te?3Tm.签名和验证
的耗时都少于张等人的方案。因此,我们的方案是更加有效地。
6 结论
我们指出张等人基于RSA的连续多重签名方案的缺陷,那就是:验证者不能区分签名是由一组签名者共同签署还是仅由这组签名者中的最后一位单独签署。为了克服这个缺陷,我们提出一个改进方案,在这个方案中,验证者能够知道签名是由哪些人产生的。这个改进方案没有增加计算量和通信费用;它的安全性是基于一个大整数分解的困难性。性能分析和安全性分析显示,提出的这个方案比原来的方案更加安全和有效。
第39页 共41页
陕西理工学院毕业论文(设计)
附录B:源程序 clc clear
disp('产生密钥对:')
p=input('输入第一个大素数:p=');
q=input('输入第二个大素数:q='); n=p*q
fain=(p-1)*(q-1)
e=floor(unifrnd(0,fain,1,1)) while(gcd(e,fain)~=1)|(e<2); e=floor(unifrnd(0,fain,1,1)) end
%模n求逆函数
n1=fain;n2=e;b1=0;b2=1; for i=1:1000 q1=floor(n1/n2); r=n1-q1*n2; if r~=0 n1=n2; n2=r; t=b2; b2=b1-q1*b2; b1=t; else break end end
if n2~=1
warning('所求的模逆不存在') ; end
if n2==1
d=mod(b2,fain)
fid=input('输入待加密的明文:','s'); f=abs(fid);
for i=1:length(f) a=f(i);b=e;c=1; for j=1:1000 if b==0 dashuchenmi=c; end
if mod(b,2)~=0 b=b-1; c=mod(c*a,n); else b=b/2;
第40页 共41页
陕西理工学院毕业论文(设计)
a=mod(a*a,n); end end
dashuchenmi=c;
miwen(i)=setstr(dashuchenmi); end
for i=1:length(f)
a2=miwen(i);b2=d;c2=1; for j=1:1000 if b2==0
dashuchenmi2=c2; end
if mod(b2,2)~=0 b2=b2-1; c2=mod(c2*a2,n); else b2=b2/2; a2=mod(a2*a2,n); end end dashuchenmi2=c2; mingwen(i)=setstr(dashuchenmi2); end end
disp('对所输入的明文进行加密后的密文:') miwen
disp('经过解密后恢复出的明文:') mingwen
第41页 共41页