RSA加密解密地设计与实现.docx
- 文档编号:28730350
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:23
- 大小:402.26KB
RSA加密解密地设计与实现.docx
《RSA加密解密地设计与实现.docx》由会员分享,可在线阅读,更多相关《RSA加密解密地设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。
RSA加密解密地设计与实现
上海电力学院
《应用密码学》课程设计
题 目:
RSA加密解密的设计与实现
院 系:
计算机科学与技术学院
专业年级:
2010级
学生姓名:
李正熹 学号:
20103273
指导教师:
田秀霞
2013年1月8日
1.设计要求
2.开发环境与工具
3.设计原理(算法工作原理)
4.系统功能描述与软件模块划分
5.设计核心代码
6.参考文献
7.设计结果及验证
8.软件使用说明
9.设计体会
附录
1.设计要求
1随机搜索大素数,随机生成公钥和私钥
2用公钥对任意长度的明文加密
3用私钥对密文解密
4界面简洁、交互操作性强
2.开发环境与工具
WindowsXP操作系统
MicrosoftVisualC++6.0
1.创建rsa工程
2.在rsa工程中创建20103273李正熹cpp文件
3.设计原理
RSA算法简介
公开密码算法与其他密码学完全不同,它是基于数学函数而不是基于替换或置换。
与使用一个密钥的对称算法不同,公开密钥算法是非对称的,并且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。
公开密钥算法有RSA、Elgamal等。
RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在1978年提出来的,并以他们的名字的有字母命名的。
RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是目前应用广泛的公钥密码体制。
RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。
并且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。
4.系统功能描述与软件模块划分
功能:
1.进行加密
加密
第一步,随机两个素数p和q,并求出n=p*q,然后再求出n的欧拉函数值phi。
第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d≡1(modphi),求出e的乘法逆元。
至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。
第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。
第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。
遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。
第五步,输出密文Ciphertext[MAXLENGTH]
2.进行解密
第一步,输入加密后的密文Ciphertext1[MAXLENGTH],输入以-1为结束标志
第二步,输入解密密钥[d,phi],对密文进行解密,结果保存在DecryptionText[MAXLENGTH]中。
第三步,输出解密后明文DecryptionText[MAXLENGTH]
生成随机素数:
先生成一个随机数然后判断它是否为素数从而输出
unsignedlongfoo()//生成随机数
intpanduan(unsignedlongb)//判断是否为素数
unsignedlongtiqu(unsignedlong&p,unsignedlong&q)//从随机素数中选取两个为p和q
求e时需要用到e与phi的互逆所以在随机产生e的同时需要作互逆判断若互逆则输出随机e否则重新生成e
intgcd(intx,inty)//判断两数是否为互素
在p、q、e都准备就绪的时候就可以进行加解密的运算因为考虑到溢出所以3个一组进行加解密
voidEncryption()//加密算法
voidDecryption()//解密算法
5.设计核心代码
unsignedlongfoo()
{
unsignedlongrandom=0;
srand((int)time(0));
random=rand()%300;
returnrandom;
}
srand函数是随机数发生器的初始化函数
需要提供一个种子这里使用time来获取系统当前时间
rand()%300是随机0-299的整数
//以下为加密算法
voidEncryption()
{//加密算法
cout<<"随机生成两个较大的素数:
"< tiqu(p,q); n=p*q;//求解n, phi=(p-1)*(q-1);//求解n的欧拉函数值 cout<<"n="< cout<<"请从[0,"< "; while (1) { e=foo(); if(gcd(e,phi)==1&&e>=100&&e<=300&&e! =q&&e! =p) break; } cout< floatd0; for(inti=1;;i++) {///求解乘法逆元e*d≡1(modphi) d0=(float)(phi*i+1)/e; if(d0-(int)d0==0) break; } d=(int)d0; cout< cout<<"e="< cout<<"公开密钥Pk={e,n}={"< cout<<"秘密密钥Sk={d,n}={"< cout< cout<<"请3位一组输入要加密的正整数(以-1结束): "< cout<<"加密前的明文为: "; for(i=0;i Ciphertext[i]=1; intcount; for(intj=0;j { cin>>clear[j]; if(clear[j]==-1) break; count=e; while(count>0) {//对明文进行加密Ciphertext=(clear)^emodn Ciphertext[j]=(Ciphertext[j]*clear[j])%n; //加密算法 count--; } } cout<<"密文为: "; size=j;//实际密文长度 for(intk=0;k cout< cout< } //以下为解密算法 voidDecryption() {//解密算法 intpp,kk; for(inti=0;i DecryptionText[i]=1; intcount; cout<<"请输入要解密的密文(以-1结束): "< for(intu=0;u { cin>>Ciphertext1[u]; if(Ciphertext1[u]==-1) break; } cout<<"输入密钥解密(d,n)"< cin>>pp>>kk; for(intj=0;j { count=pp; while(count>0) {//对密文进行解密DecryptionText=(Ciphertext)^d(modn) DecryptionText[j]=((DecryptionText[j]*Ciphertext1[j])%kk); count--; } } cout<<"解密后的明文为: "; for(intk=0;k cout< cout< } 6.参考文献 [1]赛迪网.RSA2010: 云安全需急迫解决的安全隐患.旧金山: 赛迪网,2010. [2]赛迪网.RSA主席认为云安全成2010安全领域趋势.旧金山: 赛迪网,2010. [3]魏晨.安全风向标: 品味RSA2012信息安全大会.旧金山: 赛迪网,2012. [4]四夕.新的安全威胁而前需要新的安全架构.旧金山: 赛迪网,2012. [5]王茜.倪建伟,一种基于RSA的加密算法.重庆大学学报,2005,28 (1): 68-72. [6]周升力.RSA密码算法的研究与改进实现.现代计算机,2008: 51-53. [7]管占明.邓亚娟.RSA加密算法的研究及应用.科技广场,2009: 98-99. [8]胡向东,魏琴芳等.应用密码学.北京市: 电子工业出版社,2008: 114-119. [9]卢开澄.计算机密码学.北京市: 清华大学出版社,2002: 73-77 [10]史予荣.软件加密技术从入门到精通,北京市: 清华大学出版社.2007: 74-77. 7.设计结果及验证 进行加密 得到公钥(113,11021)和私钥(2105,11021) 加密明文12358711456189 得到密文14533857882632948732744 输入密文解密 得到先前加密的明文12358711456189 8.软件使用说明 1.选择RSA加解密系统功能 1为加密2为解密0为退出输入其他错误重新输入 2.输入1进行加密过程 输入需要加密的明文3个一组空格空开-1结束 生成密文并且返回主界面 2.输入2进行解密 输入加密好的密文-1结束 输入密钥dn 解密得到加密前明文 解密成功返回主界面 9.设计体会 RSA课程设计中,包含了加解密的过程,刚开始对做设计的时候,觉得对于RSA的加解密只要套用公式就可以很方便地进行,实现并不是非常困难。 但是在真正实现的时候还是碰到了不少的问题,在随机产生素数的时候,不同的实现方法会具有不同的复杂度,从而使得时间效率也有所不同,若直接生成素数,系统需要很长一段时间来生成,而随机生成一个数后再判断是否为素数可以减少很多时间,效率也就提高了。 在加解密的时候,起初使用的是int型的整形变量,但是发现int型只有4位长度8字节,所以在计算时,数字一大就会产生溢出,所以使用了数组进行了加解密。 而在大素数生成时,可以生成非常大的素数,但是在加密时,因为程序效率过于低以至于一天都没有算出结果,所以在实现时使用了可进行运算和实现较大的素数而并不是大素数。 随机大素数进行RSA加解密的程序还需要时间进行进一步改进。 需要进一步调用大整数的加减乘除算法,素数明文密文密钥公钥都要使用数组才能加以实现,在此暂时保留这个程序,将用更充分的时间来实现。 总结这次课程设计,不可否定又是一次对于自己编程能力的提升以及团队合作的加深,自己动手编程真的是一种成就感,然而在这以外,我还发现了自己会有一些突发奇想的思路,会发现和挖掘实现实验时某些过程的优化,而这些思路又可以帮助自己来完成程序。 这次课程设计的不足是还没有完全完成课程设计所需要的任务要求,写的程序还是略微有点简单化了,可能自己能力还是有限,在静候的时间里还需要更加的磨练才行。 附录 #include #include #include #include usingnamespacestd; #defineMAXLENGTH500//明文最大长度,即所允许最大整数个数 intsize=0;//保存要进行加密的正整数的个数 unsignedlongp,q;//两个大素数 intn,phi;//n=p*q,phi=(p-1)*(q-1)是n的欧拉函数值 inte;//{e,n}为公开密钥 intd;//{d,n}为秘密密钥 longclear[MAXLENGTH],Ciphertext[MAXLENGTH],Ciphertext1[MAXLENGTH];//分别用于存放加//密前的明//文和加密后的密文 longDecryptionText[MAXLENGTH];//存放解密后的明文 //////////////////////////////////////////////////////////// unsignedlongfoo() { unsignedlongrandom=0; srand((int)time(0)); random=rand()%300; returnrandom; } intpanduan(unsignedlongb) { intflag=1; if(flag) { for(unsignedlongj=2;j<=sqrt(b);j++) { if(b%j==0) { flag=0; //cout< "< } } } if(flag) { return1; } elsereturn0; } unsignedlongtiqu(unsignedlong&p,unsignedlong&q) { label: while (1) { p=foo(); if(panduan(p)&&p>100&&p<300) { //cout<<"p="< break; } } while (1) { q=foo(); if(panduan(q)&&q>100&&q<300) { //cout<<"q="< break; } } if(p! =q) { cout<<"p="< cout<<"q="< } elsegotolabel; return0; } intgcd(intx,inty) { intt; while(y) { t=x; x=y; y=t%y; } returnx; } //以下为加密算法 voidEncryption() {//加密算法 cout<<"随机生成两个较大的素数: "< tiqu(p,q); n=p*q;//求解n, phi=(p-1)*(q-1);//求解n的欧拉函数值 cout<<"n="< cout<<"请从[0,"< "; while (1) { e=foo(); if(gcd(e,phi)==1&&e>=100&&e<=300&&e! =q&&e! =p) break; } cout< floatd0; for(inti=1;;i++) {///求解乘法逆元e*d≡1(modphi) d0=(float)(phi*i+1)/e; if(d0-(int)d0==0) break; } d=(int)d0; cout< cout<<"e="< cout<<"公开密钥Pk={e,n}={"< cout<<"秘密密钥Sk={d,n}={"< cout< cout<<"请3位一组输入要加密的正整数(以-1结束): "< cout<<"加密前的明文为: "; for(i=0;i Ciphertext[i]=1; intcount; for(intj=0;j { cin>>clear[j]; if(clear[j]==-1) break; count=e; while(count>0) {//对明文进行加密Ciphertext=(clear)^emodn Ciphertext[j]=(Ciphertext[j]*clear[j])%n; //加密算法 count--; } } cout<<"密文为: "; size=j;//实际密文长度 for(intk=0;k cout< cout< } ////////////////////////////////////////////////////////////// //以下为解密算法 voidDecryption() {//解密算法 intpp,kk; for(inti=0;i DecryptionText[i]=1; intcount; cout<<"请输入要解密的密文(以-1结束): "< for(intu=0;u { cin>>Ciphertext1[u]; if(Ciphertext1[u]==-1) break; } cout<<"输入密钥解密(d,n)"< cin>>pp>>kk; for(intj=0;j { count=pp; while(count>0) {//对密文进行解密DecryptionText=(Ciphertext)^d(modn) DecryptionText[j]=((DecryptionText[j]*Ciphertext1[j])%kk); count--; } } cout<<"解密后的明文为: "; for(intk=0;k cout< cout< } voidmain() { intsign=1; intchioce=0; while(sign==1) { cout<<"——————————————————"< cout<<"RSA加解密系统"< cout<<"由李正熹李鑫共同完成"< cout<<"1.进行加密"< cout<<"2.进行解密"< cout<<"0.退出系统"< cout<<"——————————————————"< cout<<"请输入! "< intchoice; cin>>chioce; switch(chioce) { case1: Encryption(); break; case2: Decryption(); break; case0: sign=0; break; default: cout<<"输出错误重新输入"< } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RSA 加密 解密 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)