AES加密过程详解
AES简介
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的**,具体的加密流程如下图:
-
明文P
没有经过加密的数据。
-
**K
用来加密明文的密码,在对称加密算法中,加密与解密的**是相同的。**为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致**泄漏,通常是通过非对称加密算法加***,然后再通过网络传输给对方,或者直接面对面商量**。**是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
-
AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为**,C为密文。也就是说,把明文P和**K作为加密函数的参数输入,则加密函数E会输出密文C。
-
密文C
经加密函数处理后的数据
-
AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为**,P为明文。也就是说,把密文C和**K作为解密函数的参数输入,则解密函数会输出明文P。
在这里简单介绍下对称加密算法与非对称加密算法的区别。
-
对称加密算法
加密和解密用到的**是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是**的传输比较麻烦。
-
非对称加密算法
加密和解密用的**是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是**传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
AES算法流程:
AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮**加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的**分别由初始**扩展得到。算法中16个字节的明文、密文和轮**都以一个4x4的矩阵表示。
注意:前9次的加密过程是一样的,而最后一次的加密过程是没有列混淆的。
1.字节替换:字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。
2.行移位:行移位的功能是实现一个4x4矩阵内部字节之间的置换。
3.列混淆:
根据矩阵的乘法可知,在列混淆(利用域GF(28)上的算术特性的一个代替)的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法需要注意如下几点:
(1)将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011
(2)乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)
(3)此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(异或运算)。
因为:说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。
4.轮**加:
加密过程中,每轮的输入与轮**异或一次(当前分组和扩展**的一部分进行按位异或);因为二进制数连续异或一个数结果是不变的,所以在解密时再异或上该轮的**即可恢复输入。首尾使用轮**加的理由:若将其他不需要**的阶段放在首尾,在不用**的情况下就能完成逆过程,这就降低了算法的安全性。
加密原理:轮**加本身不难被**,另外三个阶段分别提供了混淆和非线性功能。可是字节替换、行移位、列混淆阶段没有涉及**,就它们自身而言,并没有提供算法的安全性。但该算法经历一个分组的异或加密(轮**加),再对该分组混淆扩散(其他三个阶段),再接着又是异或加密,如此交替进行,这种方式非常有效非常安全。
5.**扩展:
其复杂性是确保算法安全性的重要部分。当分组长度和**长度都是128位时,AES的加密算法共迭代10轮,需要10个子**。AES的**扩展的目的是将输入的128位**扩展成11个128位的子**。AES的**扩展算法是以字为一个基本单位(一个字为4个字节),刚好是**矩阵的一列。因此4个字(128位)**需要扩展成11个子**,共44个字。
**扩展过程说明:将初始**以列为主,转化为4个32 bits的字,分别记为w[0…3];按照如下方式,依次求解w[i],其中i是整数并且属于[4,43]。
2)分别对每个字节按S盒进行映射。
3)32 bits的常量(RC[i/4],0,0,0)进行异或,RC是一个一维数组,其中RC = {01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}。
4)除了轮**的第一列使用上述方法,之后的二到四列都是w[i]=w[i-4]⊕w[i-1]
5)最终得到的第一个扩展**为(之后的每一轮**都是在前一轮的基础上按照上述方法得到的):