zoukankan      html  css  js  c++  java
  • RSA双向加密

    RSA是一种双向加密的算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。

    该算法的实例代码如下:

    一、 生成公钥和私钥

    公钥可以对外公开,供其他人加密使用,而把私钥秘密保存用于解密。下面程序产生公钥和私钥,并将他们分别保存在文件中。

    import java.io.*; 
    import java.security.*; 
    import javax.crypto.*; 
    import javax.crypto.spec.*; 
    
    public class Skey_RSA{
       public static void main(String args[]) throws Exception{
            //创建密钥对生成器,指定加密和解密算法为RSA
            KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
            //指定密钥的长度,初始化密钥对生成器
            kpg.initialize(1024);
            //生成密钥对
            KeyPair kp=kpg.genKeyPair();
    
            //获取公钥
            PublicKey pbkey=kp.getPublic();
            //获取私钥
            PrivateKey prkey=kp.getPrivate();
            
            //保存公钥到文件
            FileOutputStream  f1=new FileOutputStream("Skey_RSA_pub.dat");
            ObjectOutputStream b1=new  ObjectOutputStream(f1);
    	        b1.writeObject(pbkey);
            
            //保存私钥到文件
            FileOutputStream  f2=new FileOutputStream("Skey_RSA_priv.dat");
            ObjectOutputStream b2=new  ObjectOutputStream(f2);
    	       b2.writeObject(prkey);
       }
    }
    

    二、使用RSA算法,用公钥对明文加密

    import java.security.*;
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import javax.crypto.interfaces.*;
    import java.security.interfaces.*;
    import java.math.*;
    import java.io.*;
    public class Enc_RSA{
       public static void main(String args[]) throws Exception{
            //需要加密的明文字符串
            String s="Hello World!";
            //从文件中读取公钥
            FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
            ObjectInputStream b=new ObjectInputStream(f);
            RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
    
            //RSA算法是使用整数进行加密的,在RSA公钥中包含有两个整数信息:e和n。对于明文数字m,计算密文的公式是m的e次方再与n求模。
            BigInteger e=pbk.getPublicExponent();
            BigInteger n=pbk.getModulus();
            System.out.println("e= "+e);
            System.out.println("n= "+n);
    
            //获取明文的大整数
            byte ptext[]=s.getBytes("UTF8");
            BigInteger m=new BigInteger(ptext);
    
            //加密明文
            BigInteger c=m.modPow(e,n);
    
            //打印密文c
            System.out.println("c= "+c);
    
            //将密文以字符串形式保存在文件中
            String cs=c.toString( );
            BufferedWriter out= 
              new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("Enc_RSA.dat")));
            out.write(cs,0,cs.length( ));
            out.close( );
           
       }
    }
    

    三、使用RSA算法,用私钥对密文解密

    import java.security.*;
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import javax.crypto.interfaces.*;
    import java.security.interfaces.*;
    import java.math.*;
    import java.io.*;
    public class Dec_RSA{
       public static void main(String args[]) throws Exception{
    
           //读取密文
            BufferedReader in= 
              new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));
            String ctext=in.readLine();
            BigInteger c=new BigInteger(ctext);
    
            //获取私钥 
            FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
            ObjectInputStream b=new ObjectInputStream(f);
            RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
    
            //获取私钥的参数d,n
            BigInteger d=prk.getPrivateExponent();
            BigInteger n=prk.getModulus();
            System.out.println("d= "+d);
            System.out.println("n= "+n);
    
            //解密明文
            BigInteger m=c.modPow(d,n);
            System.out.println("m= "+m);
    
            //计算明文对应的字符串并输出。
            byte[] mt=m.toByteArray();
            System.out.println("PlainText is ");
            for(int i=0;i<mt.length;i++){
                  System.out.print((char) mt[i]);
            }
       }
    }
    

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。 RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET( Secure Electronic Transaction )协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。

  • 相关阅读:
    11g 配置 dgmgrl 以及报错 DataGuard ORA-00313,
    java三种匿名的方式开启线程
    java 四种方式实现字符流文件的拷贝对比
    java中过滤查询文件
    通过Java实现斗地主
    java中Map的entrySet 和keySet的使用
    python3列表推导式和生成器。
    python的特殊方法总结
    python3 定义向量运算
    python3模拟扑克牌
  • 原文地址:https://www.cnblogs.com/luoxuehuan/p/5476903.html
Copyright © 2011-2022 走看看