0×00 前言

在密码学中,block(分组)密码的工作模式被广泛使用,使用同一个分组密码密钥对很多称之为块的数据加密,在优于很多诸如RSA、ECC密码的性能的情况下,也不失为一种安全的加密算法,今天我们将要来详细认识一下在密码学中占据重要位置的AES加密标准,在密码学中又称为Rijindael加密法。首先AES是用来替代原先的DES,是美国NIST发布,俨然已经成为对称密钥中最流行的算法之一。

0×01 正文

AES 又称“矩阵加密算法”其原理采用字节矩阵上进行“或与非”的操作(置换和替代),达到数据被重新排列、或者替换成为另一个完全不相同的数据;从而达到可以采用相同的密钥进行“回转”。 AES 加密的区块长度固定为 128、192、256 位(bit).image.png加密会先将需要加密的明文拆分为许多明文块然后采取下面的加密图种的4种方式加密最后得到许多密文块。其次AES也不是一次性将明文转变为密文的算法,而是经过许多轮的加密而成的。具体分成多少轮呢?

初始轮(Initial Round)  1次

普通轮(Rounds)          N次

最终轮(Final Round)   1次

上面我们提到AES的Key支持三种长度:AES128,AES192,AES256。Key的长度决定了AES加密的轮数。除去初始轮,各种Key长度对应的轮数如下:

AES128:10轮

AES192:12轮

AES256:14轮

不同阶段的Round有不同的处理步骤。AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤。image.png初始轮只有一个步骤:

加轮密钥(AddRoundKey)

普通轮有四个步骤:

字节代替(SubBytes)

行移位(ShiftRows)

列混淆(MixColumns)

加轮密钥(AddRoundKey)

最终轮有三个步骤:

字节代替(SubBytes)

行移位(ShiftRows)

加轮密钥(AddRoundKey)

AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

SubBytes—通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

ShiftRows—将矩阵中的每个横列进行循环式移位。

MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

字节替换SubBytes

字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。image.png步骤SubBytes,又称作S盒,它是AES加密过程中唯一的非线性变换。他是一个砖匠置换,该置换包含一个作用在状态字节上的S盒,用Srd表示AES中特使用的特定的S盒。

1.非线性度:

输入输出之间最大相关幅度必须尽可能小。
差分传播概率最大值必需尽可能小。

2.数复杂度

在GF(2^8)中Srd应当具有复杂的代数表达式

image.png字节代替最主要的运算就是根据表2-1进行加密。

例:

image.png上图为需要加密的密码块其中可以直接查表:如19就对应着0xd4;a0对应0xe0;…

行移位ShiftRows

行移位是一个4×4的矩阵内部字节之间的置换,用于提供算法的扩散性。在ShiftRows步骤中,矩阵中每一行的各个字节循环向左方位移。位移量则随着行数递增而递增。ShiftRows描述矩阵的行操作。在此步骤中,每一行都向左循环位移某个偏移量。在AES中(区块大小128位),第一行维持不变,第二行里的每个字节都向左循环移动一格。同理,第三行及第四行向左循环位移的偏移量就分别是2和3。128位和192比特的区块在此步骤的循环位移的模式相同。经过ShiftRows之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。Rijndael算法的版本中,偏移量和AES有少许不同;对于长度256比特的区块,第一行仍然维持不变,第二行、第三行、第四行的偏移量分别是1字节、2字节、3字节。除此之外,ShiftRows操作步骤在Rijndael和AES中完全相同。

如下图:行移位变换完成基于行的循环移位操作,变换方法为:第0行不变,第1行循环左移1个字节,第2行循环左移两个字节,第3行循环左移3个字节

image.png

正向行移位:

正向行移位用于加密,其原理图如下。其中:第一行保持不变,第二行循环左移8比特,第三行循环左移16比特,第四行循环左移24比特。

假设矩阵的名字为state,用公式表示如下:

state’[i][j] = state[i][(j + i) % 4]

其中i、j属于[0,3]2) 逆向行移位,逆向行移位即是相反的操作,即:第一行保持不变,第二行循环右移8比特,第三行循环右移16比特,第四行循环右移24比特。

用公式表示如下:

state’[i][j] = state[i][(4 + j -i) % 4]

其中i、j属于[0,3]列混淆MixColumns。

列混淆:利用域GF(2^8)上算术特性的一个代替,同样用于提供算法的扩散性。
在MixColumns步骤,每一列的四个字节通过线性变换互相结合。image.png

每一列当做上元素的系数合并成为一个一个多项式,接着将此多项式和一个固定的多项式image.png在模下image.png
乘起来,若两个多项式进行乘法运算,运算的方法为两个多项式相乘,若运算的结果超过8次方,则必须对此结果对一个多项式m(x)进行模运算。AES算法中,这个8次不可约多项式确定为m(x)=x^8+x^4+x^3+x+1。image.png

轮密钥相加AddRoundKey

该部分就是把上一步的结果和密钥进行异或;得到的结果作为初始值,重复以上操作9次。第10次的时候不执行MixColumns直接和密钥求异或操作,得到的最终结果就是密文。

第n组第i列 为 第n-1组第i列 与 第n组第i-1列之和(模2加法,1<= i <=3)

对于每一组 第一列即i=0,有特殊的处理:

将前一列即第n-1组第3列的4个字节循环左移1个字节,

并对每个字节进行字节替代变换SubBytes。

将第一行(即第一个字节)与轮常量rc[n]相加 ,

最后再与前一组该列相加。

这里的rc[n]是个定值:image.png

在AddRoundKey步骤中,将每个状态中的字节与该回合密钥做异或(⊕)。AddRoundKey步骤,回合密钥将会与原矩阵合并。在每次的加密循环中,都会由主密钥产生一把回合密钥(通过Rijndael密钥生成方案产生),这把密钥大小会跟原矩阵一样,以与原矩阵中每个对应的字节作异或(⊕)加法。

image.png

0×02 解密运算及安全性

AES解密算法与加密不同,基本运算中除了AddRoundKey(轮密钥加)不变外,其余的都需要进行逆变换即

InvSubBytes(逆字节替代)

InvShiftRows(逆行移位)

InvMixColumns(逆列混淆)

0×03 总结

截至2006年,针对AES唯一的成功攻击是旁道攻击,新的 AES 将无疑成为加密所有形式电子信息的事实上的标准,取代 DES。AES 加密的数据在某种意义上是安全的,因为没有已知的密码分析攻击可以解密 AES 密文,除非强行遍历搜索所有可能的 256 位密钥。

[1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.

[2] Joan Daemen Vincent Rijmen 著;谷大武 徐胜波 译.高级加密标准(AES)算法——Rijindael 设计(第二版)[M].北京:清华大学出版社,2008,2

[3]wikipedia-高级加密标准

[4]https://blog.csdn.net/bcbobo21cn/article/details/51312335

[5]https://blog.csdn.net/qq_28205153/article/details/55798628