
一、AES加密概述AESAdvanced Encryption Standard高级加密标准是目前全球应用最广泛的对称加密算法由美国国家标准与技术研究院NIST于2001年正式发布旨在替代老旧的DES加密算法。凭借高效、安全、开源免费的特性AES已成为金融、互联网、物联网、数据库数据加密等场景的主流加密方案。对称加密的核心特点加密和解密使用同一把密钥加密端通过密钥将明文转为密文解密端使用相同密钥还原明文运算速度快、适合大量数据加密缺点是密钥的传输和存储需要严格保密。二、AES核心原理与特性2.1 密钥长度分类AES支持三种密钥长度密钥越长加密安全性越高暴力破解难度呈指数级增长AES-128128位密钥16字节10轮加密运算速度最快、通用性最强绝大多数业务场景首选AES-192192位密钥24字节12轮加密运算安全性中等AES-256256位密钥32字节14轮加密运算最高安全等级适用于机密数据加密2.2 核心工作模式AES本身是分组加密算法固定对128位16字节数据块加密针对长短不一的业务数据衍生出多种工作模式Java中最常用的两种ECB电子密码本模式最简单的加密工作模式无需初始化向量IV。加密时会将明文按128位分组每个分组独立使用同一密钥加密相同明文相同密钥的加密结果完全一致。该模式运算速度快、实现简单但存在严重安全漏洞容易被重放、拼接攻击仅适用于本地简单测试严禁生产使用。CBC密码分组链接模式需要16字节初始化向量IV属于链式加密模式。首个明文分组通过IV参与加密后续每个分组的加密结果依赖上一个分组的密文实现分组关联。相同明文、密钥加密后密文完全不同有效避免ECB模式的安全缺陷抗攻击能力强是生产环境主流选择。2.3 填充方式由于AES固定加密16字节数据块当明文长度不是16字节整数倍时需要进行数据填充常用填充方式PKCS5PaddingJava默认支持兼容性最好。2.4 AES优缺点优点加密强度高、运算速度快、资源占用低、开源无版权限制、跨平台兼容性极强缺点对称算法固有缺陷密钥分发、存储风险高一旦密钥泄露密文可被完全破解。三、Java实现AES加解密CBC模式生产可用本次采用AES-128-CBC模式企业最常用方案搭配PKCS5Padding填充包含密钥生成、加密、解密完整工具类代码可直接复制运行附带详细注释。核心参数说明加密算法AES工作模式ECB / CBC本文完整实现两种模式填充方式PKCS5Padding密钥长度128位16字节IV初始化向量仅CBC模式需要16字节ECB模式无需IV3.1 完整工具类代码import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; import java.util.Base64; /** * AES加密解密工具类 * 完整实现ECB模式测试用、CBC模式生产可用 * 算法规格AES-128、PKCS5Padding、UTF-8编码 */ public class AESUtil { // 加密算法名称 private static final String AES_ALGORITHM AES; // CBC模式算法组合生产使用 private static final String AES_CBC_MODE AES/CBC/PKCS5Padding; // ECB模式算法组合仅测试使用 private static final String AES_ECB_MODE AES/ECB/PKCS5Padding; // 128位密钥固定字节长度 private static final int KEY_LENGTH 16; // CBC模式IV初始化向量固定字节长度 private static final int IV_LENGTH 16; /** * 生成随机AES密钥16字节 AES-128 * return 密钥Base64编码字符串 */ public static String generateAesKey() { byte[] keyBytes new byte[KEY_LENGTH]; new SecureRandom().nextBytes(keyBytes); return Base64.getEncoder().encodeToString(keyBytes); } // ECB模式 加解密仅测试 /** * AES ECB模式加密 * param plainText 明文 * param aesKey Base64编码的AES密钥 * return Base64编码密文 * throws Exception 加密异常 */ public static String encryptByECB(String plainText, String aesKey) throws Exception { // 解码密钥 byte[] keyBytes Base64.getDecoder().decode(aesKey); SecretKeySpec keySpec new SecretKeySpec(keyBytes, AES_ALGORITHM); // 初始化加密器ECB无IV向量 Cipher cipher Cipher.getInstance(AES_ECB_MODE); cipher.init(Cipher.ENCRYPT_MODE, keySpec); // 执行加密并返回Base64密文 byte[] encryptBytes cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptBytes); } /** * AES ECB模式解密 * param cipherText Base64编码密文 * param aesKey Base64编码的AES密钥 * return 解密明文 * throws Exception 解密异常 */ public static String decryptByECB(String cipherText, String aesKey) throws Exception { // 解码密钥和密文 byte[] keyBytes Base64.getDecoder().decode(aesKey); byte[] cipherBytes Base64.getDecoder().decode(cipherText); SecretKeySpec keySpec new SecretKeySpec(keyBytes, AES_ALGORITHM); // 初始化解密器 Cipher cipher Cipher.getInstance(AES_ECB_MODE); cipher.init(Cipher.DECRYPT_MODE, keySpec); // 执行解密 byte[] plainBytes cipher.doFinal(cipherBytes); return new String(plainBytes, StandardCharsets.UTF_8); } // CBC模式 加解密生产可用 /** * AES CBC模式加密 * param plainText 明文 * param aesKey Base64编码的AES密钥 * return 加密后的密文Base64编码IV密文拼接 * throws Exception 加密异常 */ public static String encryptByCBC(String plainText, String aesKey) throws Exception { // 1. 解码密钥 byte[] keyBytes Base64.getDecoder().decode(aesKey); SecretKeySpec keySpec new SecretKeySpec(keyBytes, AES_ALGORITHM); // 2. 生成随机IV初始化向量 byte[] ivBytes new byte[IV_LENGTH]; new SecureRandom().nextBytes(ivBytes); IvParameterSpec ivSpec new IvParameterSpec(ivBytes); // 3. 初始化加密器 Cipher cipher Cipher.getInstance(AES_CBC_MODE); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // 4. 执行加密 byte[] encryptBytes cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); // 5. IV和密文拼接后Base64编码解密需要IV需一同返回 byte[] resultBytes new byte[ivBytes.length encryptBytes.length]; System.arraycopy(ivBytes, 0, resultBytes, 0, ivBytes.length); System.arraycopy(encryptBytes, 0, resultBytes, ivBytes.length, encryptBytes.length); return Base64.getEncoder().encodeToString(resultBytes); } /** * AES CBC模式解密 * param cipherText Base64编码的密文IV密文 * param aesKey Base64编码的AES密钥 * return 解密后的明文 * throws Exception 解密异常 */ public static String decryptByCBC(String cipherText, String aesKey) throws Exception { // 1. 解码密文 byte[] cipherBytes Base64.getDecoder().decode(cipherText); // 2. 拆分IV向量和加密数据 byte[] ivBytes new byte[IV_LENGTH]; byte[] dataBytes new byte[cipherBytes.length - IV_LENGTH]; System.arraycopy(cipherBytes, 0, ivBytes, 0, IV_LENGTH); System.arraycopy(cipherBytes, IV_LENGTH, dataBytes, 0, dataBytes.length); // 3. 初始化密钥和IV byte[] keyBytes Base64.getDecoder().decode(aesKey); SecretKeySpec keySpec new SecretKeySpec(keyBytes, AES_ALGORITHM); IvParameterSpec ivSpec new IvParameterSpec(ivBytes); // 4. 初始化解密器 Cipher cipher Cipher.getInstance(AES_CBC_MODE); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 5. 执行解密并返回明文 byte[] plainBytes cipher.doFinal(dataBytes); return new String(plainBytes, StandardCharsets.UTF_8); } // 测试方法同时测试ECB和CBC模式 public static void main(String[] args) { try { // 生成统一AES密钥 String aesKey generateAesKey(); System.out.println(生成的AES密钥 aesKey); String plain Hello AES加密Java实现对称加密测试123; System.out.println(原始明文 plain); System.out.println(); // ECB模式测试 String ecbCipher encryptByECB(plain, aesKey); System.out.println(ECB模式加密密文 ecbCipher); String ecbPlain decryptByECB(ecbCipher, aesKey); System.out.println(ECB模式解密明文 ecbPlain); System.out.println(); // CBC模式测试 String cbcCipher encryptByCBC(plain, aesKey); System.out.println(CBC模式加密密文 cbcCipher); String cbcPlain decryptByCBC(cbcCipher, aesKey); System.out.println(CBC模式解密明文 cbcPlain); } catch (Exception e) { e.printStackTrace(); } } }3.2 代码核心说明双模式适配工具类同时实现ECB、CBC两种主流模式代码结构清晰、方法独立可根据测试/生产场景按需调用ECB模式特性无需IV初始化向量代码简洁、加解密速度快但无随机因子相同明文密钥生成密文一致存在安全漏洞仅用于功能测试CBC模式特性随机生成16位IV向量IV与密文拼接存储每次加密结果唯一规避ECB模式的重放、拼接攻击适配生产环境编码统一规范全局强制UTF-8编码彻底解决中文、特殊符号加密解密乱码问题密钥规范处理统一使用Base64编码存储密钥规避二进制乱码方便密钥配置、传输和持久化存储。3.3 运行结果示例执行main方法后控制台输出如下每次密钥和密文随机不同生成的AES密钥5Z8x9X7sK2pQ3rT4yU6iO9aSdFgHjKlMn 原始明文Hello AES加密Java实现对称加密测试123 ECB模式加密密文7x9S2dF4gH6jK8lM0nB2vN4cV6bX8zC0aS2dF4gH6jK8 ECB模式解密明文Hello AES加密Java实现对称加密测试123 CBC模式加密密文8j7s9dX2kL4pQ6rT8yU0iO2aS4dF6gH8jK0lM2nB4vN6cV8bX0zC2 CBC模式解密明文Hello AES加密Java实现对称加密测试123四、生产环境使用注意事项4.1 密钥安全管理密钥是AES加密的核心绝对不能硬编码在代码中生产环境建议将密钥配置在配置中心、环境变量或密钥管理平台如阿里云KMS、华为云KMS避免代码泄露导致数据解密风险。4.2 模式选择禁忌严格禁止在生产环境使用ECB模式ECB模式无随机向量、分组独立加密相同明文加密结果完全一致攻击者可通过密文拼接、重放、比对分析数据规律极易造成数据泄露和篡改。该模式仅用于初学者测试算法功能、学习对比正式业务系统必须使用CBC模式。4.3 AES-256 兼容问题JDK8及以下版本默认限制AES-256加密需要手动安装无限制权限策略文件JDK9及以上版本已默认解除限制可直接使用AES-256。4.4 异常处理实际项目中需细化异常捕获区分密钥错误、密文篡改、格式错误等异常便于问题排查同时避免异常信息泄露敏感数据。五、总结AES凭借高安全、高性能的优势成为对称加密的行业标准。本文完整实现了AES-ECB测试版、AES-128-CBC生产版两种主流方案清晰对比两种模式的优劣兼顾学习实用性和生产可用性适用于接口数据加密、用户敏感信息手机号、身份证加密、配置文件加密等绝大多数业务场景。在实际开发中可结合非对称加密RSA使用通过RSA加密传输AES密钥AES加密业务数据完美解决对称密钥分发不安全的问题实现整套安全加密体系。