当前位置: 首页 > news >正文

AES介绍以及应用(crypto.js 实现数据加密)

AES介绍以及使用

介绍

AES(Advanced Encryption Standard)是一种对称加密算法,广泛用于保护敏感数据的安全传输和存储。以下是关于AES的详细解析:

1、什么是AES

  • 对称加密:加密和解密使用相同的密钥。
  • 块加密:将数据分成固定大小的块(128位)进行加密。
  • 标准化:2001年被美国国家标准与技术研究院(NIST)选为替代DES的新一代加密标准。

2、密钥长度

AES支持三种密钥长度:

密钥长度

轮数

安全性

128

10轮

192

12轮

更高

256

14轮

最高

:密钥越长,安全性越高,但计算开销也更大。

3、AES 的工作原理

(1)加密过程

AES加密分为多个步骤:

  1. 密钥扩展(Key Expansion:生成多轮加密所需的子密钥。
  2. 初始轮(AddRoundKey:明文与第一轮密钥异或。
  3. 多轮加密(10/12/14轮)
    • SubBytes(字节替换):使用S盒进行非线性替换。
    • ShiftRows(行移位):对数据块的行进行循环移位。
    • MixColumns(列混淆):对列进行矩阵运算。
    • AddRoundKey(轮密钥加):与子密钥异或。
  4. 最终轮:省略MixColumns步骤。

(2)解密过程

解密是加密的逆过程,使用相同的密钥但步骤相反。

4、AES 的工作模式

AES支持多种加密模式,适用于不同场景:

模式

描述

适用场景

ECB

电子密码本模式,每块独立加密(相同明文→相同密文)

简单数据加密(不推荐敏感数据)

CBC

密码块链接模式,每块与前一块密文异或(需要初始化向量IV)

文件加密、SSL/TLS

GCM

伽罗瓦计数器模式,支持认证加密(AEAD),高效且安全

网络通信(如HTTPS)

CTR

计数器模式,将块密码转换为流密码,可并行加密

实时数据流(如视频加密)

OFB

输出反馈模式,将块密码转换为流密码

较少使用

推荐GCM(认证加密)或 CBC(兼容性好)是当前最常用的模式。

5、 AES 的安全性

  • 数学基础牢固:基于代换-置换网络(SPN),难以破解。
  • 密钥空间大:AES-256的密钥空间为2²⁵⁶,暴力破解几乎不可能。
  • 抗已知攻击:对线性攻击、差分攻击等有强抵抗力。

AES实战

这里我们用vue + spring boot项目,来实现

Vue

下载crypto-js

npm install crypto-js

新建aes.js 工具文件

  

import CryptoJS from 'crypto-js'/*** pad: Pkcs7 //前端 Pkcs7 对应 后端 Pkcs5*///注意这是在测试环境密钥这么写,实际因该写在环境变量里const KEY = CryptoJS.enc.Utf8.parse('12345678123456781234567812345678') // 秘钥// 生成随机的iv,长度为16字节const iv = CryptoJS.lib.WordArray.random(16)export const Encrypt = (plaintext) => {let ciphertext = CryptoJS.AES.encrypt(plaintext, KEY, {iv: iv,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7,}).toString()return ciphertext}/*** AES 解密*/export const Decrypt = (jsonStr) => {let plaintext = CryptoJS.AES.decrypt(jsonStr, KEY, {iv: iv,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7,}).toString(CryptoJS.enc.Utf8)return plaintext}

在发送请求时这样写:

import { Encrypt, Decrypt } from '@/utils/aes.js'

//加密数据const encrypted = Encrypt(JSON.stringify(newChat))// request.post('/chat/save', { id: newId, title: newChat.title });request.post('/chat/save', {  data: encrypted });

Spring boot :

添加依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.42</version>
</dependency>

写入工具类:

// 32字节密钥(必须与前端一致)
private static final String AES_KEY = "12345678123456781234567812345678";/*** AES-ECB 解密*/
public static String decrypt(String encryptedData) throws Exception {// 1. 初始化解密器Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(AES_KEY.getBytes(), "AES"));// 2. 执行解密byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decrypted);
}

在控制层中:

@PostMapping("/chat/save")
public Result add(@RequestBody EncryptedRequest request) throws Exception {System.out.println(request.getData());//解密请求的数据String data = AESUtil.decrypt(request.getData());ChatList chatList = JSON.parseObject(data, ChatList.class);System.out.println(chatList);//保存会话chatService.save(chatList);return Result.success();
}

可以看到他的加密与解密结果:


文章转载自:

http://g9PaabHg.jrbyz.cn
http://PVA3JP2B.jrbyz.cn
http://EABPJlYg.jrbyz.cn
http://yoSIiX0Q.jrbyz.cn
http://UmWVTDCo.jrbyz.cn
http://SqjlWWVq.jrbyz.cn
http://vKKDOrcu.jrbyz.cn
http://2avRKqD7.jrbyz.cn
http://4mVeOS8k.jrbyz.cn
http://JZCiiRkE.jrbyz.cn
http://8kKWXHek.jrbyz.cn
http://7uZfEIDn.jrbyz.cn
http://8etjGVDC.jrbyz.cn
http://XwlwfTa0.jrbyz.cn
http://GuXNmO3l.jrbyz.cn
http://3nouySyo.jrbyz.cn
http://YERc0KHJ.jrbyz.cn
http://GgNFxTNx.jrbyz.cn
http://DGO7Z76t.jrbyz.cn
http://FNdetNqE.jrbyz.cn
http://ZVEmj0aJ.jrbyz.cn
http://x2o7zFAz.jrbyz.cn
http://hSZ2kSqO.jrbyz.cn
http://2QUIuAtT.jrbyz.cn
http://vdvKAspe.jrbyz.cn
http://hqDKdkVg.jrbyz.cn
http://mIeJlbaJ.jrbyz.cn
http://CI2CaiRL.jrbyz.cn
http://412DQDbF.jrbyz.cn
http://77T7Wc2E.jrbyz.cn
http://www.dtcms.com/a/367600.html

相关文章:

  • 四十岁编程:热爱、沉淀与行业的真相-优雅草卓伊凡
  • 【数据分享】中国城市营商环境数据库2024(296个城市)(2017-2022)
  • 结合prompt分析NodeRAG的build过程
  • 2025数学建模国赛高教社杯B题思路代码文章助攻
  • Nano-Banana使用教程
  • 在Spring MVC中使用查询字符串与参数
  • Unity中,软遮罩SoftMaskForUGUI的使用
  • Websocket的Key多少个字节
  • 手写Java泛型,彻底掌握它!
  • Redlock:为什么你的 Redis 分布式锁需要不止一个节点?
  • leetcode 1419 数青蛙
  • 蔚来汽车前制动器设计及热性能分析cad+三维图+设计说明书
  • 唯品会获得vip商品详情 API 返回值说明
  • Java对接Kafka的三国演义:三大主流客户端全景评测
  • 2020年_408统考_数据结构41题
  • 简单例子实现 字符串搜索替换
  • Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
  • 【IO】共享内存、信息量集
  • CmakeLists.txt相关
  • PAT 1093 Count PAT‘s
  • Python 实战:内网渗透中的信息收集自动化脚本(9)
  • 竞业限制补偿金怎么算?一次性支付要交税吗?人事系统帮你理清这些坑!
  • 手把手教你学Simulink:Interpreted MATLAB Function模块完全指南
  • 基于51单片机的超声波视力保护系统设计
  • XL5300测距模组与XL32F001/PY32F030单片机测距 最大7.6M距离测量
  • 【问题记录】Anaconda的jupyter NoteBook点击launch的时候,弹出的页面提示ERR_FILE_NOT_FOUND
  • vector 题目练习 算法代码分析 代码实现
  • 每日工作计划管理工具:核心功能详解
  • Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
  • 【VLMs篇】05: MiniCPM-V 4.5 技术架构详解与代码深度解读