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/10/17 8:13:02 阅读更多 →
拆开看CBCX:服务边界说明、风控教育表达与用户保护意识

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

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

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

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

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

2026/10/17 8:15:02 阅读更多 →

最新新闻

MoE架构解析:万亿参数模型如何以稀疏激活实现高效计算?

MoE架构解析:万亿参数模型如何以稀疏激活实现高效计算?

1. 核心认知:参数规模和计算量,很多人的第一反应都错了1.1 一个让大模型“变轻”的反直觉设计我最初看到“万亿参数”这个词的时候,跟大部分人一样,第一反应是“这得要多大的算力才能跑起来”。但后来实际接触并拆解了混合专家&am…

2026/10/17 11:55:36 阅读更多 →
AI辅助教材编写:低查重与教学工作流设计实战指南

AI辅助教材编写:低查重与教学工作流设计实战指南

这两年我用AI辅助编写了多本校本教材和课程讲义,最大的体会是:AI写教材真正的“秘密武器”,不是让大模型一口气吐出几十万字,而是把“检索、组织、改写、审校”拆开的一套生产流程。很多人栽跟头,是因为对AI有两层误解…

2026/10/17 11:55:36 阅读更多 →
上海租公寓,这三样我现在一定会现场确认

上海租公寓,这三样我现在一定会现场确认

有一套我当时觉得很合适:月租在预算里,离地铁也近,照片里的客厅很亮。住了两周我才明白,亮是因为下午侧光,早上房间是暗的;晚上临着马路,窗户关上仍有车声。那次之后,看公寓整租我固…

2026/10/17 11:55:36 阅读更多 →
开源Agent网关OpenClaw:架构设计、部署实操与踩坑记录

开源Agent网关OpenClaw:架构设计、部署实操与踩坑记录

做AI Agent也有一段时间了,前后折腾过不少框架和项目,但一直有个问题像鞋里的沙子一样硌脚:AI助手和我的各种终端之间,总是隔着一层说不清的别扭。直到某天我实在忍不住,动手写了个叫OpenClaw的东西——一个开源的AI A…

2026/10/17 11:55:36 阅读更多 →
Hadoop+MapReduce+HBase离线日志分析集群搭建实战

Hadoop+MapReduce+HBase离线日志分析集群搭建实战

最近有个项目要做离线日志分析和实时查询,数据量不大但增长很快,我们最后选择了CentOS 8.1 Hadoop MapReduce HBase这套组合。这套方案最直接的优势在于:Hadoop负责海量文件的分布式存储,MapReduce处理批量计算,HBa…

2026/10/17 11:55:36 阅读更多 →
深入理解 DOM ProcessingInstruction:用法与实战

深入理解 DOM ProcessingInstruction:用法与实战

1. 引言在 DOM(文档对象模型)中,除了常见的元素节点、文本节点和注释节点之外,还存在一类相对冷门但功能明确的节点类型——ProcessingInstruction(处理指令)。它通常出现在 XML 文档中,用于向解…

2026/10/17 11:54:35 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →