package com.dsh.guns.modular.system.util; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.util.Base64; public class AESUtils { private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; private static final String ALGORITHM = "AES"; private static final String CHARSET = "utf-8"; /** * 建议为16位或32位 */ private static final String KEY = "c53fd327353a09a1"; /** * 必须16位 * 初始化向量IV不可以为32位,否则异常java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long */ private static final String IV = "3a0565e3b1d8ae3d"; /** * 加密 * * @param context * @return */ public static String encrypt(String context) { try { byte[] decode = context.getBytes(CHARSET); byte[] bytes = createKeyAndIv(decode, Cipher.ENCRYPT_MODE); return Base64.getEncoder().encodeToString(bytes); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 解密 * * @param context * @return */ public static String decrypt(String context) { try { Base64.Decoder decoder = Base64.getDecoder(); byte[] decode = decoder.decode(context); byte[] bytes = createKeyAndIv(decode, Cipher.DECRYPT_MODE); return new String(bytes, CHARSET); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取key & iv * * @param context * @param opmode * @return * @throws Exception */ public static byte[] createKeyAndIv(byte[] context, int opmode) throws Exception { byte[] key = KEY.getBytes(CHARSET); byte[] iv = IV.getBytes(CHARSET); return cipherFilter(context, opmode, key, iv); } /** * 执行操作 * * @param context * @param opmode * @param key * @param iv * @return * @throws Exception */ public static byte[] cipherFilter(byte[] context, int opmode, byte[] key, byte[] iv) throws Exception { Key secretKeySpec = new SecretKeySpec(key, ALGORITHM); AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(opmode, secretKeySpec, ivParameterSpec); return cipher.doFinal(context); } }