在AES中,分组长度只能是128位,密钥长度可以是三者中的任意一种
密钥长度不同,则加密轮数不同,AES参数如表3.8所示。本节中,假定密钥长度位128位,那么AES的迭代轮数为10轮,这也是目前使用最广发的实现方式。
AES处理单位是字节,128位的输入明文分组P和输入密钥K都被分为16字节。
一般明文分组用以字节位单位的正方形矩阵描述,称为状态(State)矩阵。
在算法的每一轮,状态矩阵的内容不断发生变化,最后的结果作为密文输出C。
矩阵中字节的排序顺序为从上到下,从左至右,输入矩阵和输出矩阵如图3.9所示。
类似地,128位密钥也是以字节为单位的矩阵表示,矩阵的每一列被称作1个32bit的字
通过密钥编排程序,该密钥矩阵被扩展成一个由44个字组成的w[0],w[1],...w[43]系列的前4个元素是原始密钥,用于加密运算的初始密钥加。
后40个字分为1组,每组4个字(128bit)分别用于10轮运算中的轮密钥加。
AES算法的加密与加密如图3.10所示
AES的解密过程与加密过程并不一致,因为AES并未使用Feistel结构,在每轮操作时,对整个分组进行处理。解密过程仍为10轮,每轮操作是加密操作的逆变换。解密操作的一轮就是顺序执行逆行移位、逆字节变换、轮密钥加和逆列混合。与加密操作类似,最后一轮不执行逆列混合,在第一轮解密之前,要执行1轮密钥加操作。
加密和解密分别由轮密钥加开始和结束,是因为只有轮密钥加阶段使用了密钥。
字节代换:
字节代换是一个关于字节的非线性变换,独立地对状态的每个字节进行。字节代换是可逆,由以下两个可逆变换复合得到。首先,将一个字节变换成有限域GF(28)中的乘法逆元素,规定00映射到自身00。
其次,对之前的结果进行如下(GF(2)上的,可逆的)仿射变换,可由以下矩阵变换表示。
也可以将字节代换对各种可能字节的变换结果拍成一个表,如果3.11所示,它称为AES的字节代替表或S盒。
状态矩阵中的元素按照下面的方式通过S盒映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒对应行列的元素作为输出
例如:加密时,输入字节0x12,则查找s盒的第一行第二列,得到值0xC9。
例如:
将计算结果从下往上读,最终(11101001),写成十六进制数为0xE9;
行位移:
1.行位移是将状态矩阵的各行进行循环移位,不同状态行的位移量不同。
2.第0行不移动,
3.第1行循环左移1个字节
4.第2行循环左移2个字节
5.第3行循环左移三个字节,行移位示意图如图3.12所示。
6.行移位逆变换是将状态矩阵的每行执行相反的移位操作
7.列如,AES-128中,状态矩阵的第0行右移0字节。
8.第一行右移1字节
9.第二行右移2字节
10.第三行右移3字节
11.行移位虽然简单,但是相当有用。
12.它将某个字节从其中一列移到另一列中,它的线性距离是4字节(1个字)的倍数,同时这个变换确保了某列的4字节被扩展到了4个不同的列。
列混合:
1.列混合变换是一个替代操作,是AES算法中最具技巧性的部分。该步骤的设计中包含了多个方面,包括维数、线性性、扩散性盒在8位处理器上的运算性能,它只在AES的第0,1,... ,Nr-1轮中使用。
2.列混合变化是通过矩阵相乘实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵:
3.列混合过程用到有限域GF(28)乘法
4.其中任何值乘0x01都等于自身
5.用0x02做乘法时 可以使用乘法运行xtime()来描述
6.使用0x03做乘法时,可以采用:
b*0x03=b*(0x02异或0x01) = (b*0x02)异或(b*0x01)
7.例如:
列混合运算的逆运算是类似的,即每列都用一个特定的多形式d(x)相乘。
d(x)满足(’03’x3+’01’x2+’01’x+’02’)d(x)=’01’,由此可得d(x)=’0B’x3+’0D’x2+’09’x+’0E’。
4.轮密钥加
1.128位的state按位与128位的密钥逐位异或(XOR)
2.10轮轮密钥加变换虽然简单,缺影响了State中的每一位。
3.密钥扩展的复杂性和AES其它阶段运算的发杂性,确保了该算法的安全性
4.轮密钥加是将128bit密钥Ki同State中的数据进行逐位异或操作,该过程可以看作字逐位异或的结果,也可以看作字节级别的操作。
5.其中,密钥Ki中每个字w[4i]、w[4i+1]、w[4i+2]、w[4i+3]均为32bit,包含4个字节。
6.密钥Ki(i=0 ,1,… ,9)的生成过程为密钥扩展算法,轮密钥加运算示意图如图3.15所示。
7.轮密钥加运算的逆运算同正向的轮密钥加运算完全一致,这是因为异或的逆操作是其本身。
密钥扩展:
AES在加密和解密算法中使用了一个由种子密钥字节数组生成的密钥调度表,称为密钥扩展(Key Expansion)
密钥扩展从一个原始密钥中生成了多重密钥来代替使用单个密钥,大大增加了比特位的扩散
AES密钥扩展算法的输入值是4字密钥,输出是一个44字的一维线性数组,这为初始轮密钥扩展阶段和算法中的其他10轮中的每一轮提供16个字节的轮密钥。
AES首先将初始128位密钥输入一个4x4矩阵中。矩阵的每列被称为1个32bit的字,依次命名为w[0],w[1],w[2],w[3]
它们构成了一个以字为单位的数组w
然后每次用w数组填充扩展密钥数组余下的部分,在扩展密钥数组中,w[i]的值一来与w[i-1]和w[i-4] (i≥4)
对w数组中下标不为4的倍数的元素,只进行简单的异或,其逻辑关系为w[i]=w[i-1]异或w[i-4]
对w数组中下标为4的倍数的元素,由等式w[i]=w[i-4]异或T(w[i-1])
其中T是一个复杂的函数,由3部分组成:字循环、字节代换和轮常量异或
T(w[i-1]) =ByteSub (RotByte (w[i-1]))⊕Rcon[i] 具体作用如下。
(1)字循环RotByte():将1个字的4个字节循环左移1个字节,即将字(B0B1B2B3) 变为(B1B2B3B0) 。
(2)字节代换ByteSub():基于S盒对输入字中的每个字节进行S代替。:
(3)轮常量异或⊕:将上述(1)和(2)的结果再与轮常量Rcon[i]相异或,其中i表示轮数
为了抵抗已有的密码分析,AES使用了于轮相关的轮常量来防止不同轮中产生的轮密钥的对称性和相似性
轮常量Rcon[i]是1个4个字节的字,这个字的右边三个字节总为0,Rcon[i]数据表如表3.9所示
Rcon[i/Nk] 为轮常数,其值与Nk无关,定义为(字节用十六进制表示,同时理解为GF(28)上的元素):
Rcon[i]=(RC[i], ‘00’, ‘00’, ‘00’)
其中RC[i]是GF(28)中值为xi-1的元素,因此。
RC[1]=1(即‘01’)
RC[2]=x(即‘02’)
RC[i]=xi-1
分组密码的工作模式:
分组密码在加密时,明文分组的长度是固定的,而实际应用中待加密消息的数据量是不固定的,数据格式可能多种多样
为了能在各种应用场合使用DES,1980年NIST公布了DES的4种工作模式:电子密码本(Electronic Code Book,ECB)模式、密码分组链接(Cipher Block Chaining,CBC)模式、密码反馈(Cipher Feedback,CFB)模式和输出反馈(Output Feedback,OFB)模式。
2001年12月公布了AES的5种工作模式,即ECB、CBC、CFB、OFB和CTR(计数器模式,Counter Mode)。
ECB模式是最简单的工作模式,ECB模式的加密操作和ECB模式的解密操作分别如图3.16和3.17所示,它一次对一个64bit长的明文分组加密,而且每次的加密密钥都相同。当密钥取定时,对明文的每个分组都有唯一的密文与之对应。
ECB模式在用于短数据(如加密密钥)时非常理想,因此如果需要安全地传递DES密钥,ECB是最合适的模式。