2. 密码学基础:对称加密(AES)、非对称加密(RSA/ECC)原理简介
做密钥管理,密码算法是地基。我每次接到新项目,第一件事就是确认用什么算法——选错了后面全白干。这一章不搞太多数学公式,咱们把 AES、RSA、ECC 这几个常用家伙的脾气摸透。
2.1 对称加密与 AES
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,家里大门一个钥匙开锁关锁,简单高效。但问题在于:这把钥匙怎么安全地交给对方?
目前工业界最常用的对称算法就是 AES(Advanced Encryption Standard)。我记得 2010 年左右很多系统还在用 DES,后来 NIST 一推动,AES 就成标配了。AES 有三种密钥长度:128、192、256 位。我个人的习惯是:非极高密级场景用 AES-128 就够了,性能好;涉及金融或长期数据保护,直接上 AES-256。
AES 的工作模式也很关键。ECB 模式是个坑,我曾经见过有人把图片用 ECB 加密,结果轮廓还能看出来——因为相同明文块会输出相同密文块。所以千万别用 ECB。CBC 模式以前很常见,但现在已经慢慢被 GCM 取代了。GCM 是认证加密模式,同时保证机密性和完整性,我现在几乎所有的对称加密场景都用 AES-256-GCM。
下面是一个使用 OpenSSL 命令行进行 AES-256-GCM 加密的示例(仅示意,生成环境慎用直接命令):
# 加密(需要指定 IV 和 AAD)
openssl enc -aes-256-gcm -K 0123456789abcdef0123456789abcdef \
-iv 0123456789abcdef -a -A -in plain.txt -out cipher.txt
# 解密
openssl enc -d -aes-256-gcm -K 0123456789abcdef0123456789abcdef \
-iv 0123456789abcdef -a -A -in cipher.txt -out decrypted.txt
2.2 非对称加密:RSA 与 ECC
非对称加密解决了对称加密的密钥分发问题——公钥公开,私钥自留。但代价是慢,特别慢。我在项目里只用它来做密钥交换和数字签名,从不拿它加密大文件。
RSA 是元老级算法,基于大整数分解的数学难题。安全强度取决于密钥长度。现在建议最少 2048 位,4096 位更稳妥。但 RSA 有个硬伤:密钥生成速度极慢,我曾经在嵌入式设备上用 4096 位 RSA 生成密钥对,等了十几秒才出来。所以物联网项目里我很少用 RSA。另外 RSA 的加密长度受限于模长,通常需要用混合加密(先用 RSA 加密对称密钥,再用对称密钥加密数据)。
ECC 是后起之秀,基于椭圆曲线离散对数难题。同样安全强度下,ECC 的密钥长度比 RSA 短得多。例如 256 位 ECC 密钥与 3072 位 RSA 安全性相当。我近几年几乎所有的数字签名方案都切到了 ECDSA 或 EdDSA。尤其移动端和 IoT 设备,ECC 的签名和计算速度优势非常明显。
RSA 和 ECC 对比见下表:
| 特性 | RSA | ECC |
|---|---|---|
| 数学基础 | 大整数分解 | 椭圆曲线离散对数 |
| 推荐密钥长度 | 2048~4096 位 | 256~521 位 |
| 加密速度 | 慢(特别是私钥操作) | 较快 |
| 密钥生成速度 | 慢 | 快 |
| 数字签名性能 | 签名慢,验签快 | 签名快,验签也快 |
| 移动/IoT 适用性 | 差(功耗高、密钥长) | 优秀 |
2.3 对称 vs 非对称选择策略
你可能会问:既然非对称这么方便,为什么不全用非对称?嗯,这里要注意一个核心差异——性能。对称加密比非对称快几千甚至上万倍。因此实际工程中基本都是混合使用:
- 用非对称加密(或密钥交换)建立安全的对称密钥通道。
- 然后用对称加密(AES-GCM)加密业务数据。
举个我做过的大型存储系统例子:客户端和服务端通过 ECDH 协商出 256 位共享密钥,再用 HKDF 派生出 AES 密钥和 IV。后续所有数据传输都用 AES-256-GCM。这样既解决了密钥分发问题,又保证了传输效率。
2.4 密钥长度与安全强度对比
不同算法达到相同安全强度所需的密钥长度差异很大。下面这张表是 NIST 推荐的等效安全强度:
| 安全强度(比特) | 对称密钥(AES) | RSA 模长 | ECC 密钥长度 |
|---|---|---|---|
| 80(已不够安全) | Skip | 1024 | 160 |
| 112 | 3DES(不推荐) | 2048 | 224 |
| 128(当前标准) | AES-128 | 3072 | 256 |
| 192 | AES-192 | 7680 | 384 |
| 256(高级保护) | AES-256 | 15360 | 512 |
我目前给客户做方案时,默认推荐 AES-256 配合 ECC P-256 或 X25519。既满足监管要求,性能也平衡。如果是合规需要特别指明 RSA,那就用 2048 位起步,但要做好密钥生成慢的心理准备。
上面这张图把对称加密、非对称加密以及混合用法的关系整理清楚了。你在实际设计时,可以把这个图谱作为思考框架,快速定位该用哪种算法组合。