如何改进AES加密算法

AES算法基于置换和置换运算。排列是重新排列数据,替换是用一个数据单元替换另一个数据单元。AES使用几种不同的方法来执行置换和置换运算。AES是一种迭代的对称密钥分组密码。它可以使用128、192和256位密钥,用128位(16字节)加密和解密数据。与公钥加密中使用的密钥对不同,对称密钥加密使用相同的密钥来加密和解密数据。分组密码返回的加密数据的位数与输入数据的位数相同。迭代加密使用循环结构,其中输入数据被重复置换和替换。据记载,公元前400年,古希腊人发明了排列密码。1881年,世界上第一个电话保密专利出现。第二次世界大战期间,德国军方启动了英格玛密码机,密码学在战争中发挥了非常重要的作用。

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