第2章:对称加密与公钥加密算法——DES、AES、RSA、ECC

加密算法分两大类:对称加密和公钥加密。两者原理不同,应用场景也差别很大。我刚开始做密码改造时,也搞混过——明明能用对称加密的地方,有人非要用RSA,结果性能崩了。咱们今天就把它们掰开揉碎讲清楚。

2.1 对称加密:一把钥匙开门

对称加密的特点是:加密和解密用同一把密钥。你想想看,发送方和接收方必须先协商好这把钥匙,才能通信。速度快,适合大量数据加密。

2.1.1 DES — 老古董,别用了

DES(Data Encryption Standard)诞生于1970年代,密钥长度56位。当年觉得够安全,现在呢?一台普通PC用暴力破解,几天就能搞定。我曾在审计某旧系统时发现还在用DES加密数据库备份……嗯,当场标记为高风险。

  • 优点:硬件实现简单(早期专用芯片)
  • 缺点:密钥太短,易被暴力破解
  • 现状:已废弃,不允许用于新系统
注意:DES的64位分组也有安全问题(生日攻击)。2025年的今天,任何新项目都不应再考虑DES。

2.1.2 3DES — 打补丁的过渡方案

3DES就是拿DES做三次加密,密钥长度提升到112或168位。说实话,它只是把老棺材刷了层漆。我2018年在某金融系统迁移中见过3DES,性能比AES差好几倍,而且分组大小还是64位,容易受块密码攻击。现在也不推荐了。

指标DES3DESAES
密钥长度56 bit112/168 bit128/192/256 bit
分组大小64 bit64 bit128 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])
    输出 状态 作为密文
经验:AES-GCM模式需要合适的nonce(12字节最好)。我曾见过有人重复使用nonce导致密钥泄露。记住:每个加密操作必须用不同的nonce!

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 bit160 bit
112位2048 bit224 bit
128位3072 bit256 bit
256位15360 bit521 bit
避坑:ECC的曲线选择很重要。不要自己造轮子,只用标准曲线:P-256(secp256r1)、P-384、Curve25519等。我之前见过有人用自定义曲线,结果安全强度大打折扣。

2.3 对称 vs 非对称:一张图看清

下面这张图表是我自己整理的,把两类加密的核心流程放在一起对比。左边是对称加密(用同一把钥匙),右边是非对称加密(公钥加密,私钥解密)。

对称加密 vs 非对称加密流程对比 明文(Plaintext) 加密(E) 密钥K 密文(Ciphertext) 解密(D) 密钥K 还原明文 同一把密钥K,加解密都用它 明文(Plaintext) 加密(E) 公钥 密文(Ciphertext) 解密(D) 私钥 还原明文 公钥加密,私钥解密,密钥不同 注意:非对称加密前会先查公钥,解密时必须持有对应的私钥。实际中常混合使用:非对称加密对称密钥,对称密钥加密数据。

2.4 实战选型建议

说了这么多算法,到底选哪个?我一般遵循这几个原则:

  1. 数据量大、性能敏感:用对称加密(AES-256-GCM)。比如文件加密、数据库加密、通信内容加密。
  2. 密钥分发、数字签名:用公钥加密(ECC P-256或RSA-4096)。比如SSL/TLS握手、代码签名、数字证书。
  3. 混合加密:最常用。先用ECC交换一个临时对称密钥,再用AES加密实际数据。HTTPS就是这么干的。
一句话总结:对称加密像快递柜(一把钥匙锁上开下),非对称加密像邮箱(谁都能投信,只有你有钥匙取)。密码改造工程中,大部分场景用AES-256-GCM就够了,需要身份验证或密钥协商时再上ECC或RSA。
关于国产密码算法:虽然本章没展开,但如果你在做等保三级以上的系统,务必考虑SM2/SM4等国家算法。SM4对标AES,SM2对标ECC。我在政企项目中都被要求必须替换为国密算法。