AES算法的加密过程:
①明文初始状态矩阵的构建
将明文进行分组,将128bit划分为16byte,在一个4X4矩阵中按照列优先的顺序填充
②字节替代(s盒替换)
将状态中的每一个字节在S盒中映射为另一个字节
映射方法为:输入的前一个字节指定在S盒中的行值,后一个字节指定在S盒中的列值
例如:输入为80,则在S盒中映射为行数8列数0的字节
在S盒中的字节替代实际上是包括两个代数运算:
在有限域GF(2^8)上求乘法逆(2)在GF(2)上进行如下仿射变换:bi’ = bi⊕b[(i+4)mod8] ⊕b[(i+5)mod8] ⊕b[(i+6)mod8] ⊕b[(i+7)mod8] ⊕ci,其中ci是01100011中第i位的值,
步骤(2)也可用矩阵预算来表示
下面我们通过一个实际例子来具体体会一下字节替代(此处略去已知S盒表格,通过查表的方法进行字节替代)
例:输入字符为F5,求它通过字节替代后为多少?
解:
(1)在有限域GF(2^8)上求乘法逆
① 写出该字节(16进制表示)的对应二进制
F5 = 11110101
② 由该二进制写出对应的多项式
F(F5) = x^7 + x^6 + x^5 + x^4 + x^2 + 1,也即11110101从低位依次对应i * x^y中的i,x^y对应该低位的权重
③ 计算该多项式的逆元
(x^7 + x^6 + x^5 + x^4 + x^2 + 1)* a(x) = 1 mod p(x), p(x)在有限域GF(2^8)上固定为x^8 + x^4 + x^3 +x + 1
计算a(x):采用多项式的欧几里得扩展算法,此处不在赘述怎么使用多项式的欧几里得扩展算法,如有不会可以参考:http://t.csdnimg.cn/c4RkS
④ 得出逆元多项式转为为对应的二进制
通过计算可以知悉:a(x) = x^6 + x^2 + x,其对应的二进制为:1000110,填充为8bit为:01000110,对应16进制数为:46
(2)在GF(2)上进行如下仿射变换
① 写出原始矩阵,再填入对应数据
原始矩阵如上图所示,b0……b7 = 01100010 (为a(x)的填充8bit二进制码的反向)
② 矩阵相乘计算结果
例如:b’0 = 1 * 0 + 0 * 1 + 0 * 1 + 0 * 0 + 1 * 0 + 1 * 0 + 1 * 1 + 1 * 0 + 1
注意:图中给出矩阵的第一行:10001111,实际上是一个一行八列,只是书籍篇幅有限每个数据之间并没有间隔,但为了理解建议分开写[1 0 0 0 1 1 1 1],再与列相乘
③ 将得出的b’0……b’7转换为16进制数
运算结果为:11100110 = E6
③ 行移位
行移位进行的操作为:将状态矩阵的每一行以字节为单位进行循环左移,每一行的循环左移的偏移量由行号和列数确定
- 列混合
列混合进行的操作为:将输入的状态矩阵的每一列与固定多项式a(x)在有限域GF(2^8)上相乘,然后模多项式想x^4 + 1,其中a(x) = {03}x^3 + {01}x^2 +{01}x + {02},计算矩阵为如下所示:
简化运算方法:GF(28)上域元素的乘
GF(28) 上还定义了一个运算,称之为x乘法,设:
例如:
④ 轮密钥加
轮密钥加进行的操作为:将列混合的输出状态矩阵与子密钥状态进行异或运算(子密钥是初始密钥派生而来)
⑤ 密钥扩展
算法的密钥同样以字节为单位进行变换,用一个4行的二维阵列来表示。密钥按照矩阵的列进行分组,密钥长度等于明文分组长度乘以轮数加1,即密钥比特数长度=明文分组长度*(轮数Round+1)
操作流程:
①构造密钥初始状态矩阵
例:现有一个密钥
k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 k11 k12 k13 k14 k15 k16 k17 k18 k19 k20 k21 k22 k23(byte)
它的初始状态矩阵为:
其中密钥列数由:密钥长度(bit)/ 32确定,但每一列均为4个bit
②计算新列Ki
- 若i不是4的倍数,则Ki = Ki-4 ⊕ Ki-1 (⊕为异或符号)
- 若i是4的倍数,则Ki = Ki-4 ⊕ T(Ki-1)
- 计算T(Ki-1),方法如下 ①以字节为单位循环左移一位 ②将循环后的输出进行字节替代(S盒替换) ③根据Rcon常量查表得到Rcon[i / Nk], Nk为密钥列数 ④将2与3的结果异或
③得出结果
例子: