2. 经典密码算法全景盘点

各位同学,咱们今天来盘一盘经典密码算法的家底。说实话,在开始讲 PQC 迁移之前,我特别想先带大家把「老伙计们」摸清楚。你想想看,如果连现在用的算法都搞不明白,怎么知道迁移后要保留什么、替换什么?

我个人习惯把经典密码体系分成三大块:对称加密、非对称加密、哈希函数。这三兄弟各司其职,构成了现代网络安全的基石。咱们一个一个来。

对称加密:AES 的统治地位

对称加密,说白了就是加密和解密用同一把钥匙。你在网上买东西、刷脸支付,背后都有对称加密在干活。为什么?因为它快,特别快。

核心要点:对称加密是数据加密的主力军,AES 是绝对的主角。

我记得 2010 年左右做过一个金融交易系统,当时还在纠结用 3DES 还是 AES。后来我果断选了 AES,为什么?因为 3DES 本质上是在给 DES「续命」,效率低不说,安全性也只是勉强够用。AES 就不一样了,它是 NIST 在 2001 年正式发布的标准,到现在二十多年了,还没被攻破过。

AES 有三个关键参数:

  • 密钥长度:128 位、192 位、256 位。我个人建议,新系统直接上 AES-256,别省那点性能。
  • 分组大小:固定 128 位。注意,AES 是分组密码,不是流密码。
  • 工作模式:ECB、CBC、CTR、GCM 等等。这里我要重点说一下——千万别用 ECB 模式。

避坑指南:我曾经在一个项目中看到有人用 ECB 模式加密图片,结果加密后的图像轮廓依然清晰可见。ECB 模式下,相同的明文块会生成相同的密文块,这等于给攻击者留了后门。记住,生产环境首选 GCM 模式,自带认证,省心省力。

来看一个简单的 AES 加密示例(Python):

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

key = get_random_bytes(32)  # AES-256
cipher = AES.new(key, AES.MODE_GCM)
plaintext = b"Hello, PQC Migration!"
ciphertext, tag = cipher.encrypt_and_digest(plaintext)

print(f"Nonce: {cipher.nonce.hex()}")
print(f"Ciphertext: {ciphertext.hex()}")
print(f"Tag: {tag.hex()}")

嗯,这里要注意:GCM 模式会输出一个 tag,用于验证数据完整性。解密时如果 tag 校验失败,说明数据被篡改了。

非对称加密:RSA 与 ECC 的较量

非对称加密,也叫公钥密码学。它解决了一个根本问题:两个从未见过面的人,怎么安全地交换密钥?

RSA 是 1977 年诞生的老前辈,基于大整数分解难题。ECC 是 1985 年提出的后起之秀,基于椭圆曲线离散对数问题。两者都是经典,但思路完全不同。

特性 RSA ECC
数学基础 大整数分解 椭圆曲线离散对数
密钥长度(等效安全) 2048 位 ≈ 112 位安全 256 位 ≈ 128 位安全
签名速度 较慢 较快
密钥生成 慢(需要找大素数) 快
典型应用 数字证书、密钥交换 移动设备、TLS 1.3

你看这个表格,ECC 在同等安全强度下,密钥长度只有 RSA 的十分之一左右。我在做物联网项目时,设备内存只有几十 KB,RSA 根本跑不动,ECC 就是救命稻草。

但 RSA 也有它的优势:实现简单,兼容性好。很多老系统只支持 RSA,你硬要换 ECC,反而会出兼容性问题。我的建议是:新系统优先用 ECC,老系统迁移时保留 RSA 兼容层。

经验之谈:我曾经帮一个银行系统做升级,他们用了十几年的 RSA-1024。我建议直接跳到 ECC P-384,而不是先升到 RSA-2048 再过渡。为什么?因为 RSA-1024 到 RSA-2048 只是「续命」,而 ECC P-384 能撑到量子计算时代来临前。事实证明这个决策是对的,后来他们做 PQC 迁移时,ECC 到 CRYSTALS-Kyber 的过渡比 RSA 平滑得多。

哈希函数:SHA-2 与 SHA-3 的取舍

哈希函数,就是把任意长度的数据压缩成固定长度的摘要。它有三个核心特性:抗原像性、抗第二原像性、抗碰撞性。说白了就是:你不能从摘要反推原文,也不能找到两个不同的输入产生相同的摘要。

SHA-2 家族(SHA-224/256/384/512)是目前使用最广泛的哈希函数。SHA-3 是 2015 年 NIST 发布的新标准,它采用了完全不同的 Keccak 海绵结构。

我个人的看法是:SHA-2 够用,但 SHA-3 是未来。为什么?

  • SHA-2 和 SHA-3 在安全性上目前没有本质区别,都没有被实际攻破。
  • SHA-3 的设计更灵活,支持可扩展输出(SHAKE128/256),适合需要变长哈希的场景。
  • SHA-2 的 Merkle-Damgård 结构存在长度扩展攻击隐患,虽然实际利用难度大,但 SHA-3 从设计上就避免了这个问题。

注意:MD5 和 SHA-1 已经彻底被攻破了,任何新系统都不应该使用。我曾经审计过一个遗留系统,里面还在用 MD5 做文件完整性校验,我当场就让他们改了。记住,MD5 和 SHA-1 是雷区,碰都不要碰。

来看一个哈希计算的例子:

import hashlib

data = b"PQC Migration is coming"

# SHA-256
sha256_hash = hashlib.sha256(data).hexdigest()
print(f"SHA-256: {sha256_hash}")

# SHA-3-256
sha3_256_hash = hashlib.sha3_256(data).hexdigest()
print(f"SHA-3-256: {sha3_256_hash}")

# SHAKE128(可扩展输出)
shake = hashlib.shake_128(data)
print(f"SHAKE128 (32 bytes): {shake.hexdigest(32)}")

嗯,这里要注意:SHAKE 的输出长度是你在调用时指定的,非常灵活。这在一些需要固定长度哈希的协议中特别好用。

经典算法全景图

为了让大家更直观地理解这三类算法的关系,我画了一张全景图:

经典密码算法全景图 对称加密 AES-128/192/256 GCM / CBC / CTR 非对称加密 RSA-2048/4096 ECC P-256 / P-384 哈希函数 SHA-2 (256/512) SHA-3 / SHAKE 对称加密:数据加密主力,AES 统治 非对称加密:密钥交换与数字签名,RSA 与 ECC 并存 哈希函数:完整性校验与数字签名基础,SHA-2 为主,SHA-3 为未来 注意:MD5、SHA-1 已淘汰,新系统禁止使用 ⚠ 量子计算威胁:RSA/ECC 即将失效

从这张图可以看得很清楚:对称加密和哈希函数在量子计算面前相对安全(Grover 算法只能将安全强度减半),但 RSA 和 ECC 在 Shor 算法面前基本是「裸奔」。这就是为什么我们要做 PQC 迁移——非对称加密这块必须换。

小结:经典算法的定位

咱们总结一下这三类算法在 PQC 迁移中的定位:

  • AES:继续用,密钥长度翻倍即可(AES-256 在量子时代仍有 128 位安全强度)。
  • RSA / ECC:必须替换,这是 PQC 迁移的核心任务。
  • SHA-2 / SHA-3:继续用,哈希函数受量子计算影响较小。

我个人建议,在开始 PQC 迁移之前,先把现有系统里的算法用清单列出来。我曾经帮一个客户做迁移评估,发现他们系统里居然同时用了 RSA-1024、ECC P-256、SHA-1 和 MD5,简直是「密码学灾难现场」。先盘点,再规划,最后动手——这个顺序不能乱。