DES 加密:一个时代的落幕与启示
什么是 DES?
DES(Data Encryption Standard,数据加密标准)是密码学历史上的一座里程碑。1977 年,它被美国国家标准局(NBS,现在的 NIST)正式采纳为联邦信息处理标准,成为全球第一个公开的、标准化的对称加密算法。
把时钟拨回 1970 年代初。IBM 的研究员 Horst Feistel 带领团队开发了一个叫 Lucifer 的加密算法,用的是一种后来以他的名字命名的网络结构——Feistel 网络。NSA(美国国家安全局)介入审查后做了一个在当时看来合理的决定:把 Lucifer 原本 128 位的密钥砍到 56 位,把 128 位的分组砍到 64 位。然后,这个修改过的算法就变成了 DES。
说实话,这场”削减”背后到底是因为 NSA 觉得 56 位足够了,还是他们想给自己留后门,学术界争论了几十年。但有一点是确定的:56 位的密钥长度,直接决定了 DES 最终的命运。
DES 最了不起的地方不在于它多安全,而在于它把密码学从军方的黑箱里拽了出来。在此之前,加密算法都是机密,只有军方和情报机构知道怎么运作。DES 公开了全部设计细节,让全世界的学者都能审视、分析、攻击它。这种开放精神影响了之后全部的密码学标准制定流程。
DES 的工作原理
DES 属于分组密码(Block Cipher),明文按 64 位(8 字节)一块进行加密。流程可以概括为:初始置换 → 16 轮 Feistel 迭代 → 逆初始置换。
这张图把整个流程从头串到尾,点「播放」可以一步步看:
Feistel 网络:DES 的灵魂
Feistel 网络的设计非常对称优雅。每一轮是这样运作的:
- 把 64 位的输入分成左半 L(32 位)和右半 R(32 位)
- 把 R 和当前的轮密钥送进一个叫 F 函数的东西,算出一个 32 位的结果
- 把 F 的输出和 L 做 XOR,得到下一轮的 R
- 下一轮的 L 直接等于这一轮的 R
用公式表示就是:
L_i+1 = R_i
R_i+1 = L_i XOR F(R_i, K_i)
16 轮之后,把最后的 L 和 R 拼在一起,再过一次最终置换,密文就出来了。解密的时候,把轮密钥的顺序倒过来用就行——加密和解密用的是完全相同的结构,只不过密钥顺序反了。这在硬件实现上是个巨大的优点,加密器和解密器可以共用一套电路。
把其中一轮单独放大看,就是这个样子:
F 函数里面做了什么?
F 函数是 DES 里唯一”非线性”的部分,它的复杂度决定了整个算法的安全强度。F 函数内部分四步:
- 扩展置换:把 32 位的 R 扩展到 48 位,某些位被复制了
- 与轮密钥 XOR:48 位扩展结果和 48 位轮密钥做异或
- S-Box 替换:把 48 位分成 8 组,每组 6 位,送进 8 个不同的替换盒(S-Box)。每个 S-Box 把 6 位映射为 4 位,8 个盒子合起来把 48 位压缩成 32 位。这 8 个 S-Box 是 DES 的心脏,也是当年 NSA 被人怀疑埋后门的地方——幸运的是,后来差分密码分析的研究表明,NSA 选的 S-Box 值恰好比随机选择更能抵抗差分攻击,说明他们早就知道这个攻击方法了
- P-Box 置换:把第 3 步输出的 32 位重新排列一下
这四步连起来的位宽变化值得留意——32 位进、32 位出,中间却被撑到 48 位:
密钥编排
DES 输入的”钥匙”名义上是 64 位,但每 8 位的最后一位是奇偶校验位,实际用到的密钥只有 56 位。56 位通过一个固定的置换表生成 16 把各 48 位的轮密钥,每轮用一把。
打个比方:如果把 DES 比作一个搅拌机,Feistel 网络就是搅拌桶,F 函数是搅拌叶,S-Box 是不规则形状的刀片,轮密钥是每次加进去的调料。一轮搅拌完,食材已经面目全非,16 轮之后谁也认不出这堆东西原本是什么了。
核心特性
| 特性 | 说明 |
|---|---|
| 类型 | 对称分组密码(Feistel 结构) |
| 分组大小 | 64 位(8 字节) |
| 密钥长度 | 56 位(名义 64 位,8 位是校验位) |
| 轮数 | 16 轮 |
| 安全状态 | 已不安全——24 小时内可暴力破解 |
| 标准化 | FIPS PUB 46(已撤销)、ANSI X3.92 |
| 衍生算法 | 3DES、DES-X |
56 位密钥空间一共是 2^56 ≈ 7.2 × 10^16 种可能。这个数字在上世纪 70 年代听起来很大,但到了 90 年代就撑不住了。
DES 的陨落:EFF Deep Crack 的故事
DES 从诞生起就一直被质疑——学术界始终认为 56 位太短。1998 年是个转折点。EFF(电子前哨基金会)花了 25 万美元造了一台叫 Deep Crack 的专用破解机,内含 1800 多个定制芯片,每个芯片每秒测试超过 6000 万个密钥。整台机器不到 24 小时就暴力搜遍了全部 56 位密钥空间,找出了正确的 DES 密钥。
这相当于对全世界宣布:DES 完了。
到 1999 年,EFF 和 distributed.net 合作,把时间缩短到了 22 小时 15 分钟。2006 年,德国两所大学用 COPACOBANA——一台 1 万美元的 FPGA 设备——再次做到了不到 9 天暴力破解 DES。从国家安全级别到被业余爱好者用低成本攻破,DES 的 56 位密钥就像一道把城堡大门锁了却忘了关窗户的防御。
3DES:垂死挣扎还是体面退休?
DES 被攻破、但 AES 还没出来之前(1997-2001 年),业界需要一个过渡方案。3DES(Triple DES)就是这个过渡方案。原理粗暴得不像密码学——把 DES 跑三遍:
密文 = E(K3, D(K2, E(K1, 明文)))
注意中间是解密操作——这是故意这么设计的。如果三个密钥都一样(K1=K2=K3),3DES 就退化为普通 DES,保证了向后兼容。三把不同的密钥让有效密钥长度达到 168 位,当时被认为是足够安全的。
不过话说回来,3DES 有一个尴尬的问题:64 位的分组太小了。加密大量数据时,每 32GB 的数据就存在密文块碰撞的风险(生日攻击)。再加上跑三遍 DES 性能本来就慢,AES 出来后 3DES 的使用量迅速下降。NIST 在 2023 年正式宣布 3DES 退役。
我在银行系统里还见过 DES 的遗留代码。有一家银行的内部报文系统,2005 年上线时用的就是 DES,后来升级到 3DES,再后来负责人换了三拨,大家都说”用着没出过问题就别动”。直到有一次安全审计查出风险,才痛下决心切到 AES。类似的故事在通信、嵌入式设备和早期互联网协议里也比比皆是——DES 的代码像幽灵一样飘了几十年。
实际应用场景
1. 银行业遗留系统
很长一段时间里,银行卡 PIN 码的加密传输用的就是 DES。EMV 芯片卡标准和 ATM 网络协议早期都基于 DES 或 3DES。不少银行的 HSM(硬件安全模块)至今还在同时支持 DES 和 3DES,主要就是给老系统兼容用的。
2. 通信协议
早期的 SSL/TLS(2.0 和 3.0 版本)、IPsec、Kerberos 认证协议都支持 DES 作为可选加密算法。现代版本早已把 DES 标记为不安全并移除了支持,但如果你去翻一些古董 VPN 设备的配置页面,可能还能看到 DES 的选项——说实话,看到了也别选。
3. 教育和研究
DES 是目前密码学教学中最适合入门的对称加密算法。它的结构足够简单、同时包含了分组密码的所有核心概念(Feistel 网络、S-Box、密钥编排、扩散和混淆),理解了 DES 再去看 AES,门槛会低很多。我们工具保留 DES 主要是出于这个目的——让你亲手试一下历史上最重要的加密算法是怎么运作的。
常见误区
误区一:DES 是过时了,但 3DES 还很安全
3DES 的安全性比 DES 强,但远不如 AES。核心问题不在密钥长度,在分组大小。3DES 的分组还是 64 位,这意味着只要加密约 32GB 的数据,密文内部就存在碰撞风险。还有一个叫 Sweet32 的攻击专门针对 64 位分组密码的长期会话。2023 年 NIST 已经让 3DES 退役了,新系统不该再用它。
误区二:56 位不够是因为摩尔定律
表面上看是。但实际上 56 位在 1977 年就有人质疑过——斯坦福大学的 Diffie 和 Hellman(就是发明 Diffie-Hellman 密钥交换那两位)在 DES 发布后马上就论证了,用 1977 年的技术花 2000 万美元可以造出一天破解 DES 的机器。当时 NBS 的回应是”等到能造出那种机器的时候,DES 的周期也该到 15 年了”。他们说到做到——DES 坚持了约 15 年左右,但密码学的更替远比他们预想的要慢。
误区三:DES 被破只是因为暴力搜索
其实 DES 还遭受过多种密码分析攻击。差分密码分析和线性密码分析虽然没能实际完全攻破 DES,但它们大幅降低了所需的搜索空间——从 2^56 降到 2^43 左右(线性分析)。只是暴力搜索的成本降得更快,最后是用钱砸死的。这给我一个启发:算法被攻破往往不是一种攻击方法多么精巧,而是多个攻击方法叠加的效果。
DES vs AES vs 3DES
| DES | 3DES | AES-128 | |
|---|---|---|---|
| 分组大小 | 64 位 | 64 位 | 128 位 |
| 密钥长度 | 56 位 | 168 位(三密钥) | 128 位 |
| 轮数 | 16 | 48(16×3) | 10 |
| 结构 | Feistel 网络 | 三层 Feistel | SPN 结构 |
| 安全状态 | 不安全 | 弱(分组太小) | 安全 |
| 硬件效率 | 低 | 很低 | 高(AES-NI) |
| 适用场景 | 仅教育用途 | 旧系统过渡 | 当前工业标准 |
如果把 DES 比作一张手写门锁,3DES 就是把三张手写门锁串联起来,AES 则是直接换了扇防盗门。
常见问题
Q: DES 和 3DES 现在还能用吗?
生产环境不要用。NIST 已经在 2018-2023 年间逐步撤销了对 DES 和 3DES 的标准化支持。如果维护的旧系统还依赖 DES,尽早规划迁移到 AES,别等到被审计出来再去补。
Q: DES 的 8 位校验位是干什么的?
DES 的 64 位”密钥”里,每 8 位的最后一位是校验位——它是前面 7 位的奇偶校验值(保证每个字节里 1 的个数是奇数)。这是 1970 年代数据传输不可靠的产物,放在今天的网络环境下基本没什么用了。
Q: 为什么 Feistel 网络解密和加密是一样的?
因为 XOR 操作的对称性。加密时 R 和 F 的结果 XOR,解密时把相同的 F 结果再 XOR 一次就还原了。数学上就是 (A XOR B) XOR B = A。这个性质让 Feistel 结构的加解密可以复用同一套硬件,这也是它当年被广泛采用的原因之一。
Q: DES 被暴力破解大概需要多少成本?
用 2006 年的 COPACOBANA(成本约 1 万美元)不到 9 天就能破解。放到 2026 年的今天,随便一台高端 GPU 服务器配几块显卡,跑一套优化过的密钥搜索程序,几个小时就能搞定。如果上云按需租计算实例,几百美元预算绰绰有余。
Q: 既然 DES 不安全了,为什么要学它?
因为 DES 是密码学的”活化石”。理解了 Feistel 网络、S-Box 替换、密钥编排这些 DES 中的概念,再看现在的哈希算法(SHA-2 也用了类似思路)对称加密(AES 的 SPN 是对 Feistel 的演进)就会轻松很多。更何况,你万一要维护一个 2000 年的 COBOL 银行系统呢?懂 DES 至少能读懂那些代码在干什么。