It’s PQC Time! 后量子密码学组件迁移现状

Jul 7, 2025·
Chenghao Chen
Chenghao Chen
· 3 min read

前言

想象一下,你的日记本上锁了,但你知道,十年后某个人会拥有一把万能钥匙,能轻松地打开你的所有秘密。你现在应该做什么?这就是我们今天面临的量子威胁场景:我们所有数字世界中的信息可能正面临这样的未来风险。

在本文中,我们会对后量子密码学这一概念进行简单的说明,但不会讲解其中的数学原理。希望你能够知道目前密码学领域正在默默进行的一场变革。

本文面向对密码学有基础了解,但不需要深入掌握(例如无需了解可证明安全)的读者。

强烈建议在继续阅读之前,先浏览 The Missing Semester of Your CS Education 中 Security 部分的内容。在对一下概念有一定了解后再继续阅读:

  • 安全 Hash 函数
  • 对称加密和非对称加密
  • 数字签名算法

非对称算法的量子威胁

目前,最常用的非对称算法主要分成两大类。一类是基于大数分解困难问题的 RSA 类算法,而另一类是基于离散对数求解困难问题的 DLP 类算法。

这两类算法都广泛应用于加密和签名。例如,当你使用 GitHub 并通过 SSH 连接远程仓库时,需要在设置中的 SSH and GPG keys 中绑定自己的 SSH 密钥。

GitHub 中 SSH and GPG keys 配置栏

一般来说,参照网上的教程你会经历以下流程:

  1. 安装下载 OpenSSH
  2. 命令行输入 ssh-keygen 一路回车
  3. 在现实的路径(如 ~/.ssh )中能查看到对应的 .pub 文件
  4. .pub 复制到 GitHub 上对应的 SSH keys 设置中。

如果你在多个平台使用过 OpenSSH,可能会发现有时候 pub 文件中的内容很长,有时候很短。细心的读者可能注意到,OpenSSH 在生成密钥时提示的算法可能不同:

# A
> ssh-keygen
Generating public/private ed25519 key pair.
# B
> ssh-keygen
Generating public/private rsa key pair.

这两者都是数字签名算法,其中 Ed25519 签名属于基于椭圆曲线离散对数问题(EC-DLP)的算法,RSA 签名则是基于整数分解问题的 RSA 类算法。Ed25519 因效率高、密钥长度短,正逐渐取代 RSA,但这种迁移并非强制

域名的数字证书的情况类似。比如以下官网截图显示,Google 使用 RSA 签名证书,而 ChatGPT 使用 ECDSA 签名证书(对应 EC-DLP 类)。

Google 采用了 RSA 签名证书

ChatGPT 采用了 ECDSA 签名证书 (对应 ECDLP 类)

目前 RSA 和 ECDSA 的安全性均依赖于经典计算机无法有效解决的大数分解和离散对数问题。然而,这种安全假设在量子计算机出现后将受到严重威胁。

1994年,Shor 提出了一个基于量子计算机的高效算法,能够以多项式时间完成整数分解和离散对数问题的求解。这意味着 RSA 和 ECDSA 等传统算法在量子时代将不再安全。

后量子密码算法的诞生

为抵御量子计算机的威胁,后量子密码学(Post-Quantum Cryptography, PQC)应运而生。这些算法专门设计用于抵抗量子计算机攻击,即使量子计算机得到普及,也能保持安全性。

值得一提的是,PQC 算法要求能在传统计算机上执行,换言之,我们的设备都能够运行 PQC 算法。这是和另外一个领域“量子密码学”的不同之处。

目前,PQC 算法按照底层的数学结构主要分为以下几个大类:

  • 基于格理论(Lattice-based)
  • 基于多变量多项式方程组(Multivariate)
  • 基于哈希函数(Hash-based)
  • 基于纠错码(Code-based)
  • 基于同源性问题(Isogeny-based)

目前 NIST 已经完成标准化的 PQC 算法包括:

  • FIPS 203 ML-KEM: Module-Lattice-Based Key-Encapsulation Mechanism Standard
    • 源自于 CRYSTALS-Kyber
  • FIPS 204 ML-DSA: Module-Lattice-Based Digital Signature Standard
    • 源自于 CRYSTALS-Dilithium
  • FIPS 205 SLH-DSA: Stateless Hash-Based Digital Signature Standard
    • 源自于 SPHINCS+

已经通过筛选,正在标准化流程中的:

  • FALCON: Fast-Fourier Lattice-based Compact Signatures over NTRU
  • HQC: Hamming Quasi-Cyclic Code-based Public Key Encryption Scheme

开源 PQC 仓库

开源社区在PQC的研发和推广中发挥着至关重要的作用。一系列开源PQC库为开发者提供了必要的工具,使他们能够试验、集成和部署PQC算法。这些项目不仅实现了已标准化的算法,还积极参与到对候选算法的研究和评估中,从而加速了整个PQC生态系统的创新和成熟。

其中 Open Quantum Safe (OQS) 项目 liboqs 是PQC开源领域的核心力量之一,现已成为Linux基金会后量子密码学联盟 (PQCA) 的一部分。

open-quantum-safe/liboqs

liboqs 集成了多种量子抵抗的密钥封装机制 (KEM) 和数字签名算法 。它不仅支持NIST已选定的算法,如 ML-KEM (Kyber)、ML-DSA (Dilithium)、SLH-DSA (SPHINCS+) 和 Falcon,还包含了 NIST 第四轮评估中的候选算法,以及其他一些有前景的算法。

liboqs 提供了统一的 API 接口,方便开发者在不同算法间切换。此外,该项目还包含了测试工具集和性能基准测试程序,并提供了针对多种编程语言(如 Java、Python、Rust、Go)的封装库以及与 OpenSSL 等常用应用的集成方案。

性能挑战

PQC算法在设计上与传统密码算法有显著差异,这带来了一系列性能挑战。

如果用一句话总结,可以说:“PQC 算法没有一个能打的。”

参考 Westerbaan 和 Valenta 博文中的总结,我们可以看出,PQC 签名算法(✅ 标准化完成,📝 即将标准化,🤔 候选中)与传统算法(❌)做性能对比,PQC 签名算法在密钥长度和签名/验证时间上的整体表现较差。

PQC 算法和经典算法的性能对比

PQC 算法的性能是如此糟糕,以至于在实际部署的时候会受到来自厂商的阻力,但安全需求迫使我们继续探索。

NIST 的 10 年大计

尽管如此,我们依然对 PQC 的发展抱有乐观态度。

根据 NIST 内部报告 NIST IR 8547,建议从现在到 2030 年逐步淘汰易受攻击的加密方法,到 2030 年弃用依赖 112 位安全性的算法,并目标在 2035 年前完成所有系统的迁移。

为什么后量子密码学的转移部署如此迫切?是因为 Store‑Now‑Harvest‑Later (存储后收割)这一攻击现象的存在。在这个情况下,攻击者现在截获并长期保存看似安全的加密数据,等待未来量子计算足够成熟时再行解密。

这种威胁特别针对需要长期保密的数据,如政府机密、商业秘密、医疗记录。在量子计算成为现实的那一天,这些陈年数据将被一次性破解,造成难以逆转的损失。

更令安全策略复杂化的是,这种攻击本身在当前不会立即显现危害,所以往往被低估。但全球多国政府和企业已经开始警觉,主动推动 PQC 算法的迁移部署,以应对这一“时延性”攻击

业界迁移情况

近年来,PQC 算法逐步开始工程化并被应用于实际系统中。例如:

OpenSSL 从 3.0 版本起已经开始引入后量子密码算法,提供了如 Kyber 和 Dilithium 的支持。

OpenSSH 在 9.9 版本中也开始支持已经被 NIST 标准化的后量子密钥交换算法,通过混合(hybrid)密钥交换方法mlkem768x25519-sha256,同时采用传统算法 X25519 和 PQC 算法 ML-KEM 进行密钥交换,以增强安全性。而在 10.0 版本中,该方法已经被作为默认的密钥交换方法。

查看 OpenSSH 支持的 PQC 算法 (红框选部分)

我们可以搭建一个环境来简单的测试一下。由于目前主流的发行版还没有将 OpenSSH 10.x 版本作为默认版本,因此我们需要自己 build OpenSSH。

我们编写一个简单的 Dockerfile 来构建容器:

FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive

# 安装依赖
RUN apt-get update \
    && apt-get install -y wget build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-dev libedit-dev \
    && rm -rf /var/lib/apt/lists/*

RUN useradd -r -M -s /usr/sbin/nologin sshd

# 下载并编译 OpenSSH 10
RUN wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p2.tar.gz \
    && tar xzf openssh-10.0p2.tar.gz \
    && cd openssh-10.0*p* \
    && ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-ssl-engine \
    && make && make install \
    && cd /tmp && rm -rf openssh-10.0*p* openssh-10.0p2.tar.gz

# 添加默认用户并设定密码
RUN useradd -m user && echo "user:password" | chpasswd

# 初始化 sshd 所需环境
RUN mkdir -p /var/run/sshd && ssh-keygen -A

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

然后进行 Docker 容器的构建和运行:

docker build -t ssh10-test .
docker run -d --name ssh10-test -p 2222:22 ssh10-test
ssh -vvv -p 2222 user@localhost

我们可以在输出中找到:

debug3: kex_choose_conf: will use strict KEX ordering
debug1: kex: algorithm: mlkem768x25519-sha256

表明在协商后默认的密钥交换算法为 mlkem768x25519-sha256

小结

技术不断发展,安全需求也在随之变化。后量子密码学可能看起来有些复杂,但归根结底,它只是在默默地为我们的数字生活提供保障。希望通过本文,你对量子时代即将带来的变化有了初步了解。

推荐阅读