RSA加密算法和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学文化课程报告题目:RSA公钥加密算法及实现
RSA公钥加密算法及实现
摘要
公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。
公钥密码是基于数学的上的困难问题来保证其机密性。
其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。
但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。
本文利用C语言编程技术进行了RSA算法的演示[1]。
关键词:C语言编程、RSA算法、应用数学。
RSA public key encryption algorithm
Abstract
Public 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公钥密码算法的基本理论知识 (3)
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)
附录 (141)
附录A 各函数C语言代码 (141)
第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所示。
图3-1 命令行中运行结果
第4章结果分析与讨论
RSA密码体制安全性
任何密码都没有绝对的安全性,RSA密码体制同样如此,但RSA密码经过了20年的考验,可以说,迄今为止,没有一种相对有效的方法去由公钥破解私钥,由公钥破解私钥等价于将公钥{E,N}中的N,分解为两个质数的积,从而算出私钥{D,N}。
将一个数有效分解为两个因子之积是数学上的一大难题,当N增大一位时,时间复杂度呈倍增长。
无论N有多长,总有一天能被质因数分解,1999年,512比特的整数由292台计算机花费5.2个月才完成。
RSA密码的优点与缺点
RSA算法理论非常简单,应用的数学原理,非常巧妙,但是其实现性不如对称密码容易。
RSA算法在实际过程中需要找到合适的p和q,得到一个合适的N,实际过程中,N有100位之多,甚至有1024位,但是如此之大的数给加密,解密都带来一定的困难,算法没有对称密码加密快[5]。
尽管如此,但是由于其相对较高的安全性使得其应用非常广泛。
于是出现了用硬件进行RSA算法计算,加快了处理速度[6]。
第5章结论
RSA密码算法在现在来说还是相当可靠的,因为迄今没有一个相当好的算法来分解一个大的整数。
此外,RSA算法可以和其他加密算法一起使用,或者用于数字签名。
通过不断的学习RSA算法的相关知识,完成了这篇论文,自身的知识有了很大的提高,了解了RSA算法的基本内容后,对其进行编程测试,自身的能力也有所提高。
致谢
数学文化课的学习即将结束,在此,我要感谢费祥历老师的教育之恩。
本文离不开梁玉环老师在C语言课程中的教育,在此表示忠心的感谢。
参考文献
[1] [日]结城浩,.图解密码技术[M].人民邮电出版社,2015.1.
[2] 周升力.RSA密码算法的研究与快速实现[J].
[3]百度百科.RSA算法_百度百科
./link?url=Dplx6jG5wOijYLjKRn_eu_fSu0NhGYMa-1QS5UnsC3 0mdDcJ1O5jwkDFYmj-UxFd15PtUF3TxQh4T76fpj6tWupv-bp-a7mO0KC9wcH01ZDQUQ51uG8J2 qrYvBZAZPbM
[4] 百度百科.欧拉定理_百度百科
./link?url=swLTWWnjw4aAyPFre6_Jsd9MqurjKXenfLyq6tjlm1 mRSsqImRSTqDHf6i6GJpRTRWz1DU9Ot44EdLgLU3vNhn60ye6W06oB3miIoPBdYrU5STBo3C2jU 4vbM3kFKfQq
[5] [日]结城浩.图解密码技术[M].人民邮电出版社,2015.1.
[6] 刘嘉勇.应用密码学.[M].清华大学出版社.
附录
附录A 相关函数
/*判断是否为质数*/
long int iszs(long int a)
{
long int b=0;
if(a<=1) /*函数入口检查*/ {
return 0;
}
for(b=sqrt(a)+1; b>=1; b--)
{
if(0==a%b) break;
}
if(1==b)
{
return 1;
}
else
{
return 0;
}
}
/*求两个数的公倍数L*/
long int lcm(int p,int q)
{
long int a=1,b=1,all=1;
if(q>0&&p>0)
{
if(p>q)
{
a=q;
}
else
{
a=p;
}
for(b=a; b>=2; b--)
{
if(p%b==0&&q%b==0) {
p=p/b;
q=q/b;
all=all*b;
}
}
all=all*p*q;
return all;
}
else
{
printf("ERROR in lcm!\n"); return 0;
}
}
/*判断是否互质*/
long int ishz(int p,int q)
{
long int c;
if(p>1&&q>1)
{
do
{
c=p%q;
p=q;
q=c;
}
while(c>1); if(q==1)
{
return 1; }
else
{
return 0; }
}
else
{
return 0;
}
}
/*求最互质数E*/
long int gcd(int L) {
long int a=2;
do
{
a++;
}
while(!(1==ishz(L,a))); return a;
}
/*由E和L求出密钥D*/
long int qiuD(int E, int L) {
long int D;
for(D=1; D<1000000; D++) {
if((D*E)%L==1)
{
return D;
}
}
return -1;
}
/*加密算法*/
long int Encryption(long int E,long int N,long int ming) {
long int mi=ming;
int i;
for(i=1; i<E; i++)
{
mi=(ming*mi)%N;
}
return mi;
}
/*解密算法*/
long int Decryption(long int D,long int N,long int mi) {
long int ming=mi;
long int i;
for(i=1; i<D; i++)
{
ming=(mi*ming)%N;
}
return ming;
}
对数学文化课程的建议
我对老师印象非常好,不过我自己认为数学之美的内容偏少,可以增加一些,让同学们了解更多数学美的内涵,并运用计算机技术发掘数学的美。
另外,可以线上线下同时学习,不过课时可能会增长很多,学生压力会增加。