zoukankan      html  css  js  c++  java
  • RSA加密算法

    RSA加密算法(Java实现)

    注:本博客并非原创,参考 https://leanote.zzzmh.cn/blog/post/5d1c661416199b0683002dc8

    之前在公司实习的时候,进行前后端数据交互,采用明文传输的方式显然不够安全,综合网上的资料选择了 RSA 这种非对称加密算法,也是时下应用最广泛的加密算法之一,这里主要做一个记录,代码主要参考上面那篇博客的,特此感谢。

    RSA加密算法

    RSA非对称加密算法,加密和解密需使用不同的密钥,这在一定程度上就加大了破解的难度,公钥放在前端进行数据加密,服务端收到密文再利用密钥进行解密。

    RSA的安全性依赖于大数的因子分解,这本身在数学中就是一大难题,一般密钥长度为 1024 位已经极难破解了,下面附上一张百度百科的照片。

     这里只做一下简单的记录,以后有时间还需要好好研究研究。

    代码实现

    import java.util.Base64;
    import javax.crypto.Cipher;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * Java RSA 加密工具类
     * 参考: https://blog.csdn.net/qy20115549/article/details/83105736
     */
    public class Security {
        /**
         * 密钥长度 于原文长度对应 以及越长速度越慢
         */
        private final static int KEY_SIZE = 1024;
        /**
         * 用于封装随机产生的公钥与私钥
         */
        private static Map<Integer, String> keyMap = new HashMap<Integer, String>();
        /**
         * 随机生成密钥对
         */
        public static void genKeyPair() throws NoSuchAlgorithmException {
            // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            // 初始化密钥对生成器
            keyPairGen.initialize(KEY_SIZE, new SecureRandom());
            // 生成一个密钥对,保存在keyPair中
            KeyPair keyPair = keyPairGen.generateKeyPair();
            // 得到私钥
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            // 得到公钥
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            // 得到私钥字符串
            String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
            // 将公钥和私钥保存到Map
            //0表示公钥
            keyMap.put(0, publicKeyString);
            //1表示私钥
            keyMap.put(1, privateKeyString);
        }
        /**
         * RSA公钥加密
         *
         * @param str       加密字符串
         * @param publicKey 公钥
         * @return 密文
         * @throws Exception 加密过程中的异常信息
         */
        public static String encrypt(String str, String publicKey) throws Exception {
            //base64编码的公钥
            byte[] decoded = Base64.getDecoder().decode(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
            //RSA加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));
            return outStr;
        }
        /**
         * RSA私钥解密
         *
         * @param str        加密字符串
         * @param privateKey 私钥
         * @return 明文
         * @throws Exception 解密过程中的异常信息
         */
        public static String decrypt(String str, String privateKey) throws Exception {
            //64位解码加密后的字符串
            byte[] inputByte = Base64.getDecoder().decode(str);
            //base64编码的私钥
            byte[] decoded = Base64.getDecoder().decode(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
            //RSA解密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            String outStr = new String(cipher.doFinal(inputByte));
            return outStr;
        }
        public static void main(String[] args) throws Exception {
            long temp = System.currentTimeMillis();
            //生成公钥和私钥
            genKeyPair();
            //加密字符串
            System.out.println("公钥:" + keyMap.get(0));
            System.out.println("私钥:" + keyMap.get(1));
            System.out.println("生成密钥消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");
            String message = "czc123456";
            System.out.println("原文:" + message);
            temp = System.currentTimeMillis();
            String messageEn = encrypt(message, keyMap.get(0));
            System.out.println("密文:" + messageEn);
            System.out.println("加密消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");
            temp = System.currentTimeMillis();
            String messageDe = decrypt(messageEn, keyMap.get(1));
            System.out.println("解密:" + messageDe);
            System.out.println("解密消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");
        }
    }

     程序输出:

     

     吾生也有涯,而知也无涯。

  • 相关阅读:
    智能指针之 auto_ptr
    UML在线绘图
    inline使用
    工作随笔—2017-12-12
    链表排序
    转——浅谈如何提高服务器并发处理能力
    使用re开发python计算器
    Linux-centos7下python3 环境设置
    C语言中的static 详细分析
    pycharm import pygame 出现报错:No module named 'pygame'
  • 原文地址:https://www.cnblogs.com/hzauxx/p/11365321.html
Copyright © 2011-2022 走看看