AES加密
密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。
目前被使用多个地方,我目前看到的一个项目使用这些代码。(注释:部分内容来源于https://zhuanlan.zhihu.com/p/562256846
加密原理
使用对称加密的方式,支持的密钥长度为128,192,256位。



AES加密一共涉及到5种方法:明文矩阵填充,轮秘钥填充(字节替代,行位移,列混淆,轮密钥加密)。不同的秘钥加密的论量是不同的。
明文数据对齐填充
被加密的数据类型进行数据相关的处理,需要实现数据对齐的原则。如果出现数据不对齐的情况,会开始进行数据的填充的操作。目前有多种的填充方式:1,NoPadding 2,PKCS5Padding 3,ISO10126Padding
NoPadding
不做任何填充,要求明文必须是16bit的整数倍。
PKCS5Padding(默认)
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。8
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
PKCS#7(推荐)
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。每个字节值均为0x06。
- 明文(10 字节,示例为十六进制):`0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A
- 填充后(16 字节):
0x01 0x02 ... 0x0A 0x06 0x06 0x06 0x06 0x06 0x06 - 解密时:读取最后 1 个字节的值
n,直接删除末尾n个字节即可恢复明文(无歧义)。

轮密钥加密

把加密的4x4的正方形矩形和AES128位的第一个的填充数据对应的位置进行异或计算,得出来之后4x4正方形矩形(16位)。
字节替代
使用直接代换表进行转换为对应的信息
| | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
| 00 | 63 | 7C | 77 | 7B | F2 | 6B | 6F | C5 | 30 | 01 | 67 | 2B | FE | D7 | AB | 76
| 01 | CA | 82 | C9 | 7D | FA | 59 | 47 | F0 | AD | D4 | A2 | AF | 9C | A4 | 72 | C0
| 02 | B7 | FD | 93 | 26 | 36 | 3F | F7 | CC | 34 | A5 | E5 | F1 | 71 | D8 | 31 | 15
| 03 | 04 | C7 | 23 | C3 | 18 | 96 | 05 | 9A | 07 | 12 | 80 | E2 | EB | 27 | B2 | 75
| 04 | 09 | 83 | 2C | 1A | 1B | 6E | 5A | A0 | 52 | 3B | D6 | B3 | 29 | E3 | 2F | 84
| 05 | 53 | D1 | 00 | ED | 20 | FC | B1 | 5B | 6A | CB | BE | 39 | 4A | 4C | 58 | CF
| 06 | D0 | EF | AA | FB | 43 | 4D | 33 | 85 | 45 | F9 | 02 | 7F | 50 | 3C | 9F | A8
| 07 | 51 | A3 | 40 | 8F | 92 | 9D | 38 | F5 | BC | B6 | DA | 21 | 10 | FF | F3 | D2
| 08 | CD | 0C | 13 | EC | 5F | 97 | 44 | 17 | C4 | A7 | 7E | 3D | 64 | 5D | 19 | 73
| 09 | 60 | 81 | 4F | DC | 22 | 2A | 90 | 88 | 46 | EE | B8 | 14 | DE | 5E | 0B | DB
| 0A | E0 | 32 | 3A | 0A | 49 | 06 | 24 | 5C | C2 | D3 | AC | 62 | 91 | 95 | E4 | 79
| 0B | E7 | C8 | 37 | 6D | 8D | D5 | 4E | A9 | 6C | 56 | F4 | EA | 65 | 7A | AE | 08
| 0C | BA | 78 | 25 | 2E | 1C | A6 | B4 | C6 | E8 | DD | 74 | 1F | 4B | BD | 8B | 8A
| 0D | 70 | 3E | B5 | 66 | 48 | 03 | F6 | 0E | 61 | 35 | 57 | B9 | 86 | C1 | 1D | 9E
| 0E | E1 | F8 | 98 | 11 | 69 | D9 | 8E | 94 | 9B | 1E | 87 | E9 | CE | 55 | 28 | DF
| 0F | 8C | A1 | 89 | 0D | BF | E6 | 42 | 68 | 41 | 99 | 2D | 0F | B0 | 54 | BB | 16

这里的第一行第一列,数字18,第一个为1(看列对应关系),第二个为8(看行对应关系)。最后结果计算30,把30数据填充上去18的位置。其他的位置替换类似。
行位移
规则
第一行不变
第二行向左循环移动1字节
第三行向做循环移动2字节
第四行向左循环移动3字节
列混淆(我自己没有看懂,抄一个博主的)
列混淆是加密过程中最复杂的一块
公式:使用GF(2^8)对[列混淆左乘矩阵的行]与[当前字节的列]进行矩阵乘法
Copy
举例说明
上述计算
[x1,y1] = 0x02 × [x1,y1] ⊕ 0x03 × [x2,y1] ⊕ 0x01 × [x3,y1] ⊕ 0x01 × [x4,y1]
[x2,y1] = 0x01 × [x1,y1] ⊕ 0x02 × [x2,y1] ⊕ 0x03 × [x3,y1] ⊕ 0x01 × [x4,y1]
[x3,y3] = 0x01 × [x1,y3] ⊕ 0x01 × [x2,y3] ⊕ 0x02 × [x3,y3] ⊕ 0x03 × [x4,y3]
[x1,y1] = 0x01 × [x1,y4] ⊕ 0x01 × [x2,y4] ⊕ 0x02 × [x3,y4] ⊕ 0x03 × [x4,y4]
Copy
在GF(2^8)中加法和乘法是不一样的
1.加法操作
直接改成异或操作,a+b 等效为 a ⊕ b
2.乘法操作
2.1.定义一个函数f(a)
如果a小于0x80,则返回2*a
否则返货((2*a)mod 0x100) ⊕ 0x1B
2.2乘法操作中的其中一个数值是2的N次方,则可以套用以下公式
0x01 × a = a 0x02 × a = f(a) 0x04 × a = f(0x02 × a) 0x08 × a = f(0x04 × a) 0x10 × a = f(0x08 × a) ...Copy
2.3.非2的次方可以拆分后相加(这里的相加操作依然为异或操作)
例子
0x0D × a = (0x08 × a) ⊕ (0x04 × a) ⊕ (0x01 × a) = f(0x04 × a)⊕ f(0x02 × a)⊕ a 0x0D × a = (0x08 × a) ⊕ (0x04 × a) ⊕ (0x02 × a) = f(0x04 × a)⊕ f(0x02 × a)⊕ f(a)Copy
直接计算实际例子
以前面例子中的[x3,y1]为例
[x3,y1] = 0x01 × [x1,y1] ⊕ 0x01 × [x2,y1] ⊕ 0x02 × [x3,y1] ⊕ 0x03 × [x4,y1]
= 0x01 × 0x3B ⊕ 0x01 × 0xF7 ⊕ 0x02 × 0xA8 ⊕ 0x03 × 0xB7
0x01 × 0x3B = 0x3B
0x01 × 0xF7 = 0xF7
0x02 × 0xA8 = f(0xA8) = ((2*0xA8)mod 0x100) ⊕ 0x1B = 0x50 ⊕ 0x1B = 0x4B
0x03 × 0xB7 = f(0xB7) ⊕ 0xB7 = ((2*0xB7)mod 0x100) ⊕ 0x1B ⊕ 0xB7 = 0x75 ⊕ 0xB7 = 0xC2
[x3,y1] = 0x3B ⊕ 0xF7 ⊕ 0x4B ⊕ 0xC2 = 0x45
再举例[x2,y4]
[x2,y4] = 0x01 × [x1,y4] ⊕ 0x02 × [x2,y4] ⊕ 0x03 × [x3,y4] ⊕ 0x01 × [x4,y4]
= 0x01 × 0x27 ⊕ 0x02 × 0x85 ⊕ 0x03 × 0x53 ⊕ 0x01 × 0xD8
0x01 × 0x27 = 0x27
0x02 × 0x85 = f(0x85) = ((2*0x85)mod 0x100) ⊕ 0x1B = A ⊕ 0x1B = 0x11
0x03 × 0x53 = f(0x53) ⊕ 0x53 = (2*0x53) ⊕ 0x53 = A6 ⊕ 0x53 = 0xF5
0x01 × 0xD8 = 0xD8
[x2,y4] = 0x27 ⊕ 0x11 ⊕ 0xF5 ⊕ 0xD8 = 1B
许多内容来源于下面这个链接AES加密和解密流程


450



被折叠的 条评论
为什么被折叠?



