这篇文章上次修改于 221 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
加密流程
AES 是一个分组密码,每组 16 bytes,即 128 bit(也有 256 bit 的,不过 128 bit 的安全性就足够了)
- 将 128 bit 的明文写为 $4*4$ 的矩阵 $M_0$,将 128 bit 密钥写为 $4*4$ 的矩阵 $K_0$
- $K_0$ 通过密钥扩展算法扩展出新的密钥矩阵 $K_1, K_2, ..., K_{10}$
- $M_0$ 与 $K_0$ 进行 1 轮 xor 运算,得到新的矩阵 $M_1$
- $M_1$ 进行 4 轮( 最后一轮是与 $K_1$ 的 xor)的轮函数运算后得到新的矩阵 $M_2$
- 将步骤 4 重复 9 遍,得到矩阵 $M_{10}$
- 将 $M_{10}$ 进行 3 轮(最后一轮是与 $K_{10}$ 的 xor)的轮函数运算后得最终矩阵 $M_{11}$
- 将 $M_{11}$ 由矩阵形式写为向量形式,得到最终的密文
所以轮函数和密钥扩展函数是 AES 的关键部分
解密流程
解密算法的操作顺序正好与加密算法相反,且每一步对应加密算法的逆操作。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。
轮函数
轮函数包含 4 种操作:字节替换,行移位,列混淆,轮密钥加
字节替换
是非线性变换,可抵抗解方程组攻击、延展攻击。延展性:基于已有密文计算新的密文,例如同态加密具有延展性。
字节代替通过 $S$ 盒完成一个字节到另外一个字节的映射。$S$ 盒用于提供密码算法的混淆性。
$S$ 和 $S^{-1}$ 分别为 16x16 的矩阵,输入的高 4-bit 对应的值作为行标,低 4-bit 对应的值作为列标,可在 $S$ 或 $S^{-1}$ 中找到新的 8-bit 数据作为输出。
行移位
行移位是一个 4x4 的矩阵内部字节之间的置换,用于提供算法的扩散性。
加密:第一行保持不变,第二行循环左移 8 比特,第三行循环左移 16 比特,第四行循环左移 24 比特。
解密:第一行保持不变,第二行循环右移 8 比特,第三行循环右移 16 比特,第四行循环右移 24 比特。
列混淆
计算方式一:使用域 $F_{2^8}$ 上的不可约多项式 $m(x) = x^8 + x^4 + x^3 + x +1$
例如
$$ \begin{align} \left\{02\right\} \cdot \left\{C9\right\} &= (0000,00010) \cdot (1100,1001) \\ &= x \cdot (x^7 + x^6 + x^3 + 1) mod (m(x))\\ &= x^7 + x^3 + 1 = (1000, 1001) = \left\{89\right\} \end{align} $$
计算方式二:左乘矩阵 $\begin{bmatrix} 02 & 03 & 01 & 01 \\ 01 & 02 & 03 & 01 \\ 01 & 01 & 02 & 03 \\ 03 & 01 & 01 & 02 \end{bmatrix} $
(1) 将某个字节所对应的值乘以 2,其结果就是将该值的二进制位左移一位。 如果原始值的最高位为 1,则还需要将移位后的结果异或常量 00011011
(2)乘法对加法满足分配率 $07·S_{0,0}=(01⊕02⊕04)·S_{0,0}=( 01·S_{0,0})⊕ (02·S_{0,0}) ⊕(04·S_{0,0}) $
(3)加法是模 $2^8$ 加法(异或运算)。
逆向列混淆:左乘矩阵 $\begin{bmatrix} 0E & 0B & 0D & 09 \\ 09 & 0E & 0B & 0D \\ 0D & 09 & 0E & 0B \\ 0B & 0D & 09 & 0E \end{bmatrix} $
AES 加密计算复杂度更低,AES 解密计算复杂度更高。因为 CFB/OFB/CTR 模式仅用到加密算法生成随机数,没有用到解密算法。
轮密钥加
加密:每轮的输入与轮子密钥异或一次,c=m⊕k
解密::再异或上该轮的轮子密钥即可恢复明文,m=c⊕k
密钥扩展算法
- 将种子密钥按图 (a) 的格式排列,$k_0, k_1, ..., k_{15}$ 依次表示种子密钥的一个字节。排列后用 4 个 32 比特的字表示,记为 $w_0, w_1, w_2, w_3$,每组 4 个字节
串行求解 $w_j$,其中 $j \in [4,43]$
- 如果 $j \space mod \space 4=0$,则 $w_j=w_{j-4} \bigoplus g(w_{j-1})$
- 否则,$w_j=w_{j-4} \bigoplus w_{j-1}$
g(x) 如图 (b) 所示
- $w$ 循环左移 8 比特
- 分别对每个字节做 S 盒置换
与 32 比特的常量(RC[j/4],0,0,0)进行异或
RC 是一个有 10 个元素的一维数组:01, 02, 04, 08, 10, 20, 40, 80, 1B, 36
分组密码每次加密 128bit 的数据,如果数据为 128bit~300Gbit 数据,则将分组密码循环调用多次。
对称加密的五种工作模式
ECB 电码本模式
用相同的密钥分别对明文分组独立加密。
优点:可并行加密和解密
缺点:如果明文 $P_1=P_2$,则密文 $C_1=C_2$,随机性很差
应用场景:仅加密 128-bit 的数据
CBC 密文分组链接模式
明文块 $P_1$ 先与初始向量 IV 做异或运算,再加密得到密文块 $C_1$。剩下的明文块 $P_i$ 加密前,必须与前一个密文块 $C_1$ 做一次 xor 运算再加密。最后一个分组需要填充。
优点:随机性高
缺点:
- 1bit 传输错误,会影响后续解密,称为雪崩效应
- 串行加密
应用场景:数据本地加解密,且数据量较小(或对速度无要求)
CFB 密文反馈模式
用密钥 $K$ 对初始向量 $IV$ 加密,产生 128-bit 随机数,选择其中的 s-bit 与 s-bit 的明文数据块 $P_1$ 进行 xor 运算,得到密文块 $C_1$。将 $C_1$ 放到移位寄存器的尾部,移位后,再用 $K$ 对其加密,...。不需要填充。
优点:加密和解密都用的是 AES 加密算法,效率高
缺点:
- 1bit 传输错误,会影响后续解密
- 串行加密,且每次只加密 s-bit 明文
OFB 输出反馈模式
选择一个保密的 Nonce,用密钥 $K$ 对 Nonce 加密得到新的随机数 $R_1$,$R_1$ 与明文块 $P_1$ 异或得到密文块 $C_1$,再用 $K$ 加密 $C_1$,...。不需要填充。本质上是分组密码算法构造出流密码算法,生成任意长的随机数对消息加密。
优点:加密和解密都用的是 AES 加密算法,效率高
缺点:串行加解密
CTR 计数器模式
相对于 OFB 模式,用一个公开的 Counter1 = IV 代替了保密的 Nonce,Counter2 = Counter1 + 1
优点:
- 独立性高,可并行加解密
- 加密和解密都用的是 AES 加密算法,效率高
对比分析和应用场景
模式 | 优点 | 缺点 | 备注 |
---|---|---|---|
ECB | 支持并发加解密 | 重复明文反映在密文中,不能抵抗重放攻击 | 不推荐 |
CBC | 抵抗重放攻击,可并行解密 | 不能并行加密,错误的密文影响后续密文解密 | 推荐 |
CFB | 不需要填充,可并行解密,解密分组间无依赖 | 不能并行加密,,错误的密文影响后续密文解密 | 不推荐 |
OFB | 不需要填充,出现错误时仅对应明文出错 | 不支持并行计算 | 不推荐 |
CTR | 不需要填充,可并行加解密 | 反转密文分组中的部分 bit 时,对应明文也会反转 | 推荐 |
GCM 加密模式
GCM 是认证加密模式,目前最推荐的加密模式!GCM = MAC + CTR
MAC:提供附加消息的完整性校验
CTR:确保数据的保密性,有并行性、counter=IV 可公开等优点
双方提前共享一个密钥,发送者使用共享密钥和数据计算哈希值,并随消息一起发送。 接收者通过共享密钥计算收到消息的 MAC 值,与接收的 MAC 值做比较,从而判断消息 是否被改过(完整性)。对于篡改者,由于没有密钥(认证),也就无法对篡改后的消息计算 MAC 值。
没有评论