2、对称加密算法基础:AES算法原理
2.1 AES算法概述
AES(Advanced Encryption Standard,高级加密标准)是目前全球最广泛使用的对称加密算法,由比利时密码学家Joan Daemen和Vincent Rijmen设计,最初称为Rijndael算法。2001年,NIST(美国国家标准与技术研究院)将其正式采纳为联邦信息处理标准(FIPS 197)。
AES属于分组密码(Block Cipher),其核心特征如下:
- 分组长度固定:128位(16字节)
- 密钥长度可选:128位、192位、256位
- 轮数依赖密钥长度:10轮(128位)、12轮(192位)、14轮(256位)
- 操作单位:字节(8位)和字(32位)
对称加密核心概念:加密和解密使用相同的密钥。发送方和接收方必须在通信前通过安全渠道协商并共享密钥。AES的安全性完全依赖于密钥的保密性。
2.2 AES算法内部结构
AES的每一轮(除最后一轮外)包含四个基本操作:字节代换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)、轮密钥加(AddRoundKey)。最后一轮省略列混淆操作。
下图展示了AES-128加密的完整流程与内部轮结构:
2.3 四大核心操作详解
2.3.1 字节代换(SubBytes)
字节代换是AES中唯一的非线性变换,通过一个16×16的S盒(Substitution Box)对状态矩阵中的每个字节进行独立替换。S盒具有以下设计特性:
- 可逆性:加密S盒与解密逆S盒一一对应
- 非线性:抵抗线性密码分析
- 差分均匀性低:抵抗差分密码分析
S盒构造过程:先计算字节在GF(2⁸)上的乘法逆元,再应用仿射变换。
2.3.2 行移位(ShiftRows)
行移位对状态矩阵的每一行进行循环左移操作:
| 行号 | 移位量(字节) | 说明 |
|---|---|---|
| 第0行 | 0 | 不移位 |
| 第1行 | 1 | 循环左移1字节 |
| 第2行 | 2 | 循环左移2字节 |
| 第3行 | 3 | 循环左移3字节 |
行移位的作用是扩散——将列之间的相关性打散,使每一列的数据分散到不同列中。
2.3.3 列混淆(MixColumns)
列混淆将状态矩阵的每一列视为GF(2⁸)上的一个4维向量,与一个固定的可逆矩阵相乘:
┌ s'₀c ┐ ┌ 02 03 01 01 ┐ ┌ s₀c ┐
│ s'₁c │ = │ 01 02 03 01 │ │ s₁c │
│ s'₂c │ │ 01 01 02 03 │ │ s₂c │
└ s'₃c ┘ └ 03 01 01 02 ┘ └ s₃c ┘
其中乘法在GF(2⁸)上执行,加法为异或操作。列混淆进一步增强了雪崩效应——明文或密钥的微小变化会导致密文约50%的比特位发生变化。
2.3.4 轮密钥加(AddRoundKey)
轮密钥加是最简单的操作:将状态矩阵与当前轮的轮密钥进行逐字节异或。轮密钥由主密钥通过密钥扩展算法生成。
密钥扩展要点:
- AES-128:从16字节主密钥扩展出44个字(176字节),每轮使用4个字
- AES-192:从24字节主密钥扩展出52个字(208字节)
- AES-256:从32字节主密钥扩展出60个字(240字节)
- 扩展算法包含字循环(RotWord)、S盒替换(SubWord)和轮常数异或(Rcon)
2.4 AES-128/192/256 区别
三种AES变体的核心区别在于密钥长度和轮数,直接影响安全强度和性能:
| 参数 | AES-128 | AES-192 | AES-256 |
|---|---|---|---|
| 密钥长度 | 128位(16字节) | 192位(24字节) | 256位(32字节) |
| 轮数 | 10 | 12 | 14 |
| 扩展密钥字数 | 44 | 52 | 60 |
| 安全强度 | 128位 | 192位 | 256位 |
| 性能(相对) | 最快 | 中等 | 最慢(约慢20%~40%) |
| 量子安全(Grover算法) | 64位(不安全) | 96位(过渡) | 128位(推荐) |
| 典型应用 | IoT设备、移动端 | 企业级应用 | 政府、金融、长期机密 |
安全建议:对于新建系统,建议优先选择AES-256。虽然AES-128在经典计算下足够安全(暴力破解需2¹²⁸次尝试),但考虑到量子计算威胁(Grover算法可将安全强度减半),AES-256是面向未来的选择。
2.5 ECB/CBC/GCM 模式对比
AES作为分组密码,需要配合工作模式来处理超过16字节的数据。三种最常用的模式对比如下:
| 特性 | ECB(电子密码本) | CBC(密码分组链接) | GCM(伽罗瓦/计数器模式) |
|---|---|---|---|
| 加密方式 | 每个分组独立加密 | 前一分组密文与当前明文异或后加密 | 计数器递增 + 加密 + 异或明文 |
| 是否需要IV | 否 | 是(随机IV,16字节) | 是(随机Nonce,12字节推荐) |
| 并行加密 | 支持 | 不支持 | 支持 |
| 并行解密 | 支持 | 支持 | 支持 |
| 错误传播 | 仅影响当前分组 | 影响当前及下一分组 | 仅影响当前分组 |
| 完整性认证 | 无 | 无 | 内置GMAC认证标签 |
| 密文模式 | 确定型(相同明文→相同密文) | 概率型(相同明文→不同密文) | 概率型(相同明文→不同密文) |
| 安全性 | 低(不推荐用于多分组数据) | 中(需正确实现) | 高(AEAD认证加密) |
| 典型场景 | 单分组数据、密钥加密 | 文件加密、传统协议 | 网络通信、TLS 1.3、VPN |
下图展示了三种工作模式的加密流程对比: