java瘪嘴程序员Springboot

java RSA 非对称 私钥 密钥 加密解密工具类

2018-06-22  本文已影响222人  5ebe383afd3a

先决条件

使用了apache commons-codec进行base64编码

<dependency>
  <groupId>commons-codec</groupId>
  <artifactId>commons-codec</artifactId>
  <version>1.11</version>
</dependency>

apache commons-codec

工具类

复制粘贴,引入依赖即可

/**
 * RSA工具类。
 *
 *         RSAUtils.RSAKey key = RSAUtils.createRSAKey("任意的字符,最好是这样的QWEqwsf1235325$%^&*@#@");//创建钥匙
 *         String prkey = key.getPrivateKey();
 *         String pukey = key.getPublicKey();
 *         String testMaMa = "逆水行舟,也能随时驻留原地,戒躁。";
 *         String encrypt = RSAUtils.encrypt(pukey, testMaMa);//加密
 *         String decrypt = RSAUtils.decrypt(prkey, encrypt);//解密
 *
 * @author chenzhonghua
 * @date 2018/6/22
 */
public class RSAUtils {
    private static final String RSA = "RSA";

    public static final int DF_SIZE=1024;

    private RSAUtils() {
        throw new IllegalAccessError("this is a utils");
    }

    /**
     * 生成RSA钥匙
     *
     * @param random 钥匙种子
     * @return RSA钥匙
     */
    public static RSAKey createRSAKey(String random,int size) {
        Objects.requireNonNull(random, "random不能为Null");
        Objects.requireNonNull(size, "size不能为Null");
        KeyPairGenerator rsa;
        try {
            rsa = KeyPairGenerator.getInstance(RSA);
        } catch (NoSuchAlgorithmException e) {
            throw new RSAException("没有找到" + RSA + "标准算法", e);
        }
        rsa.initialize(size, new SecureRandom(random.getBytes()));
        KeyPair keyPair = rsa.generateKeyPair();
        return new RSAKey(Base64.encodeBase64String(keyPair.getPrivate().getEncoded()), Base64.encodeBase64String(keyPair.getPublic().getEncoded()));

    }

    /**
     * 生成RSA钥匙
     *
     * @param random 钥匙种子
     * @return RSA钥匙
     */
    public static RSAKey createRSAKey(String random) {
        return createRSAKey(random,DF_SIZE);
    }

    /**
     * 还原base64 的公钥
     *
     * @param publicKey 公钥
     * @return 公钥
     */
    public static PublicKey getPulicKey(String publicKey) {
        Objects.requireNonNull(publicKey, "publicKey不能为Null");
        try {
            return KeyFactory.getInstance(RSA).generatePublic(new X509EncodedKeySpec(Base64.decodeBase64(publicKey)));
        } catch (InvalidKeySpecException e) {
            throw new RSAException("publicKey:" + publicKey + "无效", e);
        } catch (NoSuchAlgorithmException e) {
            throw new RSAException("没有找到" + RSA + "标准算法", e);
        }
    }

    /**
     * 还原base64 的私钥
     *
     * @param privateKey 私钥
     * @return 私钥
     */
    public static PrivateKey getPrivateKey(String privateKey) {
        Objects.requireNonNull(privateKey, "privateKey不能为Null");
        try {
            return KeyFactory.getInstance(RSA).generatePrivate(new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)));
        } catch (InvalidKeySpecException e) {
            throw new RSAException("privateKey:" + privateKey + "无效", e);
        } catch (NoSuchAlgorithmException e) {
            throw new RSAException("没有找到" + RSA + "标准算法", e);
        }
    }

    /**该方法会尝试先去构建私钥,私钥构建失败就回去尝试构建公钥。
     * @param key 钥匙base64
     * @return 钥匙
     */
    public static Key getKey(String key) {
        try {
            return getPrivateKey(key);
        }catch (Exception e){
            return getPulicKey(key);
        }
    }

    /**加密
     * @param key 钥匙
     * @param data 数据
     * @return 加密后的base64
     */
    public static String encrypt(String key, String data) {
        return encrypt(getKey(key),data);
    }

    /**加密
     * @param key 钥匙
     * @param data 数据
     * @return 加密后的base64
     */
    public static String encrypt(Key key, String data) {
        Objects.requireNonNull(key, "key不能为Null");
        Objects.requireNonNull(data, "data不能为Null");
        try {
            Cipher cipher = Cipher.getInstance(RSA);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return Base64.encodeBase64String(cipher.doFinal(data.getBytes()));
        } catch (Exception e) {
            throw new RSAException("RSA加密失败", e);
        }
    }

    /**解密
     * @param key 钥匙
     * @param data 密文(base64)
     * @return 明文
     */
    public static String decrypt(String  key, String data) {
        return decrypt(getKey(key),data);
    }

    /**解密
     * @param key 钥匙
     * @param data 密文(base64)
     * @return 明文
     */
    public static String decrypt(Key key, String data) {
        Objects.requireNonNull(key, "key不能为Null");
        Objects.requireNonNull(data, "data不能为Null");
        try {
            Cipher cipher = Cipher.getInstance(RSA);
            cipher.init(Cipher.DECRYPT_MODE, key);
            return new String(cipher.doFinal(Base64.decodeBase64(data)));
        } catch (Exception e) {
            throw new RSAException("RSA解密失败", e);
        }
    }


    /**
     * RSA钥匙对象
     */
    public static class RSAKey {
        private String privateKey;

        private String publicKey;

        private RSAKey(String privateKey, String publicKey) {
            this.privateKey = privateKey;
            this.publicKey = publicKey;
        }

        public String getPrivateKey() {
            return privateKey;
        }

        public String getPublicKey() {
            return publicKey;
        }
    }

    /**
     * RSA操作异常
     */
    public static class RSAException extends RuntimeException {
         RSAException(String message, Throwable cause) {
            super(message, cause);
        }
    }
}

示例

code:

    public static void main(String[] args){
        RSAUtils.RSAKey key = RSAUtils.createRSAKey("任意的字符,最好是这样的QWEqwsf1235325$%^&*@#@");//创建钥匙
        String prkey = key.getPrivateKey();
        String pukey = key.getPublicKey();
        System.out.println("私钥:" + prkey);
        System.out.println("公钥:" + pukey);
        String testMaMa = "逆水行舟,也能随时驻留原地,戒躁。";
        System.out.println("原文:" + testMaMa);
        String encrypt = RSAUtils.encrypt(pukey, testMaMa);//加密
        System.out.println("密文:" + encrypt);
        String decrypt = RSAUtils.decrypt(prkey, encrypt);//解密
        System.out.println("明文:" + decrypt);
    }

结果:

私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJCehN++3gG+VnQoxsshw7XvXiq0b3IOmBm3AMA2SU87UzYbRVCwhXDap6ohWbt8tyWvuRvTTzMf33UETFv0tpxb52EP9h4N0gkf8u77c9zgiPfYe4MrlkSWu/aViBcUbxfSPs90bDKivbBMIB2KePQEv0HpqCgmwUfBd2CeSvTpAgMBAAECgYACTlTGEJAPrQ5J2eCZmpc5TnDM84WXZv4r4swjRHpUxhhkk3i+eaIXE5V60/9PSwTMmAm2lN79bLOudPwWt0c2HqpMJRg0brbODKyz8NwadlMLWTD3fjHi2VEngC4vG8JiHmebjwbR7ETTDQMLPoiRvPM6u8bF64pT/bOIYVzM5QJBAP+o6thtKKRD4fCdfPvI9+U5iJUdb0ANczO4w/vUmE8QLSq2KTpb9n9YMNjlaw0GaSXK8L7sqi1Pnkh2AC/lVS8CQQCQz8dz9VqbeOXnXxf0Y0hWUTrH0oTQfoSo1HOumfJp383Ml5oRTfsypZpwBXmDnhTpAZ+OzbHVIHHbHMtEN4FnAkEA3Lzy8CTnx1SZGxBPXnH5n6AaTm1Ypdw3EHxCMwgu7WzRIqSfWjUW0oLJwivrTxau6KOdU6uxj2fECVpg9Pm0nwJBAI7KMtOmhPd02M2yOL6j/zoN0rYiYQ/tEQYgpwjth9jZ8+XfPu39RMqF/Kik3VLo15mCHkEDlmyfF2WFGPFlAdUCQHbvH3L+fofY8CjajBB7cIUQNNswuFsunwTsA1eI+iVNihdx0OaEJNSqaeiTFsk++sbeYjYmmG61msgoPJeYCwc=
公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQnoTfvt4BvlZ0KMbLIcO1714qtG9yDpgZtwDANklPO1M2G0VQsIVw2qeqIVm7fLclr7kb008zH991BExb9LacW+dhD/YeDdIJH/Lu+3Pc4Ij32HuDK5ZElrv2lYgXFG8X0j7PdGwyor2wTCAdinj0BL9B6agoJsFHwXdgnkr06QIDAQAB
原文:逆水行舟,也能随时驻留原地,戒躁。
密文:YVR7l6/tvgksyz0fWUNbJgZ9PBbSEqerRrRrs+BFgsiQ3AcukRxSvnUkZqM7ueDmg1FdYiHRYWQGwvltbWQrxwrgnR+s7aCv9YG9mV12Mw1F0nf/SJ0TnVg92lD2r+4O7nWKqs7CCOtKlChuIRBpOTacHHnA0BQbcGC/QAw75nU=
明文:逆水行舟,也能随时驻留原地,戒躁。
上一篇 下一篇

猜你喜欢

热点阅读