- 在线加解密测试网址:
https://the-x.cn/cryptography/Rsa.aspx
工具类
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 {
public static String encrypt(String str,String publicKey){
return SecureUtil.rsa((String) null,publicKey).encryptBcd(str, KeyType.PublicKey);
}
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));
}
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);
}
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 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);
}
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");
String publicKey = HexUtil.encodeHexStr(pair.getPublic().getEncoded());
String privateKey = HexUtil.encodeHexStr(pair.getPrivate().getEncoded());
String encryptStr = SecureUtil.rsa(SecureUtil.decode(privateKey), SecureUtil.decode(publicKey)).encryptHex(content, KeyType.PublicKey);
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);
}
}