Lazy loaded image
加解密
🔑深入理解AES加密
Words 3828Read Time 10 min
2024-12-27
2025-12-26
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加密的特征:
  1. 数据特征
      • 密文长度是16字节的倍数
      • Base64编码输出(常带/+=字符)
      • 包含IV(通常16字节,Base64编码)
  1. 代码特征
      • JavaScript中搜索AESCryptoJSencrypt等关键词
      • 常见库:CryptoJS、forge、Web Crypto API
      • 函数调用如CryptoJS.AES.encrypt(text, key, {iv: iv})
  1. 网络特征
      • HTTP头可能有X-Encrypted: AES-256-GCM
      • 参数名如encrypted_dataciphertextiv
      • 响应Content-Type可能为application/octet-stream

7. 爬虫中遇到AES的常见处理方法

7.1 分析流程

notion image

7.2 静态分析技巧

查找JavaScript中的加密逻辑

7.3 动态分析工具

  1. 浏览器开发者工具
      • 设置XHR断点,捕获加密请求
      • 在加密函数上设置JavaScript断点
      • 使用Console执行代码,测试加密逻辑
  1. 专业调试工具
      • Frida:动态插桩,Hook加密函数
      • Charles/Fiddler:中间人代理,修改请求
      • IDA Pro/Ghidra:二进制逆向(针对App)

7.4 实战处理策略

情况1:固定密钥和IV
情况2:动态生成密钥
情况3:完整模拟加密流程

8. Python实现完整示例

9. 知识点串联与实战总结

9.1 完整爬虫处理AES的流程

  1. 识别阶段
      • 检查响应数据的长度特征(16字节倍数)
      • 搜索页面JavaScript中的加密关键字
      • 分析网络请求的加密参数结构
  1. 分析阶段
      • 静态分析:阅读JavaScript源码,找到加密函数
      • 动态分析:使用调试器跟踪加密过程
      • 参数提取:获取密钥、IV、工作模式、填充方式
  1. 实现阶段
      • Python重现加密/解密逻辑
      • 处理可能的密钥派生过程
      • 考虑时间戳、随机数等动态因素
  1. 集成阶段
      • 创建解密中间件
      • 错误处理和日志记录
      • 性能优化和缓存策略

9.2 高级技巧与注意事项

处理动态密钥
应对反爬虫策略
  • 某些网站会检测加密函数的调用环境
  • 可能需要模拟完整的浏览器环境
  • 考虑使用Puppeteer或Selenium执行JavaScript
性能优化
  • 缓存已解密的密钥和配置
  • 并行处理多个加密请求
  • 使用连接池减少握手开销

9.3 伦理与法律提醒

  1. 合法合规
      • 仅对公开数据或已授权数据进行采集
      • 遵守网站robots.txt协议
      • 尊重数据版权和隐私权
  1. 道德准则
      • 不破解他人加密数据用于非法目的
      • 不绕过付费墙窃取付费内容
      • 不进行大规模爬取导致服务器压力
  1. 技术防护
      • 设置合理的爬取间隔
      • 使用User-Agent标识自己
      • 处理异常,避免无限重试
上一篇
白话哈希(Hash)算法
下一篇
一文读懂公钥、私钥(建议收藏)
  • 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!

Comments
Loading...