对称加密基础:AES与DES简介

对称加密是密码学里最经典的“老伙计”。加密和解密用同一把密钥,简单直接。我入行那会儿最先接触的就是DES,后来才慢慢啃透AES。这一章我们就把这两位“元老”拉出来好好聊一聊。

为什么需要对称加密?

举个真实场景。你要给同事传一份本地数据库的备份文件,不能明文传吧?但用非对称加密,RSA加解密巨慢,文件一大就卡死。这时候对称加密就派上用场了:快,简单,适合批量数据。

我的习惯: 文件传输、磁盘加密、Web应用的会话加密,核心都用对称算法。非对称只用来交换对称密钥。

DES:老将的辉煌与退场

DES的核心参数

  • 密钥长度:56位(实际64位,其中8位校验)
  • 分组大小:64位
  • 轮数:16轮Feistel网络
  • 设计者:IBM,1975年发布

DES在70年代是军用级标准。我2014年维护过一个旧系统,里面的POS终端用的还是DES-CBC。后来安全扫描直接报严重漏洞,我才被迫升级。

注意: DES的56位密钥现在用专用硬件几小时就能暴力破解。任何生产环境都不该再用DES,包括它的小改版3DES。

DES的弱点在哪?

  1. 密钥太短:56位面对现代算力如同虚设。
  2. 分组太小:64位分组容易出现生日攻击下碰撞问题(当加密数据量大于2^32个分组时)。
  3. 互补性:DES存在互补对称性质,可降低一半破解搜索空间。

我曾看过一个金融项目,他们用3DES做加密。3DES本质是三次DES串联,密钥长度到112或168位,安全度提升但性能只有DES的三分之一。在今天看来,依然不够理想。

AES:现代加密的基石

AES是2001年NIST选定的新标准。我记得当年学校里老师兴奋地说:“这是比利时的两位密码学家设计的Rijndael算法……” 它的设计思路和DES完全不同,安全性、性能都上了一个台阶。

AES的核心参数

密钥长度 轮数 分组大小
128位 10轮 128位
192位 12轮 128位
256位 14轮 128位

注意,AES分组固定128位(16字节),但密钥长度可选。这也是很多初学者容易搞混的:AES-256指的是密钥256位,不是分组变大。

AES为什么比DES强?

  • 安全裕度大: 128位密钥暴力破解需要2^128次计算,远超现有物理极限。
  • 硬件友好: AES使用查表、列混淆等操作,现代CPU甚至有AES-NI指令集加速。我测试过,Intel i5上AES-128-CBC加密1GB数据只需不到1秒,而3DES需要7秒。
  • 无互补性: AES的S-box和密钥扩展精心设计,差分/线性攻击漏洞很小。
实用建议: 对绝大多数场景,AES-128就足够安全。只有面对量子威胁预研或极高安全需求才考虑AES-256(多6轮,性能下降约20%-30%)。

加密模式的选择(简单带过)

DES和AES都是分组密码,需要配合工作模式处理任意长度数据。常见的模式有ECB、CBC、CTR、GCM等。我个人强烈反对ECB,因为它相同的明文分组会生成相同的密文分组,暴露数据模式。我在项目里吃过亏——一个气象传感器报文用了ECB,结果密文每隔16个字节就重复,一眼看出数据的周期规律。

一般来讲,推荐GCM模式(Authenticated Encryption),同时提供加密和完整性校验。或者CBC模式,但需要单独加HMAC防篡改。

SVG:对称加密流程对比

下面这张图直观对比DES和AES的处理流程差异。

DES与AES加解密流程对比 DES 分组 64位 16轮 Feistel 网络 密钥 56位 密文 64位 ⚠ 现代已不安全 AES 分组 128位 10/12/14 轮 (SubBytes, ShiftRows, MixColumns, AddRoundKey) 密钥 128/192/256位 密文 128位 ✅ 行业标准,推荐使用 安全级别差距巨大

性能权衡:数据说话

我整理了一个小测试,在我笔记本(Intel i7-1165G7)上用Python的cryptography库,加密1MB随机数据,重复100次取平均值。

算法 加密耗时 (ms) 解密耗时 (ms) 相对速度
AES-128-CBC 2.1 2.3 基准
AES-256-CBC 2.8 3.0 慢约30%
3DES (168位) 15.4 15.9 慢约7倍
DES (56位) 5.0 5.2 慢约2.4倍
注意: 实际生产中,AES-NI指令集能让AES速度快到接近内存复制速度。而DES缺乏硬件优化,性能差距更大。

避坑指南

  • 密钥长度选128位够用: 很多安全标准强制AES-256,但128位在可预期未来都安全,且性能更好。
  • 不要自己实现算法: 我见过有人手写DES做数据脱敏,结果因为Endianness搞反,上线后密文无法解密。直接用经过审计的库(OpenSSL, crypto.cipher等)。
  • 初始化向量(IV)必须随机: 尤其是CBC模式,IV固定会导致相同明文产生相同密文首块,泄露模式。
  • ECB模式是魔鬼: 曾经有个开源项目,因为嫌CB C麻烦,用ECB加密用户头像,结果每个头像都有规律的水印状条纹。

小结