AES加密简介
- 现代密码学按照密钥的数量分为对称加密和非对称加密,对称加密只使用一个密钥加解密,而非对称需要公钥和私钥分别加解密。
- AES属于对称加密,因为使用同一把密钥,所有速度快,适合数据量比较大的加解密。
- AES是一种分组密码 分组长度为128位(16字节),根据密钥长度可分为AES-128 AES-192和AES-256,密钥长度不同,AES的加密轮数也不同。
AES |
密钥长度/bit |
分组长度/bit |
加密轮数 |
AES-128 |
128 |
128 |
10 |
AES-192 |
192 |
128 |
12 |
AES-256 |
256 |
128 |
14 |
AES流程
- AES的具体步骤主要分为密钥扩展、字节代换、行移位、列混淆、轮密钥加。
- 给定一个明文16位,是个4*4的字节矩阵,将轮密钥与明文进行异或运算
- 对密文块进行S-盒替换
- 再对结果进行行移位
- 再对结果进行列混淆交换
- 再进行轮密钥加
- 以128位为例
密钥扩展
- 密钥扩展是将128位的密钥扩展为11个128位的密钥
- 每一轮用一个128位进行轮密钥加操作
- 当i为4的倍数时,计算W[i],W[i-1]进行左移1个字节(向上移动一位),然后用给定的S-盒进行替换,最后与W[i-4]和轮常数进行异或,得到W[i]
- 当i不是4的倍数时,W[i]就是W[i-1]和W[i-4]进行异或
- 重复40次,得到其余10轮的轮密钥
- 轮常数:
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
RC[i] |
0x01 |
0x02 |
0x04 |
0x08 |
0x10 |
0x20 |
0x40 |
0x80 |
0x1B |
0x36 |
0x6c |
字节替换
- 被替换字节的高4位为X坐标,低4位为Y坐标
- 在S-盒当中找到替换的字节进行替换
行移位
- 第一行不变,第二行左移一个字节,第三行左移两个字节,第四行左移三个字节
列混淆
- 对每一列进行单独的操作
- 把每一列都看成GF($2^8$)中的一个四项多项式$s(x)$,再与GF($2^8$)上的固定多项式$a(x)={03}x^3+{01}x^2+{01}x+{02}$进行模$x^4+1$的乘法运算。
- 拿我上课老师的PPT做个例子
轮密钥加
- 轮密钥加就是将列混合得到的结果中的每一列分别与密钥中的每一列做异或,然后取代原字节序列,实现也很简单,就是一个异或操作。
AES解密过程
- 看图就能理解了
- AddRoundKey->轮密钥加
- InvByteSub->字节替换
- InvShiftRows->行移位
- InvMixColumns->列混淆