算法简介
AES的全称是Advanced Encryption Standard,意思是高级加密标准。
他的出现是为了取代DES加密算法的,DES算法的密钥长度是56bit,所以算法的理论安全强度是2的56次方,现已不能满足人类对安全性的需求,所以AES诞生了
AES和DES都是分组密码,但是组的大小不一样,DES是64bit一组,AES是128bit一组,密钥长度DES是56位。但AES的密钥长度可以是128、192、256,密钥长度每多64位只会增加两次轮函数的运用,128长度是10轮,192是12轮,256是14轮。
DES是基于Feistel的机构进行加密,每一轮加密的是64位的一半,也就是32位。
而AES不具有Feistel结构,每次迭代中就加密了所有的128位,所以一般情况下,AES的轮数会比DES少
需要理解的是AES算法是面向字节的加密算法,1字节有8位,也就是8位二进制,AES这里写成16进制
算法流程图
结构比DES看起来更简单明了一些
只有密钥生成和轮函数两部分,这里不介绍密钥生成函数,只介绍轮函数
密钥加法层
密钥K先生成K0,和明文按位异或
轮函数
字节代换
如果不考虑S盒的生成过程,那字节代换就是一个查表的过程
对于输入的128位,分成16个8位的二进制串,每个二进制串分成前后两个4位2进制,转换成对应的十六进制,作为查表用的行和列,找到表中对应的数就行
但是S盒是怎么产生的呢?
其实是经过两部分操作后得到的,首先把一个字节的数换算成10进制,就会得到0-255的一个十进制数,计算一下他在模256下的逆元,由于0没有逆元,这里规定为0是0的逆元。然后将刚刚的逆元以2进制的方法写出来,进行以下的仿射变换(本质就是一个矩阵乘法)
得到的就是一个字节对应的值,0到255共256种不同的字节,S盒就是打表提前计算出来所有的数的值,便于直接利用,节约时间
行位移
行位移操作很简单,就是将输入的数据竖着写为一个个规定大小的矩阵,进行位置上的变化
比如 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16记做:
1 | 5 | 9 | 13 |
---|---|---|---|
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
4 | 8 | 12 | 16 |
规定的大小要看你的密钥长度是128还是192还是256,这三个分别对应4 * 4、4 * 6、4 * 8的矩阵
再根据位移表来位移就行,这三个对应的位移表不同,这里就只介绍128的
行 | C0 | C1 | C2 | C3 |
---|---|---|---|---|
位移大小 | 0 | 1 | 2 | 3 |
上述表经过左移后得到的如下:
1 | 5 | 9 | 13 |
---|---|---|---|
6 | 10 | 14 | 2 |
11 | 15 | 3 | 7 |
16 | 4 | 8 | 12 |
列混合
列混淆子层是AES算法中最为复杂的部分,属于扩散层,列混淆操作是AES算法中主要的扩散元素,它混淆了输入矩阵的每一列,使输入的每个字节都会影响到4个输出字节。行位移子层和列混淆子层的组合使得经过三轮处理以后,矩阵的每个字节都依赖于16个明文字节成可能。其中包含了矩阵乘法、伽罗瓦域内加法和乘法的相关知识。
主要是在扩展域GF(28)的矩阵加法与乘法,这里暂不仔细介绍
密钥加
就是异或上此轮的密钥Ki