AES概述

AES(Advanced Encryption Standard)是一种对称密钥分组加密算法.

不同于它的前任标准DES,Rijndael使用的是代换-置换网络,而非Feistel架构.

AES分组固定为128bit,即16byte.而密钥长度可以为128bit,192bit或256bit.不同长度的密钥,推荐加密轮次也不同.

与DES不同,AES维护一个状态矩阵,所有加密轮次结束后,状态矩阵内容即为密文.

下面描述AES-128.

AES基本结构

加密轮次

作为分组密码,AES的每个分组长度固定,而对于不同长度密钥,有着不同的推荐加密轮次(轮函数的执行次数),如下所示:

AES 密钥长度/字(32bit为1个字) 分组长度/字(32bit为1个字) 加密轮次
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

加密的结构

AES在一个4x4的矩阵上运行,每个元素都是1byte,一共16byte,即一个128bit的分组.

初始时,这个矩阵内容即为当前分组的明文,填充进这个状态矩阵,顺序从上到下,从做到用,如下所示:

image-20231214152521877

每轮加密都是对这个状态矩阵进行几步运算,其中涉及到置换,异或,矩阵乘法等.

密钥的处理

128位密钥也是以矩阵的形式来处理.需要对其进行扩展,最终扩展为44个字,其中前4个字位初始密钥,后40个字每10个一组依次用于10轮加密.

首先初始密钥也存储在一个4x4的矩阵:

image-20231214152734850

然后每一列的4个字节(byte)合成一个字(word):

image-20231214152908328

W0K0K1K2K3拼接而成.

接着根据如下规则产生后面的W4-W43:

image-20231214153611764
  1. 如果i不是4的倍数,则 W[i] = W[i-4] xor W[i-1]
  2. 如果i是4的倍数,则 W[i] = W[i-4] xor T(W[i-1])

其中T()为:

a. 将4个字节进行循环左旋1个字节.

b. 然后使用S盒(AES定义的,后面给出)进行变换

c. 然后与轮常量Rcon[j]异或(图中的ji/4):

image-20231214154248868

AES的S盒和逆S盒

AES的S盒定义如下:

image-20231214160148556

逆S盒:

image-20231214160426437

查找时,将输入字节的高4位作为行,低4位作为列进行查找.

行移位

行移位是一个简单的左循环操作,第0行左移0位(即不移位),第1行左移1位,第2行左移2位,第3行左移3位.

image-20231214160647204

其逆变换即为反向的移位.

列混合

列混合是一个矩阵乘法,有一个固定的矩阵:

image-20231214160746412

逆列混合同理:

image-20231214160803810

可以验证两个矩阵互逆.

轮密钥加

轮密钥加实际上就是逐位异或.

image-20231214160948716

AES的加解密操作

过程如下图:

image-20231214161107048

其中的字节代换就是查询S盒的操作,将一个字节输入S盒,输出结果就是查S盒表的结果.逆字节代换同理,使用逆S盒.

每一轮都使用扩展的对应的四字密钥.

另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作.


参考:https://blog.csdn.net/qq_28205153/article/details/55798628