CRYSTALS-Kyber 后量子密钥封装机制
字数 3527 2025-10-30 08:32:21
CRYSTALS-Kyber 后量子密钥封装机制
题目描述:请解释后量子密码学中的 CRYSTALS-Kyber 密钥封装机制(KEM)是如何工作的。请详细说明其核心数学问题(模块化格上的带误差学习问题,MLWE)、密钥生成、封装和解封装的完整过程,并解释其为何能抵抗量子计算机的攻击。
解题过程:
Kyber 是一种基于格的、被 NIST 选为标准化算法的后量子密钥封装机制。其安全性依赖于模块化格上带误差学习问题(Module Learning With Errors, MLWE)的困难性。
第一步:理解核心数学基础——MLWE 问题
- 基本概念:MLWE 是 LWE(带误差学习问题)的扩展。在一个 MLWE 实例中,我们工作在环 \(R_q = \mathbb{Z}_q[X] / (X^n + 1)\),其中 \(n\) 是 2 的幂次(如 256),\(q\) 是一个素数模数。环中的元素是次数小于 \(n\) 的多项式,系数在 \(\mathbb{Z}_q\) 中。
- 问题描述:给定一个由均匀随机多项式向量 \(\mathbf{A}\)(公钥的一部分)组成的矩阵,和一个向量 \(\mathbf{t} = \mathbf{A} \mathbf{s} + \mathbf{e}\)(公钥的另一部分),其中 \(\mathbf{s}\) 和 \(\mathbf{e}\) 是包含“小”系数(从某个特定错误分布中抽取)的秘密向量。MLWE 问题是指,从 \((\mathbf{A}, \mathbf{t})\) 中恢复出秘密 \(\mathbf{s}\) 或 \(\mathbf{e}\) 是计算上不可行的。即使对于量子计算机,目前也没有已知的有效算法。
第二步:Kyber 的密钥生成 (KeyGen)
密钥生成的目的是产生一个公私钥对 (pk, sk)。
- 生成随机矩阵 A:采样一个在环 \(R_q\) 上、维度为 \(k \times k\)(例如 Kyber512 中 k=2)的随机矩阵 \(\mathbf{A}\)。这个矩阵是公开参数的一部分,或者由种子 deterministically 生成。
- 生成秘密和误差向量:
- 采样一个秘密向量 \(\mathbf{s}\),其元素是从一个中心二项分布(Centered Binomial Distribution)中抽取的小多项式。这个分布只产生系数较小的多项式,是安全性的关键。
- 采样一个误差向量 \(\mathbf{e}\),其元素也来自同样的中心二项分布。
- 计算公钥:计算向量 \(\mathbf{t} = \mathbf{A} \mathbf{s} + \mathbf{e}\)。这里的加法和乘法都是在环 \(R_q\) 上进行的。
- 输出密钥对:
- 公钥
pk:由压缩后的 \(\mathbf{A}\)(或其种子)和压缩后的 \(\mathbf{t}\) 组成。压缩是为了减少公钥尺寸。 - 私钥
sk:主要是秘密向量 \(\mathbf{s}\)。此外,为了安全性和效率,sk通常还会包含pk和一个随机种子等。
- 公钥
第三步:Kyber 的封装 (Encapsulate)
封装的目的是发送者(Bob)使用接收者(Alice)的公钥 pk,来生成一个共享秘密 K 和一个封装(或称为密文)c,并将 c 发送给 Alice。
- 解压公钥:从 Alice 的公钥
pk中恢复出矩阵 \(\mathbf{A}\) 和向量 \(\mathbf{t}\)。 - 生成临时秘密:采样一个新的、一次性的临时秘密向量 \(\mathbf{r}\)(其元素也来自中心二项分布)和一个新的临时误差向量 \(\mathbf{e_1}\)。
- 生成密文第一部分
u:计算 \(\mathbf{u} = \mathbf{A}^T \mathbf{r} + \mathbf{e_1}\)。(这里 \(\mathbf{A}^T\) 是 \(\mathbf{A}\) 的转置)。 - 生成临时误差标量:采样一个新的误差标量 \(e_2\)(一个小多项式)。
- 生成共享秘密和密文第二部分
v:- 首先,计算一个中间值 \(\mathbf{t}^T \mathbf{r}\)。
- 然后,将要封装的消息
m(一个比特串,例如是一个随机数)编码为环上的一个元素。 - 计算 \(v = \mathbf{t}^T \mathbf{r} + e_2 + m\)。
- 最后,使用一个密钥派生函数 KDF,从
m派生出最终的共享秘密K。
- 压缩与输出:将向量 \(\mathbf{u}\) 和标量 \(v\) 进行压缩以减小密文尺寸,得到最终的密文
c = Compress(u, v)。输出(K, c),Bob 保存K,发送c给 Alice。
第四步:Kyber 的解封装 (Decapsulate)
解封装的目的是接收者(Alice)使用自己的私钥 sk 对收到的密文 c 进行解密,恢复出与 Bob 相同的共享秘密 K。
- 解压密文:从收到的密文
c中解压出 \(\mathbf{u}\) 和 \(v\)。 - 近似恢复消息
m':利用私钥中的秘密向量 \(\mathbf{s}\),计算 \(m' = v - \mathbf{s}^T \mathbf{u}\)。- 让我们展开这个计算:
\(m' = (\mathbf{t}^T \mathbf{r} + e_2 + m) - \mathbf{s}^T (\mathbf{A}^T \mathbf{r} + \mathbf{e_1})\) - 代入 \(\mathbf{t} = \mathbf{A} \mathbf{s} + \mathbf{e}\):
\(m' = ((\mathbf{A} \mathbf{s} + \mathbf{e})^T \mathbf{r} + e_2 + m) - \mathbf{s}^T (\mathbf{A}^T \mathbf{r} + \mathbf{e_1})\)
\(m' = \mathbf{s}^T \mathbf{A}^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + e_2 + m - \mathbf{s}^T \mathbf{A}^T \mathbf{r} - \mathbf{s}^T \mathbf{e_1}\)
\(m' = m + (\mathbf{e}^T \mathbf{r} + e_2 - \mathbf{s}^T \mathbf{e_1})\) - 可以看到,
m'等于原始消息m加上一个误差项 \(\mathbf{e}^T \mathbf{r} + e_2 - \mathbf{s}^T \mathbf{e_1}\)。由于 \(\mathbf{s}, \mathbf{e}, \mathbf{r}, \mathbf{e_1}, e_2\) 都是“小”的,这个误差项的整体范数(大小)也被控制得很小,不会影响从m'中正确解码出m。
- 让我们展开这个计算:
- 解码消息:通过对 \(m'\) 进行适当的取模和舍入操作,可以准确地恢复出原始的比特串消息
m。 - 重新计算并验证共享秘密:
- 使用和封装步骤中完全一样的 KDF,从恢复出的
m派生出共享秘密K。 - Kyber 的解封装算法通常还会利用私钥中的信息(如公钥
pk)来重新模拟封装过程,以验证收到的密文c是否是有效的(即是否由正确的公钥产生),这提供了抵抗选择密文攻击(CCA)的安全性。
- 使用和封装步骤中完全一样的 KDF,从恢复出的
总结:为何能抵抗量子计算机攻击
Kyber 的安全性核心在于 MLWE 问题的困难性。攻击者即使截获了公钥 (A, t) 和密文 (u, v),他们看到的都是一些被随机小误差干扰过的线性关系。从这些“嘈杂”的信息中分离出秘密值,等价于解决 MLWE 问题。目前,无论是经典计算机还是已知的量子算法(如 Shor 算法),对于结构良好的格问题(如 MLWE)都没有亚指数时间的解法。因此,Kyber 被认为能够抵御量子计算机的攻击,是后量子密码学的有力候选者。