引言:从DES到AES
AES( Advanced Encryption Standard )分组密码广泛使用的一种对称密码。AES提出是为了替代DES,DES存在的问题在业内饱受诟病:
- DES不能够抵抗蛮力攻击,在1999年NIST(National Institute of Standards and Technology)就明确要求使用3DES抵抗蛮力攻击。但是DES的软件实现并不十分高效,而3DES的耗时是DES的三倍多。
- DES的分组大小相对较小,每个分组一般为64 bits。
- 当时的NIST认为抵抗量子计算机攻击,密钥长度应该接近256 bits,而DES的密钥实际为48 bits。不过在现在看来在量子霸权下,256 bits的密钥依然不够看。
所以就上述问题,NIST公开征集的密码标准,所提交的候选方案需要满足以下要求:
- 分组大小为 128位的分组密码
- 必须支持三种密码长度: 128位,192位和256位
- 比提交的其他算法更安全
- 在软件和硬件实现上都很高效
AES算法概述
DES加密使用Feistel结构,在Feistel网络中每一轮只加密了半个分组:32 bits 的数据。而在AES中,每一轮加密是对整个分组进行加密,所以AES需要的加密轮数比DES少的原因。并且不是固定的,同秘钥长度有关,下表为AES秘钥长度和的关系。
秘钥长度 | 轮数 |
---|---|
128 | 10 |
192 | 12 |
256 | 14 |
首先需要知道,每一轮加密分为三层:字节代换层(Byte Substitution Layer,SubBytes), 扩散层、秘钥加法层(AddRoundKey )
每一层的作用的作用如下:
秘钥加法层 128位子秘钥和每一轮的输入进行异或运算。
字节代换层 通过提前设置好的S-Box,将16字节(128 bits)映射为4x4的矩阵
扩散层 由两个子层组成,每个子层都是线性操作:
- ShiftRows 行移位变化
- MixColumn 列混淆变换,将4x4的矩阵合并为16字节
AES同样采用了秘钥编排为每一轮加密生成子秘钥()。之后将每一层加密和秘钥编排组合起来,就是AES算法的框架。
AES内部结构
加密轮
和DES不同的是AES是面向字节(Byte)的,而DES是面向(Bits)的,即AES处理的最小单位是字节。单轮AES的详细结构如下。定义16字节输入为 。
(1)首先字节会经过一个S-Box。假设,经过S-Box之后得到的为在有限域GF()上的逆元。即在有限域GF()上, 其中为GF()上的不可约多项式。S-Box是事先计算好的,和有关。以下为S-Box示例,对应的。因为,所以查表可得。
(2) 对于AES中S-Box每一轮都是相同的,S-Box式一个非线性映射即。并且S是双向映射的,即输入和输出一一对应,确保能够解密。
(3) 在SubByte层除了S-Box求逆操作外,有的还会进行一个防射步骤,进而破话有限域的代数结构,能够抵抗针对有限域逆元的攻击。放射即将逆元(8 bits)和一个(8x8)的常量矩阵相乘,在和一个8位的常向量相加。
(1)-(3)就是字节替换层的过程,接下来回进行扩展时层。
(4) ShiftRows 子层 通过上一层之后,我们可以得到状态矩阵(Status Matrix), ShiftRows 子层的操作很简单,只需要按照一定的规则对举证每一行的进行循环移动集合,目的是为了增加AES的扩散属性。如下图所示
(5)MixColumn子层 会进行列混淆,以矩阵每一列的4个字节作为一个向量右乘上一个4X4的常量举证,结果作为新矩阵的行,以下面的式子为例:
假设经过ShiftRows 子层得到的状态矩阵$B = {25, 25, \dots, 25},则我们只需要计算:
由于上述中间值没有大于所以不需要mod不可约多项式。所以我们可得到为:
所以。
(6)秘钥加法层 16字节的和16字节的每一轮的子秘钥进行异或运算,和GF(2)的加法运算相同。
秘钥编排
128 位秘钥编排
128 位秘钥编排如图所示,初始秘钥,其中的大小为1 byte = 8 bits。整个秘钥编排过程还是比较简单只需要进行异或操作一个g函数。g函数的内部其实进行了一次循环移动和求逆运算。
函数g()的目的有两个:第一,增加密钥编排中的非线性:第二,消除AES中的对称性。这两种属性都是抵抗某些分组密码攻击必要的。
从上面的流程图可以得出子秘钥的第一个子分组的递推公式为:
其余三个分组的递推公式为:
在非线性函数g()中,首先将四个字节进行翻转,然后进行S-Box代换,最后和轮系数相加,的生成规则如下:
192 位秘钥编排
256 位秘钥编排
AES解密
各种逆整活🦄
本文章中图片来源于《深入浅出密码学》、tutorialspoint
相关链接: