AES
- 1、AES产生
- 2、数学基础
- 2.1有限域GF(2^8^)
- 2.1.1加法运算
- 2.1.2乘法运算
- 2.1.3x乘运算
- 2.1.4系数在GF(2^8^)上的多项式
- 3、AES算法描述
- 3.1字节代换
- 3.2行移位
- 3.3列混合
- 3.4轮密钥加
- 3.5密钥扩展
1、AES产生
征集AES算法的活动,目的是确定一个非保密的、公开的、全球免费使用的加密算法。对AES的基本要求:执行性能比三重DES快、至少与三重DES一样安全、数据分组长度是128bit、密钥长度是129/192/256bit。
原型是Squsre算法,优点:
可以给出算法的最佳差分特征的概率以及最佳线性逼近的偏差的界
使用非线性结构的S盒,足够安全;
有很高的灵活性;由防御特性。
2、数学基础
2.1有限域GF(28)
将b7b6b5b4b3b2b1b0构成的一个字节看成多项式b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x1+b0x0,其中b∈GF(2)。如十六进制的57=01010111=x6+x4+x2+x1+x0
2.1.1加法运算
对应元素的系数进行模2加。
如’57’+‘83’
‘57’=01010111=x6+x4+x2+x1+x
‘83’=10000011=x7+x+1
二者相加=11010100=x7+x6+x4+x2
2.1.2乘法运算
乘法运算就是两个多项式的模乘,其中8次不可约多项式:m(X)=x8+x4+x3+x+1
例如:‘57’·‘83’
‘57’=01010111=x6+x4+x2+x1+x0
‘83’=10000011=x7+x+1
‘57’·‘83’=(x6+x4+x2+x1+x0)·(x7+x+1)
=x13+x11+x9+x8+x6+x5+x4+x3+1
(x13+x11+x9+x8+x6+x5+x4+x3+1)mod m(x):
①x5m(x)=x13+x9+x8+x6+x5
剩余:x11+x4+x3+1
②x3m(x)=x11+x7+x6+x4+x3
剩余x7+x6+1
所以最终结果是x7+x6+1
2.1.3x乘运算
b(x)x计算的结果模m(x)求余得到x·b(x),若b7=0,则结果就是x·b(x);若b7=1,则先将结果减去m(x),结果是x·b(x).
xtime():
若最高位是0,则只需要左移一位,末尾补0;
若最高位是1,则左移之后还要与‘1b’='00011011’进行模2 加运算。
2.1.4系数在GF(28)上的多项式
规定多项式的乘法必须要取模M(x)=x4+1,这样使得次数小于4的多项式的乘积仍然是一个次数小于4的多项式。
c(x)=a(x)✖b(x)=c3x3+c2x2+c1x+c0
3、AES算法描述
AES分为:
①线性混合层:确保多轮之上的高度扩散;
②非线性层:将具有最优的“最坏情况非线性特性”的S盒并行使用
③密钥加层:单轮子密钥简单地异或到中间状态上,实现一次性掩盖。
详细视频: link
如下的AES参数:
AES算法 | 密钥长度(32bit) | 分组长度(32bit) | 加密和解密轮数 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
AES的处理单位是字节,128bit的的输入明文组P和输入密钥K都被分成16个字节。
状态矩阵:描述明文分组,在算法的每一轮状态矩阵的内容都不断发生变化,最后的结果作为密文输出C。
输入矩阵和输出矩阵如图:
密钥的转换是以字节为单位的矩阵,通过密钥编排程序,该密钥矩阵被扩展成一个由44个字(32bit)组成的序列w[0],w[1]…w[43],该序列的前四个元素(128Bit)是原始密钥,用于加密运算中的初始密钥加;后面40个元素被分成10组,一组4个也就是128bit,每一组作为一个子密钥参与每一轮的加密。
过程如下:
加密的时候:
在初始将明文和原始密钥进行一次轮密钥加操作;后续1-9轮都有四个操作字节代换、行移位、列混合和轮密钥加,最后一轮不进行列混合。
解密的时候:
在初始进行一次轮密钥加操作,后续第一轮是顺序执行逆行移位、逆字节变换、轮密钥加和逆列混合。
3.1字节代换
字节代换是一个关于字节的非线性变换,独立地对状态的每个字节进行代换。字节代换是可逆的,可以由两个可逆变换复合而成。
将所有结果裂成表格就可以得到S盒,以高四位为行,第四位为列,取出S盒中对应的元素作为输出。
S盒如下:
3.2行移位
行移位是将状态矩阵的各个行进行循环移位,不同状态行的位移量不一样。
第0行不移动,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。如下图所示:
3.3列混合
列混合变换是一个替代操作,是AES算法中最具技巧性的部分。列混合在最后一轮不适用,是通过矩阵相乘实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵。
则:
其中a(x)={03}x3+{01}x2+{01}x+{02},其中是模x4+1乘法
也可以将其表示为矩阵乘法:
也就是:
列混合的逆运算是每一列都用一个特定的多项式d(x)相乘,其中a(x)d(x)=‘01’,所以
d(x)={0B}x3+{0D}x2+{09}x+{0E}
3.4轮密钥加
128bit地sate按位与128Bit地密钥逐位异或,可以影响状态sate中地每一位。
3.5密钥扩展
输入:4字密钥
输出:44字的一维线性数组
为初始轮密钥扩展阶段和算法中的其他10轮每一轮提供了一个16字节的轮密钥。
AES在加密和解密算法中使用了一个由种子密钥字节数组生成地密钥调度表,称为密钥扩展,从一个原始密钥中生成多重密钥以代替使用单个密钥,大大增加了比特位的扩散。
①首先将128bit的密钥输入一个4x4的矩阵中,每一列是一个32bit的字,依次为w[0],w[1],w[2],w[3],构成数组w,然后每次用数组w填充扩展密钥数组剩下的部分:w[i]的值依赖于w[i-1]和w[i-4] (i≥4):
①若元素下标不是4的倍数,则只进行简单的异或:w[i]=w[i-1]异或w[i-4]
②若元素下标是4的倍数,则w[i]=w[i-4]异或T(w[i-1]);其中T(w[i-1])=ByteSub(RotByte(w[i-1]))异或Rcon[i]
-----1)字循环RotByte():将1个字的4个字节循环左移1个字节,即将字B0,B1,B2,B3变成B1,B2,B3,B0
-----2)字节代换ByteSub():基于S盒对输入字中的每个字节进行S代替
-----3)轮常量异或:将上述1和2的结果再与轮常量Rcon[i]进行异或,i表示轮数。轮常量Rcon[i]是一个32Bit的字,这个字的右边3个字节总为0。
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Rcon[i] | 01000000 | 02000000 | 04000000 | 08000000 | 10000000 | 20000000 | 40000000 | 80000000 | 1b000000 | 36000000 |
密钥扩展设计标准如下:
1)知道密钥或者轮密钥的部分位不能计算出轮密钥的其他位
2)可逆变换:知道扩展密钥中任何连续Nk个字能够重新产生整个扩展密钥(Nk是构成密钥所需要的字数)
3)能在各种处理器上有效执行;能利用轮常量排除对称性;
4)密钥的每一位能影响到轮密钥的一些位
5)足够的非线性以防止轮密钥的差完全由密钥的差所决定
6)易于描述