数据加密标准-DES
DES 加密概述
数据加密标准(Data Encryption Standard,缩写为 DES)是由国家标准局(NIST)出版的对称密钥分组密码(块密码)。
对于任何加密体制,总有明文和密钥两个输入。DES 是费斯妥密码(Feistel Cipher)的一种实现,进行 16 轮迭代,其明文长度为 64 bit,密钥长度也是 64 bit(但只有 56 bit 被实际用于算法,其余 8 bit 可以被用于奇偶校验,并在算法中被丢弃)。
DES 的一般结构如下图所示,可见明文的处理经过了三个阶段。
- 首先,64 bit 明文经过初始置换(IP)而被重新排序;
- 然后,经过 16 轮相同的费斯妥函数的处理过程,每轮包含了代替和置换两个步骤;
- 最后, 再进行一次与初始置换互逆的置换($IP^{-1}$) ,得到 64 bit的密文。
除了初始和末尾的置换,DES 的结构与费斯妥密码结构完全相同。
算法描述
初始置换和末尾置换
初始置换和末尾置换只是对输入按位重新组合,在 DES 中没有密码学意义,初始置换和末尾置换如下所示:
输入的第 58 位换到第 1 位,第 50 位换到第 2 位,…,依此类推,最后一位是原来的第 7 位。假设输入的 64 位块为 $M_1, M_2, M_3, …, M_{64}$,则经过初始置换后的结果为 $M_{58}, M_{50}, M_{42}, …, M_7$。
64 位的输入 M:
这里 $M_i$ 都是二进制,经过置换 X=IP(M) 之后,得到的 X:
费斯妥函数(F 函数)
DES 加密的核心是费斯妥函数,即每轮的变换。由费斯妥密码结构可知,明文会被均分成两等分,右半部分和密钥经过费斯妥函数处理。对于 DES 加密,48 bit 子密钥(由主密钥派生)和 32 bit 右半块作为费斯妥函数的输入,处理后输出 32 bit结果。
下图是费斯妥函数的内部结构。密钥 $K_i$ 长度为 48 bit,R 长度为 32 bit。分为四个步骤:
- 将 R 置换扩展为 48 bit,其中有 16 bit 是重复;
- 置换扩展产生的 48 bit 输出与 48 bit 的 $K_i$ 异或;
- 异或的结果经过“S盒”(置换盒),产生 32 bit 的输出;
- “S盒”的输出最后再经过一次 P 置换,得到的 32 bit 是费斯妥函数的输出。
扩展置换
因为右半块长度是 32 bit,而密钥长度是 48 bit,因此,需要先把右半块扩展到 48 bit,称为“扩展置换”。扩展置换是将输入的 32 bit 半块分成 8 个 4 bit 小块,每 4 bit 块加上左右相邻块中紧邻的位,得到 6 bit 输出。第 1 块没有左邻,用第 32 位,最后一块没有右邻,用第 1 位。扩展置换输出 8 个 6 bit 的块,其逻辑如下:
扩展置换逻辑通常被描述为下图的 DES 规范表格:
与密钥混合
用异或操作将扩展的 48 bit 右半块和一个 48 bit 子密钥进行混合。16 轮变换使用 16 个 48 bit 子密钥,也就是每轮用的子密钥都是不同的,48 bit 的子密钥是利用密钥调度(下面介绍)从 58 bit 主密钥生成。
S 盒(置换盒)
48 bit 的异或输出再经过 S 盒处理,产生 32 bit 的输出。S 盒执行真正的混淆,它提供了 DES 的核心安全性。如果没有 S 盒,密码会是线性的,很容易破解。DES 使用 8 个 S 盒,每个盒子以查找表方式提供非线性的变换,将 6 bit 输入变成 4 bit 输出。
S 盒是一个 4x16 的表,盒 $S_i$ 输入的 6 bit 中,由第 1 位和第 6 位组成的二进制数确定表的行,中间 4 位组成的二进制数确定表的列,行和列交叉的元素转换成 4 bit 二进制数作为输出。
DES 的 8 个 S 盒变换表(下标从 0 开始)规格如图所示:
例如,在 $S_1$ 中,若输入为 011001,则行是 1(01),列是 12(1100),由行和列确定的元素是 9(1, 12),9 对应的二进制为 1001,因此 4 bit 输出为 1001。
置换
S 盒的 32 bit 输出最后再经过一次“P置换”进行重组。这个设计是为了将每个 S 盒的 4 位输出在下一回次的扩张后,使用 4 个不同的 S 盒进行处理。置换表格如下图所示:
S 盒,P 置换和 E 扩展各自满足了克劳德·香农在 1940 年代提出的实用密码所需的必要条件——“混淆与扩散”。
密钥生成
前面我们知道,密钥长度为 64 bit,算法只用 56 bit。循环密钥生成器从 56 bit 密钥中创建 16 个 48 bit 子密钥。密钥生成过程如下图所示。
首先,使用选择置换 1(PC-1) 从 64 bit 输入密钥中选出 56 bit 的密钥,剩余的 8 bit 要么直接被丢弃掉,要么作为奇偶校验位。
然后,将 56 bit 密钥分成两个 28 bit 的半密钥。在接下来的每轮变换中,两个半密钥都被左移 1 或 2 位(左移 1 还是 2 由当前的迭代轮数决定),移位后的值作为下一轮的输入,并且通过选择置换 2(PC-2) 压缩成 48 bit 的子密钥。
解密过程中,除了子密钥输出的顺序相反外,密钥调度的过程与加密完全相同。
置换选择以及移位次数如下图所示:
安全与密码分析
DES 满足分组密码的两个要求,这两个特性使加密非常强大。
雪崩效应——明文或密钥的微小改变将对密文产生很大的影响。
完备性——每一位密文都依赖于许多位明文。
到当前为止,最实用的攻击方法仍然是暴力攻击。虽然有 3 种理论攻击(差分密码分析、线性密码分析和改进的戴维斯攻击)的理论复杂性小于暴力破解,但需要不现实的已知明文或选择明文数量,并无实用价值。
DES 已被证明是一种设计良好的分组密码。除了暴力穷举密钥搜索外,DES 没有受到任何重要的密码分析攻击。为抵抗暴力破解,有大量的 DES 的代替算法,最重要的有 AES 和 3DES。