当前位置:文档之家› RSA加密算法及实现

RSA加密算法及实现

数学文化课程报告题目:RSA公钥加密算法及实现RSA公钥加密算法及实现摘要公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。

公钥密码是基于数学的上的困难问题来保证其性。

其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。

但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。

本文利用C 语言编程技术进行了RSA算法的演示[1]。

关键词:C语言编程、RSA算法、应用数学。

RSA public key encryption algorithmAbstractPublic key cryptography is an important invention in cryptography, thanks to public key cryptography, and it is used in modern computer and Internet password technology. Public key cryptography is based on the mathematics difficult problem to ensure its confidentiality. The RSA public key encryption algorithm is an important cryptographic algorithm, RSA using the difficulty that large integer is hard to be factorized into prime Numbers to ensure it safety. But if you can find a kind of fast algorithm to do the factorization, RSA algorithm will be failure. In this paper we used C language programming technology to demonstrate the RSA algorithm.Keywords:C language programming、RSA algorithm、Applied mathematics目录第1章引言 (1)第2章RSA公钥密码算法的基本理论知识 (2)2.1模运算操作、费马小定理与欧拉定理 (2)2.1.1 模运算操作 (2)2.1.2 费马小定理 (2)2.1.3 欧拉定理 (2)2.2 RSA算法的过程 (3)2.3 RSA算法的可行性 (3)第3章RSA算法的演示 (4)3.1 RSA程序的设计 (4)3.2 RSA算法的实现 (5)3.3 RSA算法的演示 (6)第4章结果分析与讨论 (7)第5章结论 (8)致 (9)参考文献 (10)附录 (111)附录A 各函数C语言代码 (111)第1章引言计算机与网络技术的高速发展,使密码技术成为信息安全技术的核心。

它主要由密码编码技术和密码分析技术两大分支组成。

密码编码技术的主要任务是寻求产生安全性高的有效密码算法和协议,以满足对消息进行加密或认证的要求。

密码分析技术的主要任务是破译密码或伪造认证信息,实现窃取信息或进行诈骗破坏话动。

这两个分支既相互对立又相互依存,正是由于这种对立统一关系,才推动了密码学自身的发展[2]。

公钥加密中,密钥分为加密和解密密钥两种,发送者用加密密钥对消息进行加密,解密者用解密密钥对明文解密,公钥和密钥是一一对应的,一对公钥和密钥称为密钥对,由公钥加密的密文必须由与该公钥配对的密钥解密。

密钥对中的两个密钥具有非常密切的关系,不能单独生成。

RSA公钥加密算法是1977年由罗纳德·维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。

1987年首次公布,当时他们三人都在麻省理工学院工作。

RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。

到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。

只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一[3]。

第2章RSA公钥密码算法的基本理论知识2.1模运算操作、费马小定理与欧拉定理2.1.1模运算操作对任意整数a和任意正整数n,存在唯一的整数q和r,满足。

0<r<=n,并且a=n*q+r,值q=[a/n]称为除法的商,其中[b]表示小于等于x的最大整数。

值r=a rood n称为除法的余数,因此,对于任意整数,可表示为:a=[a/n]+(a mod n) (2.1)且有(a*b)mod c =((a mod c)*(b mod c))mod c (2.2)费马定理和欧拉定理在公钥密码学中有重要的作用。

2.1.2费马小定理如果P是素数,a是不能被P整除的正整数,则:a p-1≡1 mod p (2.3)2.1.3欧拉定理对于任何互质的整数a和n,有在数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。

欧拉定理表明,若n,a为正整数,且n,a互质,φ(n)在1到n中为与n互质的数的个数,则:aφ(n) =1 mod n (2.4) 欧拉定理证明:将1~n中与n互质的数按顺序排布:x1,x2……xφ(n) (显然,共有φ(n)个数)我们考虑这么一些数:m1=a*x1;m2=a*x2;m3=a*x3……mφ(n)=a*xφ(n)1)这些数中的任意两个都不模n同余,因为如果有mS≡mR (mod n) (这里假定mS更大一些),就有:mS-mR=a(xS-xR)=qn,即n能整除a(xS-xR)。

但是a与n互质,a与n的最大公因子是1,而xS-xR<n,因而左式不可能被n整除。

也就是说这些数中的任意两个都不模n同余,φ(n)个数有φ(n)种余数。

2)这些数除n的余数都与n互质,因为如果余数与n有公因子r,那么a*xi=pn+qr=r(……),a*xi与n不互质,而这是不可能的。

那么这些数除n的余数,都在x1,x2,x3……xφ(n)中,因为这是1~n中与n互质的所有数,而余数又小于n.由1)和2)可知,数m1,m2,m3……mφ(n)(如果将其次序重新排列)必须相应地同余于x1,x2,x3……xφ(n).故得出:m1*m2*m3……mφ(n)≡x1*x2*x3……xφ(n) (mod n)或者说a^[φ(n)]*(x1*x2*x3……xφ(n))≡x1*x2*x3……xφ(n)或者为了方便:K{a^[φ(n)]-1}≡0 ( mod n ) 这里K=x1*x2*x3……xφ(n)。

以上定理是我们证明RSA算法可行性的基础[4]。

2.2RSA算法的过程N=p*q,其中p和q是素数,L为(p-1)和(q-1)的公倍数,L=lcm((p-1),(q-1))(由欧拉函数得出)。

E为与L互质的随机数,D是使得(D*E)mod L =1的数。

M为明文,E为加密后的密文,{E,N}为公钥,可以公开,{D,N}为私钥由自己保管。

甲向乙发送自己的公钥,乙用公钥加密后,将密文发送给甲,甲用私钥解密,得到密文。

加密算法为:E=M E mod N。

解密算法为:M=E D mod N。

其中有M与E小于N,均大于0。

2.3 RSA算法的可行性RSA算法的可逆性表明其理论上的可行性,要证明可逆性即证明:M=C D=(M E)D=M e*d mod n因为E*D=1mod L,这说明存在E*D=t*L+1,其中t为正整数且有t>=1。

所以:M E*D=M t*L+1 mod N=((M t*L mod N)(M mod N))mod N 因此可以通过证明M t*L=1 mod N成立来证明。

欧拉定理证明有a L =1 mod n,所以:M t*L=1 mod N从理论上证明算法可逆,第3章RSA算法的演示在编写程序之前先理清思路,设计关键的函数的入口、出口、功能、编写出伪代码。

之后,便是进行函数编写、调试阶段。

最后,便将函数组合在一起,使之成为一个完整的程序。

3.1 RSA程序的设计程序中有判断是否为质数、求两个数的公倍数、判断是否互质、求最大互质数、由E和L求出密钥D、加密算法和解密算法。

各函数算法见附录A。

3.2 RSA算法的实现RSA加密产生公钥和密钥过程可分为以下四步:(1)得出公钥中的N:随机取两个不同的素数,p和q,N=p*q。

(2)求出L:L的值为(p-1)和(q-1)的最小公倍数,L=lcm((p-1),(q-1))。

(3)求出一个随机的公钥E:求出一个与L互质的数E,有gcd(E,L)=1。

(4)求出一个随钥D:密钥D应满足(D*E)mod L=1;主函数的代码如下:int main(){long int p,q,E,D,N,L,ming,mi;display();srand(time(NULL));do{p=rand()%500;}while(p<100||!(iszs(p)));do{q=rand()%500;}while(!(iszs(q))||p==q);N=p*q;L=lcm(p-1,q-1);E=gcd(L);D=qiuD(E,L);if(D<=0||E<=0) return 0;printf("p=%ld q=%ld N=%ld L=%ld E=%ld D=%ld\n",p,q,N,L,E,D);printf("{E=%ld,N=%ld},{D=%ld,N=%ld}\n",E,N,D,N);printf("Let's do it!\n");do{do{printf("请输入一个小于N=%ld的正整数:",N);scanf("%ld",&ming);getchar();}while(ming>N||ming<=0);mi=Encryption(E,N,ming);ming=Decryption(D,N,mi);printf("公钥:E=%ld N=%ld 密文:%ld\n密钥:D=%ld N=%ld 明文:%ld\n",E,N,mi,D,N,ming);printf("还想再来一次吗?[y/n]:");}while('y'==getchar());printf("See you!\n");return 0;}3.3 RSA算法的演示完成编程后,便做了一次测试,测试结果如图3-1所示。

相关主题