1.6k likes | 1.78k Views
公钥密码快速算法 与实现技术. 公钥密码快速算法与实现技术 王喜成 张振华 刘贤锋 张宪 胡斌 著. ■ 版权所有 侵权必究 ■ 邮购本书请与本社发行科联系。电话:( 028 ) 83201495 邮编: 610054 本书如有缺页、破损、装订错误,请寄回印刷厂调换。. 内 容 提 要 本书是根据广西自然科学基金项目 《 公钥密码中模密乘快速算法及其实现 》 (桂科基 0144034 )的研究成果合作写成的,凝聚了研究者四年来所付出的心血,记录了探索者四年来所走过的历程。
E N D
公钥密码快速算法与实现技术 王喜成 张振华 刘贤锋 张宪 胡斌 著 ■ 版权所有 侵权必究 ■ 邮购本书请与本社发行科联系。电话:(028)83201495 邮编:610054 本书如有缺页、破损、装订错误,请寄回印刷厂调换。
内 容 提 要 本书是根据广西自然科学基金项目《公钥密码中模密乘快速算法及其实现》(桂科基0144034)的研究成果合作写成的,凝聚了研究者四年来所付出的心血,记录了探索者四年来所走过的历程。 本书主要研究RSA公钥密码体制的大数模幂乘快速算法与硬件实现技术。 提出一种公钥密码中大数模幂乘的快速运算新方法:预计算式模216Montgomery算法,提高了大数模幂乘的运算速度。设计了一个独立的硬件加密系统,采用TI 公司DSP芯片TMS320C5409,在CCS集成开发环境下,实现了RSA密码快速算法。 本书还提出一种免比较免进位免预处理的模幂乘快速算法和基于改进型Montgomery算法的三级并行模幂乘快速算法,并采用FPGA预以实现。
目录 第1章 密码学概论 第2章 Montgomery算法的研究与改进 第3章 RSA快速算法的C语言编程 第4章 RSA快速算法的DSP实现 第5章 RSA快速算法的系统设计 第6章 基于FPGA的大数模幂乘快速算法研究
第1章 密码学概论 1.1 引言 1.2 对称密码体制 1.3 公钥密码体制 1.4 RSA公钥密码算法 1.5 本书内容
1.1 引 言 密码学概论 近年来计算机安全技术取得了巨大的进展,但计算机信息安全性比以往任何时候都更加脆弱。它体现在: (1)计算机领域中任何大的技术进步都对安全性构成新的威胁; (2)网络使信息共享达到了一个新的层次,信息被暴露的机会大大增多; (3)计算机安全的每一个漏洞都会使系统的所有安全措施变得毫无价值; (4)安全性的地位总是列在计算机系统总体设计规划的最后面。它首先考虑的是系统的功能、价格、性能、兼容性、可靠性、用户界面; (5)计算机安全本身也带来了一些约束。
1.2 对称密码体制 密码学概论
密码学概论 虽然对称密码体制具有算法简单、安全性高、加解密速度快等优点,但是对称密码体制也存在着下述无法解决的问题: (1)密钥必须秘密地分配,因为密钥比任何加密的信息更有价值,知道了密钥意味着知道了所有信息。 (2)如果密钥被损害了(被偷窃、被猜出),那么盗窃者就能用该密钥去解密所有传送的信息,也能够假装是几方中的一方,产生虚假信息欺骗另一方。 (3)假设网络中每对用户使用不同的密钥,则密钥总数随着用户数的增加迅速以N平方次递增。N个用户的网络需要N(N-1)/2个密钥。
1.3 公钥密码体制 密码学概论 1.3.1 公钥密码体制概述
密码学概论 一个典型的公钥密码体制模型。下面描述A怎样使用公开密钥密码发送信息给B: (1)A和B选用一个公开密钥密码系统; (2)B将他的公钥传送给A; (3)A用B的公钥加密A的信息,然后传送给B; (4)B用他自己的私钥解密由A加密的信息。
密码学概论 公钥密码体制有以下特点: (1)用户在通信之前双方无需交换密钥,因此适合于用户相对不固定的系统; (2)由于公开其算法和公开密钥,因而减少了密钥管理方面的大量工作; (3)其应用范围更广,是大型网络和数据库中身份认证、数字签名、信息完整性验证等安全技术的核心。
密码学概论 1.3.2 离散对数公钥密码 当用户a和b要进行保密通信时,他们利用Kab=AXaXbmodM作为对信息进行加密和解密的公共密钥,并按照传统密码体制方式对信息进行加解密。为了获得Kab,用户a从公钥本上查得用户b的公开密钥Yb,然后和自己的密钥Xa进行计算: (Yb)Xa mod M=(AXb mod M)Xa mod M=Kab
密码学概论 1.3.3 椭圆曲线公钥密码 椭圆曲线公钥密码体制于1985年分别由Victor Miller[73]和Neil Koblitz[72]独立提出。他们没有发明有限域上使用椭圆曲线的新的密码算法,但他们用椭圆曲线实现了已存在的公钥密码算法,如Diffie-Hellman算法。椭圆曲线的吸引人之处在于提供了由“元素”和“组合规则”来组成群的构造方式。用这些群来构造模算法具有完全的相似性,但它们并没有减少密码分析的分析量。
密码学概论 (1)对于每个满足0≤x<p的x,计算x3+ax+b(mod p); (2)对于上一步骤得到的每个结果确定它是一个模p的平方根。如果没有,在Ep(a,b)中就没有具有这个x值的点。如果有,就有两个满足平方根算法的y值(除非y=0)。 对于所有的点P,Q∈Ep(a,b),它们可以陈述如下: (1)P +Q =P; (2)如果P=(x,y),那么P+(x,-y)=O;点(x,-y)是P的负值,记为-P; (3)如果P=(x1,y1)和Q=(x2,y2),而P≠-Q,那么P+Q=(x3,y3)由下列规则确定: x3≡2-x1-x2(mod p) y3≡(x1-x3)-y1(mod p)
密码学概论 1.3.4 HASH算法 HASH函数就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是说,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一地确定输入值。信息安全领域的HASH函数需要满足三个条件: ①单向性:由原文可简单迅速地产生散列值(摘要),反向是困难的。 ②抗冲突:一般要求抗强冲突,计算上难以找到一对任意的M(任意长度明文)和M',使满足H(M)=H(M')即相同的散列值。 ③映射分布均匀和差分分布均匀性。
密码学概论 1.3.4.1 MD5算法概述
密码学概论 FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<s GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<s HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<s II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<s Mj表示消息的第j个子分组(从0到15),<<表示左移位,ti是4294967296*abs(sin(I))的整数部分,i的单位是弧度。
密码学概论 1.3.4.2 MD5的应用 (1)应用于文件校验。有些计算机的操作系统,如Unix和Linux的口令鉴别系统,其用户密码并不直接保存在计算机上,而是将用户密码的MD5散列值保存在计算机上,比较用户进入系统时的口令(用户密码)所产生的散列值与口令鉴别系统所保存的散列值,以确定口令是否正确。不保存口令的原文,以防止口令被窃取。 (2)应用于数字签名。ISO鉴别框架的X.509定义了一种基于公开密钥的认证协议。CA中心签发的数字证书使用MD5或是SHA1来确认数字证书的完整性。 (3)应用于网络通信。在下一代INTERNET协议IPV6中,MD5被作为缺省的认证算法。其中IP安全层——IPSEC的封装安全净荷协议(ESP)和IPSEC验证头协议(AH)中,使用与MD5算法相关的HMAC算法作为验证机制。
密码学概论 1.3.4.3 MD5 系列算法的安全性 曾一度被认为是非常安全的MD5,也存在被攻破的可能。在2004年国际密码学会议上(Crypto’),来自山东大学的王小云教授作了破译MD5、HAVAL-128、MD4和RIPEMD算法的报告:《Collisions for Hash Functions MD4,MD5,HAVAL-128 and RIPEMD》。论文对MD5给出了一对产生相同摘要值的1024bit明文。该论文作为近年来密码学领域的重要发现,宣告了世界通行的散列算法MD5具有重大的不足,这个结果使MD5的安全性和强抗冲突性受到质疑。MD5及类似的HASH函数的安全性,也值得重新考虑。
1.4 RSA公钥密码算法 密码学概论 1.4.1 RSA算法的数学描述 欧拉定理: 若整数a与m互素,则aφ(m)≡1(mod m),其中φ(m)是比m小但与m互素的正整数个数。
密码学概论 RSA加密算法的过程是: (1)取两个素数p和q(p,q保密); (2)计算n=p*q(公开),φ(n)=(p-1)(q-1); (3)随机选取整数e满足 gcd(e,φ(n))=1(e公开) ,gcd为求最大公约数; (4)计算d,使d满足de=l(mod φ(n))(d保密)。
密码学概论 1.4.2 RSA算法安全性探讨 若n=p*q 被因子分解,则RSA便被击破。因为若p,q已知,则 φ(n)=(p-1)*(q-1)便可算出。解密密钥d和加密密钥e之间关系满足: d*e=1(mod φ(n)) (a)p和q的长度相差不大; (b)p-1和q-1有大素数因子; (c)(p-1,q-1)公因子很小。
密码学概论 1.4.3 RSA算法的技术难题 公钥密码学对安全的随机序列的选取比其他大多数应用对随机序列的要求更严格。密码学意义上安全的随机数,还必须具有下面的性质: (1)它是不可预测的。即使给出产生序列的算法或硬件和所有以前产生的比特流的全部知识,也不可能通过计算来预测下一个随机比特数应是什么; (2)它不能可靠地重复产生。即使用完全同样的输入对序列产生器操作多次也将得到两个不相关的随机序列。
密码学概论 1.4.4 RSA算法的应用情况 RSA体制因具有加密、解密算法的对称性以及较充分的安全性分析而成为最有希望的一种公钥密码体制。当前影响RSA体制广泛使用的主要障碍是它的加密、解密速度慢,相对于DES等对称密码系统,在数据处理速率上不具有竞争性。
1.5 本 书 内 容 密码学概论 第1章在概述对称密码体制和公钥密码体制的基础上,着重分析了RSA公钥密码算法。第2章理论研究提出了解决大数模幂乘快速算法的新方法 。第3章将改进型Montgomery算法应用于RSA密码体制,本书称之为RSA快速算法,采用C语言编程予以实现。 第4章在TI 公司DSP芯片TMS320C54X和CCS(Code Composer Studio)开发环境下,将C语言转换为ANSI C并进行优化处理 。第5章设计了一个软件系统和硬件系统,独立实现了第2章提出的RSA快速算法。 第6章则独劈蹊径,采用FPGA实现模幂乘的快速算法 。
第2章 Montgomery算法的研究与改进 2.1 Montgomery算法的证明与分析 2.2 Montgomery算法的改进 2.3 改进型Montgomery算法的实现 及其复杂性分析 2.4 算法复杂性比较 2.5 本章小结
2.1 Montgomery算法的证明与分析 Montgomery算法 2.1.1 Montgomery算法的证明 算法输入:A为n位二进制被乘数an-1an-2…a1a0; B为n位二进制被乘数bn-1bn-2…b1b0; M为n位二进制奇数mn-1mn-2…m1m0,m0=1; 且A<M,B<M 算法输出:S = AB2-n(mod M)=M(A,B,M) Step1:S0=0; Step2:for i=0 to n do qi=Si(mod 2) Si+1=(Si +qiM)/2+biA end; Step3:S=Sn+1(mod M)
Montgomery算法 2.1.2 Montgomery算法的分析 在Montgomery算法中: ∵ A<M、B<M。AB均为n位二进制数。 ∴ A,B,M<2n Q也为n位二进制数Q<2n 2nSn+1=QM+BASn+1=QM/2n+BA/2n<2-n(QM+M2) ∵ Q<2n,M<2nSn+1=2-n(Q+M)M 2-n(Q+M)<2 ∴ Sn+1<2M ∴ 0<Sn+1<2M 由此可知:算法得出的Sn+1有可能大于M但必小于2M。 若Sn+1>M时,Sn+1-M必等于S=Sn+1-M=AB2-n(mod M) ∴Step3无需求模,仅需比较大小及减法。 Step3可改为 if Sn+1>M then S = Sn+1-M else S=Sn+1
2.2 Montgomery算法的改进 Montgomery算法 2.2.1 预计算式Montgomery算法的提出和应用 2.2.1.1 预计算式Montgomery算法 由以上分析,Montgomery算法记作:S=M(A,B,N)=AB2-n( mod N) 预计算P=22n(mod N) 令改进的Montgomery算法为MP(…) MP(P,S,M)=M(P,M(A,B,N),N)=AB2-n·22n·2-n(mod N) =AB(mod N)
Montgomery算法 2.2.1.2 在RSA加/解密算法中的应用 Montgomery算法在模幂乘运算中的应用: 因为在计算RSA的加/解密方法时,令公钥为(E,N),私钥为(D,N),明文为M 则加密算法 C=ME(mod N) 解密算法 M=CD(mod N) 可知,在RSA加/解密过程中,模幂运算是最主要的运算。 令M(A,B,N)=AB2-n(mod N) 加密算法:输入:M为:mn-1mn-2m0 M<n E为:ek-1ek-2e0 k<Ne0=1 N为:Nn-1Nn-2….N0 Nn+1=N0=1 输出:Sout=ME(mod N)
Montgomery算法 预先计算出 Const=22n(mod N) A0=M(M,Const,N)=M·22n·2-n(mod N)=M·2n(mod N) ∵e0=1 ∴可令P0=A0 for i= 1 upto k-1 do Ai=M(Ai-1,Ai-1,N)=Ai2·2-n(modN) if ei=1 the Pi=M(Pi-1,Ai,N) else Pi=Pi-1 end Sout=M(1,Pk-1,N)=Ae(mod N)
Montgomery算法 2.2.2 模216 Montgomery算法的提出和应用 首先构造一个模216的Montgomery算法,记作Monpro(A,B,N),设216=s。 算法输入:A为n位s进制被乘数an-1an-2…a1a0; B为n位s进制被乘数bn-1bn-2…b1b0; N为n位s进制奇数nn-1nn-2…n1n0,即(n0&0x0001)=1; 且A<N,B<N。
Montgomery算法 算法输出:Sout = A*B*s-n(mod N)=Monpro(A,B,N) 令e=sn,令ē为e的逆元(inverse),即 e*ē= 1(mod N) 因为 e*A*B*s-n(mod N)=e*ē*A*B(mod N) 由同余关系(见附录A)得: Sout=A*B*s-n(mod N)= A*B*ē(mod N) 所以 Monpro(A,B,N)=A*B*ē(mod N) (其中ē为e的逆元,e=sn=216n,sn-1<N<sn)
2.3 改进型Montgomery算法的实现及其复杂性分析 Montgomery算法 2.3.1 改进型Montgomery算法的实现 对于n*16bit的大数A,B,求T=A*B。 A为n位216进制的数:an-1an-2…a2a1a0; B为n位216进制的数:bn-1bn-2…b2b1b0; T为2n位216进制的数:t2n-1t2n-2…t2t1t0; for i= 0 to n-1 C=:0 for j=0 to n-1 (C,S)=:t[i+j]+a[j]*b[i]+C t[i+j]=:S t[i+n]=:C 其中,(C,S)表示为2个16比特数,其中C表示进位。结果存在t[0],t[1],…,t[2n-1]。
Montgomery算法 2.3.2 改进型Montgomery算法的复杂性分析 实现Monpro(A,B,N)的乘法次数和加法次数与数长的平方成正比。在DSP芯片TMS320C54X中有专用的乘法单元,实现乘法的时间和加法的时间相同。所以在DSP中实现Monpro运算总的时间复杂性为6n2+5n。 Monpro(A,B,N)是Monexp(A,P,N)的基础,而RSA加/解密过程都可以看作是Monexp(A,P,N)运算。在分析过程中把Monpro运算看作是一个独立的单元,耗时为6n2+5n。
2.4 算法复杂性比较 Montgomery算法 2.4.1 FIPS算法的步骤和复杂性分析 Montgomery算法主要解决RSA算法中大数模幂乘的运算。计算大数模幂乘运算的典型算法有FIPS(Finely Integrated Product Scanning)法[13]。该算法的思路是先计算出大数A×B=T,然后求出T(mod N)的值。在介绍该算法之前,先定义一种运算CARRY(T[i],C): 1)for j = i upto n-1 2)(C,t[i])=:t[i]+C 3)if C =0 then break;else 4)if j=n-1 t[n]=1
Montgomery算法 FIPS算法如下: A为n位216进制的数:an-1an-2…a2a1a0; B为n位216进制的数:bn-1bn-2…b2b1b0; T为3位216进制的数:t2t1t0; Q为n+1位216进制的数:qnqn-1qn-2…q2q1q0; N为n位216进制的数:nn-1nn-2…n2n1n0;
Montgomery算法 2.4.2 算法性能分析比较 性能提高百分比
2.5 本 章 小 结 Montgomery算法 本章主要讨论了Montgomery算法的改进,提出一种新的预计算式Montgomery算法,以简化加密、解密运算;采用模216运算代替Montgomery原始算法中的模2运算,使其适合采用16位定点DSP芯片TMS320C54X系列,实现快速加密和解密运算;设计了一种简单巧妙的留数算法,降低了Montogmery算法中留数计算的复杂性;通过对大数模幂乘算法复杂性的分析和比较,证明了包含上述三种新方法的改进型Montogmery算法,提高了大数模幂乘的运算速度。总之,这一章是本书的理论基础。下一章将给出C语言环境下改进型Montogmery算法在RSA算法中的应用。
第3章 RSA快速算法的C语言编程 3.1 程序总体构思 3.2 大数基本运算程序编程 3.3 大数模幂乘程序编程 3.4 RSA算法的辅助性程序 3.5 公钥和私钥的产生 3.6 加密、解密运算的实现3.7 程序性能测试 3.8 本章小结
3.1 程序总体构思 RSA与C 加密过程 解密过程
3.2 大数基本运算程序编程 RSA与C (1)初始化函数:void INIT(int LENGH,unsigned a[]) 功能:对无符号数组a[]进行初始化。 (2)左移函数:void LEFT(int LENGH,unsigned a[],int leftsize) 功能:对无符号数组a[]进行左移leftsize位,相当于乘上2leftsize,在进行此运算时,应考虑其是否溢出。 (3)右移函数:void RIGHT(int LENGH,unsigned a[],int rightsize) 功能:对无符号数组a[]进行右移rightsize位,相当于除上2rightsize。 (4)大数拷贝:void LCPY(int LENGH,unsigned a[],unsigned b[]) 功能:把数组a的值赋给b。
RSA与C (5)大数交换:void LTRA(int LENGH,unsigned a[],unsigned b[]) 功能:交换大数a,b的值。 (6)大数求反:void NOT(int LENGH,unsigned a[]) 功能:求大数a的反数。在0、1置换后,末位加1,因此需考虑进位。 (7)判断奇偶性:int ODDEVEN( unsigned a[]) 功能:根据返回值判断大数a是奇数还是偶数,仅需对a[0]进行判断即可。 (8)打印大数:void PTF(int LENGH,unsigned a[]) 功能:按从高字节到低字节顺序,以十六进制方式打印大数。 (9)求大数有效长:void GETLENGH(int LENGH,unsigned int a[],int *k) 功能:求出大数a的有效长度(比特),其有效长度放在指针k中。
RSA与C 10)求和:void LADD(int LENGH,unsigned a[],unsigned b[],unsigned c[],int *addcarry) 功能:求两个大数之和c=a+b,如果溢出,*addcarry=1。 程序描述: carry=:0 for i=0 upto LONG-1 sum=:(long)a[i]+(long)b[i]+(long)carry carry=:(int)(sum>>16)c[i]=:sum *addcarry=:carry (11)求差:void LSUB(int LENGH,unsigned a[],unsigned b[],unsigned c[],int *subcarry) 功能:求两个大数之差 c=a-b,如果溢出,*subcarry=1。程序与LADD相似。
RSA与C (12)大数比较:int LCMP(int LENGH,unsigned a[],unsigned b[]) 功能:根据返回值,比较两个大数的大小。a>b时,返回1;a=b时,返回0;a<b时,返回-1。 (13)大数置数:void SETNUM(int LENGH,unsigned a[],int k) 功能:对大数置一16比特整数。(14)乘法:void LMUL(int LENGH,unsigned a[],unsigned b[] ,unsigned c[],unsigned d) 功能:实现大数乘法[c,d]=a×b。数组c表示高位,d表示低位。乘法运算在该算法中比较重要,且相对于其他基本运算函数实现有一定难度。因此对该函数进行较详细描述:
3.3 大数模幂乘程序编程 RSA与C 在RSA加密、解密过程中,都是对大数进行模幂乘运算;而且在素数的判定过程中,也将主要用到大数模幂乘运算。可以说,大数模幂乘运算是RSA算法的灵魂,在RSA算法中占据主导地位。大数模幂乘运算的效率决定RSA算法的效率。因此大数模幂乘是C语言实现的重点。在下面的内容中Monexp(A,P,N)表示大数模幂乘运算,即Monexp(A,P,N)=AP(mod N)。
RSA与C 3.3.1 大数模乘的C语言编程 Monpro(A,B,N)运算主要是把对N的求模运算化作对e=2k的求模运算。对于对e的求模可以用移位实现,从而避免了大数之间的除法运算,其中2k-1<N<2k。在第2章曾经给出了其转化过程和证明。在Monpro(A,B,N)计算过程中涉及到对N的留数Π求解,e*ē-N*Π=1,即Π=(e*ē-1)/N。在2.3节中给出了对Π的优化求法,仅需求出对Π(0)即可。在Monpro(A,B,N)程序中设INVER=Π(0)。
RSA与C 3.3.2 大数模幂乘的C语言编程 在计算模幂乘时,需先对A进行预处理。即计算 A*e(mod N),通过对Monpro程序分析可知,Monpro无法计算A*e(mod N)的值,且没有定义大数之间的除法,因此应定义特定的函数进行预处理计算。设函数RRMOD()完成上述功能。该算法思路:先判断A是否大于N,大于则T=A-N,再判断2T是否大于N,大于则T=2T-N,循环K次。则求出A*e(mod N)。
3.4 RSA算法的辅助性程序 RSA与C 3.4.1 随机数的产生 在RSA算法中,算法的安全性基于对N的分解即N=P*Q的分解。因此P和Q的产生应该没有任何规律性和重复性。现代密码学中要求算法的保密性存在于且仅能存在于对密钥的保密性,而不能寄托于对算法的保密。因此对随机数的随机性要求很高,普通的C程序中库函数产生的随机数毫无随机性可言,因为每次运行程序时所得结果相同,不满足不可重复性要求。因此,在C语言实现过程中应加入不确定因素,使之重复调用时不会产生相同的随机数。
RSA与C 3.4.2 随机数的素性判定 在N=P*Q中,P和Q应是素数。对于具有256或512比特甚至更大的数,确定其是否为素数,目前还没有确定的办法。所有测试方法都是基于概率测试,不过当该数的非素数概率小于10-50时,可以看作该数是素数。为了确保算法的准确性,在素数产生后应带入系统中进行再测试。由2.4.1小节介绍的内容可知,当所测试的数为伪素数时,将无法进行准确的加密、解密运算。