AES
- Advanced Encryption Standard(高级加密标准)
- 分组加密算法
- 是Rijndael算法的子集,实际应用中等价
- 分组长度为128位
- 密钥长度为三种:128 / 192 / 256 位,相应的迭代轮数为 10 / 12 / 14 轮
- 基本运算单位是字节,加密和解密过程都是在一个4×4的字节矩阵上运作,该矩阵又称为“体”或“状态”
一般结构图
明文初始矩阵构造
- 输出密文128位按相同顺序提取
- 填不满的矩阵用0补满
密钥初始矩阵
以192位密钥长度为例:
轮密钥加
c:明文块
k:子密钥
字节代替
S盒(16×16):
- 输入字节的前 4 位指定S盒的行值,输入字节的后 4 位指定S盒的列值
- 行号和列号都从0开始计数
行移位
列混合
- 通过矩阵相乘来实现,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵
- 固定矩阵是给定的
- 都是模运算
密钥扩展
- 其复杂性是确保算法安全性的重要部分
- 由于 10 轮迭代需要 10 个轮密钥,初始密钥也被扩展为一个轮密钥,因此共需要11个轮密钥
- 密钥比特的总数 = 密钥长度 × (轮数 + 1)
- 密钥扩展的目的是将输入的 128 位密钥扩展成 11 / 13 / 15 个 128 位子密钥
- AES的密钥扩展算法是以字为一个基本单位(一个字为 4 个字节),刚好是密钥矩阵的一列
g函数
- 将该列以字节为单位,循环左移一个字节,例如
FF EE EE AA
变成EE EE AA FF
- 将循环左移之后的输出进行字节代替(利用S盒)
- 根据Rcon常量表查表得到
RC[i]
值,i代表的是轮数
Rcon[i] = (RC[i],0,0,0),
其中RC[1] = 1,RC[i] = 2•RC[i-1]
乘法是定义在域GF(2^8)上的
- 将步骤 2 和步骤 3 的结果异或
解密
轮密钥加
与加密时相同
逆字节代替
更换S盒为逆S盒
逆行移位
循环左移变循环右移
逆列混合
固定矩阵改变: