如何改进AES加密算法
AES加密算法的主要步骤
1.1 AES算法总体描述
l给定一个明文x,将状态初始化为x,执行AddRoundKey运算,将RoundKey与状态进行异或运算。
l对于前面Nr-1轮中的每一轮,S盒对用于替换操作,这被称为子字节;;替换State、ShiftRows。;再对State做操作,MixColumns;然后执行AddRoundKey操作。
l依次执行SubBytes、ShiftRows和AddRoundKey操作。
l将状态定义为密文y。
1.2伪代码
密码(字节输入[4*Nb],字节输出[4*Nb],字w[Nb*(Nr+1)])
开始
字节状态[4,Nb]
状态=输入
AddRoundKey(state,w[0,Nb-1])
对于round = 1,步骤1至Nr-1
子字节(状态)
ShiftRows(州)
混合列(状态)
AddRoundKey(state,w[round*Nb,(round+1)*Nb-1])
结束于
子字节(状态)
ShiftRows(州)
AddRoundKey(state,w[Nr*Nb,(Nr+1)*Nb-1])
out =状态
结束
2 KeyExpansion()的实现
2.1要求
在加密过程中将128 bit的密钥扩展到9轮,然后在初始和最后两轮后构造11轮的密钥。每轮密钥由四个单词组成。每个字由四个字节组成。
2.2算法设计
输入:byte[] key,byte[] w //key是键,w是扩展键。
输出:byte[] w //扩展密钥长度为4 * 4 * 11。
搬运:
1)创建一个4字节的一维数组来存储一个单词。byte[]temp;
2)发送密钥[0.15]到W[0.15];//已经给w赋了4个字。
3)对于I = 4到43
//以下每次处理一个字(32位)
temp = w[I-1];
If (I = 0 mod 4) //处理一个字然后。
j = 1到4 //字的4字节处理
在这个循环中,取temp数组索引的顺序是1,2,3,0 //RotWord操作。
如果是一个字的第一个字节,取Rcon常数Rcon(I/4);
temp[j]= sbox(temp[(j+1)/4]rcon常数。
结束于
temp = subword(rotword(temp))⊕rcon[i/4]
如果…就会结束
w[I]= w[i-4]⊕temp;
结束于
4)输出w
3多项式乘法模GF(28)运算
3.1要求
将有限域GF(28)中两个字节乘以多项式,模不可约多项式m(x)=x8+x4+x3+x+1。
3.2算法设计
输入:字节a,字节b
输出:字节r
数学基础:
GF(28)有限域的性质:两个元素的相加与按比特模式2两个字节的相加是一致的;乘法满足结合律;
考虑多项式中的一项aixi(i∈0-7),将多项式乘以线性x:
b(x)= b7x 7+b6x 6+b5x 5+B4 x4+b3x 3+B2 x2+b 1x+B0,
得到
b7x 8+b6x 7+b5x 6+b4x 5+B3 x4+b2x 3+b 1x 2+B0X(公式1)。
结果模m(x)被求补以获得x*b(x)。
如果b7 = 0,则公式1为x*b(x)。
如果b7不等于0,则必须从等式1中减去m(x ),结果是x*b(x)。简称多项式乘以x。
由此可以得出结论,aixi乘以b(x)可以乘以I倍。x的乘法(十六进制表示为0x02)可以通过将字节左移一位,然后与0x1b的按位模2相加来实现,这个操作暂时记为xtime()。通过重复应用xtime(),可以实现x的高阶乘法。通过将中间结果相加,可以使用xtime()实现任何乘法。例如:
57 * 13 = fe,这是因为:
57 * 02 = xtime(57) = ae
57 * 04 = xtime(ae) = 47
57 * 08 = xtime(47) = 8e
57 * 10 = xtime(8e) = 07
因此
57 * 13 = 57 * ( 01⊕ 02 ⊕10 )
= 57⊕ ae⊕ 07
=铁
第4代Sbox
4.1要求
将一个字节byte看作有限域GF(28)中的一个多项式,求出它关于模m(x)的乘法逆,然后将乘法逆在GF(2)上进行仿射变换。
4.2算法设计
输入:字节a
输出:字节[] S
数学逻辑:
根据有限域GF(28)性质。一个生成元(也是本原)A,它的A (28-1) ≡ 1 mod m (x)。或者a255 ≡ 1 mod m(x)。另外,a从1到28-1的幂构成了有限域GF(28)。
由乘法逆b * b -1 ≡ 1的性质。求乘法的倒数可以简化如下
设x = am,y是x的乘法逆,则y = a255-m。
搬运:
设置三个数组,分别是:字节s [255],字节l [255],字节e [255]。
设原语为a = 0x03,
将A的0,1,2…255次方模m(x)分别发送到数组L。a的运算是指前面的多项式乘法运算。下面是伪代码:
对于i = 0至255
L[i] = ai(公式2)
结束于
为了方便计算乘法逆的指数,数组E存储ai的幂指数I。设等式2中的ai值为数组E的下标,数组L中ai的下标I为数组E中对应的值..公式2中每一项都有E[ai] = i。
从上面两个数组L,E,可以得到GF(28)域中任意字节的乘法逆。
让字节c由ai生成。其中a是GF(28)域中的生成元。要找到c的乘法逆运算,只需找到A255-i..在数组E中,生成器A的幂指数I可以通过C找到..c-1的幂指数是255-i .所以c-1 = L[255-i]。
对于每个字节,根据上述内容得到乘法逆,通过仿射变换得到数组S。是Sbox