001package top.cenze.utils.crypt;
002
003import javax.crypto.Cipher;
004import javax.crypto.KeyGenerator;
005import javax.crypto.SecretKey;
006import javax.crypto.spec.SecretKeySpec;
007
008/**
009 * AES对称加密工具
010 * 密钥加密/解密
011 * @author chengze
012 * @date 2023-11-14 22:05
013 */
014public class AESUtil {
015    public static String AES = "AES";//指定算法类型
016    public static int KEY_LEN = 128;//指定密钥长度
017    public static String UTF_8 = "UTF-8";//编码格式
018
019    /*
020     * @Author boy
021     * @Description 生成AES密钥
022     * @Date 2019/8/22 10:49 AM
023     * @Param []
024     * @return java.lang.String
025     */
026    public static String genAESKey() throws Exception{
027        //构造密钥生成器,指定为AES算法
028        KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
029        //生成一个指定位数的随机源,KEY_LEN=128就是128位
030        keyGenerator.init(KEY_LEN);
031        //生成对称密钥
032        SecretKey sKey = keyGenerator.generateKey();
033        return java.util.Base64.getEncoder().encodeToString(sKey.getEncoded());
034    }
035
036    /*
037     * @Author boy
038     * @Description 使用AES密钥加密数据
039     * @Date 2019/8/22 10:51 AM
040     * @Param [key, data]
041     * @return java.lang.String
042     */
043    public static String encrypt(String key, String data) throws Exception{
044        //获取key
045        SecretKey secretKey = new SecretKeySpec(java.util.Base64.getDecoder().decode(key.getBytes()),AES);
046        //根据指定算法生成密码器
047        Cipher cipher=Cipher.getInstance(AES);
048        //初始化密码器,第一个参数为加密或者解密解密操作,第二个参数为使用的KEY
049        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
050        //将加密内容转化为字节数组
051        byte [] byte_data=data.getBytes(UTF_8);
052        //将字节数组加密
053        byte [] AES_data=cipher.doFinal(byte_data);
054        return new String(java.util.Base64.getEncoder().encode(AES_data));
055    }
056
057    /*
058     * @Author boy
059     * @Description 使用AES密钥解密数据
060     * @Date 2019/8/22 8:06 PM
061     * @Param [key, data]
062     * @return java.lang.String
063     */
064    public static String decrypt(String key, String data) throws Exception{
065        //获取key
066        SecretKeySpec secretKey = new SecretKeySpec(java.util.Base64.getDecoder().decode(key.getBytes()),AES);
067        //根据指定算法生成密码器
068        Cipher cipher=Cipher.getInstance(AES);
069        //初始化密码器,第一个参数为加密或者解密解密操作,第二个参数为使用的KEY
070        cipher.init(Cipher.DECRYPT_MODE, secretKey);
071        //将加密内容转化为字节数组,因为数据是用Base64转换过的,所以需要使用base64解密
072        byte [] dataByte = java.util.Base64.getDecoder().decode(data.getBytes(UTF_8));
073        //解密字节数组
074        byte [] decryptData=cipher.doFinal(dataByte);
075        return new String(decryptData);
076    }
077
078//    private static final String key = "aeswwwLkd56InKey";   // 必需为16位
079//    private static final String initVector = "aeswwwLkd56InVec";    // 必需为16位
080//
081//    //加密
082//    public static String encrypt(String value) {
083//        try {
084//            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
085//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
086//
087//            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
088//            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
089//
090//            byte[] encrypted = cipher.doFinal(value.getBytes());
091//            return Base64.encodeBase64String(encrypted);
092//        } catch (Exception ex) {
093//            ex.printStackTrace();
094//        }
095//
096//        return null;
097//    }
098//
099//    //    解密
100//    public static String decrypt(String encrypted) {
101//        try {
102//            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
103//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
104//            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
105//            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
106//            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
107//            return new String(original);
108//        } catch (Exception ex) {
109//            ex.printStackTrace();
110//        }
111//
112//        return null;
113//    }
114}