CRYSTALS-Dilithium 后量子数字签名算法中的多项式运算与NTT加速
题目描述
CRYSTALS-Dilithium 是一种基于格的后量子数字签名算法,其安全性依赖于模块格上短整数解问题(MLWE 和 MSIS)的困难性。算法核心操作涉及多项式环 \(\mathbb{Z}_q[X]/(X^n+1)\) 上的乘法、加法及数乘运算,其中 \(n=256\),\(q=8380417\)(一个质数)。由于多项式乘法是计算瓶颈,Dilithium 使用数论变换(NTT) 将多项式乘法复杂度从 \(O(n^2)\) 降至 \(O(n\log n)\),显著提升签名与验证效率。本题要求详细解释 Dilithium 中多项式运算的 NTT 加速原理及具体步骤。
1. 多项式环与 NTT 的适配性
Dilithium 的多项式环为 \(R_q = \mathbb{Z}_q[X]/(X^n+1)\),其中 \(n=256\) 是 2 的幂次,且质数 \(q\) 满足 \(q \equiv 1 \pmod{2n}\),即存在 \(2n\) 次本原单位根。这一性质使得 NTT 可在 \(R_q\) 上直接应用:
- NTT 定义:NTT 是有限域上的离散傅里叶变换(DFT),将多项式 \(f \in R_q\) 从系数表示转换为点值表示。
- 关键性质:在点值表示下,多项式乘法变为逐点乘法(\(O(n)\) 复杂度),再通过逆 NTT 恢复系数表示。
2. NTT 的具体步骤
步骤 1:预计算单位根
在 \(\mathbb{Z}_q\) 中找到一个 \(2n\) 次本原单位根 \(\omega\),满足 \(\omega^{2n} = 1\) 且 \(\omega^k \neq 1\)(对 \(k<2n\))。例如,Dilithium 中 \(\omega\) 可通过枚举找到:
\[\omega = 1753 \quad (\text{验证 } \omega^{512} \equiv 1 \pmod{8380417}) \]
进一步计算 \(n\) 次单位根 \(\psi = \omega^2\),用于加速变换。
步骤 2:正向 NTT(系数 → 点值)
输入多项式 \(f = \sum_{i=0}^{n-1} f_i X^i\) 的系数向量 \([f_0, f_1, ..., f_{n-1}]\)。
- 位反转置换:将系数按二进制位反转顺序重排(例如 \(n=8\) 时,索引 \(0,1,2,3,4,5,6,7\) 变为 \(0,4,2,6,1,5,3,7\))。
- 迭代合并:
- 从长度为 2 的子多项式开始,逐层合并(类似 Cooley-Tukey FFT)。
- 每层合并时,乘以旋转因子 \(\psi^k\)(\(k\) 依赖当前层索引)。
- 最终得到点值表示 \(\hat{f} = [f(\psi^0), f(\psi^1), ..., f(\psi^{n-1})]\)。
伪代码示例(简化):
def ntt(f):
f = bit_reverse(f)
m = 1
while m < n:
for i in range(0, n, 2*m):
for j in range(i, i+m):
t = psi * f[j + m] # psi 为预计算旋转因子
f[j + m] = f[j] - t
f[j] = f[j] + t
m <<= 1
return f
步骤 3:点值乘法
若需计算 \(h = f \cdot g\),直接在点值形式下逐点相乘:
\[\hat{h}_i = \hat{f}_i \cdot \hat{g}_i \pmod{q} \]
复杂度从 \(O(n^2)\) 降至 \(O(n)\)。
步骤 4:逆 NTT(点值 → 系数)
- 对点值向量进行类似正向 NTT 的操作,但使用 \(\psi^{-1}\) 作为旋转因子。
- 最终结果乘以 \(n^{-1} \pmod{q}\)(标量乘法),恢复系数表示。
3. Dilithium 中的优化技巧
- 懒约简(Lazy Reduction):在 NTT 计算中,延迟模运算至必要时,减少模操作次数。
- 合并运算:在签名过程中,将多个多项式乘法合并为一次 NTT,例如同时计算 \(s_1 + c \cdot y\) 和 \(s_2 + c \cdot w\) 的 NTT 形式。
- 避免逆 NTT:部分中间结果可保留为点值形式,直到最终步骤才转换回系数表示。
4. 实例说明(简化场景)
假设 \(n=4\),\(q=17\),单位根 \(\omega=4\)(满足 \(\omega^8=1\))。
- 多项式 \(f = 1 + 2X + 3X^2 + 4X^3\)。
- 正向 NTT 后得到点值:
\[ f(1)=10, \quad f(4)=2, \quad f(16)=14, \quad f(13)=12 \]
- 若与 \(g = 2 + X + X^3\) 相乘,先计算 \(g\) 的点值,再逐点乘得到 \(h\) 的点值,最后逆 NTT 恢复 \(h\)。
5. 安全性关联
NTT 本身不改变算法安全性,但需注意:
- 随机多项式采样(如高斯噪声)必须在系数表示下进行,避免在点值域引入可预测性。
- 签名中的拒绝采样步骤需在系数表示下完成,确保输出分布与噪声独立。
通过上述步骤,Dilithium 利用 NTT 显著提升了多项式运算效率,使其适用于后量子时代的嵌入式设备与高速网络场景。