1import org.slf4j.Logger; 2import org.slf4j.LoggerFactory; 3 4import javax.crypto.Cipher; 5import javax.crypto.spec.IvParameterSpec; 6import javax.crypto.spec.SecretKeySpec; 7import java.util.Base64; 8 9/** 10 * <p> 11 * AES加密解密工具类 12 * 概述:AES高级加密标准,是对称密钥加密中最流行的算法之一; 13 * 工作模式包括:ECB、CBC、CTR、OFB、CFB; 14 * 使用范围:该工具类仅支持CBC模式下的: 15 * 填充:PKCS5Padding 16 * 数据块:128位 17 * 密码(key):32字节长度(例如:12345678901234567890123456789012) 18 * 偏移量(iv):16字节长度(例如:1234567890123456) 19 * 输出:base64 20 * 字符集:UTF-8 21 * 使用方式:String encrypt = AESUtil.encrypt("encData"); 22 * String decrypt = AESUtil.decrypt("decData"); 23 * 返回值为空,需要抛出异常 24 * </p> 25 * 26 * @author 张辉 27 * @since 2019-01-03 28 */ 29public class AESUtil { 30 31 private static final Logger logger = LoggerFactory.getLogger(AESUtil.class); 32 33 /** 34 * 字符集 35 */ 36 private static final String UTF8 = "UTF-8"; 37 38 /** 39 * 指定加密的算法、工作模式和填充方式 40 */ 41 private static final String AES_CBC = "AES/CBC/PKCS5Padding"; 42 43 /** 44 * 加密模式 45 */ 46 private static final String AES = "AES"; 47 /** 48 * 密钥(32位以内) 49 */ 50 public static final String SKEY = "123456"; 51 /** 52 * 偏移向量(必须固定16位) 53 */ 54 public static final String IVPARAMETER = "123456789012345"; 55 56 /** 57 * 加密 58 * @param encData 加密数据 59 * @return 加密后的字符串 60 */ 61 public static String encrypt(String encData) { 62 return encrypt(encData, SKEY, IVPARAMETER); 63 } 64 65 /** 66 * 加密 67 * @param encData 加密数据 68 * @param aesKey 密钥 69 * @param aesIv 偏移向量 70 * @return 加密后的字符串 71 */ 72 public static String encrypt(String encData, String aesKey, String aesIv) { 73 try { 74 byte[] raw = aesKey.getBytes(); 75 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 76 IvParameterSpec iv = new IvParameterSpec(aesIv.getBytes()); 77 // 创建密码器 78 Cipher cipher = Cipher.getInstance(AES_CBC); 79 // 初始化为加密模式的密码器 80 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 81 // 加密 82 byte[] encrypted = cipher.doFinal(encData.getBytes(UTF8)); 83 // 使用base64做转码 84 return Base64.getEncoder().encodeToString(encrypted); 85 } catch (Exception e) { 86 logger.error("AES加密异常,encData:{}", encData, e); 87 return null; 88 } 89 } 90 91 /** 92 * 解密 93 * @param decData 解密数据 94 * @return 解密后的字符串 95 */ 96 public static String decrypt(String decData) { 97 return decrypt(decData, SKEY, IVPARAMETER); 98 } 99 100 /** 101 * 解密 102 * @param decData 解密数据 103 * @param aesKey 密钥 104 * @param aesIv 偏移向量 105 * @return 解密后的字符串 106 */ 107 public static String decrypt(String decData, String aesKey, String aesIv) { 108 try { 109 byte[] raw = aesKey.getBytes(); 110 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 111 IvParameterSpec iv = new IvParameterSpec(aesIv.getBytes()); 112 // 实例化密码器 113 Cipher cipher = Cipher.getInstance(AES_CBC); 114 // 使用密钥初始化,设置为解密模式 115 cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 116 // 解密 117 byte[] original = cipher.doFinal(Base64.getDecoder().decode(decData)); 118 String originalString = new String(original, UTF8); 119 return originalString; 120 } catch (Exception e) { 121 logger.error("AES解密异常,decData:{}", decData, e); 122 return null; 123 } 124 } 125 126}
AES加密解密工具类
Wesley13
2021-10-11
1468 0 0
点赞
收藏
评论区
加载中...