AES算法流程以及4种工作模式流程图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AES算法流程以及4种工作模式流程图
1、AES加密算法基本流程
AES算法的数据分组长度为128比特、密钥长度为128/192/256比特。

AES加解密包括Nr轮,前面Nr-1轮包含S盒变换、行移位、列混淆、轮密钥加4个阶段,最后一轮则少了列混淆这个阶段。

Rijnadel(State, CipherKey)
{
//初始化
KeyExpansion( CipherKey, ExpandedKey );//生成子密钥
AddRoundKey( State, ExpandedKey );//与子密钥位与
// 前Nr-1轮
for(i =1; i < Nr; i++)
{
ByteSub(State);// S-盒
ShiftRow(State);// 行被移位
MixColumn(State);// 列被混叠
AddRoundKey (State, ExpandedKey ); //与子密钥位与
}
//最后一轮
ByteSub(State);
ShiftRow(State);
AddRoundKey (State, ExpandedKey );
}
2、AES加密算法
2.1、状态、密钥、轮数
状态:
○1解密过程中的中间数据。

○2以字节为元素的矩阵,或二维数组。

所有的操作都在状态上进行。

状态可以用以字节为元素的矩阵阵列表示,如上图所示该阵列有4 行,列数记为Nb,Nb等于分组长度除以4。

符号说明:
Nb -明密文所含的数据字数。

Nk -密钥所含的数据字数。

Nr -迭代轮数。

2.1、S盒变换
S盒变换其实是一个查表的过程,分别取一个字节的高4位和低4位作为行值和列值(因此是),然后在S盒中找到对应的字节替换之。

该变换是一个非线性变换。

这个非线性就体现在S盒的构造上。

S 盒变换是 AES 的唯一非线性变换,是 AES 安全的关键。

关于S盒是按如下方式构造:
1)初始化S盒,按行升序排列的字节初始化。

行x列y的字节是xy,行号和列号从0开始计数。

2)求出每一个元素在GF(2^8)中的逆。

00被映射为它自身。

3)仿射变换。

对上一步中的每一个字节的每一位作如下变换
yi=xi + x(i+4)mod8 + x(i+5)mod8 + x(i+6)mod8 + x(i+7)mod8 + ci,Ci是字节0x63的第i位。

该变换用矩阵表示如下所示:
00
11
22
33
44
55
66
77
y100011111
y110001111
y111000110
y111100010
y111110000
011111001
001111101 y 000111110 y
x
x
x
x
x
x
x
x
=+
2.2、行移位变换
在行移位变换中,状态的第一行没有任何变化,第二行循环移位C1 字节,第三行循环移位C2 字节,第四行循环移位C3 字节。

位移量C1、C2 和C3 与分组长度Nb 有关,如下表:
行移位举例如下所示:
2.3、列混合变换
列混淆即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵
中每一个元素都是该元素原所在列所有元素的加权和。

2.4、轮密钥加变换
状态与轮密钥(16 byte)异或相加。

轮密钥由种子密钥通过密钥调度算法产生得到,轮密钥长度等于分组长度 Nb 。

3、密钥调度算法
轮密钥是通过密钥调度算法从密钥中产生的,这其中包括两个部分:密钥扩展和轮密钥选取。

基本原理如下:
1、所有轮密钥比特的总数等于轮数加1乘以分组长度(如128 比特的分组长度
和10轮迭代,共需要1408比特的密钥);
2、将密钥扩展成一个扩展密钥;
3、轮密钥按下述方式从扩展密钥中选取:第一个轮密钥由一开始的Nb个字组
成,第二个轮密钥由接下来的Nb个字组成,如此继续下去。

3.1密钥扩展
扩展密钥用数组W[Nb*(Nr+l)]表示,前Nk 个字是种子密钥,其它的密钥字通过递归定义生成。

由于密钥扩展函数取决于Nk 的值,我们分了Nk≤6 和Nk>6 两种情况。

对于密钥扩展,用类C 语言描述如下:
KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
begin
word temp
i = 0
while (i < Nk)
w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
i = i+1
end while
i = Nk
while (i < Nb * (Nr+1)]
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
else if (Nk > 6 and i mod Nk = 4)
temp = SubWord(temp)
end if
w[i] = w[i-Nk] xor temp
i = i + 1
end while
end
扩展算法如下:
①最前面的Nk 个字是由种子密钥填充的。

②之后的每一个字W[j] 等于前面的字W[j-1] 的与Nk 个位置之前的字W[j-Nk]的异或。

③而且对于Nk 的整数倍的位置处的字,在异或之前,对W[j-1] 的进行如下变换:
1、字节的循环移位RotByte, 即当输入字为(a,b,c,d) 时,输出字为(b , c, d, a )
2、用S 盒进行变换字中的每个字节
3、异或轮常数Rcon[i/Nk]
轮常量是一个字,这个字最右边三个字节总是0。

每轮的轮常量均不同,其定义为Rcon[j]
3.2 轮密钥的选择
在进行密钥加时,密钥长必须与分组长相等,所以第i 轮的密钥与分组长度有关,并且由扩展密钥的字w[Nb*i], w[Nb*i+1], …, w[Nb*(i+1)]构成。

如下图所示给出了Nb=4,Nk=4 时的轮密钥选择情况。

4、AES四种模式:ECB、CBC、CFB、OFB
4.1 ECB
ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。

ECB模式由于每块数据的加密是独立的因此加密和解密都可以并行计算,ECB模式最大的缺点是相同的明文块会被加密成相同的密文块,这种方法在某些环境下不能提供严格的数据保密性。

4.2 CBC
CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。

第一个明文块与一个叫初始化向量的数据块异或。

CBC模式相比ECB有更高的保密性,但由于对每个数据块的加密依赖与前一个数据块的加密所以加密无法并行。

与ECB一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。

Openssl中的AES_cbc_encrypt允许length不是16(128位)的整数倍,不足的部分会用0填充,输出总是16的整数倍。

完成加密或解密后会更新初始化向量IV。

4.3 CFB
与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。

CFB的加密工作分为两部分:
1、将一前段加密得到的密文再加密
2、将第1步加密得到的数据与当前段的明文异或。

由于加密流程和解密流程中被块加密器加密的数据是前一段密文,因此即使明文数据的长度不是加密块大小的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。

4.4 OFB
OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。

相关文档
最新文档