[关闭]
@qidiandasheng 2020-11-29T07:30:00.000000Z 字数 3190 阅读 903

AES加密算法(😁)

密码学


AES算法简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。它的出现主要是为了取代DES加密算法的,因为我们都知道DES算法的密钥长度是56Bit,因此算法的理论安全强度是2的56次方,随着计算机技术的飞速发展,DES并不能满足人们对于安全性的需求了。AES支持三种长度的密钥:128位,192位,256位,因此安全性也较高。

对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwMjE5MDgyOTA5Njg4.png-81.4kB

概念

秘钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

AES支持三种长度的密钥:128位,192位,256位。

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

填充

要想了解填充的概念,我们先要了解AES的分组加密特性。什么是分组加密呢?我们来看看下面这张图:

1572424531-eaf7f0d9943a9ae.png-9kB

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。

这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

但是这里涉及到一个问题:

假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

这里介绍几种不同的填充模式:

模式

AES的工作模式,体现在把明文块加密成密文块的处理过程中,也就是明文快与明文块之间的联系不同。AES加密算法提供了五种不同的工作模式:ECB、CBC、CTR、CFB、OFB。模式之间的主题思想是近似的,在处理细节上有一些差别。

ECB模式

ECB模式(Electronic Codebook Book)是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的。

1572424538-0219b225a2cf5c7.png-5.6kB

优点:
1.简单
2.有利于并行计算

缺点:
1.相同的明文块经过加密会变成相同的密文块,因此安全性较差。

CBC模式

CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。

IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

1572424539-f38ff8e85004b48.png-7kB

从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。

这样以来,相同的明文块加密出的密文块显然是不一样的。

优点:
1.安全性更高

缺点:
1.无法并行计算,性能上不如ECB
2.引入初始化向量IV,增加复杂度。

总结流程

1.把明文按照128bit拆分成若干个明文块。

2.按照选择的填充方式来填充最后一个明文块。

3.每一个明文块利用AES加密器和密钥,加密成密文块。

4.拼接所有的密文块,成为最终的密文结果。

加密器

经过上面的概念了解,我们知道主要加密的部分就是我们的加密器,秘钥是通过加密来加密成密文块的。

加密器的处理流程如下图:

1572424535-522911bdbcf7c4b.jpg-48.2kB

加密轮

通过上图我们可以看到加密是分为多轮的,具体分为:

加密的轮数主要跟AES加密的秘钥长度有关,AES128、AES192、AES256加密轮数分别为10、12、14(不包括初始轮)。

字节代替

1572424536-55f3e9cbbe90cc4.png-34.7kB

这里以AES128为例,16字节(一字节8位)的明文块在每一个处理步骤中都被排列成4X4的二维数组。

所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。替代的依据是什么呢?依据一个被称为S盒(Subtitution Box)的16X16大小的二维常量数组。

AES的S盒.png-237.5kB

假设明文块当中a[2,2] = 0x5B(一个字节是两位16进制),那么输出值b[2,2] = S[5,11] = 0x39。

行移位(ShiftRows)

行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:

1572424536-f711af1acdd8163.jpg-38.3kB

列混淆(MixColumns)

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:

1572424537-3adc31b3c13c446.jpg-43.8kB

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwMjE5MjAzMzQ2NDM2 (1).png-15.5kB

状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwMjE5MjAzNzQyNTE2.png-11.1kB

加轮密钥(AddRoundKey)

1572424537-718ce62215f17de.jpg-55.1kB

这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵。这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为w[0]、w[1]、w[2]和 w[3]。它们构成了一个以字为单位的数组 w。

让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]。

设初始的128位密钥为:
3C A1 0B 21 57 F0 19 16 90 2E 13 80 AC C1 07 BD

- 0 1 2 3
0 3C 57 90 AC
1 A1 F0 2E C1
2 0B 19 13 07
3 21 16 80 BD

假设输入矩阵中a[2,2] = 0x5B(一个字节是两位16进制),那么输出值b[2,2] = k[2,2] XOR a[2,2] = 0x13 XOR 0x5B = 0010011 XOR 1011011 = 1001000 = 0x48。

扩展密钥(KeyExpansions)

加密的每一轮所用到的密钥并不是相同的。这里涉及到一个概念:扩展密钥(KeyExpansions)。AES源代码中用长度 4 * 4 *(10+1) 字节的数组W来存储所有轮的密钥。w[0]、w[1]、w[2]和 w[3]=W{0-15}的值等同于原始密钥的值,用于为初始轮做处理。

后续每一个元素W[i]都是由W[i-4]和W[i-1]计算而来,直到数组W的所有元素都赋值完成。

W数组当中,W{0-15}用于初始轮的处理,W{16-31}用于第1轮的处理,W{32-47}用于第2轮的处理 ……一直到W{160-175}用于最终轮(第10轮)的处理。

参考

什么是AES算法?(整合版)
AES加密算法的详细介绍与实现

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注