AES
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的分组.
初始时,这个矩阵内容即为当前分组的明文,填充进这个状态矩阵
,顺序从上到下,从做到用,如下所示:
每轮加密都是对这个状态矩阵进行几步运算,其中涉及到置换,异或,矩阵乘法等.
密钥的处理
128位密钥也是以矩阵的形式来处理.需要对其进行扩展,最终扩展为44个字,其中前4个字位初始密钥,后40个字每10个一组依次用于10轮加密.
首先初始密钥也存储在一个4x4的矩阵:
然后每一列的4个字节(byte)合成一个字(word):
即W0
为K0K1K2K3
拼接而成.
接着根据如下规则产生后面的W4
-W43
:
- 如果i不是4的倍数,则
W[i] = W[i-4] xor W[i-1]
- 如果i是4的倍数,则
W[i] = W[i-4] xor T(W[i-1])
其中T()为:
a. 将4个字节进行循环左旋
1个字节.
b. 然后使用S盒
(AES定义的,后面给出)进行变换
c. 然后与轮常量
Rcon[j]异或(图中的j
为i/4
):
AES的S盒和逆S盒
AES的S盒定义如下:
逆S盒:
查找时,将输入字节的高4位作为行,低4位作为列进行查找.
行移位
行移位是一个简单的左循环操作,第0行左移0位(即不移位),第1行左移1位,第2行左移2位,第3行左移3位.
其逆变换即为反向的移位.
列混合
列混合是一个矩阵乘法,有一个固定的矩阵:
逆列混合同理:
可以验证两个矩阵互逆
.
轮密钥加
轮密钥加实际上就是逐位异或
.
AES的加解密操作
过程如下图:
其中的字节代换
就是查询S盒的操作,将一个字节输入S盒,输出结果就是查S盒表的结果.逆字节代换
同理,使用逆S盒.
每一轮都使用扩展的对应的四字密钥.
另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作.
参考:https://blog.csdn.net/qq_28205153/article/details/55798628