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。

经验点:你在做密钥管理方案时,如果对称加密要封装成 API,一定要暴露 IV(初始向量)的管理接口。我遇到过一个团队把 IV 写成固定值,等于没加密。

下面是一个使用 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 的签名和计算速度优势非常明显。

避坑指南:我曾经接手过一个项目,他们用 ECC 做密钥交换但没用 ECDH,而是自己用 ECC 公钥加密对称密钥。这么做既慢又不规范,后来全改成了 ECDH + HKDF。记住:非对称加密的正确用法是密钥协商或签名,不是直接加密数据。

RSA 和 ECC 对比见下表:

特性 RSA ECC
数学基础 大整数分解 椭圆曲线离散对数
推荐密钥长度 2048~4096 位 256~521 位
加密速度 慢(特别是私钥操作) 较快
密钥生成速度 慢 快
数字签名性能 签名慢,验签快 签名快,验签也快
移动/IoT 适用性 差(功耗高、密钥长) 优秀

2.3 对称 vs 非对称选择策略

你可能会问:既然非对称这么方便,为什么不全用非对称?嗯,这里要注意一个核心差异——性能。对称加密比非对称快几千甚至上万倍。因此实际工程中基本都是混合使用:

  • 用非对称加密(或密钥交换)建立安全的对称密钥通道。
  • 然后用对称加密(AES-GCM)加密业务数据。

举个我做过的大型存储系统例子:客户端和服务端通过 ECDH 协商出 256 位共享密钥,再用 HKDF 派生出 AES 密钥和 IV。后续所有数据传输都用 AES-256-GCM。这样既解决了密钥分发问题,又保证了传输效率。

提示:如果你需要后量子安全,可以考虑混合方案(ECDH + 传统密钥封装)。NIST 现在在推标准,但短期内这样做能兼容向后。

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 位起步,但要做好密钥生成慢的心理准备。

对称与非对称加密知识体系图 密码算法选型知识图谱 对称加密 (AES) AES-128 AES-256 GCM 认证加密 非对称加密 RSA 密钥交换/签名 ECC ECDH / ECDSA 混合加密:密钥协商 + AES 数据传输加密 数字签名 密钥分发 对称:加密快, 密钥分发难 非对称:安全, 但速度慢 实践中两者结合:混合加密

上面这张图把对称加密、非对称加密以及混合用法的关系整理清楚了。你在实际设计时,可以把这个图谱作为思考框架,快速定位该用哪种算法组合。