open-quantum-safe/liboqs
GitHub: open-quantum-safe/liboqs
一个用于实现和实验抗量子密码算法的开源 C 语言库,提供 NIST 标准化及候选算法的密钥封装和数字签名方案。
Stars: 2800 | Forks: 694
# liboqs
[](https://github.com/open-quantum-safe/liboqs/actions/workflows/commit-to-main.yml)
[](https://github.com/open-quantum-safe/liboqs/actions/workflows/weekly.yml)
[](https://coveralls.io/github/open-quantum-safe/liboqs?branch=main)
liboqs 是一个用于抗量子密码算法的开源 C 语言库。
- [liboqs](#liboqs)
- [概述](#overview)
- [状态](#status)
- [支持的算法](#supported-algorithms)
- [密钥封装机制](#key-encapsulation-mechanisms)
- [签名方案](#signature-schemes)
- [有状态签名方案](#stateful-signature-schemes)
- [限制与安全性](#limitations-and-security)
- [平台限制](#platform-limitations)
- [支持限制](#support-limitations)
- [快速入门](#quickstart)
- [Linux 和 Mac](#linux-and-mac)
- [Windows](#windows)
- [交叉编译](#cross-compilation)
- [文档](#documentation)
- [贡献](#contributing)
- [许可证](#license)
- [致谢](#acknowledgements)
## 概述
liboqs 提供:
- 一系列抗量子密钥封装机制 (KEM) 和数字签名算法的开源实现;完整列表可在[下方](#supported-algorithms)找到
- 用于这些算法的通用 API
- 测试工具和基准测试例程
liboqs 是 **Open Quantum Safe (OQS)** 项目的一部分,该项目的旨在开发和集成抗量子密码技术到应用程序中,以促进在现实场景中的部署和测试。特别是,OQS 通过我们的 [OpenSSL 3 Provider](https://github.com/open-quantum-safe/oqs-provider) 提供了 liboqs 在 TLS、X.509 和 S/MIME 等协议中的原型集成,并且我们提供了各种其他[支持后量子的演示](https://github.com/open-quantum-safe/oqs-demos)。
OQS 项目由作为 [Linux Foundation](https://linuxfoundation.org/) 一部分的 [Post-Quantum Cryptography Alliance](https://pqca.org/) 支持。关于 Open Quantum Safe 项目的更多信息可以在 [openquantumsafe.org](https://openquantumsafe.org/) 找到。
OQS 正在进行一项调查以更好地了解我们的社区。我们希望听到组织和个人关于他们对 Open Quantum Safe 项目的兴趣和使用情况。请花几分钟时间填写调查问卷:https://linuxfoundation.surveymonkey.com/r/oqssurvey
## 状态
### 支持的算法
关于每个支持算法的详细信息可以在 [docs/algorithms](https://github.com/open-quantum-safe/liboqs/tree/main/docs/algorithms) 文件夹中找到。
下面的列表指示了 liboqs 当前支持的所有算法,包括实验性算法,并已排除在 NIST 竞赛期间被剔除的算法变体,例如 Kyber-90s 或 Dilithium-AES。
`liboqs` 中唯一实现 NIST 标准的算法是 [`ML-KEM`](https://csrc.nist.gov/pubs/fips/203/final)(最终标准)和 [`ML-DSA`](https://csrc.nist.gov/pubs/fips/204/final)(最终标准)变体及其各自不同的位强度。`liboqs` 将保留 NIST 在标准化过程最后阶段选定的这些算法名称,因此用户可以放心它们未来会一直存在。如果 NIST 更改这些算法的实现细节,`liboqs` 将调整实现,以便用户免受此类潜在变化的影响。
Falcon 也已[被选中进行标准化](https://csrc.nist.gov/Projects/post-quantum-cryptography/selected-algorithms-2022),但 `liboqs` 中这些算法的实现目前跟踪的是第 3 轮提交,而不是 NIST 标准草案。
除 `ML-KEM` 和 `ML-DSA` 之外的所有名称都可能更改。`liboqs` 通过配置变量 [OQS_ALGS_ENABLED 提供了一种针对 NIST 标准轨道、持续 NIST 竞赛或纯实验性质的算法选择机制](CONFIGURE.md#oQS_ALGS_ENABLED)。默认情况下,构建的 `liboqs` 支持下面列出的所有(包括实验性)PQ 算法。
#### 密钥封装机制
| Algorithm family | 标准化状态 | 主要实现 |
|:-------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------|
| BIKE | 未被 [NIST](https://bikesuite.org/files/v5.1/BIKE_Spec.2022.10.10.1.pdf) 选中 | [`awslabs/bike-kem`](https://github.com/awslabs/bike-kem) |
| Classic McEliece | [ISO](https://classic.mceliece.org/iso.html) 考虑中 | [`PQClean/PQClean@1eacfda`](https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181) |
| FrodoKEM | [ISO](https://frodokem.org/) 考虑中 | [`microsoft/PQCrypto-LWEKE@a2f9dec`](https://github.com/microsoft/PQCrypto-LWEKE/commit/a2f9dec8917ccc3464b3378d46b140fa7353320d) |
| HQC | 被 [NIST](https://pqc-hqc.org/doc/hqc_specifications_2025_08_22.pdf) 选中以便即将标准化 | [`PQClean/PQClean@1eacfda`](https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181) |
| Kyber | 被 [NIST](https://csrc.nist.gov/CSRC/media/Projects/post-quantum-cryptography/documents/round-3/submissions/Kyber-Round3.zip) 选为 ML-KEM (FIPS 203) 的基础 | [`pq-crystals/kyber@441c051`](https://github.com/pq-crystals/kyber/commit/441c0519a07e8b86c8d079954a6b10bd31d29efc) |
| ML-KEM | 被 [NIST](https://csrc.nist.gov/pubs/fips/203/final) 标准化 | [`pq-code-package/mlkem-native@048fc2a`](https://github.com/pq-code-package/mlkem-native/commit/048fc2a7a7b4ba0ad4c989c1ac82491aa94d5bfa) |
| NTRU | 未被 [NIST](https://csrc.nist.gov/CSRC/media/Projects/post-quantum-cryptography/documents/round-3/submissions/NTRU-Round3.zip) 选中,[NTT](https://info.isl.ntt.co.jp/crypt/ntru/index.html) 标准化考虑中 | [`PQClean/PQClean@4c9e5a3`](https://github.com/PQClean/PQClean/commit/4c9e5a3aa715cc8d1d0e377e4e6e682ebd7602d6) |
| NTRU-Prime | 未被 [NIST](https://csrc.nist.gov/CSRC/media/Projects/post-quantum-cryptography/documents/round-3/submissions/NTRU-Prime-Round3.zip) 选中 | [`PQClean/PQClean@4c9e5a3`](https://github.com/PQClean/PQClean/commit/4c9e5a3aa715cc8d1d0e377e4e6e682ebd7602d6) |
#### 签名方案
| Algorithm family | 标准化状态 | 主要实现 |
|:-------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------|
| CROSS | [NIST](https://www.cross-crypto.com/CROSS_Specification_v2.2.pdf) 考虑中 | [`CROSS-signature/CROSS-lib-oqs@a21ebc3`](https://github.com/CROSS-signature/CROSS-lib-oqs/commit/a21ebc314e06b0972a9bbcf2813a185ecb2917f1) |
| Falcon | 被 [NIST](https://csrc.nist.gov/CSRC/media/Projects/post-quantum-cryptography/documents/round-3/submissions/Falcon-Round3.zip) 选中以便即将标准化 | [`PQClean/PQClean@1eacfda`](https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181) |
| MAYO | [NIST](https://csrc.nist.gov/csrc/media/Projects/pqc-dig-sig/documents/round-2/spec-files/mayo-spec-round2-web.pdf) 考虑中 | [`PQCMayo/MAYO-C@4b7cd94`](https://github.com/PQCMayo/MAYO-C/commit/4b7cd94c96b9522864efe40c6ad1fa269584a807) |
| ML-DSA | 被 [NIST](https://csrc.nist.gov/pubs/fips/204/final) 标准化 | [`pq-code-package/mldsa-native@f48f164`](https://github.com/pq-code-package/mldsa-native/commit/f48f164cefb07f4ffa519ddda7cee670b8ee3517) |
| SLH-DSA | 被 [NIST](https://csrc.nist.gov/pubs/fips/205/final) 标准化 | [`pq-code-package/slhdsa-c@a0fc1ff`](https://github.com/pq-code-package/slhdsa-c/commit/a0fc1ff253930060d0246aebca06c2538eb92b88) |
| SNOVA | [NIST](https://csrc.nist.gov/csrc/media/Projects/pqc-dig-sig/documents/round-2/spec-files/snova-spec-round2-web.pdf) 考虑中 | [`vacuas/SNOVA@1c3ca6f`](https://github.com/vacuas/SNOVA/commit/1c3ca6f4f7286c0bde98d7d6f222cf63b9d52bff) |
| UOV | [NIST](https://csrc.nist.gov/csrc/media/Projects/pqc-dig-sig/documents/round-2/spec-files/uov-spec-round2-web.pdf) 考虑中 | [`pqov/pqov@33fa527`](https://github.com/pqov/pqov/commit/33fa5278754a32064c55901c3a17d48b06cc2351) |
#### 有状态签名方案
| Algorithm family | 标准化状态 | 主要实现 |
|:-------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------|
| LMS | 被 [IRTF](https://www.rfc-editor.org/info/rfc8554) 标准化,被 [NIST](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-208.pdf) 批准 | [`cisco/hash-sigs`](https://github.com/cisco/hash-sigs) |
| XMSS | 被 [IRTF](https://www.rfc-editor.org/info/rfc8391) 标准化,被 [NIST](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-208.pdf) 批准 | [`XMSS/xmss-reference`](https://github.com/XMSS/xmss-reference) |
### 限制与安全性
虽然在撰写本文时,此库中使用的任何抗量子算法都没有已知的漏洞,但在部署抗量子算法时建议谨慎行事,因为大多数算法和软件没有像当前部署的算法那样经过同等程度的审查。应特别注意标准社区提供的指导,尤其是来自 NIST [Post-Quantum Cryptography Standardization](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography/Post-Quantum-Cryptography-Standardization) 项目的指导。随着研究的进展,支持的算法可能会在安全性方面发生快速变化,甚至可能证明在面对经典计算机和量子计算机时都不安全。此外,请注意 `sntrup761` 仅用于互操作性测试。
liboqs 并不打算“挑选赢家”:算法支持是根据 NIST PQC 标准化项目确定的。我们强烈建议应用程序和协议在部署抗量子密码技术时依赖该工作的成果。
我们意识到某些方可能希望在 NIST PQC 标准化项目结束之前部署抗量子密码技术。我们强烈建议此类尝试使用所谓的**混合密码技术**,即将抗量子公钥算法与传统公钥算法(如 RSA 或椭圆曲线)一起使用,以便解决方案的安全至少不低于现有的传统密码技术。
**我们目前不建议在生产环境中依赖此库或将其用于保护任何敏感数据。** 此库旨在帮助研究和原型设计。虽然我们尽最大努力避免安全漏洞,但此库尚未达到高安全性应用所必需的审计和分析水平。
请参阅 [SECURITY.md](SECURITY.md#security-policy) 了解有关如何报告漏洞以及 OQS 漏洞响应流程的详细信息。
#### 平台限制
为了优化支持工作,
- 并非所有算法在所有平台上都得到同等良好的支持。如有疑问,建议首先查看[每个算法的文档文件](docs/algorithms)。
- 并非所有编译器都得到同等良好的支持。例如,至少需要 v7.1.0 版本的 GNU 编译器。
#### 支持限制
本项目非商业支持。liboqs 的所有指导方针和目标均反映了当前的做法,由学术、兼职和/或自愿贡献者社区在尽力而为的基础上执行,并可能随时更改。任何寻求更可靠承诺的实体都强烈建议加入 OQS 社区,从而增强社区可以提供的代码和支持。
## 快速入门
### Linux 和 Mac
1. 安装依赖项:
在 Ubuntu 上:
sudo apt install astyle cmake gcc ninja-build libssl-dev python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind
在 macOS 上,使用您选择的包管理器(我们选择了 Homebrew):
brew install cmake ninja openssl@3 wget doxygen graphviz astyle valgrind
pip3 install pytest pytest-xdist pyyaml
使用 Nix:
nix develop
请注意,如果您希望 liboqs 使用 OpenSSL 进行各种对称密码算法(AES、SHA-2 等),则必须安装 OpenSSL(推荐 3.x 版本;已 EOL 的 1.1.1 版本也仍然可以使用)。
2. 获取源代码:
git clone -b main https://github.com/open-quantum-safe/liboqs.git
cd liboqs
并构建:
mkdir build && cd build
cmake -GNinja ..
ninja
各种 `cmake` 构建选项可用于自定义生成的工件,并在 [CONFIGURE.md](CONFIGURE.md#options-for-configuring-liboqs-builds) 中进行了记录。所有受支持的选项也列在 `.CMake/alg-support.cmake` 文件中,可以通过在 `build` 目录中运行 `cmake -LAH -N ..` 来查看。
以下说明假设我们在 `build` 中。
3. 默认情况下,主要构建结果是 `lib/liboqs.a`,一个静态库。如果您想构建共享/动态库,请将 [`-DBUILD_SHARED_LIBS=ON`](CONFIGURE.md#bUILD_SHARED_LIBS) 附加到上面的 `cmake -GNinja ..` 命令中,结果将是 `lib/liboqs.so|dylib|dll`。公共头文件位于 `include` 目录中。在 `tests` 目录下还构建了各种程序:
- `test_kem`:密钥封装机制的简单测试工具
- `test_sig`:签名方案的简单测试工具
- `test_sig_stfl`:有状态签名方案的简单测试工具
- `test_kem_mem`:用于检查密钥封装机制内存消耗的简单测试工具
- `test_sig_mem`:用于检查签名方案内存消耗的简单测试工具
- `kat_kem`:使用与 NIST 提交要求相同的程序生成密钥封装机制已知答案测试 (KAT) 值的程序,用于使用 `tests/test_kat.py` 根据提交的 KAT 值进行检查
- `kat_sig`:使用与 NIST 提交要求相同的程序生成签名方案已知答案测试 (KAT) 值的程序,用于使用 `tests/test_kat.py` 根据提交的 KAT 值进行检查
- `kat_sig_stfl`:用于 `tests/test_kat.py` 根据提交的 KAT 值检查结果的程序
- `speed_kem`:密钥封装机制的基准测试程序;用法说明请参见 `./speed_kem --help`
- `speed_sig`:签名机制的基准测试程序;用法说明请参见 `./speed_sig --help`
- `speed_sig_stfl`:有状态签名机制的基准测试程序;用法说明请参见 `./speed_sig_stfl --help`
- `example_kem`:展示 KEM API 用法的最小可运行示例
- `example_sig`:展示签名 API 用法的最小可运行示例
- `example_sig_stfl`:展示有状态签名 API 用法的最小可运行示例
- `test_aes`、`test_sha3`:密码子组件的简单测试工具
- `test_portability`:用于检查跨 CPU 代码可移植性的简单测试工具;需要存在 `qemu`;仅在 Ubuntu 上验证了正确操作
可以使用以下命令运行完整的测试套件
ninja run_tests
4. 要生成 API 的 HTML 文档,请运行:
ninja gen_docs
然后在您的 Web 浏览器中打开 `docs/html/index.html`。
5. 可以运行 `ninja install` 将构建的库和 `include` 文件安装到选择的位置,该位置可以通过在配置时将 `-DCMAKE_INSTALL_PREFIX=` 选项传递给 `cmake` 来指定。或者,可以运行 `ninja package` 来创建安装包。
6. 可以运行 `ninja uninstall` 来删除所有安装文件。
### Windows
可以使用安装了 [CMake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) 扩展的 Visual Studio 2019 生成二进制文件。可以使用上面针对 Linux/macOS 解释的相同选项,并在指定的 `build` 文件夹中生成构建工件。
如果您想创建 Visual Studio 构建文件,例如在不使用 `ninja` 的情况下,请确保_不要_像上面示例那样将参数 `-GNinja` 传递给 `cmake` 命令。然后,您可以使用 `msbuild` 构建所有组件,例如:`msbuild ALL_BUILD.vcxproj`,并安装所有工件,例如使用此命令 `msbuild INSTALL.vcxproj`。
### 交叉编译
您可以为各种平台交叉编译 liboqs。详细信息可在 [Wiki](https://github.com/open-quantum-safe/liboqs/wiki/Platform-specific-notes-for-building-liboqs#cross-compiling) 中找到。
## 文档
关于构建、可选构建参数、示例应用程序、编码规范等的更多详细信息可以在 [wiki](https://github.com/open-quantum-safe/liboqs/wiki) 中找到。
## 贡献
我们感激地欢迎符合验收标准的贡献。有关更多详细信息,请参阅我们的[贡献指南](https://github.com/open-quantum-safe/liboqs/wiki/Contributing-Guide)。
## 许可证
liboqs 在 MIT 许可证下授权;有关详细信息,请参阅 [LICENSE.txt](https://github.com/open-quantum-safe/liboqs/blob/main/LICENSE.txt)。
liboqs 包含一些以不同方式授权的第三方库或模块;相应的子文件夹包含适用于该情况的许可证。特别是:
- `.CMake/CMakeDependentOption.cmake`:BSD 3-Clause 许可证
- `src/common/common.c`:包含 Apache License v2.0 的部分
- `src/common/crypto/aes/aes_c.c`:公共领域或任何经 OSI 批准的许可证
- `src/common/crypto/aes/aes*_ni.c`:公共领域
- `src/common/crypto/sha2/sha2_c.c`:公共领域
- `src/common/crypto/sha3/xkcp_low` :CC0(公共领域),除了 `brg_endian.h` 和 `KeccakP-1600-AVX2.s`
- `src/common/crypto/sha3/xkcp_low/.../brg_endian.h` :BSD 3-Clause 许可证
- `src/common/crypto/sha3/xkcp_low/.../KeccakP-1600-AVX2.s` :类 BSD [CRYPTOGAMS 许可证](http://www.openssl.org/~appro/cryptogams/)
- `src/common/rand/rand_nist.c`:参见文件
- `src/kem/bike/additional`:Apache License v2.0
- `src/kem/classic_mceliece/pqclean_*`:公共领域
- `src/kem/kyber/pqcrystals-*`:公共领域 (CC0) 或 Apache License v2.0
- `src/kem/kyber/pqclean_*`:公共领域 (CC0),以及公共领域 (CC0) 或 Apache License v2.0,以及公共领域 (CC0) 或 MIT,以及 MIT
- `src/kem/kyber/libjade_*` 公共领域 (CC0) 或 Apache License v2.
- `src/kem/ml_kem/mlkem-native_*`:MIT 或 Apache License v2.0 或 ISC 许可证
- `src/kem/ntru/pqclean_*`:公共领域 (CC0)
- src/sig/falcon/pqclean_\*\_aarch64 :Apache License v2.0
- `src/sig/mayo/*`:Apache License v2.0
- `src/sig/ml_dsa/pqcrystals-*`:公共领域 (CC0) 或 Apache License v2.0
## 致谢
OQS 项目由作为 [Linux Foundation](https://linuxfoundation.org/) 一部分的 [Post-Quantum Cryptography Alliance](https://pqca.org/) 支持。
OQS 项目由滑铁卢大学的 Douglas Stebila 和 Michele Mosca 创立。[liboqs 的贡献者](https://github.com/open-quantum-safe/liboqs/blob/main/CONTRIBUTORS)包括个人贡献者、学者和研究人员以及 various companies,包括 Amazon Web Services、Cisco Systems、evolutionQ、IBM Research、Microsoft Research、SandboxAQ 和 softwareQ。
Open Quantum Safe 的开发资金支持由 Amazon Web Services、Canadian Centre for Cyber Security、Cisco、Unitary Fund、NGI Assure Fund 和 VeriSign Inc. 提供。
开发了 OQS 特定组件的研究项目得到了各种研究资助的支持,包括来自加拿大自然科学与工程研究理事会 (NSERC) 的资助;有关资金致谢,请参见源论文。
标签:Bash脚本, CVE, C语言库, DNS解析, KEM, liboqs, NIST标准化, Open Quantum Safe, 加密算法, 后量子密码学, 子域名枚举工具, 安全测试工具, 客户端加密, 客户端加密, 密码学, 密钥封装机制, 底层原语, 开发库, 开源项目, 手动系统调用, 抗量子计算, 数字签名, 混合加密, 网络安全, 蓝队防御, 逆向工具, 量子安全, 隐私保护