第2章:对称加密与公钥加密算法——DES、AES、RSA、ECC
加密算法分两大类:对称加密和公钥加密。两者原理不同,应用场景也差别很大。我刚开始做密码改造时,也搞混过——明明能用对称加密的地方,有人非要用RSA,结果性能崩了。咱们今天就把它们掰开揉碎讲清楚。
2.1 对称加密:一把钥匙开门
对称加密的特点是:加密和解密用同一把密钥。你想想看,发送方和接收方必须先协商好这把钥匙,才能通信。速度快,适合大量数据加密。
2.1.1 DES — 老古董,别用了
DES(Data Encryption Standard)诞生于1970年代,密钥长度56位。当年觉得够安全,现在呢?一台普通PC用暴力破解,几天就能搞定。我曾在审计某旧系统时发现还在用DES加密数据库备份……嗯,当场标记为高风险。
- 优点:硬件实现简单(早期专用芯片)
- 缺点:密钥太短,易被暴力破解
- 现状:已废弃,不允许用于新系统
2.1.2 3DES — 打补丁的过渡方案
3DES就是拿DES做三次加密,密钥长度提升到112或168位。说实话,它只是把老棺材刷了层漆。我2018年在某金融系统迁移中见过3DES,性能比AES差好几倍,而且分组大小还是64位,容易受块密码攻击。现在也不推荐了。
| 指标 | DES | 3DES | AES |
|---|---|---|---|
| 密钥长度 | 56 bit | 112/168 bit | 128/192/256 bit |
| 分组大小 | 64 bit | 64 bit | 128 bit |
| 性能 | 慢 | 极慢(三次迭代) | 快(硬件加速) |
| 安全强度 | 脆弱 | 中等(有密钥降级风险) | 高 |
| 推荐等级 | 禁止 | 不再推荐 | 首选 |
2.1.3 AES — 现在的王者
AES(Advanced Encryption Standard)是2001年正式成为标准的,密钥支持128、192、256位,分组128位。它用了一个叫SPN结构(替代-置换网络)的东西,轮数根据密钥长度不同:10轮(128位)、12轮(192位)、14轮(256位)。
我个人习惯在项目中至少使用AES-256-GCM,既能加密又能提供认证(防止篡改)。你如果还在用AES-128-CBC,我建议尽早换成GCM模式,能省去单独算MAC的麻烦。
AES加密(plaintext, key):
状态 = plaintext XOR roundKey[0]
for round = 1 to Nr-1:
SubBytes(状态)
ShiftRows(状态)
MixColumns(状态)
AddRoundKey(状态, roundKey[round])
SubBytes(状态)
ShiftRows(状态)
AddRoundKey(状态, roundKey[Nr])
输出 状态 作为密文
2.2 公钥加密:两把钥匙成双
公钥加密使用一对密钥:公钥公开给别人用,私钥自己保管。算法速度慢,适合加密小数据或用于密钥交换、数字签名。
2.2.1 RSA — 大数分解的老将
RSA的安全性基于大整数分解的困难性。密钥长度至少2048位(我现在都建议用4096位)。加密时把消息m变成c = m^e mod n,解密时m = c^d mod n。
我记得有一次做密码改造审计,发现某系统用RSA-1024加密用户口令的传输通道。说实话,1024位的RSA在2010年后就不安全了。我标记了“高危”,后来他们升级到了4096位。
- 适用场景:数字证书(CA签名)、密钥交换(比如混合加密中传递对称密钥)、少量数据加密
- 缺点:慢,密钥长度大(2048位以上),加密数据长度受限制
2.2.2 ECC — 更高效率的替代者
ECC(椭圆曲线密码)基于椭圆曲线离散对数难题,在同等安全强度下密钥短得多。256位的ECC就能比肩3072位的RSA。效率高,成为移动设备和区块链的首选。
我在给某物联网项目做密码改造时,设备性能有限,果断选了ECC P-256曲线做签名和密钥交换。性能跑起来比RSA-2048快了不止一个数量级。
| 安全等级 | RSA密钥长度 | ECC密钥长度 |
|---|---|---|
| 80位 | 1024 bit | 160 bit |
| 112位 | 2048 bit | 224 bit |
| 128位 | 3072 bit | 256 bit |
| 256位 | 15360 bit | 521 bit |
2.3 对称 vs 非对称:一张图看清
下面这张图表是我自己整理的,把两类加密的核心流程放在一起对比。左边是对称加密(用同一把钥匙),右边是非对称加密(公钥加密,私钥解密)。
2.4 实战选型建议
说了这么多算法,到底选哪个?我一般遵循这几个原则:
- 数据量大、性能敏感:用对称加密(AES-256-GCM)。比如文件加密、数据库加密、通信内容加密。
- 密钥分发、数字签名:用公钥加密(ECC P-256或RSA-4096)。比如SSL/TLS握手、代码签名、数字证书。
- 混合加密:最常用。先用ECC交换一个临时对称密钥,再用AES加密实际数据。HTTPS就是这么干的。