对称加密基础:AES与DES简介
对称加密是密码学里最经典的“老伙计”。加密和解密用同一把密钥,简单直接。我入行那会儿最先接触的就是DES,后来才慢慢啃透AES。这一章我们就把这两位“元老”拉出来好好聊一聊。
为什么需要对称加密?
举个真实场景。你要给同事传一份本地数据库的备份文件,不能明文传吧?但用非对称加密,RSA加解密巨慢,文件一大就卡死。这时候对称加密就派上用场了:快,简单,适合批量数据。
DES:老将的辉煌与退场
DES的核心参数
- 密钥长度:56位(实际64位,其中8位校验)
- 分组大小:64位
- 轮数:16轮Feistel网络
- 设计者:IBM,1975年发布
DES在70年代是军用级标准。我2014年维护过一个旧系统,里面的POS终端用的还是DES-CBC。后来安全扫描直接报严重漏洞,我才被迫升级。
DES的弱点在哪?
- 密钥太短:56位面对现代算力如同虚设。
- 分组太小:64位分组容易出现生日攻击下碰撞问题(当加密数据量大于2^32个分组时)。
- 互补性: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和密钥扩展精心设计,差分/线性攻击漏洞很小。
加密模式的选择(简单带过)
DES和AES都是分组密码,需要配合工作模式处理任意长度数据。常见的模式有ECB、CBC、CTR、GCM等。我个人强烈反对ECB,因为它相同的明文分组会生成相同的密文分组,暴露数据模式。我在项目里吃过亏——一个气象传感器报文用了ECB,结果密文每隔16个字节就重复,一眼看出数据的周期规律。
一般来讲,推荐GCM模式(Authenticated Encryption),同时提供加密和完整性校验。或者CBC模式,但需要单独加HMAC防篡改。
SVG:对称加密流程对比
下面这张图直观对比DES和AES的处理流程差异。
性能权衡:数据说话
我整理了一个小测试,在我笔记本(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倍 |
避坑指南
- 密钥长度选128位够用: 很多安全标准强制AES-256,但128位在可预期未来都安全,且性能更好。
- 不要自己实现算法: 我见过有人手写DES做数据脱敏,结果因为Endianness搞反,上线后密文无法解密。直接用经过审计的库(OpenSSL, crypto.cipher等)。
- 初始化向量(IV)必须随机: 尤其是CBC模式,IV固定会导致相同明文产生相同密文首块,泄露模式。
- ECB模式是魔鬼: 曾经有个开源项目,因为嫌CB C麻烦,用ECB加密用户头像,结果每个头像都有规律的水印状条纹。