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}