AES加密

作者: 国宝级初学者 | 来源:发表于2022-01-11 09:25 被阅读0次

网络通信与计算机技术的迅猛发展使信息安全面临着严峻的挑战。旧的加密标准(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的密码安全性能。

相关文章

网友评论

      本文标题:AES加密

      本文链接:https://www.haomeiwen.com/subject/skomcrtx.html