1、什么是AES加密算法
什么是加密算法?我在文章《从个人角度看什么是加密算法》中描述了我对加密算法的一些浅薄的理解。我不是信息安全领域的大神,只求有一个入门罢了!
这篇文章是文章《从个人角度看什么是加密算法》的延伸,所以在阅读前,请务必仔细阅读并理解上一篇文章的内容。
既然加密算法本质上是对明文和密钥的一系列运算,那么AES加密算法就是一种被定义的具有明确运算方式的过程。这个运算过程不可能简单,不然它也不会成为目前应用最广泛的加密算法。
AES,Advanced Encryption Standard,高级加密标准,又称Rijndael加密法。是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES是对称加密算法,这说明它的加解密使用的密钥相同,且它的加密算法可逆。
1.1、AES的基本结构
AES是分组密码。分组密码就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。
AES规定自己的分组长度固定为128位,16个字节。密钥长度则可以是128、192或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:
AES | 密钥长度(32位比特字) | 分组长度(32位比特字) | 加密轮数 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
所谓的加密轮数,就是对分组数据进行一轮加密,对于AES-128算法来说,共进行10轮加密,其中前9轮加密方式相同,第10轮不同,最终得到的就是密文。
比如明文P,使用加密函数:
C = encrypt(P, K);
加密后得到密文C。在加密函数encrypt()里,共进行10轮计算,前9轮每一轮都是对分组数据P1进行加减乘除,得到的结果P2再进行加减乘除,最后1轮加减乘没有除。运算过程中别忘了让密钥K参与进来。
上面只是举个例子!
实际AES加密中前9轮的操作并不是加减乘除,而是:字节代换、行位移、列混合和轮密钥加。第10轮也并不是加减乘,而是:字节代换、行位移、轮密钥加,不执行列混合。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文矩阵(矩阵中一个元素大小就是明文中的一个Byte字节)。 明文分组的16个字节如何在这个4x4的矩阵中排列呢?遵循:从上到下、从左到右排序。假设明文分组的数据为abcdefghijklmnop,分别对应为:P0、P1、P2、P3、P4、P5、P6、P7、P8、P9、P10、P11、P12、P13、P14、P15,存储在内存中是以编码后的数据保存:0x61、0x62、0x63、0x64、0x65、0x66、0x67、0x68、0x69、0x6A、0x6B、0x6C、0x6D、0x6E、0x6F、0x70。明文数据保存在字节矩阵中的位置为:
实际参与运算的是最后一个矩阵!
不只是明文数据需要放在矩阵表中参与运算,128位密钥K(以AES-128为例)也是用4x4矩阵表示,以字节为单位:K0、K1、K2、K3、K4、K5、K6、K7、K8、K9、K10、K11、K12、K13、K14、K15,按从上到下、从左到右顺序排列:
每一轮都需要这样的一个密钥矩阵(128位,16个字节)参与运算,每一轮的密钥又不能相同,而AES-128算法传入的密钥只有128位。怎么办呢?
在加密算法中,会对传入的128位原始密钥通过一个密钥编排函数生成10个密钥矩阵,加上原始密钥矩阵共11个。在第一轮加密前,需要将明文和原始密钥进行一次异或加密操作,然后10轮加密操作分别用生成的10个密钥矩阵参与运算。
下面简单介绍下每轮加密的四个操作:字节代换、行位移、列混合和轮密钥加。
1.1.1、字节代换
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。每个盒是一个16x16的字节矩阵。需要字节代换的4x4的数据矩阵,每个字节值的高4位作为行值(0-15),低4位作为列值(0-15),在S盒上查找到对应的单元的字节值,全部替换掉即可。如果是解密,就使用逆S盒。
1.1.2 行位移
行移位是一个简单的左循环移位操作。数据矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节。
1.1.3 列混合
这里的运算我看不大懂!
1.1.4 轮密钥加
数据矩阵与密钥矩阵对应字节位进行异或操作
密文的解密操作不只是加密的10轮操作的逆操作(10-9-8-7-6-5-4-3-2-1),还是每轮中的逆操作(轮密钥加-列混合-行位移-字节代换),还是每个操作的逆操作(比如行位移本来是往左移,逆操作就往右移,字节代换本来是在S盒中查找替换,逆操作就是在逆S盒中查找替换)。
AES算法详细介绍请参考:https://blog.csdn.net/qq_28205153/article/details/55798628?spm=1001.2014.3001.5506。写的非常好!!!
2、AES加密模式
AES加密模式共五种:CBC、ECB、CTR、OCF、CFB。它们每轮加密使用的方法都相同,不同的点在于传入的128位明文数据在加密前需要做一些额外的运算。比如CBC模式,就需要多传入一个初始值,让其与明文分组矩阵进行异或操作,然后再进行10轮加密操作。
五种加密模式的详细介绍请参考:https://www.cnblogs.com/starwolf/p/3365834.html