001package top.cenze.utils.crypt;
002
003import top.cenze.utils.pojo.RsaKeyPair;
004
005import javax.crypto.Cipher;
006import java.security.*;
007import java.security.spec.PKCS8EncodedKeySpec;
008import java.security.spec.X509EncodedKeySpec;
009import java.util.Base64;
010
011/**
012 * RSA对称加密工具
013 * (公钥加密,私钥解密)
014 * @author chengze
015 * @date 2023-11-14 22:05
016 */
017public class RSAUtil {
018    public static int KEY_LENGTH = 1024;//密钥大小
019    public static String ALGORITHM_TYPE = "RSA";//算法类型
020
021    /**
022     * 生成密钥
023     * @return privateKey、publicKey
024     * @throws NoSuchAlgorithmException
025     */
026    public static RsaKeyPair genKeyPair() throws NoSuchAlgorithmException {
027        //为RSA算法创建KeyPairGenerator对象
028        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_TYPE);
029        //创建RSA算法可信任的随机数源
030        SecureRandom secureRandom = new SecureRandom();
031        //使用随机数源初始化keyPairGenerator对象
032        keyPairGenerator.initialize(KEY_LENGTH, secureRandom);
033        //生成密钥对
034        KeyPair keyPair = keyPairGenerator.genKeyPair();
035        //获取私钥
036        PrivateKey privateKey = keyPair.getPrivate();
037        //获取公钥
038        PublicKey publicKey = keyPair.getPublic();
039        //使用base64将私钥和公钥转化为字符串
040        String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
041        String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
042
043        RsaKeyPair pair = new RsaKeyPair();
044        pair.setPrivateKey(privateKeyStr);
045        pair.setPublicKey(publicKeyStr);
046
047        return pair;
048    }
049
050    /**
051     * 加密
052     * @param data
053     * @param publicKey
054     * @return
055     * @throws Exception
056     */
057    public static String encrypt(String data, String publicKey) throws Exception {
058        //base64编码的公钥解析为二进制
059        byte[] publicKeyByte = Base64.getDecoder().decode(publicKey);
060        //得到公钥
061        PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyByte));
062        //加密数据
063        Cipher cipher = Cipher.getInstance("RSA");
064        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
065        //得到加密后的数据
066        String encryptData = Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
067        return encryptData;
068    }
069
070    /**
071     * 解密
072     * @param data
073     * @param privateKey
074     * @return
075     * @throws Exception
076     */
077    public static String decrypt(String data, String privateKey) throws Exception {
078        //base64编码的私钥解析为二进制
079        byte[] privateKeyByte = Base64.getDecoder().decode(privateKey);
080        //base64解析后的加密数据
081        byte[] dataByte = Base64.getDecoder().decode(data.getBytes());
082        //获取私钥
083        PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte));
084        //RSA解密
085        Cipher cipher = Cipher.getInstance("RSA");
086        cipher.init(Cipher.DECRYPT_MODE, priKey);
087        //得到解密后的数据
088        String decryptData = new String(cipher.doFinal(dataByte));
089        return decryptData;
090    }
091}