对称加密算法:DES、3DES、AES

对称加密,说白了就是加密和解密用同一把钥匙。你想想看,这就像你家的门锁,用一把钥匙锁门,也用同一把钥匙开门。简单、高效,但密钥分发是个大麻烦。这一章我们把三个经典算法拆开揉碎——DES、3DES、AES,看看它们到底怎么工作的。

DES——曾经的主角

DES(Data Encryption Standard)是1977年由IBM提出、美国国家标准局采用的对称加密算法。我刚开始做安全那会儿,DES还是业界默认选项。后来慢慢发现它老了,跑不动了。

核心参数一览

  • 分组长度:64 位(8 字节)
  • 密钥长度:56 位有效 + 8 位校验 = 64 位
  • 轮数:16 轮
  • 算法结构:Feistel 网络

为什么密钥只有56位?因为每8位中有一位是奇偶校验位,真正决定加密强度的只有56位。你知道吗,56位密钥的暴力破解在1998年就被专用机在56小时内完成了。所以现在谁要是还在用单纯DES,我建议你赶紧换。

DES的结构很有意思——Feistel网络。简单来讲,每轮把数据分成左右两半,右半部分经过轮函数处理后和左半部分异或,然后左右互换。这样加解密流程完全一样,只是轮密钥顺序相反。我在项目中遇到过有人试图自己实现DES做协议加密,结果因为字节序不对,两边解不出来。折腾了一下午,最后发现是个小端序问题。

3DES——过渡期的叠加

既然DES弱了,那就多做几遍。3DES(Triple DES)就是用DES把数据加密三次,但中间可以解密一次,形成“加密-解密-加密”模式(EDE)。为什么不全部用加密?嗯,这是为了兼容老系统——如果三个密钥相同,3DES退化成普通DES。

模式 密钥总长度 有效长度 安全性
3DES-EDE1 128 位(2 个密钥) 112 位 中等
3DES-EDE2 192 位(3 个密钥) 168 位 较高

我曾经帮银行系统做密码改造,他们老核心还是3DES。我建议他们趁早换AES,因为3DES慢啊——一次DES就要16轮,三次就是48轮,再加上密钥调度,吞吐量比AES慢一个数量级。而且3DES的分组依然是64位,容易受生日攻击影响。所以只是临时过渡方案。

⚠️ 避坑指南

我曾经看到一个项目在3DES的ECB模式下处理图片数据,结果加密后每块重复内容一模一样,在图上留下明显的轮廓。千万别用ECB模式做结构化数据加密,这是血泪教训。

AES——当今的王者

AES(Advanced Encryption Standard)是2001年正式成为标准的,取代DES和3DES。它的设计者Rijmen和Daemen采用了完全不同的结构——不是Feistel网络,而是SPN(Substitution-Permutation Network)。

AES核心参数

  • 分组长度:固定 128 位(16 字节)
  • 密钥长度:128 / 192 / 256 位三种选择
  • 轮数:10 / 12 / 14(对应三种密钥长度)
  • 算法结构:SPN(字节代换、行移位、列混合、轮密钥加)
  • 设计目标:高速、抗差分攻击、抗线性攻击

AES的加密过程就像在做一个多轮混合蛋糕——先把状态矩阵做字节代换(S盒),再对每一行做循环移位,再对每一列做混合运算,最后加上这一轮的密钥。每一轮都让明文的每一位和密钥的每一位充分扩散。我个人习惯用AES-256-GCM做新项目的首选,既安全又附带认证。

你看看下面这张流程图,就能直观感受DES和AES的结构差异。

对称加密算法结构对比:DES vs AES DES (Feistel网络) 左半 L0 右半 R0 轮函数 F K1 异或 ⊕ 交换 L1 重复 16 轮 加解密结构相同 AES (SPN网络) AddRoundKey (轮密钥加) SubBytes (字节代换) ShiftRows (行移位) MixColumns (列混合) 第n轮:跳过 MixColumns 密钥扩展:每轮密钥不同 DES:16轮Feistel 左右半部独立处理 AES:10-14轮SPN 整个状态矩阵一起处理

💡 选型建议

我个人习惯按这个优先级选:AES-256 > AES-192 > AES-128 > 3DES > DES。如果硬件支持AES-NI指令集,AES的吞吐量可以跑到几Gbps,完全不用担心性能。如果兼容老系统必须用3DES,至少保证两个密钥不同。

密钥长度的实际含义

密钥长度决定暴力破解的搜索空间。56位密钥有256种可能,128位是2128,256位是2256。这数字有多大?256约等于7200万个亿,看起来很大,但专用芯片每秒能试万亿次。2128就完全不可行了——全宇宙的原子数量才280左右。

但别以为选长密钥就万事大吉。我在项目里见过有人把AES-256用ECB模式加密固定格式的数据,结果同样的明文块产生同样的密文块,攻击者一看就知道内容重复了。密钥再长,模式不对照样出问题。

算法 密钥长度 分组长度 轮数 推荐状态
DES 56 位 64 位 16 已废弃
3DES-EDE2 112 位 64 位 48 过渡期使用
3DES-EDE3 168 位 64 位 48 过渡期使用
AES-128 128 位 128 位 10 推荐(一般场景)
AES-192 192 位 128 位 12 推荐
AES-256 256 位 128 位 14 强烈推荐(高安全场景)

结构差异的具体影响

DES的Feistel结构有个好处:硬件实现占面积小,而且加解密电路可以复用。但缺点是每轮只改变一半的数据位,扩散速度慢。AES的SPN结构每一轮都影响到全部128位,所以安全强度在相同轮数下更高。这也是为什么AES-128只用10轮就比DES-16轮安全得多。

我之前做过一个性能测试:同样在软件环境下加密1MB数据,3DES-EDE3耗时约120ms,AES-128只用了不到1ms。差了上百倍。你想想看,如果是一个高速传输系统,用3DES会直接把网络卡死。

⚠️ 常见陷阱

  • 不要以为填充方式不重要。DES缺省PKCS7填充——如果数据对齐,会额外补满一个整块。我曾经把填充方式搞错,导致两个系统的数据互解失败。
  • 3DES的密钥可以全部相同?是,但那就变DES了,等于没升级。
  • AES的S盒是精心设计的,有些教材会附上完整的S盒表。自己做安全实现时直接查表就好,不要试图修改S盒——这是找漏洞。

这些关键词你会经常见到

  • Feistel网络:每轮拆两半,右半进函数,结果与左半异或,然后交换。加解密对称。
  • SPN网络:整个数据矩阵同时做替换和置换,每一轮都扩散所有位。
  • 轮密钥:由主密钥通过密钥扩展算法生成,每轮使用不同的子密钥。
  • S盒:非线性替换表,提供混淆效果。AES的S盒具有代数安全性。
  • ECB / CBC / GCM:分组密码的工作模式。ECB不安全,CBC需要IV,GCM带认证。

这一章我们拆了三个对称加密算法的内部结构。DES老但开阔思路,3DES笨但兼容,AES快又安全。你写代码的时候,直接拿OpenSSL或cryptography库里的AES实现就行,不用自己手写轮函数。但搞懂内部原理,对选模式、调参数、排故障都大有帮助。