关于RAS加解密工具类

文章展示了三个版本的RSA加密解密工具类,从基础版到改进版,再到究极版。改进版引入了16进制的公钥和私钥以及本地缓存,以解决Base64编码可能带来的问题。究极版则实现了对公钥、私钥及加密数据的Base64和Hex格式的兼容。所有版本均基于Hutool库进行操作。
摘要由CSDN通过智能技术生成

  • 在线加解密测试网址:https://the-x.cn/cryptography/Rsa.aspx

工具类

  • 公钥和秘钥 是BASE64的字符串
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import org.apache.commons.codec.binary.Base64;

import java.security.KeyPair;


public class RSAUtil {



    /**
     * 公钥加密
     * @param str 加密前JSONObject->Str数据
     * @return 返回加密后数据
     */
    public static String encrypt(String str,String publicKey){
        return SecureUtil.rsa((String) null,publicKey).encryptBcd(str, KeyType.PublicKey);
    }

    /**
     * 私钥解密
     * @param str 加密后的字符串
     * @return
     */
    public static String decrypt (String str,String publicKey,String privateKey){
        return SecureUtil.rsa(privateKey,publicKey).decryptStrFromBcd(str, KeyType.PrivateKey);
    }

    public static void main(String[] args) {
//        内容
        String content="你好啊啊啊啊,AAAA,123,ad,hahaha哈哈哈";
//        公钥私钥随机生成
        KeyPair pair = SecureUtil.generateKeyPair("RSA");
//        公钥
        String publicKey = new String(Base64.encodeBase64(pair.getPublic().getEncoded()));
//        私钥
        String privateKey= new String(Base64.encodeBase64((pair.getPrivate().getEncoded())));
//        加密
        String encryptStr = encrypt(content, publicKey);
//        解密
        String resultStr = decrypt(encryptStr, publicKey, privateKey);

        System.out.println(String.format("原内容:%s,加密后内容:%s,解密后内容:%s,私钥:%s,公钥:%s",content,encryptStr,resultStr,privateKey,publicKey));


    }
}

改进版工具类

  • 公钥和私钥使用了16进制数据(若使用base64公钥私钥的话,结尾可能存在"=",在nacos配置上显示会存在高亮有误,虽然不影响业务,只是nacos的问题)
  • 使用了TimedCache本地缓存获取ras对象
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

import java.security.KeyPair;
import java.util.Objects;


public class RSAUtil {

    private static final TimedCache<String, RSA> CACHE = CacheUtil.newTimedCache(30000);

    static {
        CACHE.schedulePrune(30000);
    }



    public static String encrypt(String str,String publicKey){
        String key = SecureUtil.md5(publicKey);
        if (Objects.isNull(CACHE.get(key))){
            CACHE.put(key,SecureUtil.rsa( null,HexUtil.decodeHex(publicKey)));
        }
        return encrypt(str,HexUtil.decodeHex(publicKey),CACHE.get(key));
    }

    /**
     * 公钥加密
     * @param str 加密前JSONObject->Str数据
     * @return 返回加密后数据
     */
    private static String encrypt(String str,byte[] publicKey,RSA ras){
        if (Objects.nonNull(ras)){
            ras.encryptBcd(str, KeyType.PublicKey);
        }
        return SecureUtil.rsa( null,publicKey).encryptBcd(str, KeyType.PublicKey);
    }

    /**
     * 私钥解密
     * @param str 加密后的字符串
     * @return
     */
    public static String decrypt (String str,String publicKey,String privateKey){
        String key = SecureUtil.md5(privateKey + "|||" + publicKey);
        if (Objects.isNull(CACHE.get(key))){
            CACHE.put(key,SecureUtil.rsa(HexUtil.decodeHex(privateKey),HexUtil.decodeHex(publicKey)));
        }
        return decrypt(str, HexUtil.decodeHex(publicKey), HexUtil.decodeHex(privateKey), CACHE.get(key));

    }

    private static String decrypt (String str,byte[] publicKey,byte[] privateKey,RSA ras){
        if (Objects.nonNull(ras)){
            return  ras.decryptStrFromBcd(str, KeyType.PrivateKey);
        }
        return SecureUtil.rsa(privateKey,publicKey).decryptStrFromBcd(str, KeyType.PrivateKey);
    }

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
//        内容
        String content="你好啊啊啊啊,AAAA,123,ad,hahaha哈哈哈";
//        公钥私钥自动生成
        KeyPair pair = SecureUtil.generateKeyPair("RSA");
        公钥
//        String publicKey = new String(Base64.encodeBase64(pair.getPublic().getEncoded()));
        私钥
//        String privateKey= new String(Base64.encodeBase64((pair.getPrivate().getEncoded())));
//          私钥
        String privateK = HexUtil.encodeHexStr(pair.getPrivate().getEncoded());
//        公钥
        String publicK = HexUtil.encodeHexStr(pair.getPublic().getEncoded());
//        加密
        String encryptStr = encrypt(content, publicK);
//        解密
        String resultStr = decrypt(encryptStr, publicK, privateK);
        long l = System.currentTimeMillis();
        long l1 = l - time;
        System.out.println("耗时:"+l1);
        System.out.println(String.format("原内容:%s,加密后内容:%s,解密后内容:%s",content,encryptStr,resultStr));
        System.out.println("私钥:"+privateK);
        System.out.println("公钥:"+publicK);

    }
}

究极版工具类

  • 做了兼容
  • 公钥私钥用hex或者base64都行
  • 加密用hex或者base64都行
  • 解密方法可兼容,解密hex或者base64的加密数据都行
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

import java.security.KeyPair;
import java.util.Objects;


public class RSAUtil {

    private static final TimedCache<String, RSA> CACHE = CacheUtil.newTimedCache(30000);

    static {
        CACHE.schedulePrune(30000);
    }

    /**
     * 私钥解密
     *
     * @param str 加密后的字符串
     * @return
     */
    public static String decrypt(String str, String publicKey, String privateKey) {
        String key = SecureUtil.md5(privateKey + "|||" + publicKey);
        if (Objects.isNull(CACHE.get(key))) {
            CACHE.put(key, SecureUtil.rsa(SecureUtil.decode(privateKey), SecureUtil.decode(publicKey)));
        }
        return decrypt(str, SecureUtil.decode(publicKey), SecureUtil.decode(privateKey), CACHE.get(key));

    }

    private static String decrypt(String str, byte[] publicKey, byte[] privateKey, RSA ras) {
        if (Objects.nonNull(ras)) {
            return ras.decryptStr(str, KeyType.PrivateKey);
        }
        return SecureUtil.rsa(privateKey, publicKey).decryptStr(str, KeyType.PrivateKey);
    }

    public static void main(String[] args) {
//        内容
        String content = "你好啊啊啊啊,AAAA,123,ad,hahaha哈哈哈";
//        公钥私钥自动生成
        KeyPair pair = SecureUtil.generateKeyPair("RSA");

//        用哪套公钥私钥都行 2选1
//            第一套公钥私钥 Base64形式的公钥私钥
//        String publicKey = new String(Base64.encodeBase64(pair.getPublic().getEncoded()));
//        String privateKey= new String(Base64.encodeBase64((pair.getPrivate().getEncoded())));

//            第二套公钥私钥 hex形式的公钥私钥
        String publicKey = HexUtil.encodeHexStr(pair.getPublic().getEncoded());
        String privateKey = HexUtil.encodeHexStr(pair.getPrivate().getEncoded());

        //        hex或者base64加密都行
//           1.如果是base64的公钥私钥 则用此传参加密(hex或者base64加密都行)
//        String encryptStr = SecureUtil.rsa(privateKey, publicKey).encryptBase64(content, KeyType.PublicKey);
//        String encryptStr = SecureUtil.rsa(privateKey, publicKey).encryptHex(content, KeyType.PublicKey);


//          2.如果是hex的公钥私钥 则用此传参加密(hex或者base64加密都行)
//        String encryptStr  = SecureUtil.rsa(SecureUtil.decode(privateKey), SecureUtil.decode(publicKey)).encryptBase64(content, KeyType.PublicKey);
        String encryptStr = SecureUtil.rsa(SecureUtil.decode(privateKey), SecureUtil.decode(publicKey)).encryptHex(content, KeyType.PublicKey);


//          解密hex或者base64的加密数据都行
        String resultStr = decrypt(encryptStr, publicKey, privateKey);


        System.out.println(String.format("原内容:%s,加密后内容:%s,解密后内容:%s", content, encryptStr, resultStr));
        System.out.println("私钥:" + privateKey);
        System.out.println("公钥:" + publicKey);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值