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加密分为多个步骤:
- 密钥扩展(Key Expansion):生成多轮加密所需的子密钥。
- 初始轮(AddRoundKey):明文与第一轮密钥异或。
- 多轮加密(10/12/14轮):
- SubBytes(字节替换):使用S盒进行非线性替换。
- ShiftRows(行移位):对数据块的行进行循环移位。
- MixColumns(列混淆):对列进行矩阵运算。
- AddRoundKey(轮密钥加):与子密钥异或。
- 最终轮:省略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();
}
可以看到他的加密与解密结果: