网络通信与计算机技术的迅猛发展使信息安全面临着严峻的挑战。旧的加密标准(DES)作为上世纪70年代的加密标准,其加密强度和安全性能越来越难以满足现时要求。在这种情况下,美国国家标准技术局(NIST)在1997年开始倡导制定高级加密标准AES替代DES,以满足21世纪的信息加密要求。经过几年的招标,论证和筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为AES(Rijndael)的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。
AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点,Rijndael的信息快长度和加密密钥长度都是可变的,可以为128比特,192比特和256比特。论证表明,它能够抵抗所有目前技术水平下的已知和潜在的密码攻击,因而是更加安全可靠的机密算法。
AES算法分析
Rijndael算法是分组长度和密钥长度可变的对称分组加密算法,可以处理128,192和256位的块和同样长度的密钥,块和密钥的组合都是可能的。AES“官方”的分组长度只有128位。AES的数据处理单元是字节,128bit的分组数据被分成16个字节后按顺序被复制到一个4*4的矩阵中,称为state。AES是通过轮函数的多轮的迭代实现的,根据密钥的长度不同,轮函数的迭代次数分别为10,12,14轮。下面介绍算法的主要步骤。
AES算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。正常的轮中的每一轮迭代中,包括以下四个变换:
(1). 字节变换(SubByte)
(2). 行移位变换(ShiftRows)
(3). 列混合变换(MixColumns)
(4). 加载子密钥(AddRoundKey)
SubByte变换,是一个可逆的非线性字节变换过程,也是AES中唯一的一个非线性组件,这种变换要对分组中的各个字节变换。AES的字节变换由有限域GF(2^8)上的乘法和GF(2)上的仿射变换构成,此处不再介绍复杂的有限域的乘法和加法。在具体实现上不用关心该变换的详细的数学推导和表示,而是通过查找变换表S盒来完成字节变换。AES的S盒十六进制表示如表1-4所示,逆S盒十六进制表示如表1-5表示。其中,X和Y分别为S盒行和列的索引。


字节变换代码如下:

ShiftRows变换是一种线性变换,其目的是使得密码达到充分的扩散。行移位在状态的每行间进行,将state每一行循环移位,移位的位数以字节为单位,移动字节数由行数确定,下式表示了移位的过程。

行移位变换代码如下:


MixColumns变换是对状态的列的一种变换,状态每列有四个字节。这四个字节(一个字)可以用有限域GF(2)上的4项多项式来表示,在多项式中,未知数的系数分别为字中的相应字节。一个字在有限域GF(2^8)上可以表示成下面的4项多项式:


列混合变换代码如下:

AddRoundKey变换就是轮密钥的各字节分别异或,实现明文与密钥的混合。轮密钥由密钥通过扩展产生。

加载子密钥代码如下:

AES密钥扩展,对于长度为128的密钥,算法的输入值是4字(16字节),输出值是一个44字(176字节)的线性数组。这足以为初始轮密钥加阶段和算法中的其他10轮中的每一轮提供4字的轮密钥。输入密钥被复制到扩展密钥数组的前四个字。然后每次用四个字填充扩展密钥数组余下的部分。对于长度为128的密钥,其密钥生成可用下图说明。

密钥扩展基本分为3步:
1)位置变换RotWord,接收一个4个字节的数组并将它们向左旋转一个位置,这一步与行位移变换相似;
2)字节变换SubWord,使用替换表S盒对某一给定的一行密钥调度表进行逐字节替换;
3)变换Rcon,将上一步得到的值与Rcon表中的常数相异或,这些常数都是4字节,每一个与密钥调度表的某一行相匹配。每个轮常数的最左边的字节是域中2的幂次方。另一种表示方法是其每个值是前一个值乘上0x02(有限域乘法)。
密钥扩展代码如下:


以上是对AES所有的各个模块算法的分析,除了没有在有限域的计算上面做详细的分析解释(有限域的乘法加法在数学上比较复杂,用在AES上面的加法和乘法比较易懂),在所有的模块实现上面都做了分析并给出了详细的代码。这里给出的是C语言的代码,可在DSP的simulation下面实现,在emulation下实现的时候建议读者考虑实时性与优化。AES加密的全过程如下图所示:

Rijndael解密算法是加密的逆过程,解密的每步分别取加密的逆,即可得到直接解密算法。AES算法的设计特点使得可以构造等价解密算法,只要经过下列五个代换,加密算法和轮变换算法就分别改造成等价解密算法和等价轮变换:
(1)SbuBytes——InvSubBytes;
(2)ShiftRows——InvShiftRows;
(3)MixColumns——InvMixColumns;
(4)InvExpandedKey[N,-i]——ExpandedKey[i];
(5)当1≤i≤Nr—1时InvMixColumns(InvExpandedKey[i])。
许多情况下,等价解密算法的实现性能要优于直接解密算法。
加密算法如下:

解密算法如下:

由上面的程序可以看出,解密即是加密的逆过程。解密的首要任务是知道加密的初始密钥。其他的密钥由轮密钥构成,其余部分按照逆过程即可。
AES算法修正
重新看Rijndeal算法,其实Rijndeal算法允许的分组长度和密钥长度为32bit的步长,从128bit到256bit范围内进行特定的变化。Rijndeal算法支持的长度为128,160,192,224和256的长度,ROUNDS为10,11,12,13,14。AES不采用其他的分组长度仅仅是为了简化标准,160bit分组的加密其实具有相同的安全强度。
有时候在特殊的应用中需要改变AES加密的数据长度而不改变他的加密强度,就需要此类修改。因此在160bit分组的加密中,只需要将BC改成5,ROUNDS改成11就可以实现。经笔者实际验证可行。有兴趣的读者可以一试。
AES分组密码由多轮迭代的轮函数构成,对轮函数包括的4个面向字节的变换:字节变换、行移位、列混合和加载子密钥。在某些特殊的场合下,比如对G.729A的语音编码帧进行AES加密的时候,由于G.729A 语音编码帧的大小为80bit,128bit的AES加密不再合适,需要对其修正,在不损害 AES 的安全强度下,160bit的AES加密完全适合。根据分组密码的随机性测试、明密文独立性测试、雪崩效应测试分析AES160密码统计性能,测试结果表明AES160有着优秀的密码学统计性能。结果论证表明,AES160适用于加密G.729A的语音编码帧,并保留了AES的密码安全性能。
网友评论