对称加密与非对称加密:AES、RSA、ECC 算法原理与适用场景
加密这玩意儿,说白了就两大流派:对称加密和非对称加密。我刚开始接触密码学时觉得对称加密简单粗暴,非对称加密花里胡哨,后来踩的坑多了才知道——各有各的脾气,用对地方才叫本事。
这一章我们就把 AES、RSA、ECC 这三个主流算法拆开揉碎,看看它们到底怎么工作,适合干什么,不适合干什么。嗯,先上一张总览图,帮你建立整体印象。
1. 对称加密:AES 算法
AES(Advanced Encryption Standard)是当今最常用的对称加密算法。为什么大家都在用?因为够快、够安全。我做过一个数据库字段加密的项目,当时选型对比了好几个算法,最后全栈都统一用了 AES-256-GCM——原因后面会讲。
原理简述
AES 对数据进行分组加密,每组 128 位(16 字节)。密钥长度支持 128、192、256 位。说白了就是“替换 + 置换”反复多轮,把明文打散成完全随机分布的密文。256 位版本在可预见的未来都很难被暴力破解。
适用场景
- 数据库字段加密:单机或分布式系统内,密钥可安全存储在 KMS 或 HSM 中。
- 文件批量加密:比如备份文件、日志归档。
- 通信链路对称加密:TLS 握手完成后,数据传输阶段其实用的是对称加密(如 AES-GCM)。
2. 非对称加密:RSA 与 ECC
非对称加密有公私钥对,公钥公开,私钥保密。这样的好处是不用提前共享密钥。但是,性能比对称加密慢几个数量级。所以实际系统里它主要用来“分发对称密钥”或做数字签名。
RSA(Rivest-Shamir-Adleman)
RSA 基于大整数分解的数学难题。给你公钥(n, e),想推出私钥 d 需要分解 n 的质因数——n 越大越安全。目前推荐 RSA-2048 起步,4096 更稳妥。
痛点:密钥越长,加解密越慢。2048 位的 RSA 每秒只能做几百次签名,而同样安全强度的 ECC 可以快一个数量级。
ECC(Elliptic Curve Cryptography)
ECC 基于椭圆曲线上的点运算。256 位的 ECC 密钥等价于 3072 位 RSA 的安全性。这就是为什么现在 TLS 1.3 默认推荐 ECDHE 密钥交换。
我在项目中维护过一个老旧支付系统,RSA 2048 签名导致高并发时 CPU 爆表。换 ECDSA 后,签名延迟从 8ms 降到 1ms 左右,效果立竿见影。
经典对比表
| 特性 | AES (对称) | RSA (非对称) | ECC (非对称) |
|---|---|---|---|
| 密钥长度推荐 | 256 位 | 2048 / 4096 位 | 256 位 (secp256r1) |
| 加密速度 | 极快 (GB/s 级) | 慢 (MB/s 级) | 中等 (MB/s 级) |
| 典型用途 | 数据加密、批量加密 | 密钥交换、数字签名 | 密钥交换、签名(更轻量) |
| 抗量子计算 | 尚可 (增大密钥即可) | 脆弱 | 脆弱 |
| 数学基础 | 置换 + 替换网络 | 大整数分解 | 椭圆曲线离散对数 |
3. 混合加密:TLS 中的实际做法
你想想看,如果 TLS 全程用非对称加密传输数据,性能根本撑不住。实际上 TLS 工作方式是:
- 握手阶段用非对称加密(ECDHE 或 RSA)交换一个临时对称密钥(会话密钥)。
- 后续数据用 AES-GCM 对称加密传输。
这就是典型的混合加密。我经常被新人问:「为什么握手之后不继续用公钥加密?」——因为对称加密快啊,而且每次会话的密钥都是新的,安全性也能保证。
4. 避坑指南 & 选型决策树
下面这几条是我在实际项目里摔过跟头之后总结的,希望对你有帮助。
- 不要自己实现加密算法。使用成熟的库,比如 OpenSSL、BoringSSL、libsodium。我曾经见过有人手动实现 AES,结果 S 盒写错一位,整个系统加密后无法解密,惨痛教训。
- 密钥管理比算法本身更重要。再强的算法,密钥硬编码在代码里也是白给。建议使用 KMS 或 HSM 密钥。
- ECDHE 比 RSA 密钥交换更适合现代 TLS。因为 ECDHE 支持前向安全,即使长期私钥泄露,历史会话也不会被解密。
- 不要迷信“最强算法”。比如有些场景用 AES-128 就够了,性能还比 AES-256 好 10% 左右。安全强度足够即可,没必要无脑上 256。
核心原则:对称加密用来加密数据,非对称加密用来分发密钥或签名。把两者组合好,就是大部分安全系统的基石。