对称密码之Rijndael和AES
AES(Advanced Encryption Standard)是取代前任标准(DES)而成为新标准的一种对称密码算法。
2000年,在多个对称密码候选算法中,选出了一种名为Rijndael的对称密码算法,并将其确定为了AES。
AES的选拔
组织AES公开竞选的是美国的标准化机构NTST(National Institute of Standards and Technology, 国家标准技术研究所),该机构所选拔的密码算法,将成为美国的国家标准,即联邦信息处理标准(FIPS)。
参加AES竞选的条件:
- 被选为AES的密码算法必须无条件地免费供全世界使用。
- 参加者必须提交密码算法的详细规格书、以ANSI C和Java编写的实现代码以及抗密码破译强度的评估材料。
AES的选拔过程是对全世界公开的。
1997年,NTST开始公开募集AES,进入评审对象范围的密码算法共有15个(CAST-256、Crypton、DEAL、DFC、E2、Frog、HPC、LOK197、Magenta、MARS、RC6、Rijndael、SAFER+、Serpent、Twofish)。
AES的选拔并不仅仅考虑一种算法是否存在弱点、算法的速度、实现的容易性等也都在考虑范围内。不仅加密本身的速度要快、密钥准备的速度也很重要。
这种算法还必须能够在各种平台上有效工作,包括智能卡、8为CPU等低性能平台以及工作站等高性能平台。
2000年10月2日,Rijndael力压群雄,被NTST选定为AES标准。
Rijndael
Rijndael是由比利时密码学家Joan Daemen和Vincent Rijmen设计的分组密码算法。
Rijndael的分组长度和密码长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。AES规格中,分组长度固定为128比特,密码长度只有128、192以及256比特三种可选。
Rijndael的加解密
Rijndael算法也是由多个轮构成的,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个步骤。
DES使用Feistel网络作为基本结构,而Rijndael没有使用Feistel网络,而是使用SPN结构。
Rijndael的输入分组为128比特,也就是16个字节。
SubBytes
以字节的值(0~255)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理。 也就是将1个字节的值替换为S-Box中对应索引的另一个1字节的值。
S-Box替换表AES官方会提供,也可以自己手动设置。
ShiftRows
以4字节为单位的行(row)按照一定的规则向左平移,且每一行平移的字节数是不同的。
MixColumns
对4字节的值进行比特运算,将其变为另外一个4字节的值。
AddRoundKey
将上面的结果与轮密钥进行XOR。
结论
通过上面的结构,可以发现输入的所有比特在一轮中都会被加密。
和每一轮只加密一半输入的比特的Feistel网络相比,这种方式的优势在于加密所需要的轮数更少。
这种方式的另一个优势在于,SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行并行计算。
加密流程
SubBytes->ShiftRows->MixColumns->AddRoundKey
解密流程
AddRoundKey->InvMixColumns->InvShiftRows->InvSubBytes
Inv指的是加密流程中对应步骤的逆运算。
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF/%E5%AF%B9%E7%A7%B0%E5%AF%86%E7%A0%81%E4%B9%8Brijndael%E5%92%8Caes/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。