后量子 KEM 方案:Kyber
参考文献:
- Bos J, Ducas L, Kiltz E, et al. CRYSTALS-Kyber: a CCA-secure module-lattice-based KEM[C]//2018 IEEE European Symposium on Security and Privacy (EuroS&P). IEEE, 2018: 353-367.
- Avanzi R, Bos J, Ducas L, et al. Crystals-kyber[J]. NIST, Tech. Rep, 2017.
- Brakerski Z, Gentry C, Vaikuntanathan V. (Leveled) fully homomorphic encryption without bootstrapping[J]. ACM Transactions on Computation Theory (TOCT), 2014, 6(3): 1-36.
文章目录
- Kyber
- Module-LWE
- IND-CPA PKE
- IND-CCA KEM
- KEY EXCHANGE
- 正确性分析
- 实例化
Kyber
Module-LWE
Kyber 基于 MLWE 问题,成为了唯一进入 NIST PQC 第 3 轮的 KEM 方案(一共 4 个方案,另外 3 个都是签名,其中 2 个也基于 MLWE,另外 1 个基于 Hash)。
MLWE 最早作为标准 LWE 与 Ring-LWE 的扩展 General LWE 出现在 BGV 方案中:分圆多项式环记做 Rq=Zq[X]/(Xn+1)R_q = Z_q[X]/(X^n+1)Rq=Zq[X]/(Xn+1),随机采样秘密向量 s∈Rqks \in R_q^ks∈Rqk,均匀随机采样 ai∈U(Rqk)a_i \in U(R_q^k)ai∈U(Rqk),计算 bi=aiTs+ei∈Rqb_i=a_i^Ts+e_i \in R_qbi=aiTs+ei∈Rq,输出 mmm 对样本 (ai,bi)∈Rqk×Rq(a_i,b_i) \in R_q^k \times R_q(ai,bi)∈Rqk×Rq
基于 MLWE 问题的密码方案,需要使得 m=km=km=k 以保证私钥的安全性。因此,按行排列,mmm 个 MLWE 样本可以写作 (A,b)∈Rqk×k×Rqk(A,b) \in R_q^{k \times k} \times R_q^k(A,b)∈Rqk×k×Rqk,其中 b=As+eb=As+eb=As+e
使用 MLWE 的一个优势是:改变安全级别时,只需调整矩阵规模 kkk 以及噪声规模 η\etaη,而环 RqR_qRq 不需要改变,因此可以代码复用,有利于软硬件优化。
IND-CPA PKE
Kyber 使用 Newhope-Simple 的思路,通过压缩密钥和密文来减小规模。对于 x∈Zqx \in \mathbb Z_qx∈Zq,进行 ddd 比特离散化:
Compress(x,d):=⌊2dq⋅x⌉(mod2d)Decompress(x,d):=⌊q2d⋅x⌉(modq)\begin{aligned} \text{Compress}(x,d) &:= \left\lfloor \dfrac{2^d}{q} \cdot x \right\rceil \pmod{2^d}\\ \text{Decompress}(x,d) &:= \left\lfloor \dfrac{q}{2^d} \cdot x \right\rceil \pmod{q}\\ \end{aligned} Compress(x,d)Decompress(x,d):=⌊q2d⋅x⌉(mod2d):=⌊2dq⋅x⌉(modq)
这可以被视为FHE中的“模切换”技术,引入了少量的(均匀)舍入噪声。
Kyber 的 PKE 方案与 Newhope 和 LAC 的几乎完全一样:
IND-CCA KEM
同样的,Kyber 也是用 Fujisaki–Okamoto transform 得到 CCA 安全的 KEM:
当解密错误时,并不输出 ⊥∉{0,1}256\perp \not \in \{0,1\}^{256}⊥∈{0,1}256,而是输出伪随机的 H(z,c)H(z,c)H(z,c),“隐式拒绝”。
KEY EXCHANGE
无身份认证的 KE 协议:
单方面身份认证的 KE 协议:
双向身份认证的 KE 协议:
正确性分析
在 CPA PKE 中,公钥的第二分量包含中心二项分布噪声和舍入噪声,
b=Decompress(Compress(A⋅s+e,d0),d0)=As+e+r0\begin{aligned} b &= \text{Decompress}(\text{Compress}(A \cdot s+e,d_0),d_0)\\ &= As+e+r_0\\ \end{aligned} b=Decompress(Compress(A⋅s+e,d0),d0)=As+e+r0
其中 s←RΨη1kns \leftarrow_R \Psi_{\eta_1}^{kn}s←RΨη1kn,e←RΨη2kne \leftarrow_R \Psi_{\eta_2}^{kn}e←RΨη2kn。在压缩时简单丢弃了低位比特,因此可以近似地认为舍入噪声是均匀的。令 l=⌈logq⌉l = \lceil \log q \rceill=⌈logq⌉,那么 r0←RU(R2l−d0k)r_0 \leftarrow_R U(R_{2^{l-d_0}}^k)r0←RU(R2l−d0k)
类似地,密文的第一分量中的噪声为:
c1=Decompress(Compress(AT⋅s′+e′,d1),d1)=AT⋅s′+e′+r1\begin{aligned} c_1 &= \text{Decompress}(\text{Compress}(A^T \cdot s'+e',d_1),d_1)\\ &= A^T \cdot s'+e'+r_1\\ \end{aligned} c1=Decompress(Compress(AT⋅s′+e′,d1),d1)=AT⋅s′+e′+r1
其中 s′←RΨη1kns' \leftarrow_R \Psi_{\eta_1}^{kn}s′←RΨη1kn,e′←RΨη2kne' \leftarrow_R \Psi_{\eta_2}^{kn}e′←RΨη2kn,r1←RU(R2l−d1k)r_1 \leftarrow_R U(R_{2^{l-d_1}}^k)r1←RU(R2l−d1k)
对于密文的第二分量,可以计算出它携带的噪声项:
c2=Decompress(Compress(bT⋅s′+e′′+Encode(m),d2),d2)=bT⋅s′+e′′+Encode(m)+r2=(As)Ts′+eTs′+r0Ts′+e′′+r2+Encode(m)\begin{aligned} c_2 &= \text{Decompress}(\text{Compress}(b^T \cdot s'+e''+ \text{Encode}(m),d_2),d_2)\\ &= b^T \cdot s'+e''+ \text{Encode}(m)+r_2\\ &= (As)^T s' + e^Ts' + r_0^Ts' + e'' + r_2 + \text{Encode}(m)\\ \end{aligned} c2=Decompress(Compress(bT⋅s′+e′′+Encode(m),d2),d2)=bT⋅s′+e′′+Encode(m)+r2=(As)Ts′+eTs′+r0Ts′+e′′+r2+Encode(m)
其中 e′′←RΨη2kne'' \leftarrow_R \Psi_{\eta_2}^{kn}e′′←RΨη2kn,r2←RU(R2l−d2k)r_2 \leftarrow_R U(R_{2^{l-d_2}}^k)r2←RU(R2l−d2k)。
解密步骤是 m←Decode(c2−c1T⋅s)m \leftarrow \text{Decode}(c_2 - c_1^T \cdot s)m←Decode(c2−c1T⋅s),我们可以计算出
c2−c1T⋅s=Encode(m)+(As)Ts′+eTs′+r0Ts′+e′′+r2−sTATs′−sTe′−sTr1=Encode(m)+(e+r0)Ts′−sT(e′+r1)+(e′′+r2)\begin{aligned} c_2 - c_1^T \cdot s =\,\,& \text{Encode}(m) + (As)^T s' + e^Ts' + r_0^Ts' \\ &+ e'' + r_2 - s^TA^Ts' - s^Te' - s^Tr_1\\ =\,\,& \text{Encode}(m) + (e+r_0)^Ts' - s^T(e'+r_1)+(e''+r_2) \end{aligned} c2−c1T⋅s==Encode(m)+(As)Ts′+eTs′+r0Ts′+e′′+r2−sTATs′−sTe′−sTr1Encode(m)+(e+r0)Ts′−sT(e′+r1)+(e′′+r2)
简记 E=∥(e+r0)Ts′−sT(e′+r1)+(e′′+r2)∥∞E = \|(e+r_0)^Ts' - s^T(e'+r_1)+(e''+r_2)\|_\inftyE=∥(e+r0)Ts′−sT(e′+r1)+(e′′+r2)∥∞ 为解密时的累积噪声规模。由于对消息采用了MSB编码方式,所以等式 m=Decode(Encode(m)+e)m=\text{Decode}(\text{Encode}(m)+e)m=Decode(Encode(m)+e) 成立的充要条件是 ∥e∥∞<⌊q/4⌉\|e\|_\infty < \lfloor q/4 \rceil∥e∥∞<⌊q/4⌉。
因此,我们需要选取合适的参数集,使得解密错误率足够小:
Δ:=Pr[E≥⌊q4⌉:(n,k,η1,η2,d0,d1,d2)]\Delta := \Pr\left[ E \ge \left\lfloor \dfrac{q}{4} \right\rceil:\,\, (n,k,\eta_1,\eta_2,d_0,d_1,d_2) \right] Δ:=Pr[E≥⌊4q⌉:(n,k,η1,η2,d0,d1,d2)]
实例化
在第三轮 NIST PQC 文档中,Kyber 的参数选取如下:
由于 q=3329=13×256+1q = 3329 = 13 \times 256+1q=3329=13×256+1,因此在 GF(q)GF(q)GF(q) 中存在 256256256 次本原单位根,从而可以支持 log128=7\log{128}=7log128=7 轮的“不完全的反循环NTT变换”,将环元素 f∈Rqf \in R_qf∈Rq 同构于 128128128 个长度为 222 的小多项式。注意 NTT 实现时采用 Montgomery 算法、 Barrett 算法,进行加速。
用到的对称原语(PRF, XOF, KDF, Hash)采用 FIPS-202 标准(SHA3):