文章目录
- 1. 简介
- 2. 密钥加法层
- 2. 字节代换层
- 3. 行位移 - ShiftRows
- 4. 列混淆 - MixColumn
- 5. 其他
- 5.1列混淆矩阵乘法运算
- 5.2 AES密钥生成
- 6. 参考资料
以下内容为信息安全开发过程中,AES对称加密算法的笔记,大部分内容转载其他文章,若描述不清楚,可以直接看原文。
1. 简介
AES算法主要有四种操作处理,分别是密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)。而明文x和密钥k都是由16个字节组成的数据(当然密钥还支持192位和256位的长度,暂时不考虑),它是按照字节的先后顺序从上到下、从左到右进行排列的。而加密出的密文读取顺序也是按照这个顺序读取的,相当于将数组还原成字符串的模样了,然后再解密的时候又是按照4·4数组处理的。AES算法在处理的轮数上只有最后一轮操作与前面的轮处理上有些许不同(最后一轮只是少了列混淆处理),在轮处理开始前还单独进行了一次轮密钥加的处理。在处理轮数上,我们只考虑128位密钥的10轮处理。
输入字节顺序
AES算法流程图
以下分别介绍密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)、秘钥变换方法。
2. 密钥加法层
在密钥加法层中有两个输入的参数,分别是明文和子密钥k[0],而且这两个输入都是128位的。这里需要注意在扩展域中加减法操作和异或运算等价,所以这里的处理也就异常的简单了,只需要将两个输入的数据进行按字节异或操作就会得到运算的结果。
2. 字节代换层
字节代换层的主要功能就是让输入的数据通过S_box表完成从一个字节到另一个字节的映射,S_box表是一个拥有256个字节元素的数组,可以将其定义为一维数组,也可以将其定义为16·16的二维数组,如果将其定义为二维数组(目前看见的常规用法),读取S_box数据的方法就是要将输入数据的每个字节的高四位作为第一个下标,第四位作为第二个下标。逆S盒与S盒对应,用于解密时对数据处理,我们对解密时的程序处理称作逆字节代换,只是使用的代换表盒加密时不同而已。
S盒
Eg:输入数据为0x19,对应输出为0xD4(第1行,第9列)
逆S盒
3. 行位移 - ShiftRows
行位移操作最为简单,它是用来将输入数据作为一个4·4的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。ShiftRows子层属于AES手动的扩散层,目的是将单个位上的变换扩散到影响整个状态,从而达到雪崩效应。在加密时行位移处理与解密时的处理相反,我们这里将解密时的处理称作逆行位移。它之所以称作行位移,是因为它只在4·4矩阵的行间进行操作,每行4字节的数据。在加密时,保持矩阵的第一行不变,第二行向左移动8Bit(一个字节)、第三行向左移动2个字节、第四行向左移动3个字节。而在解密时恰恰相反,依然保持第一行不变,将第二行向右移动一个字节、第三行右移2个字节、第四行右移3个字节。
4. 列混淆 - MixColumn
列混淆子层是AES算法中最为复杂的部分,属于扩散层,列混淆操作是AES算法中主要的扩散元素,它混淆了输入矩阵的每一列,使输入的每个字节都会影响到4个输出字节。
在加密的正向列混淆中,我们要将输入的4·4矩阵左乘一个给定的4·4矩阵。而它们之间的加法、乘法都在扩展域GF(2^8)中进行。
具体运算法则见:“列混淆矩阵乘法运算”
PS:在解密的逆向列混淆中与正向列混淆的不同之处在于使用的左乘矩阵不同,它与正向列混淆的左乘矩阵互为逆矩阵,也就是说,数据矩阵同时左乘这两个矩阵后,数据矩阵不会发生任何变化。
5. 其他
5.1列混淆矩阵乘法运算
注意正矩阵中只有0x01、0x02、0x03,0x01与任何数相乘不发生变换,0x02、0x03运算规则如下:
5.2 AES密钥生成
记子秘钥矩阵第一列为w0,第二列为w2,…,wi,w0~w3为初始秘钥矩阵,这里介绍i >= 4的计算方法(128对应i为9;196对应11;256对应为13)
具体框图如下:
G函数处理流程分为以下几步:
字循环:将1个字中的4个字节循环左移8bit(同“行移位”处理方式一致)
字节代换:对字循环的结果使用S盒字节代换
轮常量异或:将字节代换结果与轮系数进行异或(注意这里只与字节代换的最高byte进行异或)
6. 参考资料
- https://zhuanlan.zhihu.com/p/78913397
- https://www.bilibili.com/video/BV1i341187fK/?