AES加密原理详解及Java实现加解密实战
一、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加密业务数据完美解决对称密钥分发不安全的问题实现整套安全加密体系。

相关新闻

30+普通人如何零基础抓住AI风口:大模型应用实战指南

30+普通人如何零基础抓住AI风口:大模型应用实战指南

1. 为什么30普通人也能抓住AI风口?最近两年AI技术爆发式发展,特别是大模型的出现彻底改变了行业格局。作为一个在科技行业摸爬滚打多年的从业者,我亲眼见证了这场变革带来的机会——它不再只是技术精英的专属领域。传统AI开发需要深厚的数学基…

2026/8/18 2:50:15 阅读更多 →
拆开看CBCX:服务边界说明、风控教育表达与用户保护意识

拆开看CBCX:服务边界说明、风控教育表达与用户保护意识

拆开看CBCX:服务边界说明、风控教育表达与用户保护意识评估外汇服务平台时,真正有价值的不是热闹的宣传语,而是基础流程是否清楚、风险提示是否及时、服务沟通是否稳定。CBCX作为受到关注的品牌,适合放在更细致的评测框架中观察。…

2026/8/16 18:38:50 阅读更多 →
TI EVM评估模块安全使用指南:从硬件参考到合规风险

TI EVM评估模块安全使用指南:从硬件参考到合规风险

1. 评估模块的角色与核心价值:为什么它不只是“一块板子”在嵌入式硬件开发的圈子里,德州仪器(TI)的评估模块(EVM)几乎是每个工程师都绕不开的“老朋友”。很多人拿到手,第一反应可能就是照着用…

2026/8/15 3:52:39 阅读更多 →

最新新闻

本地大语言模型部署与应用实践:从Ollama到RAG场景构建

本地大语言模型部署与应用实践:从Ollama到RAG场景构建

本地大语言模型(LLM)正在从云端走向个人设备,成为开发者、研究者和技术爱好者手中的新工具。当模型参数从百亿级压缩到数十亿甚至几亿,当推理速度从秒级提升到毫秒级,我们不再只是调用一个远程API,而是真正…

2026/8/18 10:16:04 阅读更多 →
千兆以太网滑环速率测试:原理、方法与工程实践指南

千兆以太网滑环速率测试:原理、方法与工程实践指南

千兆以太网滑环速率测试:当高速网络遇上旋转连接,如何确保数据不“打滑”? 如果你正在设计一个需要360度连续旋转的工业设备,比如风力发电机的机舱、旋转摄像头、雷达天线或者自动化生产线上的旋转工作台,那么你一定遇…

2026/8/18 10:16:04 阅读更多 →
产品需求收集与定位:从用户痛点挖掘到产品战略锚定

产品需求收集与定位:从用户痛点挖掘到产品战略锚定

1. 从“拍脑袋”到“有章法”:为什么需求收集是产品成败的起点 做产品,最怕的不是技术实现不了,而是吭哧吭哧做出来,发现没人用。这种挫败感,很多产品经理和创业者都经历过。问题出在哪?十有八九&#xff0…

2026/8/18 10:16:04 阅读更多 →
fork函数详解

fork函数详解

〇、要了解fork首先要了解一下进程控制 进程控制一共分为 五个话题:序号话题内容1进程创建fork / vfork2进程终止exit、退出码3进程等待wait / waitpid4进程程序替换exec 系列函数5自定义 shell 命令与计时器手写 shell,串起前四个话题 前四个话题合起来…

2026/8/18 10:16:04 阅读更多 →
AMD Ryzen调试工具免费开源指南:SMUDebugTool帮你解锁CPU隐藏性能

AMD Ryzen调试工具免费开源指南:SMUDebugTool帮你解锁CPU隐藏性能

AMD Ryzen调试工具免费开源指南:SMUDebugTool帮你解锁CPU隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址:…

2026/8/18 10:16:04 阅读更多 →
电路与电磁波基础相关(AI回答)

电路与电磁波基础相关(AI回答)

为什么最基础的物理实验可以环形回路,而工程中不行?这也是一个非常值得深究的对比。为什么初中物理课本上的实验可以把电线摆成一个大大的圆环,而到了工程实践(比如你接触的服务器机房布线、高速电路板设计,甚至家里的…

2026/8/18 10:15:04 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →