001package top.cenze.utils.crypt;
002
003import javax.crypto.Cipher;
004import java.security.*;
005import java.security.spec.PKCS8EncodedKeySpec;
006import java.security.spec.X509EncodedKeySpec;
007import java.util.Base64;
008import java.util.HashMap;
009import java.util.Map;
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 Map genKeyPair() throws NoSuchAlgorithmException {
027        Map<String, String> keyMap = new HashMap<String, String>();//存储公钥和私钥
028        //为RSA算法创建KeyPairGenerator对象
029        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_TYPE);
030        //创建RSA算法可信任的随机数源
031        SecureRandom secureRandom = new SecureRandom();
032        //使用随机数源初始化keyPairGenerator对象
033        keyPairGenerator.initialize(KEY_LENGTH, secureRandom);
034        //生成密钥对
035        KeyPair keyPair = keyPairGenerator.genKeyPair();
036        //获取私钥
037        PrivateKey privateKey = keyPair.getPrivate();
038        //获取公钥
039        PublicKey publicKey = keyPair.getPublic();
040        //使用base64将私钥和公钥转化为字符串
041        String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
042        String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
043        keyMap.put("privateKey", privateKeyStr);
044        keyMap.put("publicKey", publicKeyStr);
045
046        return keyMap;
047    }
048
049    /**
050     * 加密
051     * @param data
052     * @param publicKey
053     * @return
054     * @throws Exception
055     */
056    public static String encrypt(String data, String publicKey) throws Exception {
057        //base64编码的公钥解析为二进制
058        byte[] publicKeyByte = Base64.getDecoder().decode(publicKey);
059        //得到公钥
060        PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyByte));
061        //加密数据
062        Cipher cipher = Cipher.getInstance("RSA");
063        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
064        //得到加密后的数据
065        String encryptData = Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
066        return encryptData;
067    }
068
069    /**
070     * 解密
071     * @param data
072     * @param privateKey
073     * @return
074     * @throws Exception
075     */
076    public static String decrypt(String data, String privateKey) throws Exception {
077        //base64编码的私钥解析为二进制
078        byte[] privateKeyByte = Base64.getDecoder().decode(privateKey);
079        //base64解析后的加密数据
080        byte[] dataByte = Base64.getDecoder().decode(data.getBytes());
081        //获取私钥
082        PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte));
083        //RSA解密
084        Cipher cipher = Cipher.getInstance("RSA");
085        cipher.init(Cipher.DECRYPT_MODE, priKey);
086        //得到解密后的数据
087        String decryptData = new String(cipher.doFinal(dataByte));
088        return decryptData;
089    }
090}