常用加密算法之 AES 简介及应用

相关系列文章

  • 常用加密算法之 SM4 简介及应用
  • 常用加密算法之 RSA 简介及应用

引言

AES(Advanced Encryption Standard,高级加密标准)是一种​​广泛使用的对称分组加密算法​​,它使用相同的密钥进行加密和解密操作,以其高安全性、高效率和支持多种密钥长度的特点,成为保护数据安全的基石技术之一。

AES的设计基于替代-置换网络(SPN)结构,能够有效抵抗多种密码攻击,保障数据在传输和存储过程中的机密性与完整性。

一、AES算法核心原理

AES是一种​​分组密码算法​​,它将明文数据分成固定长度的块进行处理,每个块的大小为128位(16字节)。其加密过程通过多轮循环的替换和置换操作实现。

1. 密钥与轮数

AES支持三种不同长度的密钥,每种密钥对应不同的加密轮数:

• AES-128​​:128位密钥,10轮加密

•​​ AES-192​​:192位密钥,12轮加密

•​​ AES-256​​:256位密钥,14轮加密

密钥长度越长,安全性越高,但计算开销也相应增加。

2. 加密过程

AES的加密过程包含四个核心操作,每轮都会执行这些操作(最后一轮略有不同):

  1. ​字节替换(SubBytes)​​:通过一个称为S盒(Substitution box)的非线性替换表,将输入数据的每个字节替换为另一个字节,增加算法的非线性特性,增强安全性。

  2. ​​行移位(ShiftRows)​​:将数据矩阵的每一行进行循环左移操作:第一行不变,第二行左移1字节,第三行左移2字节,第四行左移3字节。这打破了列的独立性,增强了扩散效果。

  3. ​​列混淆(MixColumns)​​:将每列视为有限域GF(2^8)上的多项式,与一个固定多项式进行模乘运算,使每个输出字节依赖于输入列中的所有字节,实现列内的扩散(​​最后一轮省略此步骤​​)。

  4. ​​轮密钥加(AddRoundKey)​​:将当前数据状态与当前轮的轮密钥进行简单的按位异或(XOR)操作。​​轮密钥由初始密钥通过密钥扩展算法生成​​,每一轮使用的轮密钥都不同。

3. 密钥扩展

密钥扩展算法将初始密钥扩展成多个轮密钥(子密钥)。扩展过程使用非线性变换和循环移位操作,确保每轮加密使用不同的密钥,极大增强了安全性。

4. 解密过程

AES的解密过程是加密过程的逆操作,使用相同的密钥,但以相反的顺序执行逆操作(InvSubBytes、InvShiftRows、InvMixColumns)和应用轮密钥。

二、AES的工作模式与填充

1. 常见工作模式

AES有多种工作模式,以适应不同的应用场景:
• ​ECB(电子密码本)​​:最简单的工作模式,但安全性较低,相同的明文会生成相同的密文。

• ​​CBC(密码块链接)​​:引入初始化向量(IV),增强安全性,是广泛使用的模式之一。

• ​​CTR(计数器模式)​​:将块密码转换为流密码,适用于流加密场景。

• ​​GCM(伽罗瓦/计数器模式)​​:提供加密和认证功能,适用于需要保证数据完整性和机密性的场景。

工作模式全称特点适用场景
ECBElectronic Codebook简单,并行计算,相同明文生成相同密文,安全性较低简单数据加密,不推荐用于加密大量重复模式的数据
CBCCipher Block Chaining引入初始化向量(IV),链接模式,安全性高于ECB文件加密,SSL/TLS
CTRCounter将分组密码转换为流密码,并行加密,需唯一计数器实时流媒体加密,高速网络通信
GCMGalois/Counter Mode提供加密和认证功能,高效并行处理需要同时保证机密性和完整性的场景,如SSH

2. 填充模式

当数据长度不是128位(16字节)的整数倍时,需要进行填充。常见的填充模式包括:

• ​​PKCS5/PKCS7 Padding​​:最常用的填充方案。如果需要填充n个字节,则每个填充字节的值都是n。

• ​​Zero Padding​​:用0x00字节填充不足的部分。需注意无法区分填充值和实际数据,可能需额外记录数据长度。

• ​​No Padding​​:要求明文长度必须是块大小的整数倍。

三、SpringBoot 集成 AES 加密算法实战

下文 以 Java AES/CBC/PKCS5Padding 为例,实现 加密解密

PKCS5Padding 和 PKCS7Padding 填充方式一致

1. Maven 依赖

首先,在项目的 pom.xml文件中添加以下依赖:

<dependencies><!-- Bouncy Castle Provider 用于支持 PKCS7Padding --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version> <!-- 请检查最新版本 --></dependency><!-- Apache Commons Lang 用于字符串操作 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 请检查最新版本 --></dependency>
</dependencies>

2. java 工具类AESUtil .java

/*** AES/CBC/PKCS5Padding 加密解密工具类 (JDK 8 原生支持)* 注意:密钥和IV需要妥善管理,不建议硬编码在代码中* PKCS5Padding 和 PKCS7Padding 填充方式一致*/
public class AESUtil {// 加密算法、模式、填充方式private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; // 使用 JDK 原生支持的 PKCS5Padding// 默认密钥和初始化向量(IV),建议从外部配置读取private static final String DEFAULT_KEY = "abcdefghigklmnop"; // 16字节 密钥(必须为16、24或32字节)private static final String DEFAULT_IV = "abcdefghigklmnop"; // 16字节  初始化向量(必须为16字节)/*** AES/CBC/PKCS5Padding 加密* @param plaintext 待加密的明文* @return Base64编码的加密字符串*/public static String encrypt(String plaintext) {return encrypt(plaintext, DEFAULT_KEY, DEFAULT_IV);}/*** AES/CBC/PKCS5Padding 加密* @param plaintext 待加密的明文* @param keyStr 密钥(必须为16、24或32字节)* @param ivStr 初始化向量(必须为16字节)* @return Base64编码的加密字符串*/public static String encrypt(String plaintext, String keyStr, String ivStr) {if (plaintext == null || plaintext.isEmpty()) {
//            throw new IllegalArgumentException("Plaintext cannot be null or empty");return "";}try {// 将密钥和IV转换为字节数组并封装SecretKeySpec keySpec = new SecretKeySpec(keyStr.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8));// 获取并初始化Cipher对象Cipher cipher = Cipher.getInstance(TRANSFORMATION); // 使用 JDK 原生支持的 PKCS5Paddingcipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 执行加密操作byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));// 返回Base64编码的字符串return Base64.getEncoder().encodeToString(encryptedBytes);} catch (Exception e) {throw new RuntimeException("Encryption failed", e);}}/*** AES/CBC/PKCS5Padding 解密* @param ciphertext Base64编码的密文* @return 解密后的明文*/public static String decrypt(String ciphertext) {return decrypt(ciphertext, DEFAULT_KEY, DEFAULT_IV);}/*** AES/CBC/PKCS5Padding 解密* @param ciphertext Base64编码的密文* @param keyStr 密钥(必须与加密时使用的密钥一致)* @param ivStr 初始化向量(必须与加密时使用的IV一致)* @return 解密后的明文*/public static String decrypt(String ciphertext, String keyStr, String ivStr) {if (ciphertext == null || ciphertext.isEmpty()) {return "";
//            throw new IllegalArgumentException("Ciphertext cannot be null or empty");}try {// 将密钥和IV转换为字节数组并封装SecretKeySpec keySpec = new SecretKeySpec(keyStr.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8));// 获取并初始化Cipher对象Cipher cipher = Cipher.getInstance(TRANSFORMATION); // 使用 JDK 原生支持的 PKCS5Paddingcipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 先将Base64编码的字符串解码byte[] encryptedBytes = Base64.getDecoder().decode(ciphertext);// 执行解密操作byte[] decryptedBytes = cipher.doFinal(encryptedBytes);// 返回解密后的字符串return new String(decryptedBytes, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException("Decryption failed", e);}}/*** 测试示例*/public static void main(String[] args) {String originalText = "hello AES CBC";// 加密String encryptedText = encrypt(originalText);System.out.println("加密后 (Base64): " + encryptedText);// 解密String decryptedText = decrypt(encryptedText);System.out.println("解密后: " + decryptedText);// 验证System.out.println("解密是否成功: " + originalText.equals(decryptedText));}
}

四、前端 Vue 中使用 AES-CBC-Pkcs7 加密解密

1. 安装 CryptoJS 库

首先,使用 npm 或 yarn 安装 crypto-js

npm install crypto-js
# 或
yarn add crypto-js

2. 创建工具文件 AESUtils.js

创建一个单独的 JavaScript 文件(如 cryptoUtils.js)来存放加密解密函数,方便复用:

import CryptoJS from 'crypto-js';
// const CryptoJS = require('crypto-js'); //引用AES源码js
const key = CryptoJS.enc.Utf8.parse("abcdefghigklmnop"); //密钥
const iv = CryptoJS.enc.Utf8.parse("abcdefghigklmnop"); //密钥偏移量// 加密方法 - AES-CBC-Pkcs7
export function EncryptCBCPkcs7(word) {const encrypted = CryptoJS.AES.encrypt(word, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return encrypted.toString();
}// 解密方法 - AES-CBC-Pkcs7
export function DecryptCBCPkcs7(word) {const decrypt = CryptoJS.AES.decrypt(word, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return decrypt.toString(CryptoJS.enc.Utf8);
}

3. 测试使用

// 引入js
import { EncryptCBCPkcs7,DecryptCBCPkcs7 } from '@/utils/AESUtils';
//编写测试方法
function test(){try {const encrypted = EncryptCBCPkcs7('Hello, World!');console.log('加密结果:', encrypted);const decrypted = DecryptCBCPkcs7(encrypted);console.log('解密结果:', decrypted);} catch (error) {console.error('错误:', error);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96312.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试问题记录(一)

一、Java 核心基础与进阶1、我们知道 Java 中存在 “值传递” 和 “引用传递” 的说法&#xff0c;你能结合具体例子&#xff0c;说明 Java 到底是值传递还是引用传递吗&#xff1f;这背后涉及到 JVM 中哪些内存区域的交互&#xff1f;Java中只有值传递&#xff0c;不存在引用传…

Redis 主从复制、哨兵与 Cluster 集群部署

文章摘要 本文基于 VMware 虚拟机环境&#xff0c;详细讲解 Redis 高可用架构的核心组件与部署流程&#xff0c;涵盖三大核心模块&#xff1a;Redis 主从复制&#xff08;实现数据备份与读写分离&#xff09;、Redis 哨兵&#xff08;基于主从复制实现故障自动转移&#xff0c;…

ElementUI 中 validateField 对部分表单字段数组进行校验时多次回调问题

目录 方案一&#xff1a;循环调用 Promise.all 合并结果 方案二&#xff1a;直接传入数组字段 总结 在实际业务中&#xff0c;我们有时只需要对表单的部分字段进行校验。ElementUI 提供的 validateField 方法支持单个字段&#xff0c;也支持字段数组&#xff0c;但在使用时…

Visual Studio 2026 震撼发布!AI 智能编程时代正式来临

Visual Studio 2026 震撼发布&#xff01;AI 智能编程时代正式来临 Visual Studio 2026 Insider图标 开发者们的开发环境即将迎来前所未有的智能革命&#xff0c;微软用Visual Studio 2026 重新定义了编码体验。 2025年9月10日&#xff0c;微软正式推出了Visual Studio 2026 In…

Gamma AI:高效制作PPT的智能生成工具

你有没有过这种崩溃时刻&#xff1f;领导让你下午交一份产品介绍 PPT&#xff0c;你打开模板网站翻了半小时没找到合适的&#xff0c;好不容易选了个模板&#xff0c;又得手动调整文字间距、搭配图片&#xff0c;光是把数据做成图表就花了一小时&#xff0c;最后赶出来的 PPT 还…

Python副业新玩法:用Flask搭小程序后端,躺赚被动收入的秘密

凌晨1点&#xff0c;林浩合上电脑时&#xff0c;手机弹出一条微信消息——是上周帮一家社区水果店搭的小程序后端&#xff0c;商家发来了当月的服务费到账提醒。他靠在椅背上笑了&#xff1a;这是这个月第8笔“睡后收入”&#xff0c;加起来刚好覆盖了下个月的房贷。半年前&…

基于PyQt5和阿里云TTS的语音合成应用开发实战[附源码】

项目概述 本文将详细介绍一个基于PyQt5图形界面框架和阿里云TTS(Text-to-Speech)服务的语音合成桌面应用程序的开发过程。该应用提供了完整的文字转语音功能,包括多音色选择、参数调节、实时试听、语速调节和音频下载等特性。 技术栈 前端界面: PyQt5 语音合成: 阿里云TTS服…

基于esp32c3 rust embassy 的墨水屏程序

EPD Reader 基于ESP32-C3的电子墨水屏阅读器&#xff0c;支持ap 配网、sntp 时间同步、txt阅读、天气预报、显示节假日信息、农历显示、自动休眠、web配置等功能。这是在另一个项目 一个rust embassy esp32c3 的练习项目-CSDN博客的基础上修改的 。 界面比较粗糙&#xff0c;以…

Spring 单例测试及线程安全

创建一个账户类 package com.duanhw.demo22.account;import org.springframework.beans.factory.annotation.Value;//Service public class AccountService {Value("1000")private Integer balance;//存款public void deposit(Integer amount){int newbalance balanc…

【vue】组件宽度调整失效后,调整的方法

父容器布局限制 若组件放置在栅格布局&#xff08;如display: grid&#xff09;或弹性容器中&#xff0c;父元素的宽度限制可能导致子组件宽度失效。解决方案是为父容器设置明确的宽度&#xff0c;或通过百分比布局实现自适应16。例如&#xff1a; <div style"width:…

Java 在Word 文档中插入页眉页脚:一份实用的编程指南

在现代企业应用中&#xff0c;Java 开发者经常需要处理各种文档操作&#xff0c;其中对 Word 文档的自动化处理尤为常见。无论是生成报告、合同还是其他商业文档&#xff0c;页眉页脚作为文档结构的重要组成部分&#xff0c;承载着公司 Logo、页码、版权信息等关键内容。手动添…

深入解析Dart虚拟机运行原理

Dart虚拟机运行原理 一、Dart虚拟机 1.1 引言 Dart VM是一种虚拟机&#xff0c;为高级编程语言Dart提供执行环境&#xff0c;但这并意味着Dart在D虚拟机上执行时&#xff0c;总是采用解释执行或者JIT编译。 例如还可以使用Dart虚拟机的AOT管道将Dart代码编译为机器代码&#xf…

光谱相机在AI眼镜领域中的应用

一、核心应用场景‌健康监测系统‌‌实时生理指标分析‌&#xff1a;通过眼周皮肤光谱特征&#xff0c;监测血氧(SpO₂)和血红蛋白变化&#xff0c;精度可达2%‌血糖无创检测‌&#xff1a;近红外光谱(900-1700nm)分析泪液成分&#xff0c;临床测试相关系数R0.87‌疲劳度评估‌…

如何通过url打开本地文件文件夹

安装部署 https://github.com/jixn-hu/notion_link_opener 这是我自己开发的一个后端服务&#xff0c;要一直开着 部署好后 会打开一个前端页面填下好你文件或者文件夹 点击生成短链就可以直接打开本地的文件夹了

第一篇:如何在数组中操作数据【数据结构入门】

记录以下自己重温数据结构的笔记&#xff0c;附带自己实现的C代码&#xff0c; 其中部分Python代码是网上教程里的&#xff0c;顺手粘贴过来&#xff0c;做一对比/ &#xff08;Python确实简洁&#xff0c;但是C更好理解不是吗哈哈哈&#xff09;数组的定义 数组&#xff1a;线…

基于STM32的单片机开发复盘

硬件介绍 底盘&#xff1a;幻尔阿克曼底盘&#xff1b;2个直流霍尔电机、1个PWM舵机开发板&#xff1a;幻尔Ros Controller V1.2&#xff08;STM32F407VET6&#xff09;电源&#xff1a;因为是学习阶段&#xff0c;没有配电池&#xff0c;使用120W可调电源&#xff08;3V~12V&a…

面试常问:注册中心宕机,远程调用还能成功吗?

在微服务架构里&#xff0c;注册中心&#xff08;像 Nacos、Eureka、Consul 等&#xff09;是服务发现与治理的核心。可要是注册中心突然宕机&#xff0c;微服务间的远程调用还能顺利进行吗&#xff1f;这是面试时很常被问到的问题&#xff0c;下面我们就来深入剖析。一、远程调…

《用 Python 和 Matplotlib 绘制折线图:从入门到实战的可视化指南》

《用 Python 和 Matplotlib 绘制折线图:从入门到实战的可视化指南》 一、引言:数据可视化的力量,从一张折线图开始 在我多年的开发与教学经历中,最常被问到的问题之一是:“如何让数据更直观?”我的答案始终如一:用图说话。而在众多图表类型中,折线图以其简洁、清晰的…

Seate的XA模式和AT模式

目录 一、XA模式 【1】两阶段提交 【2】Seata的XA模型 【3】优缺点 【4】实现XA模式 二、AT模式 【1】Seata的AT模型 【2】AT与XA的区别 【3】脏写问题 【4】优缺点 【5】实现AT模式 一、XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xf…

CTFHub SSRF通关笔记6:Gopher Redis原理详解与渗透实战

目录 一、SSRF Gopher Redis 1、功能简介 2、攻击原理 &#xff08;1&#xff09;SSR的作用 &#xff08;2&#xff09;Gopher 协议特性 &#xff08;3&#xff09;攻击 Redis 步骤 二、gopherus 1、功能简介 2、攻击Redis服务方法 三、Gopherus安装 1、源码下载 2…