计算机技术学习札记

密码学 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)

密码反馈(CFB)

输出反馈(OFB)

计数器