RSA加密解密地设计与实现.docx

上传人:b****5 文档编号:28730350 上传时间:2023-07-19 格式:DOCX 页数:23 大小:402.26KB
下载 相关 举报
RSA加密解密地设计与实现.docx_第1页
第1页 / 共23页
RSA加密解密地设计与实现.docx_第2页
第2页 / 共23页
RSA加密解密地设计与实现.docx_第3页
第3页 / 共23页
RSA加密解密地设计与实现.docx_第4页
第4页 / 共23页
RSA加密解密地设计与实现.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

RSA加密解密地设计与实现.docx

《RSA加密解密地设计与实现.docx》由会员分享,可在线阅读,更多相关《RSA加密解密地设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。

RSA加密解密地设计与实现.docx

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<<"输出错误重新输入"<

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1