密码学 3:DES 与 AES
DES 和 AES 是现代的两种对称数据加密算法。DES 诞生于 1976 年,于 1997 年被第一次公开破解,故之后因安全性顾虑而鲜有使用;AES 则诞生于 2001 年 11 月,至今仍然在使用。
混淆与扩散,代换与置换
香农在 1949 年提出隐藏信息的设计准则:混淆和扩散。
混淆(confusion):改变数据块本身,使得输出与输入之间没有明显的统计关系,将明文的统计特性散布到密文中,使得明文中的每一位都能影响密文中的许多位,密文中的每一位都受到多位明文的影响。
扩散(diffusion):将密钥位转移到密文的其他位上,使得密文和密钥之间的统计关系也变得复杂,使攻击者无法从密文推出密钥。
根据此理论,一个良好的密码应当有良好的扩散性,对插入信息有敏感性,有较强的适应性,同时差错应当能扩散和传播。为了实现这些性质,借鉴古典密码中的代换和置换思想。
代换(substitution):将一组输入数据对应到另一组长相完全不同的输出数据。通过非线性变换实现。将代换过程封装为 S 盒,每个 S 盒之间没有关联。
置换(permutation):交换各个数据块的位置,交换各个子代换,使得混淆和扩散效果有更大的范围。
DES 的加密流程
考虑如下的简化 DES 加密算法,明文、密文为 8 位,密钥为 10 位,只进行 2 轮加密。真正的 DES 算法使用 64 位的明文和密文,密钥为 56 位,进行 16 轮加密。
初始置换
将明文按照某种方法进行置换,即交换各位的位置。
\[10010010\xrightarrow{81234567}01001001\]
轮函数
DES 在每一轮加密中,都将输入数据(此外为 8 位)分为左、右两部分(\(L_i\) 和 \(R_i\)),将 \(R_i\) 使用 F 函数处理得到 \(f_K(R_i)\),再与原来的左部数据 \(L_i\) 异或得到新的右部,原来的右部作为左部。即:
\[\{L_{i+1}, R_{i+1}\}\Leftarrow\{R_i, L_i\oplus f_K(R_i)\}\]
其中 F 函数 \(f_K()\) 的操作为:
拓展与置换:将 4 位的半边数据拓展置换到 8 位。
异或子密钥:将上面的结果与 8 位的子密钥 \(K\) 异或。
代换:将上面的结果分成左、右两部分,查相应的 S 盒,得到 4 位结果。
置换:将上面的 4 位结果置换,然后输出(4 位)。
逆置换
按初始置换的逆运算再置换一次。
AES 的加密流程
AES 加密与解密的流程如下图所示。AES 的明文和密文为 128 位,使用 128、192 或 256 位的密钥,对应 10、12 和 14 轮加密。
下面介绍这其中的每一个过程。
密钥扩展
以 AES-128 为例,它需要进行 10 轮加密,每一轮都需要一个 128 位的轮密钥。因此,需要从最初始的 128 位密钥生成 10 个新的 128 位的子密钥。此过程即密钥扩展。
记 \(W_i\) 表示一个 32 位的字,初始密钥即 round key 0 为 \(\{W_0, W_1, W_2, W_3\}\)。用下面的方法一直计算到 round key 10,即得到 10 个轮密钥(初始密钥不算)。
其中 \(g\) 函数的操作为:对输入的 4 个字节即 32 位字,先循环左移 1 个字节,将各字节 S 盒代换后,将第一个字节异或一个常量。
行移位
首先将 128 位的数据转换成 16 个字节 \(B_0\)~\(B_{15}\),然后以列优先的方式写成矩阵:
然后,第 1 行不变,第 2 行左移 1 字节,第 3 行左移 2 字节,第 4 行左移 3 字节,得到:
列混淆
将上面得到的矩阵左乘一个特定的矩阵。乘法在 \(GF(2^8)\) 上进行。
轮密钥加
即异或操作。将 128 位的轮密钥与 128 位的输入异或,得到 128 位的输出。
分组密码操作模式
对于分组密码如 AES 和 DES,它们的输入是固定长度的消息,而需要加密的消息很可能比这个固定长度要长,并且长度也不是此固定长度的整数倍。因此,需要采用操作模式对原消息进行处理,使得任意长度的消息都能被分组密码处理。
电子密码本(ECB)
将明文按分组长度切分,然后每块独立加密,再拼接在一起。
不安全——会暴露明文的格式和统计特征。
密码分组链接(CBC)
将明文按长度切分,但是加密前,先异或上次加密的密文。对于第一段消息,异或一个初始向量 IV。
错误传播:如果某一组密文在传输过程中出错,会影响当前组和它的下一组的解密。
Beast 攻击——如果偷懒,不生成新的 IV,会出现大问题:无法抵抗 CPA 攻击。
(图片来自:https://www.youtube.com/watch?v=-_8-2pDFvmg)