RSA加密解密的设计与实现Word格式.docx
- 文档编号:17687648
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:20
- 大小:403.44KB
RSA加密解密的设计与实现Word格式.docx
《RSA加密解密的设计与实现Word格式.docx》由会员分享,可在线阅读,更多相关《RSA加密解密的设计与实现Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
1.创建rsa工程
2.在rsa工程中创建20XX3273李正熹cpp文件
3.设计原理
RSA算法介绍
公开密码算法和其它密码学完全不一样,它是基于数学函数而不是基于替换或置换。
和使用一个密钥对称算法不一样,公开密钥算法是非对称,而且它使用是两个密钥,包含用于加密公钥和用于解密私钥。
公开密钥算法有RSA、Elgamal等。
RSA公钥密码算法是由美国麻省理工学院(MIT)Rivest,Shamir和Adleman在1978年提出来,并以她们名字有字母命名。
RSA是第一个安全、实用公钥密码算法,已经成为公钥密码国际标准,是现在应用广泛公钥密码体制。
RSA基础是数论Euler定理,其安全性基于二大整数因子分解问题困难性,公私钥是一对大素数函数。
而且该算法已经经受住了多年深入密码分析,即使密码分析者既不能证实也不能否定RSA安全性,但这不恰恰说明该算法有其一定可信度。
功效:
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()//解密算法
unsignedlongfoo()
{
unsignedlongrandom=0;
srand((int)time(0));
random=rand()%300;
returnrandom;
}
srand函数是随机数发生器初始化函数
需要提供一个种子这里使用time来获取系统目前时间
rand()%300是随机0-299整数
//以下为加密算法
voidEncryption()
{//加密算法
cout<
<
"
随机生成两个较大素数:
"
endl;
tiqu(p,q);
n=p*q;
//求解n,
phi=(p-1)*(q-1);
//求解n欧拉函数值
n="
<
n<
phi="
phi<
endl;
请从[0,"
phi-1<
]中选择一个和"
随机生成互素数e:
;
while
(1)
{
e=foo();
if(gcd(e,phi)==1&
&
e>
=100&
e<
=300&
e!
=q&
=p)
break;
}
cout<
endl;
floatd0;
for(inti=1;
;
i++)
{///求解乘法逆元e*d≡1(modphi)
d0=(float)(phi*i+1)/e;
if(d0-(int)d0==0)
d=(int)d0;
e="
e<
d="
d<
公开密钥Pk={e,n}={"
"
}"
秘密密钥Sk={d,n}={"
统计私钥"
请3位一组输入要加密正整数(以-1结束):
加密前明文为:
for(i=0;
i<
MAXLENGTH;
Ciphertext[i]=1;
intcount;
for(intj=0;
j<
MAXLENGTH;
j++)
cin>
>
clear[j];
if(clear[j]==-1)
count=e;
while(count>
0)
{//对明文进行加密Ciphertext=(clear)^emodn
Ciphertext[j]=(Ciphertext[j]*clear[j])%n;
//加密算法
count--;
}
密文为:
size=j;
//实际密文长度
for(intk=0;
k<
j;
k++)
cout<
Ciphertext[k]<
endl;
//以下为解密算法
voidDecryption()
{//解密算法
intpp,kk;
for(inti=0;
DecryptionText[i]=1;
请输入要解密密文(以-1结束):
for(intu=0;
u<
u++)
Ciphertext1[u];
if(Ciphertext1[u]==-1)
输入密钥解密(d,n)"
cin>
pp>
kk;
j<
size;
count=pp;
{//对密文进行解密DecryptionText=(Ciphertext)^d(modn)
DecryptionText[j]=((DecryptionText[j]*Ciphertext1[j])%kk);
解密后明文为:
for(intk=0;
k<
DecryptionText[k]<
[1]赛迪网.RSA20XX:
云安全需紧迫处理安全隐患.旧金山:
赛迪网,20XX.
[2]赛迪网.RSA主席认为云安全成20XX安全领域趋势.旧金山:
[3]魏晨.安全风向标:
品味RSA20XX信息安全大会.旧金山:
[4]四夕.新安全威胁而前需要新安全架构.旧金山:
[5]王茜.倪建伟,一个基于RSA加密算法.重庆大学学报,20XX,28
(1):
68-72.
[6]周升力.RSA密码算法研究和改善实现.现代计算机,20XX:
51-53.
[7]管占明.邓亚娟.RSA加密算法研究及应用.科技广场,20XX:
98-99.
[8]胡向东,魏琴芳等.应用密码学.北京市:
电子工业出版社,20XX:
114-119.
[9]卢开澄.计算机密码学.北京市:
清华大学出版社,20XX:
73-77
[10]史予荣.软件加密技术从入门到精通,北京市:
清华大学出版社.20XX:
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<
iostream>
ctime>
cstdlib>
cmath>
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];
//存放解密后明文
////////////////////////////////////////////////////////////
intpanduan(unsignedlongb)
{
intflag=1;
if(flag)
{
for(unsignedlongj=2;
j<
=sqrt(b);
j++)
{
if(b%j==0)
{
flag=0;
//cout<
b<
bu是素数!
}
}
if(flag)
return1;
elsereturn0;
}
q)
label:
p=foo();
if(panduan(p)&
p>
100&
p<
300)
//cout<
p="
'
\t'
q=foo();
if(panduan(q)&
q>
q<
q="
if(p!
=q)
cout<
elsegotolabel;
return0;
intgcd(intx,inty)
intt;
while(y)
t=x;
x=y;
y=t%y;
returnx;
//////////////////////////////////////////////////////////////
voidmain()
intsign=1;
intchioce=0;
while(sign==1)
{
——————————————————"
RSA加解密系统"
由李正熹李鑫共同完成"
1.进行加密"
2.进行解密"
0.退出系统"
请输入!
intchoice;
chioce;
switch(chioce)
case1:
Encryption();
case2:
Decryption();
case0:
sign=0;
default:
cout<
输犯错误重新输入"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RSA 加密 解密 设计 实现