1. 引言
代数格密码套件(Cryptographic Suite for Algebraic Lattices,CRYSTALS) 包含两种密码学原语:
- Kyber:一种达到 IND-CCA2 安全性的密钥封装机制(Key Encapsulation Mechanism,KEM);【即ML-KEM】
- Dilithium:一种达到强 EUF-CMA(存在性不可伪造,针对选择消息攻击)安全性的数字签名算法。【即ML-DSA】
这两种算法均基于模块格(module lattices)上的困难问题构建,旨在抵御大型量子计算机的攻击,并已提交至 NIST 后量子密码学项目。
1.1 模块格(Module Lattices)
模块格可以被视为介于用于定义 LWE(Learning With Errors)问题 的格与用于定义 Ring-LWE 问题的格之间的一类格。
如果模块所基于的环具有足够高的阶数(如 256),那么这些格不仅继承了 Ring-LWE 所使用格结构的全部效率优势,而且在CRYSTALS系列密码学算法中还具有以下额外优点:
-
1)对于 Kyber 和 Dilithium 的所有安全等级,所需的运算仅包括:
- Keccak 的各种变体;
- 固定模数 q q q 下的 Z q \mathbb{Z}_q Zq 加法与乘法;
- 环 Z q X / ( X 256 + 1 ) \mathbb{Z}_qX/(X^{256}+1) ZqX/(X256+1) 上的 NTT(Number Theoretic Transform,数论变换)。
这意味着提高或降低安全等级几乎不需要对软件或硬件实现进行重新设计。
只需调整少量参数,就可以将针对某一安全等级优化过的实现转换为针对另一安全等级的优化实现。
-
2)Kyber 和 Dilithium 所使用的格结构比 Ring-LWE 所使用的格具有更少的代数结构,更接近于 LWE 中使用的非结构化格。
因此,如果未来出现针对 Ring-LWE 的代数攻击(截至目前尚未发现此类攻击),那么这些攻击对 Kyber 和 Dilithium 等方案的效果很可能会更弱。
1.2 新闻
相关新闻有:
- 2019-05-21:发布关于 Kyber 在 Cortex-M4 平台上的新论文Memory-Efficient High-Speed Implementation of Kyber on Cortex-M4
- 2019-03-30:CRYSTALS 第二轮版本已提交并上线
- 2017-12-30:CRYSTALS 官方网站上线
1.3 致谢
Kyber 和 Dilithium 的设计与实现得到了以下机构和项目的支持:
- 欧盟委员会 ICT 计划资助项目 ICT-645622(PQCRYPTO)
- 欧盟委员会 ICT 计划资助项目 ICT-644729(SAFEcrypto)
- 瑞士国家科学基金会(Swiss National Science Foundation)2014 年 ERC Starting Grant 转移项目 CRETP2-166734(FELICITY)
- 荷兰科学研究组织(NWO)Veni 项目 639.021.645(Cryptanalysis of Lattice-based Cryptography)
- 欧盟委员会 ERC Starting Grant ERC-2013-StG-335086(LATTAC)
- 欧盟委员会 ERC Consolidator Grant ERC-2013-CoG-615073(ERCC)
- 欧盟委员会 ERC Starting Grant ERC-2018-StG-805031(EPOQUE)
- 德国科研基金会(DFG)卓越集群 2092 项目(CASA)
参与 Kyber 和 Dilithium 设计的机构包括:
- Centrum voor Wiskunde en Informatica(CWI,荷兰国家数学与计算机科学研究中心)
- École Normale Supérieure de Lyon(ENS Lyon,里昂高等师范学院)
- IBM Research Zurich(IBM 苏黎世研究院)
- Max Planck Institute for Security and Privacy(MPI-SP,马克斯·普朗克安全与隐私研究所)
- NXP Semiconductors
- Radboud University(拉德堡德大学)
- Ruhr University Bochum(波鸿鲁尔大学)

2. Kyber简介
Kyber 是一种达到 IND-CCA2 安全性 的密钥封装机制(Key Encapsulation Mechanism,KEM),其安全性建立在模块格(Module Lattices)上的学习带误差问题(Learning With Errors,LWE)的求解困难性之上。
Kyber 是 NIST 后量子密码学项目 的最终入围算法之一。
Kyber 提交方案包含三个不同的参数集,对应不同的安全等级:
- Kyber-512:目标安全性大致相当于 AES-128;
- Kyber-768:目标安全性大致相当于 AES-192;
- Kyber-1024:目标安全性大致相当于 AES-256。
对于希望实际使用 Kyber 的用户,建议:
- 采用所谓的混合模式(hybrid mode),与成熟的"后量子前(pre-quantum)"安全机制联合使用,例如椭圆曲线 Diffie-Hellman(ECDH);
- 推荐使用 Kyber-768 参数集。根据非常保守的安全分析,它能够抵御目前所有已知的经典和量子攻击,并提供超过 128 位的安全强度。
2.1 科学背景
Kyber 的设计源于 Regev 开创性的基于 LWE 的加密方案。
自 Regev 的原始工作以来,LWE 加密方案的实际效率得到了显著提升,主要来自以下几个观察和改进:
- LWE 中的秘密向量(secret)可以来自与噪声(noise)相同的概率分布;
- 可以通过使用方阵(square matrix)而非矩形矩阵(rectangular matrix)作为公钥,构造出所谓的 "LWE-like" 方案。
另一项重要改进来自于最初应用于 NTRU 密码系统 的思想------研究人员引入多项式环(polynomial rings)来替代整数环,从而定义了:
- Ring-LWE 问题
- Module-LWE 问题
Kyber 的结构建立在一个达到 CPA 安全性的密码系统之上,而该密码系统的安全性则基于 Module-LWE 问题的困难性。随后通过标准变换进一步构造出达到 CCA 安全性的 KEM------Kyber。
2.2 Kyber 的用户
Kyber 已经被工业界集成到多个密码库和系统中,如:
- Cloudflare 已将 Kyber 与其他后量子算法一起集成到其密码库 CIRCL(Cloudflare Interoperable Reusable Cryptographic Library)中:
- Amazon 已在其 AWS Key Management Service(AWS KMS) 中支持包含 Kyber 的混合模式:
- IBM 早在 2019 年就宣布推出"全球首个量子安全磁带驱动器(World's First Quantum Computing Safe Tape Drive)",其中使用了 Kyber 和 Dilithium:
3. Kyber性能概览
下表展示了 Kyber 的性能情况。
所有测试数据均来自 Intel Core i7-4770K(Haswell)处理器的单核环境。
文中给出了两种实现方式的测试结果:
- C 语言参考实现(Reference Implementation)
- 使用 AVX2 向量指令优化的实现(Optimized AVX2 Implementation)
对于 ARM Cortex-M4 微控制器平台上的性能数据,可参考 pqm4 项目公布的基准测试结果:
| Kyber-512 | |||||
|---|---|---|---|---|---|
| 尺寸(字节) | Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | |||
| sk(私钥) | 1632 | gen(密钥生成) | 122,684 | gen | 33,856 |
| pk(公钥) | 800 | enc(封装) | 154,524 | enc | 45,200 |
| ct(密文) | 768 | dec(解封装) | 187,960 | dec | 34,572 |
| Kyber-768 | |||||
|---|---|---|---|---|---|
| 尺寸(字节) | Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | |||
| sk(私钥) | 2400 | gen(密钥生成) | 199,408 | gen | 52,732 |
| pk(公钥) | 1184 | enc(封装) | 235,260 | enc | 67,624 |
| ct(密文) | 1088 | dec(解封装) | 274,900 | dec | 53,156 |
| Kyber-1024 | |||||
|---|---|---|---|---|---|
| 尺寸(字节) | Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | |||
| sk(私钥) | 3168 | gen(密钥生成) | 307,148 | gen | 73,544 |
| pk(公钥) | 1568 | enc(封装) | 346,648 | enc | 97,324 |
| ct(密文) | 1568 | dec(解封装) | 396,584 | dec | 79,128 |
作为 NIST PQC 项目第二轮提交的更新,还提出了 Kyber 的一个变体,用于展示当底层硬件能够直接支持对称密码原语时,Kyber 所能达到的性能水平。
该变体称为 Kyber-90s,其使用:
- AES-256 CTR(计数器)模式;
- SHA-2;
来替代原始 Kyber 中使用的 SHAKE。
| Kyber-512-90s | |||
|---|---|---|---|
| Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | ||
| gen(密钥生成) | 213,156 | gen | 21,880 |
| enc(封装) | 213,156 | enc | 28,592 |
| dec(解封装) | 277,612 | dec | 20,980 |
| Kyber-768-90s | |||
|---|---|---|---|
| Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | ||
| gen(密钥生成) | 389,760 | gen | 30,460 |
| enc(封装) | 432,764 | enc | 40,140 |
| dec(解封装) | 473,984 | dec | 30,108 |
| Kyber-1024-90s | |||
|---|---|---|---|
| Haswell 周期数(参考实现) | Haswell 周期数(AVX2) | ||
| gen(密钥生成) | 636,380 | gen | 43,212 |
| enc(封装) | 672,644 | enc | 56,556 |
| dec(解封装) | 724,144 | dec | 44,328 |
4. Kyber资源
4.1 NIST 第三轮提交包(Round 3)
NIST 第三轮提交包是提交给 NIST PQC 项目第三轮 的 ZIP 压缩包。
其中包含:
- Kyber 规范文档(Specification)
- 参考实现(Reference Implementation)
- AVX2 优化实现
- 测试向量(Test Vectors)
4.2 NIST 第二轮提交包(Round 2)
NIST 第二轮提交包是提交给 NIST PQC 项目第二轮 的 ZIP 压缩包。
其中包含:
- Kyber 规范文档(Specification)
- 参考实现(Reference Implementation)
- AVX2 优化实现
- 测试向量(Test Vectors)
4.3 NIST 提交包(Round 1)
NIST 提交包是于 2017 年 11 月提交给 NIST PQC 项目 的 ZIP 压缩包。
其中包含:
- Kyber 第一轮(Round 1)规范文档
- 参考实现
- 测试向量
4.4 Kyber论文
-
CRYSTALS-Kyber(版本 3.02)------ 提交至 NIST 后量子密码学项目第三轮
作者:
Roberto Avanzi、Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
规范文档(2021 年 8 月更新版)。
2021-08-04
[pdf](https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf)
-
CRYSTALS-Kyber(版本 3.01)------ 提交至 NIST 后量子密码学项目第三轮
作者:
Roberto Avanzi、Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
规范文档(2021 年 1 月更新版)。
2021-01-31
[pdf](https://pq-crystals.org/kyber/data/kyber-specification-round3-20210131.pdf)
-
CRYSTALS-Kyber(版本 3.0)------ 提交至 NIST 后量子密码学项目第三轮
作者:
Roberto Avanzi、Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
规范文档(提交包组成部分)。
2020-10-01
[pdf](https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf)
-
CRYSTALS-Kyber(版本 2.0)------ 提交至 NIST 后量子密码学项目第二轮
作者:
Roberto Avanzi、Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
规范文档(提交包组成部分)。
2019-03-30
[pdf](https://pq-crystals.org/kyber/data/kyber-specification-round2.pdf)
-
CRYSTALS-Kyber ------ 提交至 NIST 后量子密码学项目
作者:
Roberto Avanzi、Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
规范文档(提交包组成部分)。
2017-11-30
[pdf](https://pq-crystals.org/kyber/data/kyber-specification.pdf)
-
CRYSTALS -- Kyber: a CCA-secure module-lattice-based KEM
作者:
Joppe Bos、Léo Ducas、Eike Kiltz、Tancrède Lepoint、Vadim Lyubashevsky、John M. Schanck、Peter Schwabe、Gregor Seiler 和 Damien Stehlé。
发表于:
2018 IEEE European Symposium on Security and Privacy(EuroS&P 2018)
[从 ePrint 下载](https://eprint.iacr.org/2017/634)
-
Memory-Efficient High-Speed Implementation of Kyber on Cortex-M4(Cortex-M4 上 Kyber 的高性能低内存实现)
作者:
Leon Botros、Matthias Kannwischer 和 Peter Schwabe。
发表于:
第 11 届非洲密码学国际会议(Africacrypt 2019)
[从 ePrint 下载](https://eprint.iacr.org/2019/489)
4.5 演讲资料(Presentations)
-
CRYSTALS-Kyber
Peter Schwabe。
第二届 NIST 后量子密码标准化会议(Second NIST PQC Standardization Conference)演讲。
2019-08-23
[slides](https://pq-crystals.org/kyber/data/slides-nistpqc19-schwabe.pdf)
-
CRYSTALS-Kyber
Peter Schwabe。
第一届 NIST 后量子密码标准化会议(First NIST PQC Standardization Conference)演讲。
2018-04-12
[slides](https://pq-crystals.org/kyber/data/slides-nistpqc18-schwabe.pdf)
-
Standardizing Lattice Cryptography ... and Beyond(格密码标准化及其未来发展)
Vadim Lyubashevsky。
PQCRYPTO 2017 特邀报告(Invited Talk)。
2017-06-28
[slides](https://pq-crystals.org/kyber/data/slides-pqcrypto17-lyubashevsky.pdf)
5. Kyber软件(Software)
5.1 公开 Git 仓库(Public Git Repository)
获取 Kyber 软件的主要渠道是其公开的 GitHub 仓库https://github.com/pq-crystals/kyber。
下载并构建软件,请执行以下步骤:
bash
git clone https://github.com/pq-crystals/kyber.git
cd kyber/ref && make
cd ../avx2 && make
在 ref/ 和 avx2/ 两个子目录中,上述命令会构建共 26 个可执行文件(binaries)。
对于以下 6 个参数集:
- Kyber-512
- Kyber-512-90s
- Kyber-768
- Kyber-768-90s
- Kyber-1024
- Kyber-1024-90s
都会分别生成:
test_kybertest_kextest_vectorstest_speed
此外,还会为推荐参数集 Kyber-768 构建 NIST 测试向量生成程序:
PQCgenKAT_kem
其中:
-
1)
test_kyber会执行多轮:- 密钥生成(Key Generation)
- 封装(Encapsulation)
- 解封装(Decapsulation)
测试,以验证通信双方最终得到的共享密钥是否一致。
此外,它还会进行多次异常测试:
- 修改私钥后进行密钥交换;
- 修改密文后进行密钥交换;
并验证这些情况下密钥交换能够正确失败。
如果所有测试均通过,程序只会输出:
- 私钥大小(Secret Key Size)
- 公钥大小(Public Key Size)
- 密文大小(Ciphertext Size)
-
2)
test_kex用于测试:- 单向认证密钥交换(Unilaterally Authenticated Key Exchange)
- 双向认证密钥交换(Mutually Authenticated Key Exchange)
如果测试成功,程序仅输出通信双方传输的数据总量。
-
3)
test_vectors输出若干次 Kyber 执行过程中的确定性测试向量(Deterministically Generated Test Vectors)。该程序主要用于:
验证不同独立实现之间的兼容性。
-
4)
test_speed输出 Kyber 各种子例程(subroutines)的性能基准测试结果。该程序假设运行环境支持:
Intel CPU 周期计数(cycle counting)。
5.2 与 Open Quantum Safe 的集成
对于 Open Quantum Safe(OQS) 框架的用户来说,直接使用 liboqs 可能更为方便。
因为:
liboqs 已经集成了 Kyber 的实现。
5.3 与 PQClean 的集成
对于希望将多个不同 NIST PQC 候选算法快速集成到现有代码库中的开发者,可以考虑使用集成于 PQClean 中的 Kyber 实现。
实际上:
liboqs 集成 Kyber 的方式也是通过 PQClean 实现的。
5.4 第三方实现(Third-party Implementations)
下面列出了若干 Kyber 的第三方实现链接。
这些实现并非由 CRYSTALS 团队维护;如遇到相关问题,请直接联系对应实现的作者。
-
JavaScript/TypeScript 实现,作者:Paul Miller。
-
Kyber 已集成到 Botan C++ 密码学与 TLS 库 的 3.0 版本中。
-
Rust 实现,作者:Argyle Software。
-
Python 实现,作者:Dominik Klein。
-
Kyber 已被纳入 Bouncy Castle Beta 版本。
-
Java 实现,作者:Steven Fisher。
-
TypeScript 实现,作者:Steven Fisher。
同时可参考其对应的 NPM 包。
-
Go 实现,作者:Yawning Angel。
-
利用 RSA 加速器的概念验证版 Python 实现(Proof-of-Concept),作者:
- Martin R. Albrecht
- Christian Hanser
- Andrea Hoeller
- Thomas Pöppelmann
- Fernando Virdia
- Andreas Wallner
相关论文见:
-
由 Nadim Kobeissi 编写的 Go 语言 Kyber 实现,目标是:
- 代码体积小(small code)
- 易于阅读和理解(easy readability)
-
作者:Anton Tutoveanu。
该实现基于 Nadim Kobeissi 的 Go 实现(即上文的 Kyber-K2SO)移植而来。
参考资料
1 Kyber官网