package com.simple.utils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.Security; import java.util.Arrays; public class AesUtil { private static final Logger logger = LoggerFactory.getLogger(AesUtil.class); /** * 加密 * 模式:AES/CBC/PKCS7Padding * * @param encodeRules 秘钥 * @param content 加密串 * @return */ public static String AESEncode(String encodeRules, String content, String ivParameter) throws Exception { int base = 16; byte[] keybyte = encodeRules.getBytes("UTF-8"); if (keybyte.length % base != 0) { int groups = keybyte.length / base + (keybyte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keybyte, 0, temp, 0, keybyte.length); keybyte = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); // 转化成JAVA的密钥格式 Key key = new SecretKeySpec(keybyte, "AES"); try { // 初始化cipher Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivParameter.getBytes())); byte[] encryptedText = cipher.doFinal(content.getBytes()); return new String(new Base64().encode(encryptedText)).replaceAll("\r\n", ""); } catch ( Exception e) { logger.info("AESEncode error", e); } return null; } /** * 解密 * * @param encodeRules 秘钥 * @param content 解密串 * @return */ public static String AESDecode(String encodeRules, String content, String ivParameter) throws Exception { try { // 判断Key是否正确 if (encodeRules == null) { logger.info("Key为空null"); return null; } // 判断Key是否为16位 if (encodeRules.length() != 16) { logger.info("Key长度不是16位"); return null; } byte[] raw = encodeRules.getBytes("UTF-8"); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); try { byte[] encrypted1 = new Base64().decode(content);//先用base64解密 byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { logger.info(e.toString()); return null; } } catch (Exception ex) { logger.info(ex.toString()); return null; } } }