算法简介
AES本质是一种对称分组密码*,采用代替/置换网络。每轮由三层组成:线性混合层确保多轮之上的高度扩散,非线性层由16个S盒并置起到混淆的作用,秘钥加密层将子秘钥异或到中间状态。
AES加密数据块和秘钥长度可以是128比特,192比特,256比特,AES加密有很多轮的重复和变换。
大致步骤如下:
- 1、秘钥扩展(KeyExpansion)
- 2、初始化轮(Initial Round)
- 3、重复轮(Rounds),每一轮又包括:SubBytes,ShiftRows,MixColumns,AddRoundKey
- 4、最终轮(Final Round),最终轮没有MixColums)
AES的轮函数
字节代换 (SubBytes)
非线性代换,独立地对状态的每个字节进行,并且代换表(S盒)可逆,记为ByteSub(State),分两步:
- (1)将字节作为GF(28)上的元素映射到自己的逆元
- (2)将字节做GF(2)上的放射变换,即 y=Ax-1+B,其中A是一个GF(2)上8☓8的可逆矩阵,B是GF(2)上一个8位列向量
AES的S盒
S盒的使用:输入8a,输出就是7e
逆字节代换
逆字节替代变换是字节替代变换的逆变换,在状态的每个字节上应用逆S盒
y=A-1(x-B)
输入7e,输出8a
上述S-盒对状态的所有字节所做的变换记为ByteSub (State)
行移位(ShiftRow)
将状态阵列的各行进行循环移位,不同行的移位量不同:
- 0行:不动
- 1行:循环左移C1字节
- 2行:循环左移C2字节
- 3行:循环左移C3字节
算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数Nb为分组长度除32,可看成字节组成的一维数组。
Nb=6的状态阵列
行移位示意图:
逆行移位
逆行移位变换是行移位变换的逆变换,它对状态的每一行进行循环右移
- 第0行保持不变
- 第1行循环右移C1个字节
- 第2行循环右移C2个字节
- 第3行循环右移C3个字节
列混淆(MixColumn)
将每列视为GF(28)上多项式,与固定的多项式c(x)进行模x4+1乘法,要求c(x)模x4+1可逆。
列混淆运算也可写为矩阵乘法。
示意图:
轮**加(AddRoundKey)
轮**与状态进行逐比特异或。轮**由种子**通过**编排算法得到。轮**长度与分组长度相同
**编排
**编排指从种子**得到轮**的过程,它由**扩展和轮**选取两部分组成。其基本原则如下:
- (1)轮**的比特数等于分组长度乘以轮数加1;例如要将128比特的明文经过10轮的加密,则总共需要(10+1)*128=1408比特的**。
- (2)种子**被扩展成为扩展**;
- (3)轮**从扩展**中取,其中第1轮轮**取扩展**的前Nb个字,第2轮轮**取接下来的Nb个字,如此下去。
**扩展
扩展**是以4字节字为元素的一维阵列,表示为W[Nb* (Nr+1)],其中前Nk个字取为种子**,以后每个字按递归方式定义。扩展算法根据Nk≤6和Nk>6有所不同。
种子**:以字节为元素的矩阵阵列描述,阵列为4行,列数Nk为**长度除32
Nk=4的情况:
Nk<=6
轮**选取
轮**i(即第i 个轮**)由轮**缓冲字W[Nb* i]到W[Nb*(i+1)]给出,如图所示。