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

    1、RSA密钥的生成,返回一个KeyPair对象
    KeyPair 用于非对称加密,KeyPair中包含了一个公钥和一个私钥
     
        /**
         * 通过指定的密钥长度生成非对称的密钥对
         * @param keySize  推荐使用1024,2048 ,不允许低于1024
         * @return
         */
        public static KeyPair generateRSAKeyPair(int keySize){
            KeyPair ret = null;
            try {
                //1、准备生成
                KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
                //2、初始化,设置秘钥长度
                generator.initialize(keySize);
                //3、生成,并且返回
                ret = generator.generateKeyPair();
    
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return ret;
        }

    2、获取私钥和公钥

    PublicKey 和 PrivateKey 都是Key类型的

    KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024);
            //获取公钥,可以给任何人
            PublicKey publicKey = keyPair.getPublic();     //获取私钥
            PrivateKey privateKey = keyPair.getPrivate();

    3、RSA加密

    /**
         *  RSA 加密
         * @param data  需要加密的数据
         * @param key  可以是 PublicKey,也可以是PrivateKey
         * @return
         */
        public static byte[] rsaEncrypt(byte[] data ,Key key){
            byte[] ret = null;
            if (data != null
                    && data.length>0
                    && key!=null) {
                // 1、创建Cipher 使用RSA
                try {
                    Cipher cipher = Cipher.getInstance("RSA");
                    //设置Key
                    cipher.init(Cipher.ENCRYPT_MODE,key);
                    ret = cipher.doFinal(data);
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                }
            }
            return ret;
        }

    4、RSA解密

    /**
         *  RSA 解密
         * @param data 要解密的数据
         * @param key  可以是 PublicKey,也可以是PrivateKey
         * @return
         */
        public static byte[] rsaDecrypt(byte[] data ,Key key){
            byte[] ret = null;
    
            if (data != null
                    && data.length>0
                    && key!=null) {
                // 1、创建Cipher 使用RSA
                try {
                    Cipher cipher = Cipher.getInstance("RSA");
                    //设置Key
                    cipher.init(Cipher.DECRYPT_MODE,key);
                    ret = cipher.doFinal(data);
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                }
            }
            return ret;
        }

    5、公钥与私钥的存储

    一对公钥和私钥创建好之后,我们需要存储起来以后使用

        //获得公钥 私钥
            PrivateKey privateKey = keyPair.getPrivate();
            PublicKey publicKey = keyPair.getPublic();
            //编码将PublicKey和PrivateKey对象转换为字节数组,该字节数组为公钥、私钥的实际数据
            byte[] publicKeyEncoded = publicKey.getEncoded();
            byte[] privateKeyEncoded = privateKey.getEncoded();
         //将字节数组通过Base64编码算法 编码成可见的字符形式
            String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
            String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);
         //进行存储操作
         。。。。

    6、公钥与私钥的加载

    通常 1、获取密钥对 2、获取公钥、私钥 3、保存公钥、私钥,保存形式基本为字符串形式

    那么在以后的使用中就需要获取公钥和私钥来使用

    需要知道:

      6.1、KeyFactory可以来加载相应的公钥和私钥

      6.2、公钥加载 使用 X509EncodedKeySpec(byte[])

      6.3、私钥加载 使用 PCKS8EncodedKeySpec(byte[])

    //获取公钥
    //str_publickey 为公钥字符串形式数据(公钥先编码成byte[] 在 形成字符串)
    //解码
                byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
                //构造X509EncodedKeySpec对象
                X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
                //指定加密算法
                KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                //取得公钥
                PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
    //解码
    //获取私钥
    //str_private 为私钥字符串形式的数据
                byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
                //构造X509EncodedKeySpec对象
                PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
                //指定加密算法
                keyFactory = KeyFactory.getInstance("RSA");
                //取得私钥
                PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
  • 相关阅读:
    软件工程实践总结作业——个人作业
    第四次作业——个人作业——软件案例分析
    第三次作业——结对编程
    第二次作业——结对项目之需求分析与原型模型设计
    使用Git进行代码管理心得
    调研Android Studio开发环境的发展演变(附安装教程,多图)
    软件工程的实践项目的自我目标
    软件工程实践总结
    教师报课系统测试
    第四次个人作业--关于 微软必应词典客户端 的案例分析
  • 原文地址:https://www.cnblogs.com/bimingcong/p/5663758.html
Copyright © 2011-2022 走看看