rsa算法实验心得.docx
《rsa算法实验心得.docx》由会员分享,可在线阅读,更多相关《rsa算法实验心得.docx(8页珍藏版)》请在冰豆网上搜索。
![rsa算法实验心得.docx](https://file1.bdocx.com/fileroot1/2022-11/28/7d3e8d54-6af3-4d7d-ba0c-6af4e3a3a7a1/7d3e8d54-6af3-4d7d-ba0c-6af4e3a3a7a11.gif)
rsa算法实验心得
竭诚为您提供优质文档/双击可除
rsa算法实验心得
篇一:
RsA算法实验报告
实验报告
姓名:
xxxxxxxxx学号:
0xxxxx班级:
xxxxxxxxx日期:
20XX/12/*
题目:
RsA算法实验
一、实验环境
1.硬件配置:
处理器:
Inter(R)core(Tm)i5-2430mcpu@2.40ghz(4cpus),~2.4ghz内存:
2048mbRAm
2.使用软件:
(1)操作系统:
win7旗舰版
(2)软件工具:
microsoftVisualc++6.0
二、实验涉及的相关概念或基本原理
它是第一个既能用于数据加密也能用于数字签名的算法。
算法的名字以发明者的名字命名:
RonRivest,Adishamir和LeonardAdleman。
但RsA的安全性一直未能得到理论上的证明。
它经历了各种攻击,至今未被完全攻破。
RsA的安全性依赖于大数分解。
公钥和私钥都是两个大素数(大于100个十进制位)的函数。
从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
密钥对的产生。
选择两个大素数,p和q。
计算:
n=p*q
然后随机选择加密密钥e,要求e和(p-1)*(q-1)互质。
最后,利用euclid算法计算解密密钥d,满足
e*d=1(mod(p-1)*(q-1))
其中n和d也要互质。
数e和n是公钥,d是私钥。
两个素数p和q不再需要,应该丢弃,不要让任何人知道。
加密信息m(二进制表示)时,首先把m分成等长数据块m1,m2,...,mi,块长s,其中 大。
对应的密文是:
ci=mi^e(modn)(a)
解密时作如下计算:
mi=ci^d(modn)(b)
RsA可用于数字签名,方案是用(a)式签名,(b)式验证。
具体操作时考虑到安全性和m信息量较大等因素,一般是先作hAsh运算。
RsA的安全性。
RsA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RsA就一定需要作大数分解。
假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。
目前,RsA的一些变种算法已被证明等价于大数分解。
不管怎样,分解n是最显然的攻击方法。
现在,人们已能分解多个十进制位的大素数。
因此,模数n必须选大一些,因具体适用情况而定。
RsA的速度。
由于进行的都是大数计算,使得RsA最快的情况也比Des慢上倍,无论是软件还是硬件实现。
速度一直是RsA的缺陷。
一般来说只用于少量数据加密。
RsA的选择密文攻击。
RsA在选择密文攻击面前很脆弱。
一般攻击者是将某一信息作一下伪装(blind),
让拥
有私钥的实体签署。
然后,经过计算就可得到它所想要的信息。
实际上,攻击利用的都是同一个弱点,即存在这样一个事实:
乘幂保留了输入的乘法结构:
(xm)^d=x^d*m^dmodn
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。
但从算法上无法解决这一问题,主要措施有两条:
一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用one-wayhashFunction对文档作hAsh处理,或同时使用不同的签名算法。
在中提到了几种不同类型的攻击方法。
RsA的公共模数攻击。
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。
最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。
设p为信息明文,两个加密密钥为e1和e2,公共模数是n,则:
c1=p^e1modn
c2=p^e2modn
密码分析者知道n、e1、e2、c1和c2,就能得到p。
因为e1和e2互质,故用euclidean算法能找到r和s,满足:
r*e1+s*e2=1
假设r为负数,需再用euclidean算法计算c1^(-1),则
(c1^(-1))^(-r)*c2^s=pmodn
另外,还有其它几种利用公共模数攻击的方法。
总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。
解决办法只有一个,那就是不要共享模数n。
RsA的小指数攻击。
有一种提高RsA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。
但这样作是不安全的,对付办法就是e和d都取较大的值。
三、实验内容
主要的方法:
(1)、publicstaticvoidgetprime()
方法名称:
产生大数的方法。
说明:
利用Java语言的中的java.math.bigInteger类的方法中随机产生大数。
(2)、publicstaticbooleanmillerRobin(bigIntegernum)
方法名称:
判断是否是素数的方法。
参数说明:
num是由getprime方法产生的大数。
说明:
这个方法判断getprime方法传过来的是否是一个素数,是就返回true,否就返回false。
(3)、publicstaticbigIntegerpowmod(bigIntegera,bigIntegert,bigIntegernum)
方法名称:
大数的幂运算方法。
说明:
这个方法对传入的大数进行幂运算。
(4)、publicstaticbigIntegerinvmod(bigIntegera,bigIntegerb)
方法名称:
大数的取模运算方法。
说明:
这个方法对大数进行取模运算。
(5)、publicstaticstringencode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,
bigIntegern,intnLen,intm,JTextFieldd)
方法名称:
加密算法。
参数说明:
instr是从界面输入的明文。
primep和primeQ是由getprime方法产生的两个大素数。
n是由primep和primeQ得到的值。
nLen为n的长度。
d为公钥。
(6)、publicstaticstringDecode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,bigIntegern,intnLen,intm,JTextFielde)
方法名称:
解密算法。
参数说明:
instr是从界面输入的明文。
primep和primeQ是由getprime方法产生的两个大素数。
n是由primep和primeQ得到的值。
nLen为n的长度。
e为私钥。
流程图:
RsA公钥加密算法流程图:
RsA私钥解密算法流程图:
篇二:
RsA算法实验报告
实验二非对称密码算法RsA
一、实验目的
通过实际编程了解非对称密码算法RsA的加密和解密过程,加深对非对称密码算法的认识。
二、实验环境
运行windows或Linux操作系统的pc机,具有JDK1.6版本的Java语言编译环境。
三、实验内容和步骤
1.对RsA算法的理解
RsA算法(公开密钥算法)的原理:
(1).选择两个大的素数p和q(典型情况下为1024位)
(2).计算n=p*q和z=(p-1)*(q-1).
(3).选择一个与z互素的数,将它称为d
(4).找到e,使其满足e*d=1modz
提前计算出这些参数以后,我们就可以开始执行加密了。
首先将明文分成块,使得每个明文消息p落在间隔0*p 为了加密一个消息p,只要计算c=p^e(modn)即可。
为了解密c,只要计算p=c^d(modn)即可。
可以证明,对于指定范围内的所有p,加密盒解密互为反函数。
为了执行加密,你需要e和n;为了执行解密,你需要d和n。
因此,公钥是有(e,n)对组成,而私钥是有(d,n)对组成。
实例:
根据已知参数:
p=3,q=11,m=2,计算公私钥,并对明文进行加密,然后对密文进行解密。
由题意知:
n=p*q=33,z=(p-1)*(q-1)=20,选d=7,
计算得e=3,所以
c=m^e(modn)=8
m=c^d(modn)=2
2、RsA算法与Des算法的比较:
运行附件的RsATool,输入一大段文字,记录运行时间。
再使用Des算法加密相同的文字,记录运行时间,对比这两个时间发现,RsA算法比Des算法慢很多,因为RsA算法进行的是大数运算,所以程序运行的速度比Des慢很多。
因此RsA算法只适合于少量数据加密,不适合于大量数据加密。
3、算法设计
主要的方法:
(1)、publicstaticvoidgetprime()
方法名称:
产生大数的方法。
说明:
利用Java语言的中的java.math.bigInteger类的方法中随机产生大数。
(2)、publicstaticbooleanmillerRobin(bigIntegernum)
方法名称:
判断是否是素数的方法。
参数说明:
num是由getprime方法产生的大数。
说明:
这个方法判断getprime方法传过来的是否是一个素数,是就返回true,
否就返回false。
(3)、publicstaticbigIntegerpowmod(bigIntegera,bigIntegert,bigIntegernum)方法名称:
大数的幂运算方法。
说明:
这个方法对传入的大数进行幂运算。
(4)、publicstaticbigIntegerinvmod(bigIntegera,bigIntegerb)
方法名称:
大数的取模运算方法。
说明:
这个方法对大数进行取模运算。
(5)、publicstaticstringencode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,bigIntegern,intnLen,intm,JTextFieldd)
方法名称:
加密算法。
参数说明:
instr是从界面输入的明文。
primep和primeQ是由getprime方法产生的两个大素数。
n是由primep和primeQ得到的值。
nLen为n的长度。
d为公钥。
(6)、publicstaticstringDecode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,bigIntegern,intnLen,intm,JTextFielde)方法名称:
解密算法。
参数说明:
instr是从界面输入的明文。
primep和primeQ是由getprime方法产生的两个大素数。
n是由primep和primeQ得到的值。
nLen为n的长度。
e为私钥。
4、源程序:
(RsA1.java文件)
importjavax.swing.*;
importjava.awt.event.*;
importjava.math.*;
importjava.util.*;
importjava.awt.*;
importjava.io.*;
publicclassRsA1{
publicstaticvoidmain(string[]args)
{
myFrameframe=newmyFrame();
mypanel_fbuttonpanel_fbutton=newmypanel_fbutton(frame,frame.p,frame.Q,frame.d,frame.e);
FlowLayoutfl=newFlowLayout(FlowLayout.cenTeR,0,0);
frame.setLayout(fl);
frame.add(panel_fbutton);
frame.setbounds(150,100,500,480);
frame.setDefaultcloseoperation(JFrame.exIT_on_cLose);
frame.setVisible(true);
}
}
classmyFrameextendsJFrame
{
publicmyFrame()
{
setTitle("RsA算法");
add(wel);
mypanel_ppanel_p=newmypanel_p(p);
add(panel_p);
mypanel_qpanel_q=newmypanel_q(Q);
add(panel_q);
mypanel_dpanel_d=newmypanel_d(d);
add(panel_d);
mypanel_epanel_e=newmypanel_e(e);
add(panel_e);
mypanel_inpanel_in=newmypanel_in(input);
add(panel_in);
mypanel_outpanel_out=newmypanel_out(output);
add(panel_out);
mypanel_out1panel_out1=newmypanel_out1(output1);
add(panel_out1);
mypanel_buttonpanel_button=newmypanel_button(p,Q,d,e,input,output,output1);add(panel_button);
}
privateJLabelwel=newJLabel("RsA算法演示");protectedJTextFieldp=newJTextField(35);
protectedJTextFieldQ=newJTextField(35);
protectedJTextFieldd=newJTextField(35);
protectedJTextFielde=newJTextField(35);
protectedJTextAreainput=newJTextArea(4,35);
protectedJTextAreaoutput=newJTextArea(4,35);
protectedJTextAreaoutput1=newJTextArea(4,35);
}
classmypanel_fbuttonextendsJpanel
{
publicmypanel_fbutton(Frameaframe,JTextFieldap,JTextFieldaQ,JTextFieldad,JTextFieldae)
{
frame=aframe;
p=ap;
Q=aQ;
e=ae;
d=ad;
}
privateFrameframe;
privateJTextFieldp;
privateJTextFieldQ;
privateJTextFieldd;
privateJTextFielde;
}
classmypanel_pextendsJpanel
{
publicmypanel_p(JTextFieldap)
{
p=ap;
add(newJLabel("
add(p);
}
privateJTextFieldp;
}
classmypanel_qextendsJpanel
{
publicmypanel_q(JTextFieldaQ)
{
Q=aQ;
add(newJLabel("
add(Q);
}
privateJTextFieldQ;
}
classmypanel_dextendsJpanel
{
publicmypanel_d(JTextFieldad)
{
质数p:
"));质数Q:
"));
d=ad;
add(newJLabel("公钥:
"));add(d);
}
privateJTextFieldd;
}
classm(:
rsa算法实验心得)ypanel_eextendsJpanel
{
publicmypanel_e(JTextFieldae)
{
e=ae;
add(newJLabel("私钥:
"));add(e);
}
privateJTextFielde;
}
classmypanel_inextendsJpanel
{
publicmypanel_in(JTextAreaainput)
{
input=ainput;
add(newJLabel("输入明文:
"));
Jscrollpanejsp1=newJscrollpane(input,v,h);add(jsp1);
}
privateJTextAreainput;
intv=Jscrollpane.VeRTIcAL_scRoLLbAR_As_neeDeD;inth=Jscrollpane.hoRIZonTAL_scRoLLbAR_As_neeDeD;}
classmypanel_outextendsJpanel
{
publicmypanel_out(JTextAreaaoutput)
{
output=aoutput;
add(newJLabel("生成的密文:
"));
Jscrollpanejsp=newJscrollpane(output,v,h);add(jsp);
}
privateJTextAreaoutput;
intv=Jscrollpane.VeRTIcAL_scRoLLbAR_As_neeDeD;inth=Jscrollpane.hoRIZonTAL_scRoLLbAR_neVeR;}
classmypanel_out1extendsJpanel
{
篇三:
RsA算法的实现实验报告
RsA算法的实现
一、实验目的
1.熟悉公钥密码体制;
2.掌握产生密钥对的程序设计方法;3.掌握产生加密/解密的程序设计方法。
二、实验内容和要求
1.进行RsA加密/解密算法的设计;2.对RsA程序进行编译和调试;3.使用编写的程序进行加密和解密。
三、实验环境
运行windows操作系统的pc机,可以利用具有Vc++语言环境;如果所运用的语言是JAVA,那么也可以利用JAVA语言环境来实现RsA算法的加密和解密。
四、实验步骤
1.采用c++语言进行本次实验的编写,实验的代码如下:
#include#include
intcandp(inta,intb,intc){intr=1;b=b+1;while(b!
=1){
r=r*a;r=r%c;b--;}
printf("%d\n",r);returnr;}
voidmain(){
intp,q,e,d,m,n,t,c,r;chars;
printf("pleaseinputthep,q:
");scanf("%d%d",n=p*q;
printf("thenis%3d\n",n);t=(p-1)*(q-1);
printf("thetis%3d\n",t);printf("pleaseinputthee:
");scanf("%d",if(et){
printf("eiserror,pleaseinputagain:
");scanf("%d",}d=1;
while(((e*d)%t)!
=1)d++;
printf("thencaculateoutthatthedis%d\n",d);printf("thecipherpleaseinput1\n");printf("theplainpleaseinput2\n");scanf("%d",switch(r){
case1:
printf("inputthem:
");/*输入要加密的明文数字*/scanf("%d",c=candp(m,e,n);
printf("thecipheris%d\n",c);break;
case2:
printf("inputthec:
");/*输入要解密的密文数字*/scanf("%d",
m=candp(c,d,n);
printf("thecipheris%d\n",m);break;}getch();}
2、代码的思想:
首先随意输入两个素数p和q,然后利用算法计算出p*q即n,再算出(p-1)*(q-1)即t,并且同时输出计算的结果n和t,接下来输入e,经过算法可以计算出d,由此可以知道RsA算法的公钥和私钥;接下来可以有两个选择:
一选择输入明文,有明文经过算法可以计算出密文;二输入密文,有密文经过算法可以计算出明文。
3、运行以上代码就可以得到实验的结果。
五、实验结果
实验结果如下图所示:
六、实验心得:
通过这次的实验,了解了非对称密码算法RsA,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。
在以后所涉及这方面的知识将会有全新的了解和掌握。
实验报告
姓名:
刘新平专业:
互联网班级:
10-03班学号:
5410120XX313