rsa算法实验心得文档格式.docx
- 文档编号:17171027
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:8
- 大小:20.63KB
rsa算法实验心得文档格式.docx
《rsa算法实验心得文档格式.docx》由会员分享,可在线阅读,更多相关《rsa算法实验心得文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
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)
解密算法。
primep和primeQ是由getprime方法产生的两个大素数。
n是由primep和primeQ得到的值。
nLen为n的长度。
e为私钥。
流程图:
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、算法设计
这个方法判断getprime方法传过来的是否是一个素数,是就返回true,
否就返回false。
(3)、publicstaticbigIntegerpowmod(bigIntegera,bigIntegert,bigIntegernum)方法名称:
(5)、publicstaticstringencode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,bigIntegern,intnLen,intm,JTextFieldd)
(6)、publicstaticstringDecode(stringinstr,bigIntegerprimep,bigIntegerprimeQ,bigIntegern,intnLen,intm,JTextFielde)方法名称:
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)
add(newJLabel("
add(p);
classmypanel_qextendsJpanel
publicmypanel_q(JTextFieldaQ)
add(Q);
classmypanel_dextendsJpanel
publicmypanel_d(JTextFieldad)
质数p:
"
));
质数Q:
公钥:
add(d);
classm(:
rsa算法实验心得)ypanel_eextendsJpanel
publicmypanel_e(JTextFieldae)
私钥:
add(e);
classmypanel_inextendsJpanel
publicmypanel_in(JTextAreaainput)
input=ainput;
输入明文:
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;
生成的密文:
Jscrollpanejsp=newJscrollpane(output,v,h);
add(jsp);
privateJTextAreaoutput;
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;
pleaseinputthep,q:
scanf("
%d%d"
n=p*q;
thenis%3d\n"
n);
t=(p-1)*(q-1);
thetis%3d\n"
t);
printf("
pleaseinputthee:
%d"
if(et){
eiserror,pleaseinputagain:
}d=1;
while(((e*d)%t)!
=1)d++;
thencaculateoutthatthedis%d\n"
d);
thecipherpleaseinput1\n"
theplainpleaseinput2\n"
switch(r){
case1:
inputthem:
/*输入要加密的明文数字*/scanf("
c=candp(m,e,n);
thecipheris%d\n"
c);
break;
case2:
inputthec:
/*输入要解密的密文数字*/scanf("
m=candp(c,d,n);
m);
}getch();
2、代码的思想:
首先随意输入两个素数p和q,然后利用算法计算出p*q即n,再算出(p-1)*(q-1)即t,并且同时输出计算的结果n和t,接下来输入e,经过算法可以计算出d,由此可以知道RsA算法的公钥和私钥;
接下来可以有两个选择:
一选择输入明文,有明文经过算法可以计算出密文;
二输入密文,有密文经过算法可以计算出明文。
3、运行以上代码就可以得到实验的结果。
五、实验结果
实验结果如下图所示:
六、实验心得:
通过这次的实验,了解了非对称密码算法RsA,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。
在以后所涉及这方面的知识将会有全新的了解和掌握。
刘新平专业:
互联网班级:
10-03班学号:
5410120XX313
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- rsa 算法 实验 心得