rsa算法实验心得文档格式.docx

上传人:b****5 文档编号:17171027 上传时间:2022-11-28 格式:DOCX 页数:8 大小:20.63KB
下载 相关 举报
rsa算法实验心得文档格式.docx_第1页
第1页 / 共8页
rsa算法实验心得文档格式.docx_第2页
第2页 / 共8页
rsa算法实验心得文档格式.docx_第3页
第3页 / 共8页
rsa算法实验心得文档格式.docx_第4页
第4页 / 共8页
rsa算法实验心得文档格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

rsa算法实验心得文档格式.docx

《rsa算法实验心得文档格式.docx》由会员分享,可在线阅读,更多相关《rsa算法实验心得文档格式.docx(8页珍藏版)》请在冰豆网上搜索。

rsa算法实验心得文档格式.docx

  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

  

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

当前位置:首页 > 小学教育 > 数学

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

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