CRYSTALS-Kyber 后量子密钥封装机制的密钥生成过程
字数 1972 2025-11-05 08:30:59
CRYSTALS-Kyber 后量子密钥封装机制的密钥生成过程
题目描述
CRYSTALS-Kyber 是一种基于格的后量子公钥加密和密钥封装机制(KEM),其安全性依赖于模块化格上的带误差学习问题(MLWE)。本题要求详细解释 Kyber 的密钥生成过程,包括参数选择、矩阵生成、误差引入以及公钥/私钥的最终构造。
解题过程
步骤 1:理解基础参数
Kyber 的操作基于以下预定义参数(以 Kyber-512 为例):
- \(n = 256\):多项式环 \(R = \mathbb{Z}_q[X]/(X^n + 1)\) 的维度。
- \(q = 3329\):模数,用于定义多项式系数在 \(\mathbb{Z}_q\) 上的运算。
- \(k = 2\):模块化格的维度(即公钥矩阵的行数和列数)。
- \(\eta_1, \eta_2\):决定误差多项式系数的分布参数(例如 \(\eta_1 = 3, \eta_2 = 2\))。
密钥生成的目标是生成一个私钥 \(s\) 和一个公钥 \((A, t)\),其中 \(A\) 是一个 \(k \times k\) 多项式矩阵,\(t\) 是公钥向量。
步骤 2:生成公钥矩阵 \(A\)
-
种子扩展:
- 使用密码学安全的随机数生成器(如 SHAKE-128)生成一个种子 \(\rho\)(长度通常为 32 字节)。
- 通过扩展函数 \(\text{ExpandA}(\rho)\) 将 \(\rho\) 扩展为一个 \(k \times k\) 多项式矩阵 \(A\)。每个多项式的系数均匀采样自 \(\mathbb{Z}_q\)。
- 关键点:\(A\) 是伪随机生成的,且无需存储整个矩阵,只需存储种子 \(\rho\) 即可重建。
-
多项式生成方法:
- 例如,对于 \(A_{i,j} \in R\),其系数通过 SHAKE-128 输出按 \(q\) 取模生成,确保可重现性。
步骤 3:生成私钥 \(s\) 和误差 \(e\)
-
私钥 \(s\) 的采样:
- 私钥 \(s\) 是一个长度为 \(k\) 的多项式向量,每个多项式的系数从中心二项分布(CBD)中采样。
- 具体操作:生成 \(\eta_1 \times 2\) 个随机比特,计算“1”的数量减去“0”的数量,得到系数值(范围在 \([-\eta_1, \eta_1]\))。
- 例如,若 \(\eta_1 = 3\),则生成 6 个随机比特,统计差值作为系数。
-
误差 \(e\) 的采样:
- 误差向量 \(e\) 的采样方式与 \(s\) 类似,但使用参数 \(\eta_2\)(可能更小)。
- 注意:在 Kyber 中,密钥生成和加密使用不同的误差分布(\(\eta_1\) 和 \(\eta_2\) 可能不同)。
步骤 4:计算公钥 \(t\)
- 核心运算:
- 公钥向量 \(t\) 的计算公式为:
\[ t = A s + e \pmod{q} \]
- 其中乘法是多项式乘法(在环 \(R\) 中),加法是系数模 \(q\) 加法。
- 数值压缩:
- 为减少公钥尺寸,\(t\) 的系数可能会被压缩(例如,保留高位比特)。在解密时需通过压缩损失进行近似重建。
- Kyber 定义压缩函数 \(\text{Compress}(x, d)\) 保留 \(d\) 个比特,例如 \(d=10\) 时压缩 \(3329\) 到 \(1024\) 范围内。
步骤 5:最终密钥格式
- 私钥:\(s\)(原始多项式向量)。
- 公钥:\((\rho, t)\),其中 \(\rho\) 是生成 \(A\) 的种子,\(t\) 是压缩后的公钥向量。
- 存储时,公钥和私钥会编码为字节序列(涉及多项式系数的编码规范,如位打包)。
步骤 6:安全性关键点
- MLWE 问题:从 \((A, t)\) 恢复 \(s\) 或 \(e\) 是困难的,即使攻击者知道 \(A\) 的生成方式。
- 随机预言模型:\(\text{ExpandA}\) 被设计为随机预言机,确保 \(A\) 的伪随机性。
- 误差分布:中心二项分布提供高斯近似的安全性,同时避免高精度采样开销。
总结
Kyber 的密钥生成过程通过伪随机矩阵生成、误差注入和线性运算,将 MLWE 问题的实例转化为公钥-私钥对。其设计兼顾了效率(种子压缩、简化采样)与后量子安全性,成为 NIST 后量子密码标准化中的首选 KEM 方案。