密码学基础:对称加密与非对称加密

说实话,密码学这玩意听着玄乎,但说白了就是「藏东西」和「找钥匙」的游戏。我在做审计日志系统时,最早踩的坑就是选错了加密方案——直接导致日志量暴涨,解密还慢得要死。今天就跟你好好聊聊这两种基础加密方式。

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

对称加密,意思就是加密和解密用同一把密钥。就像你用一把钥匙锁上日记本,再用同一把钥匙打开。常见的算法有 AES、DES、3DES、SM4。

核心特点

  • 速度快,适合大数据量加密
  • 密钥必须安全分发,这是最大的痛点
  • 算法公开,安全性完全依赖密钥保密

我在早期项目里就用过 AES-256 加密审计日志。当时觉得算法没问题,结果密钥没存好,差点把整盘数据弄丢。嗯,从那以后我再也不敢把密钥硬编码在配置文件里了。

代码示例:AES-CBC 加解密(Python)

下面是个简化版,用了 pycryptodome 库。实际生产环境记得用安全随机数生成 IV。

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os

key = os.urandom(32)          # 256位密钥
iv = os.urandom(16)           # 初始向量

cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = b"审计日志内容"
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

# 解密
dec_cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(dec_cipher.decrypt(ciphertext), AES.block_size)
print(decrypted.decode())

避坑指南

我曾经在生产环境里用过 ECB 模式,结果密文规律太明显,被安全团队直接打回。记住:ECB 模式对同一明文块会产生相同密文,不要在日志加密中使用。

非对称加密:公钥私钥成对出现

非对称加密,也叫公钥加密。它有一对密钥:公钥可以公开,私钥自己藏好。你用我的公钥加密数据,只有我能用私钥解开。常见的算法有 RSA、ECC、SM2。

你想想看,如果系统里有 1000 个节点,对称加密需要维护 1000×(999)/2 ≈ 50 万条密钥对。非对称加密只要每个节点生成一对密钥,公钥随便分发,管理成本低了一个数量级。

我的经验

在可搜索加密场景里,非对称加密主要用于密钥交换和数字签名。日志体量大时我会用它加密对称密钥,再用对称密钥加密日志正文。混合模式才是实战最优解。

代码示例:RSA 加解密(Python)

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

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

cipher_rsa = PKCS1_OAEP.new(key.publickey())
ciphertext = cipher_rsa.encrypt(b"审计日志元数据")

dec_cipher = PKCS1_OAEP.new(key)
plaintext = dec_cipher.decrypt(ciphertext)
print(plaintext.decode())

对称 vs 非对称:核心对比

维度 对称加密 非对称加密
密钥数量 1 把 2 把(公钥 + 私钥)
加解密速度 快(硬件加速可达 GB/s) 慢(RSA 2048 约 1 MB/s)
密钥分发 困难,需要安全信道 简单,公钥可公开
典型算法 AES, SM4, ChaCha20 RSA, ECC, SM2
适用场景 大数据批量加密 密钥交换、数字签名

混合加密方案:取长补短

实际上,HTTPS、PGP 等成熟协议都采用混合加密。流程大致是:

  1. 客户端生成临时对称密钥(会话密钥)
  2. 用服务器公钥加密该会话密钥并发送
  3. 服务器用私钥解密,得到会话密钥
  4. 双方使用该对称密钥加密后续通信数据

我在审计日志系统中也沿用了这个思路:用非对称加密保护对称密钥,用对称加密保护日志正文。这样做既保证了密钥分发的安全性,又照顾了海量日志的加解密性能。

重要提醒

非对称加密并不适合直接加密大文件。我曾经看过一个项目,用 RSA 逐块加密 10GB 日志,结果 CPU 跑满一小时还没结束。正确的做法是:用 RSA 加密 AES 密钥,用 AES 加密数据本身。

对称加密 vs 非对称加密 对称加密 明文 对称密钥 加密 密文 非对称加密 明文 公钥 加密 密文 私钥 一把钥匙 两把钥匙 对称加密特点 密钥管理成本高,加解密速度快 适合批量数据加密 非对称加密特点 密钥管理简单,加解密速度慢 适合密钥交换和签名 vs