最后轮没有列混合
初始变换:
明文4*4=16字节=128bit 密钥4*4=128bit
明文和初始密钥 异或
字节代换
S-Box
行移位
列混合
乘法
乘2时 左移1位且分为当首位为0时;当首位为1时 两种情况
乘3时 将3拆为2+1
乘4时 将4拆为2*2
轮密钥加
子密钥获得(密钥扩展)
AES算法主要包括以下几个部分:s盒模型,密钥扩充,轮密钥加,字节代换,行移位,列混合。
而本文主要讨论AES-128,进行10轮迭代,在第10轮时少一次列混合。
(1)密钥扩充
AES首先将初始密钥输入到一个4*4的状态矩阵,这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。
接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归
方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
(2)字节代换
AES的字节代换其实就是一个简单的查表操作。状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。
(3)行移位
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节
(4)列混合
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法
(5)轮密钥加
轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
设置key={ 0x2b, 0x7e, 0x15, 0x16,
0x28, 0xae, 0xd2, 0xa6,
0xab, 0xf7, 0x15, 0x88,
0x09, 0xcf, 0x4f, 0x3c }
设置输入信息=
{0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34}
(1)密钥扩展
W[i]是4的倍数时:w[i-1]循环左移一位,s盒替换, 异或 w[i-4],再与轮数异或
W[i]不是4的倍数时:w[i-1] 异或 w[i-4]
(2)字节代换
直接与sbx_tab表相应行列的值进行替换即可
(3)行移位
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节
(4)列混合
这里调用了一个xtime函数,可以进行0x02乘法//0x03乘法//0x01乘法//0x01乘法