验四:实现公钥密码算法RSA
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码***,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
一、实验内容
掌进一步掌握大素数分解的一般原理和实现方法。
二、实现公钥密码算法RSA的基本原理
2.1 实实现公钥密码算法RSA概述
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码***,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然秘密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用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)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互换使用,即:
A=B^e2 mod n;B=A^e1 mod n;
2.2 实现公钥密码算法RSA算法流程
三、实验结果
四、实验小结
本次实验难度较大。开始的时候,我用的是前面的大素数生成算法来加密和解密的,但是在使用过程中我发现,加密和加密的速度比较慢,不仅如此,还只能加密数字。所以我使用的是Jav API提供的公钥和密钥。我为了增加安全性,我给出的公钥个密钥每一次都是不断变化的。
源代码:
图形界面源代码:
- import java.awt.*;
- import javax.swing.*;
- import java.awt.event.*;
- import java.io.*;
- import java.util.*;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import javax.crypto.Cipher;
- public class RSA0414 extends WindowAdapter implements ActionListener,ItemListener{
- String puk=null;//公钥
- String bts=null;//加密后的数据
- String prk=null;//私钥
- String btt=null;//解密后的数据
- Label l1=new Label("输入:"),l2=new Label("加密:"),l3=new Label("解密:"),l4=new Label("私钥:"),l5=new Label("公钥:");
- JFrame f;
- TextField t1=new TextField(60),t2=new TextField(60),t3=new TextField(60);
- TextArea t4=new TextArea(" ",5,60,TextArea.SCROLLBARS_BOTH),t5=new TextArea(" ",5,60,TextArea.SCROLLBARS_BOTH);
- Button b1=new Button("加密"),b2=new Button("解密"),b3=new Button("清屏");
- Choice c1;
- Panel p1,p2,p3,p4,p5,p6,p7,p8,p9;
- public void display(){
- f=new JFrame("中国矿业大学密码学课程设计 学号:08093739 欧二强 ");
- f.setSize(540,400);
- f.setLocation(200,140);
- f.setBackground(Color.lightGray);
- f.setLayout(new BorderLayout());
- tiajiazujian();
- f.setVisible(true);
- }
- /*添加界面组件以及监听器*/
- public void tiajiazujian(){
- c1=new Choice();
- c1.add("实现公钥密码算法RSA");
- c1.addItemListener(this);
- f.add(c1,"North");
- p1=new Panel();
- p3=new Panel();
- f.add(p3,"Center");
- p3.setLayout(new FlowLayout());
- p3.add(l1);p3.add(t1);p3.add(l2);p3.add(t2);p3.add(l3);p3.add(t3);
- p2=new Panel();
- f.add(p2,"South");
- //p2.setLayout(new FlowLayout());//GridLayout(2,2));
- p4=new Panel();
- //f.add(p4,"Center");
- p3.add(l4);p3.add(t4);p2.add(b1);p2.add(b2);p2.add(b3);p3.add(l5);p3.add(t5);
- b1.addActionListener(this);
- b2.addActionListener(this);
- b3.addActionListener(this);
- }
- /*对应不同加密算法的按钮点击事件*/
- public void actionPerformed(ActionEvent e){
- if (e.getSource()==b3&&c1.getSelectedIndex()==0){
- t1.setText(" ");t2.setText(" ");t3.setText(" ");
- }
- if (e.getSource()==b1&&c1.getSelectedIndex()==0)
- {
- //ywjiami();
- rsaJiami();
- }
- if(e.getSource()==b2&&c1.getSelectedIndex()==0){
- //ywjiemi();
- rsaJiemi();
- }
- }
- public void itemStateChanged(ItemEvent e){
- }
- /*实现公钥密码算法RSA**/
- //RSA加密算法
- public void rsaJiami(){
- try {
- RSAEncrypt encrypt = new RSAEncrypt();
- //Scanner read =new Scanner(System.in);
- //System.out.println("请输入您要加密的数据:");
- String s1;
- String s2;
- s1=t1.getText();//输入解密数据
- String encryptText = s1;
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
- keyPairGen.initialize(1024);
- KeyPair keyPair = keyPairGen.generateKeyPair();
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- //System.out.println("请输入您要加密的数据:");
- byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
- byte[] de = encrypt.decrypt(privateKey,e);
- //System.out.println("加密的数据:");
- //System.out.println(encrypt.bytesToString(e));
- //System.out.println("解密的数据:");
- //System.out.println(encrypt.bytesToString(de));
- //System.out.println("公钥:"+publicKey);
- //System.out.println("密钥:"+privateKey);
- //puk=publicKey.toString();//公钥
- bts=encrypt.bytesToString(e);//加密后的数据
- //prk=privateKey.toString();//私钥
- //btt=encrypt.bytesToString(de);//解密后的数据
- t2.setText(bts);//加密结果
- t3.setText(btt);//解密结果
- //t4.replaceRange(prk,0,10);
- //t5.replaceRange(puk,0,10);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //RSA解密算法
- public void rsaJiemi(){
- try {
- RSAEncrypt encrypt = new RSAEncrypt();
- //Scanner read =new Scanner(System.in);
- //System.out.println("请输入您要加密的数据:");
- String s1;
- String s2;
- s1=t1.getText();//输入解密数据
- String encryptText = s1;
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
- keyPairGen.initialize(1024);
- KeyPair keyPair = keyPairGen.generateKeyPair();
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- //System.out.println("请输入您要加密的数据:");
- byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
- byte[] de = encrypt.decrypt(privateKey,e);
- //System.out.println("加密的数据:");
- //System.out.println(encrypt.bytesToString(e));
- //System.out.println("解密的数据:");
- //System.out.println(encrypt.bytesToString(de));
- //System.out.println("公钥:"+publicKey);
- //System.out.println("密钥:"+privateKey);
- puk=publicKey.toString();//公钥
- //bts=encrypt.bytesToString(e);//加密后的数据
- prk=privateKey.toString();//私钥
- btt=encrypt.bytesToString(de);//解密后的数据
- //t2.setText(bts);//加密结果
- t3.setText(btt);//解密结果
- t4.replaceRange(prk,0,10);
- t5.replaceRange(puk,0,10);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //主方法
- public static void main(String arg[])
- {
- RSA0414 ob=new RSA0414();
- ob.display();
- }
- }
RSA算法代码:
- import java.util.*;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import javax.crypto.Cipher;
- /** *//**
- * RSAEncrypt
- *
- * @author maqujun
- * @see
- */
- public class RSAEncrypt {
- /** *//**
- * Main method for RSAEncrypt.
- * @param args
- */
- public static void main(String[] args) {
- try {
- RSAEncrypt encrypt = new RSAEncrypt();
- Scanner read =new Scanner(System.in);
- System.out.println("请输入您要加密的数据:");
- String encryptText = read.next();
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
- keyPairGen.initialize(1024);
- KeyPair keyPair = keyPairGen.generateKeyPair();
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- //System.out.println("请输入您要加密的数据:");
- byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
- byte[] de = encrypt.decrypt(privateKey,e);
- System.out.println("加密的数据:");
- System.out.println(encrypt.bytesToString(e));
- System.out.println("解密的数据:");
- System.out.println(encrypt.bytesToString(de));
- System.out.println("公钥:"+publicKey);
- System.out.println("密钥:"+privateKey);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /** *//**
- * Change byte array to String.
- * @return byte[]
- */
- protected String bytesToString(byte[] encrytpByte) {
- String result = "";
- for (Byte bytes : encrytpByte) {
- result += (char) bytes.intValue();
- }
- return result;
- }
- /** *//**
- * Encrypt String.
- * @return byte[]
- */
- protected byte[] encrypt(RSAPublicKey publicKey, byte[] obj) {
- if (publicKey != null) {
- try {
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
- return cipher.doFinal(obj);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- /** *//**
- * Basic decrypt method
- * @return byte[]
- */
- protected byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) {
- if (privateKey != null) {
- try {
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.DECRYPT_MODE, privateKey);
- return cipher.doFinal(obj);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- }