zoukankan      html  css  js  c++  java
  • java实用RSA的简单例子

    import java.io.BufferedReader; 
    import java.io.BufferedWriter;
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException;
    import java.io.InputStreamReader; 
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream; 
    import java.io.OutputStreamWriter;
    import java.math.BigInteger;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;

    public class RSA
    {
        
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException, ClassNotFoundException
        {
            KeyPair pair 
    = generateKeyPair();
            PrivateKey privateKey 
    = pair.getPrivate();
            PublicKey publicKey 
    = pair.getPublic();

            
    // Save Pirvate Key
            FileOutputStream f1 = new FileOutputStream("private.ppk");
            ObjectOutputStream b1 
    = new ObjectOutputStream(f1);
            b1.writeObject(privateKey);

            
    // Save Public Key
            FileOutputStream f2 = new FileOutputStream("public.ppk");
            ObjectOutputStream b2 
    = new ObjectOutputStream(f2);
            b2.writeObject(publicKey);

            encrypt();
            
            decrypt();

        }

        
    public static void encrypt() throws IOException, ClassNotFoundException
        {
            String msg 
    = "Hello World!";

            FileInputStream f 
    = new FileInputStream("public.ppk");
            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();

            
    // 获取明文的大整数
            byte ptext[] = msg.getBytes("utf-8");
            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("encrypt.dat"), "utf-8"));
            out.write(cs, 
    0, cs.length());
            out.close();

        }

        
    public static void decrypt() throws IOException, ClassNotFoundException
        {
            BufferedReader in 
    = new BufferedReader(new InputStreamReader(new FileInputStream("encrypt.dat"), "utf-8"));
            String ctext 
    = in.readLine();
            BigInteger c 
    = new BigInteger(ctext);
            
            
    // 获取私钥
            FileInputStream f = new FileInputStream("private.ppk");
            ObjectInputStream b 
    = new ObjectInputStream(f);
            RSAPrivateKey prk 
    = (RSAPrivateKey) b.readObject();
            
            
    // 获取私钥的参数d,n
            BigInteger d = prk.getPrivateExponent();
            BigInteger n 
    = prk.getModulus();
                
            
    // 解密明文
            BigInteger m = c.modPow(d, n);
            
            
            
    // 计算明文对应的字符串并输出。
            byte[] mt = m.toByteArray();
            System.out.println(
    "PlainText is " + new String(mt, "utf-8"));
            
        }

        
    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException
        {
            KeyPairGenerator keyPairGen 
    = KeyPairGenerator.getInstance("RSA");
            
    final int KEY_SIZE = 1024;
            keyPairGen.initialize(KEY_SIZE, 
    new SecureRandom());
            KeyPair keyPair 
    = keyPairGen.genKeyPair();
            
    return keyPair;
        }

    }
    Trackback:http://yanglingsx.blog.163.com/blog/static/90584353200910545647561/
  • 相关阅读:
    python基础课程_学习笔记26:编程的乐趣
    String、StringBuffer和StringBuilder
    string 至 Color 转换演示示例:
    算法 《霍纳的方法java实践》
    Jest
    ES Head is not working with elasticsearch-1.4.0.Beta1
    Linux内核实现多路镜像流量聚合和复制
    OSSEC
    Hadoop 日志分析。
    网站安全分析:恶意DOS脚本日志分析报告
  • 原文地址:https://www.cnblogs.com/hdjjun/p/2092761.html
Copyright © 2011-2022 走看看