模格密码学数学基础
本文面向具有大学数学基础(线性代数、抽象代数初等知识)的读者,系统讲解 ML-DSA、ML-KEM 等 CRYSTALS 系列算法背后的数学基础。我们会从最基本的整数模运算出发,逐步构建到模格问题(Module-LWE 和 Module-SIS),并解释为什么这些问题对量子计算机也是困难的。
模运算是密码学的基础。如果理解了时钟上的时间计算(13 点就是下午 1 点),你就理解了模运算。
给定正整数 q,模 q 的余数就是做除法后留下的余数。我们用 Zq 表示集合 {0, 1, 2, ..., q−1},其中的加法和乘法都要对 q 取模:
加法:a + b mod q(先加起来,再取余数)
乘法:a × b mod q(先乘起来,再取余数)
例:令 q = 7
3 + 5 = 8 → 8 mod 7 = 1
3 × 5 = 15 → 15 mod 7 = 1
−3 mod 7 = 4(负数也有对应的模表示)
在格密码学中,我们经常用中心化的方式表示模 q 的数。即把 {0, 1, ..., q−1} 重新表示为关于 0 对称的数:
如果 q 是偶数:{-q/2, ..., -1, 0, 1, ..., q/2−1},以及 q/2(任意归属一边)
比如 q = 7 时,中心化表示为 {-3, -2, -1, 0, 1, 2, 3}。这种表示让我们可以谈论一个模 q 的数有多「小」——离 0 越近越「小」。
一个多项式就是形如 a0 + a1x + a2x2 + ... + anxn 的表达式。在大学数学里,你可能学过实系数多项式(如 3x2 + 2x − 1)。这里我们做两件事:
- 把系数限制在 Zq 中(而不是实数)
- 用 x256 + 1 = 0 这个规则来「截断」多项式
就像整数模运算中我们做除法取余数一样,多项式也可以做除法取余数。我们选的「模」是 xn + 1(在 ML-DSA 中 n = 256):
规则:x256 = −1
所以 x256 可以替换成 −1:
x256 → −1
x257 = x · x256 → −x
x258 = x2 · x256 → −x2
x512 = (x256)2 → (−1)2 = 1
一般地:xk mod (x256 + 1) = (−1)⌊k/256⌋ · xk mod 256
这意味着任何多项式在模 x256 + 1 之后,最高次只有 255。所以我们的多项式环中每个元素恰好有 256 个系数,可以看作一个 256 维的向量。
两个多项式相乘后取模:
这种乘法在数学上叫做负循环卷积(negacyclic convolution)。它有一个非常好的性质:可以用数论变换(NTT)来加速计算,就像用 FFT 加速普通卷积一样。这使得 ML-DSA 的多项式乘法极其高效。
现在我们把模运算和多项式放在一起,定义 CRYSTALS 方案工作的数学世界:
这个记号的意思是:
- 所有系数在 Zq 中(即 0 到 q−1 之间的整数)
- 多项式最高 255 次(因为 x256 = −1 截断了)
- 每个元素恰好有 256 个系数 → 可以看作 256 维向量
Rq 中的元素可以做加法(系数逐一相加,mod q)和乘法(多项式乘法,mod x256+1,系数 mod q)。这两个运算让 Rq 成为一个环(Ring)——满足你在抽象代数课上学过的那些性质(结合律、分配律、有零元和单位元等)。
就像实数有向量 (a, b, c) 和矩阵一样,Rq 上也有向量和矩阵。一个 Rql 中的向量包含 l 个 Rq 元素(即 l 个多项式),总共有 l × 256 个整数系数。
Rq 上的矩阵-向量乘法和普通线性代数几乎一模一样——只是每个元素从「实数」换成了「Rq 中的多项式」,加法和乘法换成了 Rq 中的运算。
Rq 中的一个元素被称为「短」的,如果它的所有系数都很小(在中心化表示中接近 0)。这是格密码学最核心的概念之一。
无穷范数:‖a‖∞ = max |ai|(最大系数的绝对值)
「短」通常指 ‖a‖∞ ≤ η(η 是一个小整数,如 2 或 4)
例(ML-DSA-65):私钥 s₁ 的每个系数 ∈ {−4, −3, ..., 0, ..., 3, 4}
而 q ≈ 200 万,所以私钥系数只用了 q 的万分之几
格是 n 维空间中一组等间距排列的点。形式地说,给定 k 个线性无关的向量 b1, b2, ..., bk(称为基),它们生成的格是:
即所有整数线性组合构成的点集。
- 同一个格可以有不同的基:比如上面的格也可以用 b1' = (3, 4), b2' = (−1, −2) 作为基——它们生成完全相同的格点集。
- 短基 vs 长基:有些基的向量很短、几乎正交(像方格纸);有些基的向量很长、很倾斜。从「长基」找到「短基」是一个非常困难的问题。
- 最小距离:格中离原点最近的非零格点的距离,记为 λ1。这个量刻画了格的「密度」。
「模格」是格概念在多项式环上的推广。理解它的关键是:Rq 中的向量-矩阵运算等价于一个非常高维的格上的运算。
Rq 中的一个多项式有 256 个系数,可以看作 256 维的整数向量(系数对 q 取模)。Rql 中的一个向量有 l 个多项式,总共 l × 256 个系数,即一个 l×256 维的向量。
所以 Rq 上的一个 k×l 矩阵 Â 对应一个 (k×256) × (l×256) 的整数矩阵(把每个多项式「展开」成 256 个系数)。这个整数矩阵生成的格就是一个模格。
理论上,直接用高维整数格也能构造密码方案。但模格有一个巨大的实用优势:紧凑性。
- 普通格方案需要存储完整的高维矩阵(几十 KB 到几百 KB)
- 模格方案只需要存储一个 Rq 上的小矩阵(几 KB)——因为多项式环的代数结构提供了大量「隐式的维度」
简而言之:模格让你用「少」的参数获得「多」的维度。这就是 ML-DSA 的公钥只要 ~2 KB 的原因。
SIS(Short Integer Solution)是格密码学的两个核心难题之一。它是构造签名方案的安全基础。
输入:一个随机矩阵 A ∈ Zq(m×n),一个上界 B
目标:找一个非零的「短」向量 z ∈ Zqn,使得:
A · z ≡ 0 (mod q),且 ‖z‖ ≤ B
简单说:找一个非零的短向量 z,使得 Az 等于零(模 q)。
在 ML-DSA 中,伪造签名本质上需要解决 SIS:攻击者需要找一个短向量 z 使得 ·z 等于某个特定值。由于  是随机的,这等价于一般的 SIS 问题。而 SIS 已被证明至少和最坏情况下的格问题一样难(worst-case to average-case 归约),这是格密码学的一个里程碑式结果。
LWE(Learning With Errors)是格密码学的另一个核心难题。它是构造加密/密钥交换方案(如 ML-KEM)的安全基础,也用于保证 ML-DSA 的签名不泄露私钥。
输入:若干对 (ai, bi),其中 ai ← Zqn 是随机向量,
bi = ⟨ai, s⟩ + ei (mod q),ei 是一个小随机「误差」
目标:恢复出秘密向量 s
简单说:给定一组「带噪声的线性方程」,求未知数 s。
普通线性方程组:Ax = b,已知 A 和 b,求 x。高斯消元法可以在多项式时间内求解。
LWE:Ax + e = b,已知 A 和 b,求 x。e 是未知的小误差。高斯消元会让误差「传染」到所有方程——消掉一个变量的同时,那个变量的误差会乘上系数加到其他方程中,很快所有方程都变得不可靠。
这就像做实验测量:如果每次测量都有微小的误差,经过多步计算后,累积误差可能完全淹没真实值。在低维情况下这还能处理,但在几千维的空间中,这是一个公认的困难问题。
| 名称 | 描述 | 困难性 |
|---|---|---|
| Search-LWE | 给定 (A, b = As + e),求出 s | 恢复秘密 |
| Decision-LWE | 区分 (A, As + e) 和 (A, u),其中 u 是随机数 | 区分「带噪声的方程」和「随机数」 |
两个版本已知是等价的:如果你无法区分 (A, As+e) 和随机数,那你当然也无法恢复 s。Decision-LWE 在构造加密方案时特别有用——密文和随机数不可区分,就意味着密文不泄露任何信息。
Module-SIS 和 Module-LWE 就是把 SIS/LWE 从整数矩阵推广到多项式环 Rq 上的矩阵。
输入:随机矩阵 Â ∈ Rq(k×l),上界 B
目标:找非零短向量 z ∈ Rql,使得 Â · z = 0(在 Rq 中)
与普通 SIS 的唯一区别:矩阵和向量的「元素」从整数变成了 Rq 中的多项式
输入:若干对 (â, b = â·ŝ + ê),其中 â ← Rqk,ê 是短「误差」向量
目标:恢复秘密 ŝ ∈ Rql
与普通 LWE 的唯一区别:运算从整数模 q 变成了 Rq 中的运算
从一般到特殊,格问题形成了一个困难性层级:
SIS 和 LWE 的困难性有非常强的理论保证:
- 最坏情况归约(Ajtai 1996;Regev 2005):解决随机实例的 SIS/LWE 至少和解决最坏情况(即最难的实例)的格问题一样难。这在密码学中是非常罕见的——大多数密码假设只保证平均情况安全性。
- NP-hard 关系:格上的最近向量问题(CVP)已知是 NP-hard 的。虽然 SIS/LWE 不直接等于 CVP,但它们是 CVP 的「近似版本」,而且近似因子足够小,使得所有已知算法都不可行。
这是后量子密码学最关键的点。目前已知的量子算法对格问题的加速很有限:
| 问题 | 经典最优算法 | 量子最优算法 | 量子加速 |
|---|---|---|---|
| 大整数分解 | 亚指数(2n1/3) | 多项式(Shor 算法) | 致命 |
| 椭圆曲线离散对数 | 亚指数 | 多项式(Shor 算法) | 致命 |
| SIS / LWE | 指数(2cn) | 指数(2c'n,c'<c) | 仅多项式加速 |
量子算法(主要是 Grover 搜索及其变体)只能把格问题的指数系数从 c 降低到 c'(比如从 2n/2 降到 2n/2.5),仍然是指数级的。只需适当增大参数(比如增大矩阵维度或模数),就能完全弥补量子加速。
对 ML-DSA-65 的最佳已知攻击(BKZ 格基归约)的复杂度估计:
| 攻击方法 | 经典复杂度 | 量子复杂度 |
|---|---|---|
| 暴力搜索 | 2256 | 2128(Grover) |
| 格基归约(BKZ) | ~2180 | ~2160 |
| 混合攻击(组合+格归约) | ~2175 | ~2155 |
所有这些数字都远远超出了可计算范围(2100 已经是宇宙级别的不可行)。而且这些估计还偏保守——实际攻击可能更难。
现在让我们把数学和具体算法联系起来:
ML-DSA 的参数是根据安全证明和已知最优攻击来选取的:
- 确定目标安全级别(如 NIST Level 3 = 2192 经典安全)
- 计算当前最优攻击(BKZ 格归约)在该参数下的复杂度
- 确保复杂度 ≥ 目标安全级别
- 适当增加裕度以应对未来可能的算法改进
这就是为什么 ML-DSA-65 的矩阵是 6×5 而不是 4×4——更大的矩阵给更大的安全裕度,代价是更大的公钥和签名。
- Ajtai, M. (1996). "Generating Hard Instances of Lattice Problems". STOC '96, pp. 99-108.
- Regev, O. (2005). "On Lattices, Learning with Errors, Random Linear Codes, and Cryptography". STOC '05, pp. 84-93.
- Lyubashevsky, V., Peikert, C., Regev, O. (2010). "On Ideal Lattices and Learning with Errors over Rings". EUROCRYPT 2010, LNCS 6110, pp. 1-23.
- Langlois, A., Stehlé, D. (2015). "Worst-case to Average-case Reductions for Module Lattices". Designs, Codes and Cryptography 75(3), pp. 565-599.
- Bai, S., Ducas, L., et al. (2018). "CRYSTALS-Dilithium: A Lattice-Based Digital Signature Scheme". TCHES 2018.
- NIST (2024). "Module-Lattice-Based Digital Signature Standard". FIPS 204.
- NIST (2024). "Module-Lattice-Based Key-Encapsulation Mechanism Standard". FIPS 203.
- Peikert, C. (2016). "A Decade of Lattice Cryptography". Foundations and Trends in Theoretical Computer Science 10(4), pp. 283-424.