AES算法

时间:2024-03-27 18:59:54

算法简介

AES本质是一种对称分组密码*,采用代替/置换网络。每轮由三层组成:线性混合层确保多轮之上的高度扩散,非线性层由16个S盒并置起到混淆的作用,秘钥加密层将子秘钥异或到中间状态。

AES加密数据块和秘钥长度可以是128比特,192比特,256比特,AES加密有很多轮的重复和变换。

大致步骤如下:

  • 1、秘钥扩展(KeyExpansion)
  • 2、初始化轮(Initial Round)
  • 3、重复轮(Rounds),每一轮又包括:SubBytes,ShiftRows,MixColumns,AddRoundKey
  • 4、最终轮(Final Round),最终轮没有MixColums)
    AES算法

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算法
AES的S盒
AES算法
S盒的使用:输入8a,输出就是7e

AES算法

逆字节代换

逆字节替代变换是字节替代变换的逆变换,在状态的每个字节上应用逆S盒
y=A-1(x-B)
输入7e,输出8a
AES算法
上述S-盒对状态的所有字节所做的变换记为ByteSub (State)
AES算法

行移位(ShiftRow)

将状态阵列的各行进行循环移位,不同行的移位量不同:

  • 0行:不动
  • 1行:循环左移C1字节
  • 2行:循环左移C2字节
  • 3行:循环左移C3字节

AES算法

算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数Nb为分组长度除32,可看成字节组成的一维数组。
Nb=6的状态阵列
AES算法

行移位示意图:
AES算法

逆行移位

逆行移位变换是行移位变换的逆变换,它对状态的每一行进行循环右移

  • 第0行保持不变
  • 第1行循环右移C1个字节
  • 第2行循环右移C2个字节
  • 第3行循环右移C3个字节
列混淆(MixColumn)

将每列视为GF(28)上多项式,与固定的多项式c(x)进行模x4+1乘法,要求c(x)模x4+1可逆。

AES算法
列混淆运算也可写为矩阵乘法。
AES算法
示意图:
AES算法

轮**加(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的情况:AES算法

AES算法
Nk<=6
AES算法
AES算法

轮**选取

轮**i(即第i 个轮**)由轮**缓冲字W[Nb* i]到W[Nb*(i+1)]给出,如图所示。
AES算法