2. 加密基础:对称加密(AES)与非对称加密(RSA)原理对比

加密这东西,说白了就是「藏」字诀。小时候我们把日记本锁进抽屉,钥匙自己保管——这就是对称加密。后来你给朋友寄信,用他的公开锁头锁上,他自己用私钥打开——这就是非对称加密。

我个人习惯把这两种加密方式想成「快递柜」和「邮政信箱」。你想想看,快递柜放件取件都用同一个密码,效率高但密码泄漏就完蛋;邮政信箱呢,谁都能往里塞信(公钥),但只有信箱主人能打开(私钥),安全但慢。

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

对称加密,核心就一个概念:加密和解密用同一把密钥。你在家写日记,锁上抽屉,晚上回来自己打开——钥匙没换过手。

AES(Advanced Encryption Standard)是现在最主流的对称加密算法。我记得早年接手一个金融数据同步项目,客户要求所有传输的字段都得加密。我的第一反应就是:「AES-256 走起」。为什么?因为它快、稳、经过全球密码学家锤了二十多年,还没被攻破。

AES 核心参数
- 分组长度:128 位(16 字节)
- 密钥长度:128 / 192 / 256 位
- 轮数:10 / 12 / 14 轮(根据密钥长度决定)
- 模式:ECB(不推荐)、CBC(常用)、GCM(推荐,带认证)

模式这块我得单独说一下。我在项目中见过不少同学直接用 ECB 模式,加密同样的明文块出来同样的密文块,攻击者一看就能猜到规律,比如你的身份证号前六位可能是重复的。建议至少用 CBC,最好用 GCM——GCM 自带认证标签,能防篡改。

AES 加密示例(Python)

from Crypto.Cipher import AES
import base64

key = b'This is a key123'  # 16字节 = AES-128
cipher = AES.new(key, AES.MODE_GCM)
plaintext = b'hello, this is a sensitive field'
ciphertext, tag = cipher.encrypt_and_digest(plaintext)

# 存储:nonce + ciphertext + tag
packet = base64.b64encode(cipher.nonce + ciphertext + tag)
print(packet)

代码看起来简单,但实际项目里要操心的事很多。密钥存哪?nonce 怎么生成?tag 过期了要不要换?我曾经在做一个日志加密工具时,把 nonce 写成了固定值,结果密文分析人员只用了半小时就猜出了加密模式。嗯,从那以后我再也不省 nonce 的随机性了。

2.2 非对称加密:一个公开锁,一把私钥

非对称加密的思路很巧妙。你有一个公开的锁(公钥),谁都可以用它锁上消息;但只有你有私钥能打开。这样密钥不用提前约定,非常适合网络传输。

RSA 是典型代表,依赖大整数分解难题。说白了,两个大质数相乘很容易,但从乘积反推质数极难。

RSA 密钥生成步骤
1. 选择两个大质数 p、q
2. 计算 n = p × q
3. 计算 φ(n) = (p-1)(q-1)
4. 选择 e(通常用 65537)
5. 计算 d ≡ e⁻¹ mod φ(n)
公钥:(e, n),私钥:(d, n)

我建议你在实际项目中直接用 OpenSSL 生成密钥对。自己写素数生成?千万别。我在安全审计时见过一个团队自己写 RSA 密钥生成,结果 p 和 q 太接近,用费马分解法几分钟就破掉了。

RSA 加密示例(Python)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

key = RSA.generate(2048)
public_key = key.publickey()

cipher = PKCS1_OAEP.new(public_key)
plaintext = b'small sensitive field'
ciphertext = cipher.encrypt(plaintext)

# 解密
cipher_dec = PKCS1_OAEP.new(key)
decrypted = cipher_dec.decrypt(ciphertext)
注意
RSA 有长度限制。2048 位 RSA 一次加密最多 190 字节(2048/8 - 2*32 - 50 ≈ 190)。别拿 RSA 去加密整个 JSON 包,否则你会碰到奇怪的「解密失败」错误。

2.3 核心区别对比

对比维度AES(对称)RSA(非对称)
密钥数量1 个,共享密钥2 个,公钥+私钥
加解密速度极快(硬件加速可达 GB/s)慢(通常 ≤2 MB/s)
密钥长度128 / 256 位2048 / 4096 位
安全性基础混淆+扩散的数学换位大整数分解的数学难题
典型场景大量数据加密(字段、文件、传输流)密钥交换、数字签名、少量数据加密
密钥分发难度高(需安全通道)低(公钥公开即可)

2.4 实际中的混合使用

现实项目里很少只用一个加密方案。我参与的一个支付字段加密项目是这样设计的:

  1. 客户端生成一个临时 AES 密钥(128 位随机数)
  2. 用服务端 RSA 公钥加密这个 AES 密钥
  3. 每个字段用 AES-GCM 加密,每次附带随机 nonce
  4. 把加密后的 AES 密钥 + nonce + 密文一起发给服务端
  5. 服务端用 RSA 私钥解密出 AES 密钥,再用 AES 密钥解密字段

这就是 RSA 加密 AES 密钥,AES 加密数据的经典混合模式。RSA 处理小数据(密钥)很合适,AES 处理大数据(字段)很高效。这招我用了很多次,稳定又灵活。

2.5 选择建议

  • 纯字段级加密:优先 AES-GCM,128 位密钥强度足够,配合每次随机 nonce
  • 需要密钥协商:用 RSA-2048 或 ECDH(椭圆曲线 Diffie-Hellman,更高效)
  • 敏感数据存储:AES-256-GCM + 定期轮换密钥
  • 数字签名验证:RSA PKCS#1 v1.5 或 PSS(推荐 PSS)
我的常用组合
字段加密:AES-128-GCM + 24 字节随机 nonce(抗重放攻击)
密钥交换:RSA-OAEP(非对称加密密钥本身)
完整校验:HMAC-SHA256(字段最终一致性检查)

你想想看,如果把加密方案选错了,后面改起来非常痛苦。我见过一个项目用 RSA 加密每个字段,结果是每次请求光加密就花了 200 毫秒,用户反馈「你们系统是不是卡了」。换成一个混合方案,降到 5 毫秒,体验瞬间正常。

对称 vs 非对称加密核心流程对比 对称加密(AES) 明文 同一密钥 密文 还原明文 非对称加密(RSA) 明文 公钥 密文 还原明文 关键对比: AES:加密/解密用同一密钥。速度极快(硬件加速)。密钥需安全配送。 RSA:公钥加密、私钥解密。密钥可公开。速度慢。适合小数据。 混合方案:RSA 加密 AES 密钥 → AES 加密全部字段。兼顾速度与密钥分发。 选择建议:大量字段选 AES-GCM;密钥交换/签名选 RSA-2048+;需要抗量子攻击提前关注。

最后我说个实在的。不会有人直接拿 RSA 加密大 JSON,也不会有人用纯对称加密做跨公网密钥交换。理解两者的差异,你就能像搭积木一样组合它们。AES 负责快,RSA 负责安全地传递钥匙。懂了这些,字段级加密才算真正入门。