RSA实验报告

一实验目的1.了解非对称加密机制2.理解RSA算法的加解密原理3.熟悉Java的学习以及运用Java实现RSA算法的加解密过程二实验背景在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。

加密算法E和解密算法D也都是公开的。

虽然秘密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。

为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

这就使加密的计算量很大。

为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。

对方收到信息后,用不同的密钥解密并可核对信息摘要。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

RSA是被研究得最广泛的公钥算法,从提出到现在的这么多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

三实验原理1.非对称密钥加解密概述使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥。

这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,这时网络中将需要n(n-1)/2个密钥(其中,每个用户都需要保存n-1个密钥),这样巨大的密钥量给密钥分配和管理带来了极大的困难。

另外,随着计算机网络,特别是因特网的发展,网络上互不相识的用户可能需要进行保密的会话(例如,如果用户在进行电子商务活动时,需要保密的连接,这时的客户对象可能根本不是固定的对象)。

最后,对称密钥加密机制难以解决签名验证问题。

非对称密钥加密也称为公开密钥加密,或者叫做公钥加密算法。

使用公开密钥密码的每一个用户都分别拥有两个密钥:加密密钥和解密密钥,它们两者并不相同,并且由加密密钥得到解密密钥在计算机上是不可行的。

每一个用户的加密密钥都是公开的。

因此,加密密钥也称为公开密钥。

所有用户的公开密钥都将记录在作用类似于电话号码薄的密钥本上,而它可以被所有用户访问,这样每一个用户都可以得到其他所有用户的公开密钥。

同时,每一个用户的解密密钥将由用户保存并严格保密。

因此,解密密钥也称为私有密钥。

非对称密码算法解决了对称密码体制中密钥管理的难题,并提供了对信息发送人的身份进行验证的手段,是现代密码学最重要的发明。

公钥加密算法一般是将对密钥的求解转化为对数学上的困难问题的求解,例如RSA算法的安全性是建立在“大数分解和素性检测”这个数论难题的基础上,已知两个大素数a和b,求出a*b是容易计算的,而已知a*b,想知道其是哪两个大素数的乘积目前还没有好的计算方法,另外也有一些非对称加密算法(如ELGamal算法)的安全性是基于求“离散对数”这个数学难题上的。

在公钥密码系统中每个实体都有自己的公钥和相应的私钥。

公钥密码系统的加密变换和解密变换分别用E和D表示。

任何实体B要向实体A发送信息m的步骤如下:实体B首先获得实体A的真实公钥的拷贝(eA),实体B使用eA计算密文c=E(m)并发送给实体A,实体A使用自己的私钥dA,计算m=D(c)解密密文,恢复出明文m。

这里公钥不需要保密,但要保证它的真实性,即eA确实是实体A掌握的私钥dA所对应的公钥。

提供真实的公钥比安全地分配密钥实现起来要容易得多。

这也是公钥密码系统的主要优点之一。

公钥密码系统的主要目的是提供保密性,它不能提供数据源认证(data origin authentication)和数据完整性(data integrity)。

数据源认证是指:指定的数据是在以前的某个时间确实是由真正的源创建的。

数据完整性是指:真正的源创建该数据后经过传输后存储没有发生改变。

数据源认证和数据完整性要由其他技术来提供(如消息认证码技术、数字签名技术等)。

从本质上来看,公钥密码比对称密钥密码加密的速度要慢,粗略的说,公钥加密算法RSA硬件实现比分组加密算法DES硬件实现的速度慢1500倍,而软件实现的速度要慢100倍。

公钥解密也可以提供认证保证(如:在实体认证协议、带认证的密钥建立协议等)。

公钥加密中必须有颁发让发送消息的人得到想要发送到的那个人的公钥的真实拷贝,否则就会受到伪装攻击。

在实践中有很多方法分发真实的公钥,如:使用可信的公共文件,使用在线可信服务器,使用离线服务器和认证。

2.公钥加解密的优缺点:1)大型网络中的每个用户需要的密钥数量少。

2)对管理公钥的可信第三方的信任程度要求不高而且是离线的。

3)只有私钥是保密的,而公钥只要保证它的真实性。

4)多数公钥加密比对称密钥加密的速度要慢几个数量级。

5)公钥加密方案的密钥长度比对称加密的密钥要长。

6)公钥加密方案没有被证明是安全的。

公钥密码的概念本身就被公认为是密码学上的一块里程碑。

三十多年来的研究表明,公钥密码成功地解决了计算机网络安全中的密钥管理,身份认证和数字签名等问题,已经成为信息安全技术中的重大核心技术。

四RSA算法1.概述RSA加密算法于1977年由美国麻省理工学院的Ronal Rivest,Adi Shamir 和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adleman 命名为RSA算法。

这三位科学家荣获2002年度图灵奖,以表彰他们在算法方面的突出贡献。

该算法利用了数论领域的一个事实,那就是虽然把两个大质数相乘生成一个合数是件十分容易的事情,但要把一个合数分解为两个质数的乘积却十分困难。

合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。

它无须收发双方同时参与加密过程,既可以用于保密也可以用于签名,因而非常适合于电子邮件系统的加密,互连网和信用卡安全系统。

算法概述:找两素数p和q,取n=p*q,取t=(p-1)*(q-1),取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1),取d*e%t==1,这样最终得到三个数:n,d,e。

设消息为数M (M <n),设c=(M**d)%n就得到了加密后的消息c,设m=(c**e)%n则m == M,从而完成对c的解密。

上面两式中的d和e 可以互换。

2.算法设计1)public static void GetPrime()说明:利用Java语言的中的java.math.BigInteger类的方法中随机产生大数。

2)public static boolean MillerRobin(BigInteger num)参数说明:num是由GetPrime方法产生的大数。

说明:这个方法判断GetPrime方法传过来的是否是一个素数,是就返回true,否就返回false。

3)public static BigInteger powmod( BigIntegera,BigIntegert,BigIntegernum )说明:这个方法对传入的大数进行幂运算。

4)public static BigInteger invmod(BigInteger a,BigInteger b)说明:这个方法对大数进行取模运算。

5)public static String Encode(String inStr,BigInteger PrimeP,BigIntegerPrimeQ,BigInteger n,int nLen,int m,JTextField d)方法名称:加密算法。

参数说明:inStr是从界面输入的明文。

PrimeP和PrimeQ是由GetPrime方法产生的两个大素数。

n是由PrimeP和PrimeQ得到的值。

nLen为n的长度。

d为公钥。

6)public static String Decode(String inStr,BigInteger PrimeP,BigIntegerPrimeQ,BigInteger n,int nLen,int m,JTextField e)方法名称:解密算法。

参数说明:inStr是从界面输入的明文。

PrimeP和PrimeQ是由GetPrime方法产生的两个大素数。

n是由PrimeP和PrimeQ得到的值。

nLen为n的长度。

e为私钥。

在对称加密中:n,d两个数构成公钥,可以告诉别人;n,e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

RSA的安全性在于对于一个大数n,没有有效的方法能够将其分解从而在已知n,d的情况下无法获得e;同样在已知n,e的情况下无法求得d。

五实验源代码import javax.swing.*;import java.awt.event.*;import java.math.*;import java.util.*;import java.awt.*;import java.io.*;public class RSA1{public static void main(String[] args){MyFrame frame = new MyFrame();MyPanel_fbutton panel_fbutton = new MyPanel_fbutton(frame,frame.P,frame.Q,frame.d,frame.e);FlowLayout fl = new FlowLayout (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);}}class MyFrame extends JFrame{public MyFrame(){setTitle("RSA算法");add(wel);MyPanel_p panel_p = new MyPanel_p(P);add(panel_p);MyPanel_q panel_q = new MyPanel_q(Q);add(panel_q);MyPanel_d panel_d = new MyPanel_d(d);add(panel_d);MyPanel_e panel_e = new MyPanel_e(e);add(panel_e);MyPanel_in panel_in = new MyPanel_in(input);add(panel_in);MyPanel_out panel_out = new MyPanel_out(output);add(panel_out);MyPanel_out1 panel_out1 = new MyPanel_out1(output1);add(panel_out1);MyPanel_button panel_button = new MyPanel_button(P,Q,d,e,input,output,output1);add(panel_button);}private JLabel wel = new JLabel(" RSA算法演示");protected JTextField P = new JTextField(35);protected JTextField Q = new JTextField(35);protected JTextField d = new JTextField(35);protected JTextField e = new JTextField(35);protected JTextArea input = new JTextArea(4,35);protected JTextArea output = new JTextArea(4,35);protected JTextArea output1 = new JTextArea(4,35);}class MyPanel_fbutton extends JPanel{public MyPanel_fbutton(Frame aframe,JTextField aP, JTextField aQ, JTextField ad, JTextField ae){frame = aframe;P = aP;Q = aQ;e = ae;d = ad;}private Frame frame;private JTextField P;private JTextField Q;private JTextField d;private JTextField e;}class MyPanel_p extends JPanel{public MyPanel_p(JTextField aP){P=aP;add(new JLabel(" 质数P:"));add(P);}private JTextField P;}class MyPanel_q extends JPanel{public MyPanel_q(JTextField aQ){Q=aQ;add(new JLabel(" 质数Q:"));add(Q);}private JTextField Q;}class MyPanel_d extends JPanel{public MyPanel_d(JTextField ad){d=ad;add(new JLabel(" 公钥:"));add(d);}private JTextField d;}class MyPanel_e extends JPanel{public MyPanel_e(JTextField ae){e=ae;add(new JLabel(" 私钥:"));add(e);}private JTextField e;}class MyPanel_in extends JPanel{public MyPanel_in(JTextArea ainput){input = ainput;add(new JLabel(" 输入明文:"));JScrollPane jsp1 = new JScrollPane (input,v,h);add(jsp1);}private JTextArea input;int v=JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED;int h=JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED; }class MyPanel_out extends JPanel{public MyPanel_out(JTextArea aoutput){output = aoutput;add(new JLabel(" 生成的密文:"));JScrollPane jsp = new JScrollPane (output,v,h);add(jsp);}private JTextArea output;int v=JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED;int h=JScrollPane.HORIZONTAL_SCROLLBAR_NEVER;}class MyPanel_out1 extends JPanel{public MyPanel_out1(JTextArea aoutput1){output1 = aoutput1;add(new JLabel("解密后的明文:"));JScrollPane jsp = new JScrollPane (output1,v,h);add(jsp);}private JTextArea output1;int v=JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED;int h=JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;}class MyPanel_button extends JPanel{public MyPanel_button(JTextField aP,JTextField aQ,JTextField ad,JTextField ae,JTextArea ainput,JTextArea aoutput,JTextArea aoutput1) {P = aP;Q = aQ;e = ae;d = ad;input = ainput ;output = aoutput ;output1 = aoutput1 ;randProduce.addActionListener(new RandListener( P, Q ));add(randProduce);randD.addActionListener(new RandDListener( P, Q, d, e ));add(randD);encode.addActionListener(new EncodeListener( P, Q, d, e, input, output ));add(encode);decode.addActionListener(new DecodeListener( P, Q, d, e, output, output1 ));add(decode);}private JTextField P;private JTextField Q;private JTextField d;private JTextField e;private JTextArea input;private JTextArea output;private JTextArea output1;private JButton randProduce = new JButton("生成质数P和Q");private JButton randD = new JButton("生成公钥和私钥");private JButton encode = new JButton("加密");private JButton decode = new JButton("解密");}class FileEncodeListener implements ActionListener{public FileEncodeListener(Frame f,JTextField ap, JTextField aq,JTextField ae,JTextField ad) {P = ap;Q = aq;E = ae;D = ad;fr = f;}public void actionPerformed(ActionEvent ee){FileDialog fd = new FileDialog(fr);fd.setVisible(true);String infileName =fd.getDirectory()+fd.getFile();String inStr = new String();inStr = PublicMethod.read(infileName);BigInteger PrimeP = new BigInteger(P.getText());BigInteger PrimeQ = new BigInteger(Q.getText());BigInteger n =PrimeP.multiply(PrimeQ);int nLen = n.bitLength();int m=(int)(Math.ceil((double)(nLen)/16.0));nLen = (nLen-1) / 16;String outStr = new String();outStr = PublicMethod.Encode(inStr,PrimeP,PrimeQ,n,nLen,m,D);for(i=infileName.length()-1;i>=0;--i){if(infileName.charAt(i)=='.') break;}String outfileName = infileName.substring(0,i);outfileName = outfileName + new String(".EncodeRsa") + infileName.substring(i,infileName.length());PublicMethod.output(outfileName,outStr);}private JTextField P;private JTextField Q;private JTextField E;private JTextField D;private Frame fr;int i;}class FileDecodeListener implements ActionListener{public FileDecodeListener(Frame f,JTextField ap, JTextField aq,JTextField ae,JTextField ad) {P = ap;Q = aq;E = ae;D = ad;fr = f;}public void actionPerformed(ActionEvent ee){FileDialog fd = new FileDialog(fr);fd.setVisible(true);String infileName =fd.getDirectory()+fd.getFile();String inStr = new String();inStr = PublicMethod.input(infileName);System.out.println(inStr);BigInteger PrimeP = new BigInteger(P.getText());BigInteger PrimeQ = new BigInteger(Q.getText());BigInteger n =PrimeP.multiply(PrimeQ);int nLen = n.bitLength();int m=(int)(Math.ceil((double)(nLen)/16.0));nLen = (nLen-1) / 16;String outStr = new String();outStr = PublicMethod.Decode(inStr,PrimeP,PrimeQ,n,nLen,m,E);for(i=infileName.length()-1;i>=0;--i){if(infileName.charAt(i)=='.') break;}String outfileName = infileName.substring(0,i);outfileName = outfileName + new String(".DecodeRsa") + infileName.substring(i,infileName.length());PublicMethod.write(outfileName,outStr);}private JTextField P;private JTextField Q;private JTextField E;private JTextField D;private Frame fr;int i;}class RandListener implements ActionListener{public RandListener(JTextField aP, JTextField aQ){P = aP;Q = aQ;}public void actionPerformed(ActionEvent e){PublicMethod.GetPrime( P );PublicMethod.GetPrime( Q );}private JTextField P;private JTextField Q;}class RandDListener implements ActionListener{public RandDListener(JTextField aP, JTextField aQ, JTextField ad, JTextField ae){P = aP;Q = aQ;d = ad;e = ae;}public void actionPerformed(ActionEvent ee){BigInteger PP = new BigInteger(P.getText());BigInteger QQ = new BigInteger(Q.getText());BigInteger temp = (PP.subtract(new BigInteger("1"))).multiply(QQ.subtract(new BigInteger("1")));BigInteger temp1;do{temp1=new BigInteger(100, new Random()).mod(temp);}while(lerRobin(temp1)==false);d.setText(temp1.toString());e.setText(PublicMethod.invmod(temp1, temp).toString());}private JTextField P;private JTextField Q;private JTextField d;private JTextField e;}class EncodeListener implements ActionListener{public EncodeListener(JTextField aP, JTextField aQ, JTextField ad, JTextField ae, JTextArea in, JTextArea out){P = aP;Q = aQ;d = ad;e = ae;input = in;output = out;}public void actionPerformed(ActionEvent ee){BigInteger PrimeP = new BigInteger(P.getText());BigInteger PrimeQ = new BigInteger(Q.getText());BigInteger n =PrimeP.multiply(PrimeQ);int nLen = n.bitLength();int m=(int)(Math.ceil((double)(nLen)/16.0));nLen = (nLen-1) / 16;String inStr = input.getText();output.setText(PublicMethod.Encode(inStr,PrimeP,PrimeQ,n,nLen,m,e));}private JTextField P;private JTextField Q;private JTextField d;private JTextField e;private JTextArea input;private JTextArea output;}class DecodeListener implements ActionListener{public DecodeListener(JTextField aP, JTextField aQ, JTextField ad, JTextField ae, JTextArea out, JTextArea out1){P = aP;Q = aQ;d = ad;e = ae;output = out;output1 = out1;}public void actionPerformed(ActionEvent ee){BigInteger PrimeP = new BigInteger(P.getText());BigInteger PrimeQ = new BigInteger(Q.getText());BigInteger n =PrimeP.multiply(PrimeQ);int nLen = n.bitLength();int m=(int)(Math.ceil((double)(nLen)/16.0));nLen = (nLen-1) / 16;String inStr = output.getText();output1.setText(PublicMethod.Decode(inStr,PrimeP,PrimeQ,n,nLen,m,d));}private JTextField P;private JTextField Q;private JTextField d;private JTextField e;private JTextArea output;private JTextArea output1;}class PublicMethod{public static void GetPrime( JTextField prime ){BigInteger num = new BigInteger("0");Random rand = new Random();do{int length = (int)(Math.random()*20+100);System.out.println(length);num = new BigInteger( length, 5 , rand );prime.setText(num.toString());}while(MillerRobin(num)==false);}public static boolean MillerRobin(BigInteger num){int time = 1000;BigInteger mod = num.mod(new BigInteger("2"));if(mod.equals(new BigInteger("0"))){return false;}int s = 0, j=0;BigInteger t=num.subtract(new BigInteger("1"));while( t.mod(new BigInteger("2")).equals("0") ){t.divide(new BigInteger("2"));++s;}for(int i=0; i<time; ++i){BigInteger a = new BigInteger(100, new Random()).mod(num.subtract(new BigInteger("3"))).add(new BigInteger("2"));BigInteger y = powmod(a, t, num);if(y.equals(new BigInteger("1"))==false&& y.equals(num.subtract(new BigInteger("1")))==false){j=1;while(j==s&&y.equals(num.subtract(new BigInteger("1")))==false){y = y.multiply(y).mod(num);if(y.equals(new BigInteger("1"))){return false;}++j;}if(y.equals(num.subtract(new BigInteger("1")))==false){return false;}}}return true;}public static BigInteger powmod( BigInteger a, BigInteger t, BigInteger num ){BigInteger A = new BigInteger("1");while(t.equals(new BigInteger("0"))==false){if(t.mod(new BigInteger("2")).equals(new BigInteger("1"))){A = A.multiply(a).mod(num);}a = a.multiply(a).mod(num);t=t.divide(new BigInteger("2"));}return A;}public static BigInteger invmod(BigInteger a, BigInteger b){System.out.println(a+" "+b);BigInteger s0=new BigInteger("1"), s1=new BigInteger("0"), s2, q, t, b0=b;while(b.equals(new BigInteger("0"))==false){q=a.divide(b);s2=s0.subtract( q.multiply(s1) );if(pareTo(new BigInteger("0"))!=-1){s2=s2.mod(b0);}else{s2=b0.subtract( s2.multiply(new BigInteger("-1")).mod(b0) );}s0=s1;s1=s2;t=b;b=a.mod(b);a=t;}if(a.equals(new BigInteger("1"))){return s0;}else{return new BigInteger("0");}}public static String Encode(String inStr,BigInteger PrimeP,BigInteger PrimeQ,BigInteger n,int nLen,int m,JTextField d) {BigInteger res = new BigInteger("0");StringBuffer outBuf = new StringBuffer();int i,k,j;for(i=0;i<inStr.length();i=j){BigInteger t = new BigInteger("0");for(j=i;j<i+nLen&&j<inStr.length();j++){t=t.shiftLeft(16);long num = inStr.charAt (j);t=t.add(BigInteger.valueOf(num));}res = PublicMethod.powmod(t,new BigInteger(d.getText()),n);String buf = new String();for(k=0;k<m;++k){long num = (res.and(BigInteger.valueOf(65535))).longValue();res = res.shiftRight(16);buf = (char)(num)+buf;}outBuf = outBuf.append(buf);}return outBuf.toString();}public static String Decode(String inStr,BigInteger PrimeP,BigInteger PrimeQ,BigInteger n,int nLen,int m,JTextField e) {StringBuffer outBuf = new StringBuffer();BigInteger res = new BigInteger("0");int i,j;for(i=0;i<inStr.length();i+=j){BigInteger t = new BigInteger("0");for(j=0;j<m&&j+i<inStr.length();j++){t = t.shiftLeft(16);long num =(long)(inStr.charAt (j+i));t=t.add(BigInteger.valueOf(num));}res = PublicMethod.powmod(t,new BigInteger(e.getText()),n);String buf = new String();while(pareTo(new BigInteger("0"))>0){long num =(res.and(BigInteger.valueOf(65535))).longValue();buf = (char)(num) + buf;res = res.shiftRight(16) ;outBuf = outBuf.append(buf);}return outBuf.toString();}public static String read(String infileName){String ans = new String ();try{FileInputStream fis = new FileInputStream(infileName);InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader (isr);int t;while(true){t= br.read();System.out.println(t);if(t==-1) break;ans = ans + (char)(t);}br.close();isr.close();fis.close();}catch(FileNotFoundException e){System.out.println("FileStreamsTest: "+e);}catch(IOException e){System.err.println("FileStreamsTest: "+e);}System.out.println("READSTR="+ans.length());return ans;}public static void write(String outfileName,String outStr){try{FileOutputStream fos = new FileOutputStream(outfileName);OutputStreamWriter osw = new OutputStreamWriter(fos,"UNICODE");BufferedWriter out = new BufferedWriter (osw);int c;for(int i=0;i<outStr.length();i++){c=(int)outStr.charAt(i);System.out.println(c);out.write(c);}out.close();osw.close();fos.close();}catch(FileNotFoundException e){System.out.println("FileStreamsTest: "+e);}catch(IOException e){System.err.println("FileStreamsTest: "+e);}System.out.println("WRITE="+outStr.length());return ;}public static String input(String infileName){String ans = new String();try{FileInputStream in = new FileInputStream(infileName);ObjectInputStream s = new ObjectInputStream(in);ans = (String)s.readObject();s.close();in.close();}catch(FileNotFoundException e){System.out.println("FileStreamsTest: "+e);}catch(IOException e){System.err.println("FileStreamsTest: "+e);}catch(ClassNotFoundException e){System.out.println("FileStreamsTest: "+e);}return ans;}public static void output(String outfileName,String outStr){try{FileOutputStream f = new FileOutputStream(outfileName);ObjectOutputStream s = new ObjectOutputStream(f);s.writeObject(outStr);s.close();f.close();}catch(FileNotFoundException e){System.out.println("FileStreamsTest: "+e);}catch(IOException e){System.err.println("FileStreamsTest: "+e);}}}六实验结果及分析实验结果如图6-1所示图6-1 运行结果界面运行程序,弹出的对话框如上图所示。

合集下载

RSA算法实验报告

RSA算法实验报告
private JTextField d;
private JTextField e;
private JTextArea input;
private JTextArea output;
private JTextArea output1;
private JButton randProduce = new JButton("生成质数P和Q");
BigInteger n,intnLen,intm,JTextField e)
方法名称:解密算法。
参数说明:
inStr是从界面输入的明文。
PrimeP和PrimeQ是由GetPrime方法产生的两个大素数。
n是由PrimeP和PrimeQ得到的值。
nLen为n的长度。
e为私钥。
4、源程序:(文件)
import.*;
add(panel_out);
MyPanel_out1 panel_out1 = new MyPanel_out1(output1);
add(panel_out1);
MyPanel_button panel_button = new MyPanel_button(P,Q,d,e,input,output,output1);
JScrollPane jsp = new JScrollPane (output,v,h);
add(jsp);
}
private JTextArea output;
int v=;
int h=;
}
class MyPanel_out1 extends JPanel
{
public MyPanel_out1(JTextArea aoutput1)

RSA实验报告

RSA实验报告

RSA实验报告⼀实验⽬的1.了解⾮对称加密机制2.理解RSA算法的加解密原理3.熟悉Java的学习以及运⽤Java实现RSA算法的加解密过程⼆实验背景在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,⽽解密密钥(即秘密密钥)SK是需要保密的。

加密算法E和解密算法D也都是公开的。

虽然秘密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先⽣成⼀对RSA 密钥,其中之⼀是保密密钥,由⽤户保存;另⼀个为公开密钥,可对外公开,甚⾄可在⽹络服务器中注册。

为提⾼保密强度,RSA密钥⾄少为500位长,⼀般推荐使⽤1024位。

这就使加密的计算量很⼤。

为减少计算量,在传送信息时,常采⽤传统加密⽅法与公开密钥加密⽅法相结合的⽅式,即信息采⽤改进的DES或IDEA对话密钥加密,然后使⽤RSA密钥加密对话密钥和信息摘要。

对⽅收到信息后,⽤不同的密钥解密并可核对信息摘要。

RSA算法是第⼀个能同时⽤于加密和数字签名的算法,也易于理解和操作。

RSA是被研究得最⼴泛的公钥算法,从提出到现在的这么多年⾥,经历了各种攻击的考验,逐渐为⼈们接受,普遍认为是⽬前最优秀的公钥⽅案之⼀。

三实验原理1.⾮对称密钥加解密概述使⽤对称密钥加密体制进⾏保密通信时,任意不同的两个⽤户之间都应该使⽤互不相同的密钥。

这样,如果⼀个⽹络中有n个⽤户,他们之间彼此都可能进⾏秘密通信,这时⽹络中将需要n(n-1)/2个密钥(其中,每个⽤户都需要保存n-1个密钥),这样巨⼤的密钥量给密钥分配和管理带来了极⼤的困难。

另外,随着计算机⽹络,特别是因特⽹的发展,⽹络上互不相识的⽤户可能需要进⾏保密的会话(例如,如果⽤户在进⾏电⼦商务活动时,需要保密的连接,这时的客户对象可能根本不是固定的对象)。

最后,对称密钥加密机制难以解决签名验证问题。

⾮对称密钥加密也称为公开密钥加密,或者叫做公钥加密算法。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。

二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。

其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。

选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。

计算e关于φ(n)的模逆元d。

公开密钥为(e,n),私有密钥为(d,n)。

加密过程为C=Me mod n,解密过程为M=Cd mod n。

2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。

AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。

每个轮包括字节替换、行移位、列混淆和轮密钥加。

3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。

DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。

四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。

2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。

(完整版)RSA算法实验报告

(完整版)RSA算法实验报告

RSA算法的实现实验原理算法原理RSA公开密钥密码体制。

所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密钥对。

其中(n,e1)为公钥,(n,e2)为私钥。

RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1 mod n;B=A^e2 mod n;密钥生成首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。

假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

密钥分配和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

步骤如下(这里设B为是实现着)(1)B寻找出两个大素数p和q。

(2)B计算出n=p*q和ϕ(n)=)(p-1)*(q-1)。

(3)B选择一个随机数e(0<e<ϕ(n)),满足(e,ϕ(n))=1 (即e与欧拉函数互素ϕ(n))。

(4)B使用欧几里得算法计算e的模余ϕ(n)的乘法逆元素d。

rsa算法实验报告

rsa算法实验报告

rsa算法实验报告RSA算法实验报告摘要:RSA算法是一种非对称加密算法,被广泛应用于网络安全领域。

本实验通过对RSA算法的原理和实现进行了深入研究,并通过编写代码实现了RSA算法的加密和解密过程。

实验结果表明,RSA算法具有较高的安全性和可靠性,能够有效保护数据的机密性和完整性。

一、引言RSA算法是一种基于大数因子分解的非对称加密算法,由Rivest、Shamir和Adleman三位数学家于1977年提出。

它的安全性基于两个大素数的乘积难以分解,因此被广泛应用于数字签名、数据加密等领域。

本实验旨在通过对RSA 算法的原理和实现进行研究,深入了解其加密和解密过程,并通过编写代码实现RSA算法的加密和解密过程。

二、RSA算法原理RSA算法的原理主要包括密钥生成、加密和解密三个过程。

首先,选择两个大素数p和q,并计算它们的乘积n=p*q,然后计算欧拉函数φ(n)=(p-1)*(q-1)。

接下来选择一个整数e,使得1<e<φ(n),且e与φ(n)互质,即e和φ(n)的最大公约数为1。

然后计算e的乘法逆元d,使得(e*d) mod φ(n) = 1。

最后,公钥为(n, e),私钥为(n, d)。

加密过程中,将明文m通过公钥加密为密文c,即c=m^e mod n;解密过程中,将密文c通过私钥解密为明文m,即m=c^d mod n。

三、实验设计本实验使用Python语言编写了RSA算法的加密和解密代码,通过输入明文和密钥,实现了对明文的加密和解密过程。

具体实验步骤如下:1. 选择两个大素数p和q,并计算n=p*q,以及φ(n)=(p-1)*(q-1);2. 选择一个整数e,使得1<e<φ(n),且e与φ(n)互质;3. 计算e的乘法逆元d,使得(e*d) mod φ(n) = 1;4. 将明文m通过公钥加密为密文c,即c=m^e mod n;5. 将密文c通过私钥解密为明文m,即m=c^d mod n。

RSA算法的实现实验报告

RSA算法的实现实验报告

RSA算法的实现实验报告一、实验目的本实验的主要目的是了解和掌握RSA(Rivest-Shamir-Adleman)算法的原理以及其在加密和解密过程中的具体实现。

通过实践和对比分析,了解RSA算法的安全性和效率,并加深对大数计算的理解。

二、算法原理1.密钥生成(1)选择两个大素数p和q,并计算其乘积n=p*q。

(2)计算n的欧拉函数φ(n)=(p-1)*(q-1)。

(3)选择一个整数e,满足1<e<φ(n),并且e与φ(n)互质,即gcd(e, φ(n)) = 1(4)计算e的乘法逆元d,满足e*d ≡ 1 (mod φ(n))。

(5)公钥为(n,e),私钥为(n,d)。

2.加密加密过程使用公钥对明文进行加密:(1)明文转化为整数m,满足0≤m<n。

(2)计算密文c = m^e mod n。

3.解密解密过程使用私钥对密文进行解密:(1)计算明文m = c^d mod n。

(2)还原明文。

三、实验步骤1.实现大数的运算由于RSA算法的关键在于处理大数运算,我们首先实现了大数的加法、减法和乘法运算,并使用这些运算函数作为之后RSA算法中的基础运算。

2.实现RSA算法的密钥生成(1)随机选择两个大素数p和q。

(2)计算n=p*q。

(3)计算φ(n)=(p-1)*(q-1)。

(4)选择一个满足要求的公钥e。

(5)计算e的乘法逆元d。

(6)生成公钥(n,e)和私钥(n,d)。

3.实现RSA算法的加密和解密(1)输入明文。

(2)使用公钥对明文进行加密。

(3)得到密文。

(4)使用私钥对密文进行解密。

(5)还原明文。

四、实验结果与分析我们使用python语言实现了RSA算法,并进行了一些测试和分析,得到以下结果和结论。

1.RSA算法的安全性2.RSA算法的效率3.实验结果分析我们对一些常见文本进行了加密和解密实验,得到了正确的结果。

实验结果表明,RSA算法能够对数据进行有效的加密和解密,并确保数据的安全性。

RSA算法实验报告

RSA算法实验报告1.实验目的2.实验原理-选择两个大素数p和q,并计算其乘积n=p*q作为公钥的模数。

-计算n的欧拉函数值φ(n)=(p-1)*(q-1)。

-选择一个小于φ(n)且和φ(n)互质的数e作为公钥的指数。

- 生成一个满足条件d*e mod φ(n)=1的数d作为私钥的指数。

-公钥为(e,n),私钥为(d,n)。

- 加密过程中,将明文m用公式c=m^e mod n进行加密。

- 解密过程中,将密文c用公式m=c^d mod n进行解密。

3.实验步骤为了实现RSA算法,我们可以按照以下步骤进行操作:-选择两个大素数p和q,并计算乘积n=p*q。

-计算n的欧拉函数值φ(n)=(p-1)*(q-1)。

-选择一个小于φ(n)且和φ(n)互质的数e作为公钥的指数。

- 计算满足条件d*e mod φ(n)=1的数d作为私钥的指数。

- 对于待加密的明文m,计算密文c=m^e mod n。

- 对于待解密的密文c,计算明文m=c^d mod n。

4.实验结果与分析我们选取两个大素数p=17,q=23,并计算得到n=391,φ(n)=352、选择e=3作为公钥的指数,并计算满足条件的私钥指数d=235、现在我们分别测试加密和解密过程。

-加密过程:设明文m=65,根据公式c=m^e mod n,计算得到密文c=65^3 mod 391=279-解密过程:设密文c=279,根据公式m=c^d mod n,计算得到明文m=279^235 mod 391=65加密和解密结果都为65,验证了RSA算法的正确性。

5.实验总结通过本次实验,我们成功实现了RSA算法,并验证了其加密和解密的正确性。

RSA算法的核心是利用两个大素数的乘积作为公钥的模数,并通过选择合适的指数和满足条件的私钥指数来进行加密和解密。

RSA算法具有很强的安全性,因为破解RSA需要对大素数进行因数分解,这是一个非常复杂和耗时的过程。

然而,RSA算法的计算复杂度较高,当加密的数据量较大时,计算速度较慢。

RSA实验报告

RSA算法实验【实验目的】1.了解RSA算法的基本原理2.掌握RSA算法的实现方法3.通过实际编程了解非对称密码算法RSA的加密和解密过程,同时锻炼编程能力。

【实验环境】1. 应用软件:Microsoft VC++2. 操作系统:Windows XP【实验预备知识点】1. RSA密码系统所基于的数学难题是对大素数的因式分解。

2. RSA算法原理:(1).选择两个大的素数p 和q(典型情况下为1024 位)(2).计算n = p * q 和z =(p-1)*(q-1).(3).选择一个与z 互素的数,将它称为d(4).找到e,使其满足e*d = 1 mod z提前计算出这些参数以后,我们就可以开始执行加密了。

【实验内容】◆自行以2位小素数为p,q,3为公钥e,构造一个小的RSA系统,对“a、b、c、d”这4个字母进行加密,解密◆在密码教学系统中实现RSA运算的大素数、公钥、私钥的生成、明文加解密、分块大小的选择◆了解在不同分块大小的情况下,RSA系统的密文长度也会有所变化◆了解在不同参数的情况下,RSA系统的性能变化【实验步骤】1.熟悉RSA运算原理;2.打开实验程序,如图1;3.选择密钥长度为128、256、512或者1024比特;4.点击“随机求取N,E,D”按钮,得到大整数N,公钥E,密钥D;5.在明文对话框中输入需要加密的明文字符串;6.点击“加密”按钮可获得加密后的密文,点击“解密”按钮可获得解密后的明文;或者7.自己输入大整数N、公钥E、密钥D,然后点击按钮“自己输入N,E,D”就激活明文输入框。

(自己输入的数都是16进制的数)8.在明文对话框中输入需要加密的明文字符串;9.点击“加密”按钮可获得加密后的密文,点击“解密”按钮可获得解密后的明文;10.运算用时:显示的是随机求取N,E,D时,程序运行所需要的时间。

图1 RSA算法实验【实验过程】1.随机求取N,E,D:点击“随机求取N,E,D”按钮,得到下图所示的N,E,D.2.输入明文abcd,点击“加密”按钮,得到加密后的密文。

rsa实验报告

rsa实验报告RSA实验报告引言:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于信息安全领域。

本实验旨在通过实际操作,深入了解RSA算法的原理和应用。

一、RSA算法原理RSA算法基于数论中的大数分解问题,其核心原理是利用两个大质数的乘积很容易计算得到,但是将这个乘积分解为两个大质数却非常困难。

以下是RSA算法的具体步骤:1. 选择两个不相等的大质数p和q,并计算它们的乘积n=p*q。

2. 计算n的欧拉函数φ(n)=(p-1)*(q-1)。

3. 选择一个小于φ(n)且与φ(n)互质的整数e作为公钥指数。

4. 计算e的模反元素d,即满足(e*d)%φ(n)=1的整数d,作为私钥指数。

5. 公钥为(n, e),私钥为(n, d)。

6. 加密时,将明文m通过公式c=(m^e)%n计算得到密文c。

7. 解密时,将密文c通过公式m=(c^d)%n计算得到明文m。

二、实验过程1. 生成密钥对首先,我们使用Python编程语言生成RSA密钥对。

通过调用相关库函数,我们可以轻松地生成公钥和私钥。

2. 加密与解密接下来,我们使用生成的密钥对进行加密与解密操作。

我们选择一段文字作为明文,将其转化为整数形式,并使用公钥进行加密。

然后,使用私钥对密文进行解密,还原为明文。

3. 安全性分析RSA算法的安全性基于大数分解的困难性。

由于大质数的乘积很容易计算得到,而将其分解为两个大质数却非常困难,因此RSA算法在理论上是安全的。

然而,在实际应用中,如果选择的大质数不够大或者密钥管理不当,可能会导致算法的安全性受到威胁。

三、实验结果与分析经过实验,我们成功生成了RSA密钥对,并进行了加密与解密操作。

实验结果表明,RSA算法能够有效地实现信息的加密和解密。

四、应用领域RSA算法在信息安全领域有着广泛的应用。

以下是一些常见的应用场景:1. 数字签名RSA算法可以用于生成数字签名,确保数据的完整性和真实性。

rsa加密 实验报告

rsa加密实验报告RSA加密实验报告概述RSA加密算法是一种非对称加密算法,广泛应用于信息安全领域。

本实验旨在通过实际操作,深入理解RSA加密算法的原理、过程和应用。

实验目的1. 理解RSA加密算法的原理和基本概念;2. 掌握RSA加密算法的加密和解密过程;3. 了解RSA加密算法的应用场景和安全性。

实验材料1. 一台计算机;2. 编程语言或工具,如Python。

实验步骤1. 生成密钥对首先,我们需要生成一对RSA密钥,包括公钥和私钥。

公钥用于加密数据,私钥用于解密数据。

在Python中,可以使用`cryptography`库来生成密钥对。

2. 加密数据选择一段需要加密的数据,可以是文本、图片或其他文件。

将数据使用公钥进行加密,得到密文。

在Python中,可以使用`cryptography`库中的RSA加密函数来实现。

3. 解密数据使用私钥对密文进行解密,还原成原始数据。

在Python中,可以使用`cryptography`库中的RSA解密函数来实现。

4. 实验结果分析分析实验结果,包括加密后的密文和解密后的明文。

观察密文的长度和结构,以及解密过程是否成功。

同时,可以比较不同数据加密的结果,探讨RSA加密算法的安全性和可靠性。

实验注意事项1. 密钥的安全性:私钥是解密数据的关键,必须妥善保管,避免泄露给他人。

公钥可以公开使用,但也需要注意保护,以防止被篡改。

2. 数据大小限制:RSA加密算法对数据的大小有一定限制,一般建议将较大的数据先进行分块处理,然后分别加密和解密。

3. 算法优化:RSA加密算法的性能较低,特别是对大素数的计算。

在实际应用中,可以采用一些优化技术,如使用快速模幂算法,提高加密和解密的效率。

实验结论通过本次实验,我们深入了解了RSA加密算法的原理和过程。

RSA加密算法具有较高的安全性,适用于保护敏感数据的加密和解密。

然而,由于其计算复杂度较高,对于大数据的加密和解密可能存在性能问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档