type
Post
status
Published
date
Dec 27, 2024
slug
aes
summary
AES(Advanced Encryption Standard,高级加密标准)是美国国家标准与技术研究院(NIST)于2001年发布的对称加密算法标准,用于取代已经不够安全的DES算法。经过全球密码学家的公开评审,比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法最终胜出,成为AES标准。
tags
加解密
category
加解密
icon
password
上次编辑时间
Dec 26, 2025 03:47 AM
comment
AI 总结
1. AES加密算法简介
AES(Advanced Encryption Standard,高级加密标准)是美国国家标准与技术研究院(NIST)于2001年发布的对称加密算法标准,用于取代已经不够安全的DES算法。经过全球密码学家的公开评审,比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法最终胜出,成为AES标准。
AES的设计哲学基于"宽径策略"(Wide Trail Strategy),通过多轮的可逆变换层(线性层和非线性层)提供高度的混淆性和扩散性。这意味着:
- 明文或密钥的微小变化会导致密文的巨大变化(雪崩效应)
- 密文的每个比特都依赖于明文的多个比特和密钥的多个比特
2. AES加密算法的类型
AES根据密钥长度分为三种变体,每种变体的轮数不同:
类型 | 密钥长度 | 轮数 | 适用场景 |
AES-128 | 128位(16字节) | 10轮 | 一般安全性需求,性能要求高 |
AES-192 | 192位(24字节) | 12轮 | 中等安全性需求 |
AES-256 | 256位(32字节) | 14轮 | 高安全性需求,政府军事级 |
密钥长度的选择平衡:
- AES-128:已足够安全,量子计算机出现前基本无法破解
- AES-256:提供额外的安全边际,但性能下降约40%
- 实际选择需权衡安全需求、性能开销和合规要求
3. AES加密算法的基础原理
3.1 数学基础:有限域GF(2⁸)
AES的所有运算都在有限域GF(2⁸)上进行,这是包含256个元素的有限域。这种数学结构提供了良好的代数性质,使得算法既高效又安全。
3.2 状态矩阵
AES将16字节的明文/密文块排列成4×4的字节矩阵,称为"状态"(State):
text
3.3 加密轮函数
每一轮加密包含四个步骤(最终轮省略MixColumns):
1. 字节代换(SubBytes)
- 使用S盒(Substitution Box)进行非线性替换
- 每个字节独立地通过8×8的S盒替换
- 提供算法的非线性特性,抵抗线性密码分析
2. 行移位(ShiftRows)
- 第一行保持不变
- 第二行循环左移1字节
- 第三行循环左移2字节
- 第四行循环左移3字节
- 增加扩散效果,使字节在列间混合
3. 列混合(MixColumns)
- 每列视为GF(2⁸)上的多项式
- 乘以固定多项式c(x) = 0x03·x³ + 0x01·x² + 0x01·x + 0x02
- 在有限域上进行矩阵乘法,进一步加强扩散
4. 轮密钥加(AddRoundKey)
- 将状态矩阵与扩展密钥的当前轮密钥进行逐字节异或
- 这是唯一涉及密钥的步骤
3.4 密钥扩展
从初始密钥生成各轮所需的轮密钥,使用递归方式生成,确保密钥间的非线性关系。
4. 填充模式
由于AES是分组密码,需要将数据填充到16字节的倍数。常见填充模式:
PKCS7(最常用)
- 填充值等于填充字节数
- 如需要填充3字节:
... | 0x03 0x03 0x03
其他填充模式
- ZeroPadding:用零填充,可能产生歧义
- ISO10126:随机填充,最后字节为填充长度
- ANSI X.923:零填充,最后字节为填充长度
5. 工作模式
工作模式定义了如何对长于分组的数据进行加密:
ECB(电子密码本)- 不推荐
- 每个分组独立加密
- 相同明文生成相同密文,泄露模式信息
- 仅用于教学或非常简单的场景
CBC(密码分组链接)- 常用
- 每个分组与前一个密文分组异或后再加密
- 需要初始化向量(IV),提供随机性
- 串行加密,错误传播
CTR(计数器)- 高性能
- 将分组密码转换为流密码
- 使用计数器和Nonce生成密钥流
- 并行加密,无需填充
GCM(伽罗瓦/计数器)- 现代首选
- 提供认证加密(加密+完整性保护)
- 结合CTR模式和GMAC认证
- TLS 1.2+和现代API的默认选择
模式对比表
模式 | 是否需要填充 | 是否并行 | 错误传播 | 认证加密 | 典型应用 |
ECB | 是 | 是 | 无 | 否 | 不推荐 |
CBC | 是 | 否 | 有 | 否 | 文件加密 |
CFB | 否 | 否 | 有 | 否 | 流加密 |
OFB | 否 | 是 | 无 | 否 | 卫星通信 |
CTR | 否 | 是 | 无 | 否 | 磁盘加密 |
GCM | 否 | 是 | 无 | 是 | TLS、API |
6. 常见的应用场景与算法特征
6.1 应用场景
Web安全
- HTTPS/TLS:大部分TLS连接使用AES-GCM
- API保护:请求参数和响应数据加密
- 会话管理:加密Cookie和Session数据
数据存储
- 数据库加密:字段级或表空间加密
- 文件加密:PDF、Office文档密码保护
- 磁盘加密:BitLocker、FileVault、LUKS
通信协议
- Wi-Fi安全:WPA2/WPA3使用AES-CCMP
- VPN协议:IPsec、WireGuard
- 即时通讯:Signal、WhatsApp的消息加密
6.2 算法特征识别
在爬虫中识别AES加密的特征:
- 数据特征
- 密文长度是16字节的倍数
- Base64编码输出(常带
/、+、=字符) - 包含IV(通常16字节,Base64编码)
- 代码特征
- JavaScript中搜索
AES、CryptoJS、encrypt等关键词 - 常见库:CryptoJS、forge、Web Crypto API
- 函数调用如
CryptoJS.AES.encrypt(text, key, {iv: iv})
- 网络特征
- HTTP头可能有
X-Encrypted: AES-256-GCM - 参数名如
encrypted_data、ciphertext、iv - 响应Content-Type可能为
application/octet-stream
7. 爬虫中遇到AES的常见处理方法
7.1 分析流程

7.2 静态分析技巧
查找JavaScript中的加密逻辑:
7.3 动态分析工具
- 浏览器开发者工具
- 设置XHR断点,捕获加密请求
- 在加密函数上设置JavaScript断点
- 使用Console执行代码,测试加密逻辑
- 专业调试工具
- Frida:动态插桩,Hook加密函数
- Charles/Fiddler:中间人代理,修改请求
- IDA Pro/Ghidra:二进制逆向(针对App)
7.4 实战处理策略
情况1:固定密钥和IV
情况2:动态生成密钥
情况3:完整模拟加密流程
8. Python实现完整示例
9. 知识点串联与实战总结
9.1 完整爬虫处理AES的流程
- 识别阶段
- 检查响应数据的长度特征(16字节倍数)
- 搜索页面JavaScript中的加密关键字
- 分析网络请求的加密参数结构
- 分析阶段
- 静态分析:阅读JavaScript源码,找到加密函数
- 动态分析:使用调试器跟踪加密过程
- 参数提取:获取密钥、IV、工作模式、填充方式
- 实现阶段
- Python重现加密/解密逻辑
- 处理可能的密钥派生过程
- 考虑时间戳、随机数等动态因素
- 集成阶段
- 创建解密中间件
- 错误处理和日志记录
- 性能优化和缓存策略
9.2 高级技巧与注意事项
处理动态密钥
应对反爬虫策略
- 某些网站会检测加密函数的调用环境
- 可能需要模拟完整的浏览器环境
- 考虑使用Puppeteer或Selenium执行JavaScript
性能优化
- 缓存已解密的密钥和配置
- 并行处理多个加密请求
- 使用连接池减少握手开销
9.3 伦理与法律提醒
- 合法合规
- 仅对公开数据或已授权数据进行采集
- 遵守网站robots.txt协议
- 尊重数据版权和隐私权
- 道德准则
- 不破解他人加密数据用于非法目的
- 不绕过付费墙窃取付费内容
- 不进行大规模爬取导致服务器压力
- 技术防护
- 设置合理的爬取间隔
- 使用User-Agent标识自己
- 处理异常,避免无限重试
- Author:24th
- URL:https://24th.top/article/aes
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!








