AES

标签(空格分隔): 未分类


AES大致介绍

AES类型 密钥长度(位) 加密轮数 密钥长度(字节) 需要的子密钥总数
AES-128 128 10 16 11
AES-192 192 12 24 13
AES-256 256 14 32 15

加密流程

1
2
3
          密匙K                        密匙
| 传输 |
明文P ->AES加密函数 - > 密文C -------> 解密 ---> 明文

开始加密

开始加密
首先通过将已知明文进行一个判断,由于AES加密只能用16个字节,所以得分块情况进行加密,当进行加密的字节刚好是16字节的话正好,如果是少于16字节就必须要进行一个填充(按照自己的方式进行补充)。

明文处理

明文转化为ASCLL值。
然后再将16字节的明文放到一个状态矩阵里面,具体顺序如下:

1
2
3
4
5
6
7
8
输入字节: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15

状态矩阵排列:
Column 0 Column 1 Column 2 Column 3
Row 0: b0 b4 b8 b12
Row 1: b1 b5 b9 b13
Row 2: b2 b6 b10 b14
Row 3: b3 b7 b11 b15

密匙拓展

先进行密匙转换为ASCLL值然后再进行排列
例子如下

1
2
3
4
5
密匙16进制:4D 79 53 65 63 72 65 74 4B 65 79 31 32 33 34 35
w[0] = [4D, 79, 53, 65]
w[1] = [63, 72, 65, 74]
w[2] = [4B, 65, 79, 31]
w[3] = [32, 33, 34, 35]

注:这是初始密匙k0

就是4个4个的分组排列。

然后进行判断!!!

如果 i % 4 == 0,执行特殊变换

如果i没有满足的话直接进行异或运算 w [ i ] = w [ i - 4 ] ⊕ w [ i-1 ]可以得到下一步的

特殊变换如下:

循环左移

1
2
原始: [byte0, byte1, byte2, byte3]
循环左移后: [byte1, byte2, byte3, byte0]

沙盒替换

由于1个16进制字节转为2进制就是8个字节,此时用这个16进制转为的2进制字节的高4位为行号(转为整数值进行查询),低四位为列号(转为整数值进行查询)。
如此重复将每个字将查询到的值进行替换。
沙盒数值如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
00: 63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
10: CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0
20: B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15
30: 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75
40: 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84
50: 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF
60: D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8
70: 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2
80: CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73
90: 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB
A0: E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79
B0: E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08
C0: BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A
D0: 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E
E0: E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF
F0: 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16

与Rcon[round]异或

Rcon = Round Constant,每轮一个常数。
Rcon[round] 是一个字:[RC[round], 0x00, 0x00, 0x00]

1
2
3
4
SubWord结果: [C3, 18, 96, 23]
Rcon[1]: [01, 00, 00, 00]
⊕ ⊕ ⊕ ⊕
结果: [C2, 18, 96, 23]

然后再与w[i-4]异或得到w[4]


加密开始


初始轮

初始状态进行异或

1
2
3
4
5
状态矩阵:    轮密钥K0:      异或结果:
48 6F 53 6C ⊕ 4D 63 4B 32 = 05 0C 18 5E
65 20 20 64 ⊕ 79 72 65 33 = 1C 52 45 57
6C 41 57 21 ⊕ 53 65 79 34 = 3F 24 2E 15
6C 45 6F 72 ⊕ 65 74 31 35 = 09 31 5E 47

主循环轮

沙盒替换
和密匙的特殊处理中沙盒的一样

这里就不多进行阐述了

行移位
假设此时为第n行那么字符向右移动n位例子如下

1
2
3
4
5
6
7
第0行:不移位 → [6B, FE, B8, 4A]

第1行:左移1字节 → [9C, 6F, 6E, 5B] → [6F, 6E, 5B, 9C]

第2行:左移2字节 → [76, 36, 95, 59] → [95, 59, 76, 36]

第3行:左移3字节 → [01, C7, 4A, 5B] → [5B, 01, C7, 4A]

列混淆
首先是在进行行移位后的状态表列出来
例子如下:

1
2
3
4
6B FE B8 4A
6F 6E 5B 9C
95 59 76 36
5B 01 C7 4A

然后获得第一列的数值:
6B 6F 95 5B
然后对每一列运用矩阵乘法

1
2
3
4
5
固定矩阵:
02 03 01 01
01 02 03 01
01 01 02 03
03 01 01 02

新行0 = (02·6B) ⊕ (03·6F) ⊕ (01·95) ⊕ (01·5B)
新行1 = (01·6B) ⊕ (02·6F) ⊕ (03·95) ⊕ (01·5B)
新行2 = (01·6B) ⊕ (01·6F) ⊕ (02·95) ⊕ (03·5B)
新行3 = (03·6B) ⊕ (01·6F) ⊕ (01·95) ⊕ (02·5B)
先进行乘法运算然后再进行异或运算得到每一列

随后对每一列重复那样的计算
总结:先提出一列然后对固定矩阵的每一行进行矩阵乘法后得到新列

轮密匙加密
与第n轮的密匙进行异或运算例子如下

1
2
3
4
5
状态:         轮密钥K1:     异或结果:
AF 45 32 8D ⊕ AD CF F7 E5 = 02 8A C5 68
80 23 9E 4C ⊕ E1 93 92 D1 = 61 B0 0C 9D
C6 F1 5A B7 ⊕ F6 D7 2B F7 = 30 26 71 40
FB DC 88 29 ⊕ 46 77 15 32 = BD AB 9D 1B

这样一轮便是结束了
如此重复9轮

第10轮
只在前几轮的基础上去掉列混淆
最后输出结果便是加密方式

##总结
大致加密流程可以画成这样

1
2
3
4
明文 → 轮密钥加(K0) 
→ [字节替换 → 行移位 → 列混淆 → 轮密钥加(Ki)] 循环9次
→ 字节替换 → 行移位 → 轮密钥加(K10)
→ 密文

解密的流程是这样

1
2
3
4
5
密文 → 轮密钥加(K10) 
→ 逆行移位 → 逆字节替换
→ [轮密钥加(Ki) → 逆列混淆 → 逆行移位 → 逆字节替换] 循环9次
→ 轮密钥加(K0)
→ 明文