<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on kenji.blog</title><link>http://kenji.blog/zh-cn/categories/security/</link><description>Recent content in Security on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 21:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-cn/categories/security/index.xml" rel="self" type="application/rss+xml"/><item><title>格密码（Lattice-based cryptography）的数学直觉</title><link>http://kenji.blog/zh-cn/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post 格密码（Lattice-based cryptography）的数学直觉" />&lt;h1 id="1-引言后量子密码pqc的黎明与格密码的崛起">1. 引言：后量子密码（PQC）的黎明与格密码的崛起
&lt;/h1>&lt;p>支撑现代社会数字基础设施的是以RSA密码和椭圆曲线密码（ECC）为首的公钥密码技术。这些密码方案的安全性建立在“整数分解问题”或“离散对数问题”等被认为使用传统经典计算机无法高效求解（需要指数级时间）的数学难题之上。&lt;/p>
&lt;p>然而，彼得·秀尔（Peter Shor）在1994年提出的“Shor算法”在密码学界引起了轩然大波。该算法在数学上证明了，一旦大规模量子计算机问世，便能在多项式时间内解决整数分解问题和离散对数问题。这意味着目前被广泛使用的公钥密码在未来将变得完全可以被破解。&lt;/p>
&lt;p>为了应对这种“量子计算机的威胁（Quantum Threat）”，亟需研究即使使用量子计算机也难以破解的新型密码方案。这就是被称为“后量子密码（Post-Quantum Cryptography: PQC）”或“抗量子计算密码”的领域。&lt;/p>
&lt;p>PQC有几种有力的候选方案。包括基于哈希的密码、基于编码的密码、多变量多项式密码、同源密码等，其中目前最受瞩目、也是NIST（美国国家标准与技术研究院）PQC标准化进程核心的便是“格密码（Lattice-based cryptography）”。与其他方案相比，格密码的加解密处理速度非常快，而且具有被称为“从最坏情况复杂度（Worst-case complexity）归约到平均情况复杂度（Average-case complexity）”的特性，在密码学理论中拥有极强的安全性证明。&lt;/p>
&lt;p>本文将从格密码的基础——“格（Lattice）”的数学定义出发，深入剖析格上的困难问题：SVP（最短向量问题）和CVP（最近向量问题），以及作为现代格密码心脏的“LWE问题（Learning With Errors）”，并结合数学公式、几何直觉以及具体的数值计算例子，进行透彻的讲解。&lt;/p>
&lt;h1 id="2-格lattice的数学定义与几何直觉">2. 格（Lattice）的数学定义与几何直觉
&lt;/h1>&lt;h2 id="21-向量空间与格">2.1 向量空间与格
&lt;/h2>&lt;p>在数学中，“格（Lattice）”是指在$n$维实向量空间 $\mathbb{R}^n$ 内规则排列的离散点的集合。它与线性代数中学习的向量空间（Vector Space）相似，但存在决定性的区别。向量空间是由基向量通过“实数系数”的线性组合表示的连续空间，而格则是通过基向量的“整数系数”的线性组合表示的离散空间。&lt;/p>
&lt;p>让我们给出严谨的数学定义。考虑在$m$维实向量空间 $\mathbb{R}^m$ 中的 $n$ 个（$n \le m$）线性无关向量 $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$。将这些向量作为列向量构成的矩阵记为 $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$。这个 $B$ 被称为格的“基（Basis）”。&lt;/p>
&lt;p>由这个基 $B$ 生成的格 $\mathcal{L}(B)$ 定义如下：&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>这里的重点是，系数 $x_i$ 被限定为整数 $\mathbb{Z}$，而不是实数 $\mathbb{R}$。因此，它并不是空间中无限存在的连续点，而是形成了像等距排列的交叉点一样的“离散点集”。&lt;/p>
&lt;h2 id="22-几何学意象">2.2 几何学意象
&lt;/h2>&lt;p>以二维平面 $\mathbb{R}^2$ 为例。如果我们选择基向量 $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ 和 $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$，由它们生成的格就是坐标平面上所有整数坐标 $(x, y) \in \mathbb{Z}^2$ 的集合。这是最简单的“方格”。&lt;/p>
&lt;p>然而，格并不总是正交的。例如，考虑基向量 $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$ 和 $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$，它们生成的点就像是倾斜扭曲的网格的交点。&lt;/p>
&lt;h2 id="23-基的非唯一性与幺模变换">2.3 基的非唯一性与幺模变换
&lt;/h2>&lt;p>有一个涉及格密码安全性根基的重要性质。那就是“生成同一个格的基有无数个”。&lt;/p>
&lt;p>例如，刚才由 $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$ 生成的 $\mathbb{Z}^2$ 格，即使使用 $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$ 这组基，也会生成完全相同的格 $\mathbb{Z}^2$。&lt;/p>
&lt;p>某个基 $B$ 和另一个基 $B'$ 生成相同格的充要条件是，存在一个整数元素构成的矩阵 $U \in \mathbb{Z}^{n \times n}$，其行列式为 $\det(U) = \pm 1$，并且可以表示为：
&lt;/p>
$$ B' = B U $$
&lt;p>
这样的矩阵 $U$ 被称为“幺模矩阵（Unimodular matrix）”。&lt;/p>
&lt;p>在密码学应用中，基本思路是使用“好基（接近正交且由短向量组成的基）”作为私钥，而使用“坏基（相互极度倾斜且由非常长的向量组成的基）”作为公钥。当维度较高时，从坏基计算出好基将变得非常困难。这就是格密码的基本直觉。&lt;/p>
&lt;h1 id="3-格上的计算困难问题">3. 格上的计算困难问题
&lt;/h1>&lt;p>格密码的安全性依赖于求解格上特定数学问题的困难性。这里介绍最基本也是最著名的两个问题。&lt;/p>
&lt;h2 id="31-最短向量问题shortest-vector-problem-svp">3.1 最短向量问题（Shortest Vector Problem: SVP）
&lt;/h2>&lt;p>SVP是格理论中最经典且最著名的问题。&lt;/p>
&lt;p>&lt;strong>定义（SVP）:&lt;/strong>
给定任意一个格的基 $B$，找到该格 $\mathcal{L}(B)$ 中除零向量以外欧几里得范数（长度）最小的向量 $\mathbf{v}$。&lt;/p>
&lt;p>用数学公式表示，即寻找使 $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$ 成立的 $\mathbf{v}$。这个最小长度记作 $\lambda_1(\mathcal{L})$，被称为“格的第一连续极小值（First successive minimum）”。&lt;/p>
&lt;p>在二维或三维的低维度下，我们可以通过画图用肉眼找到最短向量。或者可以使用高斯格基约化算法等高效地求解。但是，当维度 $n$ 达到数百至数千这样的高维时，已知严格求解SVP是NP困难的。&lt;/p>
&lt;p>在实际密码中，通常不寻找严格的最短向量，而是寻找“近似短的向量”，即近似SVP（$\gamma$-SVP）。当近似系数 $\gamma$ 为多项式大小时，这个问题仍然被认为是非常困难的。&lt;/p>
&lt;h2 id="32-最近向量问题closest-vector-problem-cvp">3.2 最近向量问题（Closest Vector Problem: CVP）
&lt;/h2>&lt;p>CVP在格密码中也是极其重要的问题。&lt;/p>
&lt;p>&lt;strong>定义（CVP）:&lt;/strong>
给定任意格基 $B$ 和空间内任意目标向量 $\mathbf{t} \in \mathbb{R}^m$（不一定是格点），在格点中找到距离 $\mathbf{t}$ 最近的格点 $\mathbf{v} \in \mathcal{L}(B)$。&lt;/p>
&lt;p>用数学公式表示，即寻找使 $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$ 成立的格点 $\mathbf{v}$。&lt;/p>
&lt;p>与SVP一样，CVP在高维空间中也是NP困难的。从密码学应用的角度来看，后文将提到的LWE问题与CVP的特殊变种（Bounded Distance Decoding: BDD）有着密切的关系。&lt;/p>
&lt;h2 id="33-为什么高维情况下无法求解lll与bkz的极限">3.3 为什么高维情况下无法求解？（LLL与BKZ的极限）
&lt;/h2>&lt;p>作为求解高维格问题的著名算法，有LLL算法（Lenstra-Lenstra-Lovász algorithm）。LLL算法能在多项式时间内运行，可以将格基约化（Reduction）到某种程度上的“好基”。然而，LLL算法所能找到的最短向量，其长度与真实最短向量相比，具有指数级（$2^{\mathcal{O}(n)}$）的近似系数，因此不足以破解密码的安全性。&lt;/p>
&lt;p>如果使用基于LLL改进的更强力的基约化算法（如BKZ，Block Korkine-Zolotarev算法），可以找到更短的向量，但其计算量会随着块大小呈指数级增长。在格密码中，就是通过估算这种BKZ算法的运行时间来决定安全参数（例如维度 $n$ 的大小）。在目前的PQC标准参数中，维度 $n$ 通常选择在500到1000以上的值，据称即使使用超级计算机或未来的量子计算机，破解所需的时间也将超过宇宙的年龄。&lt;/p>
&lt;h1 id="4-lwe问题learning-with-errors的数学公式化">4. LWE问题（Learning With Errors）的数学公式化
&lt;/h1>&lt;p>大部分现代格密码都基于Oded Regev在2005年提出的“LWE问题（Learning With Errors）”。LWE问题的美妙之处在于其公式化的简洁性，以及它拥有“从最坏情况复杂度到平均情况复杂度的归约”这一强大的数学证明。&lt;/p>
&lt;h2 id="41-无噪声的线性方程组">4.1 无噪声的线性方程组
&lt;/h2>&lt;p>为了理解LWE问题，我们先来考虑一个没有噪声的简单线性方程组。
假设有一个未知的秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$（各个分量是 $0$ 到 $q-1$ 的整数）。这里 $q$ 是一个素数。&lt;/p>
&lt;p>选择随机的系数向量 $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$，并计算它们与秘密向量 $\mathbf{s}$ 的内积对 $q$ 取模的结果：
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>如果给出足够数量（$n$个以上）的 $(\mathbf{a}_i, b_i)$ 数对，我们就可以使用线性代数中的“高斯消元法（Gaussian elimination）”轻松恢复出秘密向量 $\mathbf{s}$。这是一个可以在多项式时间内轻松求解的问题。&lt;/p>
&lt;h2 id="42-lwe问题的定义加入噪声">4.2 LWE问题的定义：加入噪声
&lt;/h2>&lt;p>那么，如果在该问题中加入微小的“噪声（误差）”会怎样呢？
这就是LWE问题的本质。&lt;/p>
&lt;p>对于未知的秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$，我们在每个方程的结果中加入一个小的误差 $e_i \in \mathbb{Z}_q$。
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>在这里，$e_i$ 是均值为0，标准差相对较小（例如从类似正态分布的离散高斯分布中选取）的小整数值。
我们所得到的信息是随机向量 $\mathbf{a}_i$ 与加上误差计算得出的 $b_i$ 组成的数对列表：
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>用矩阵表示这个过程会非常简洁。
使用随机矩阵 $A \in \mathbb{Z}_q^{m \times n}$、秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$、误差向量 $\mathbf{e} \in \mathbb{Z}_q^m$，可以写成：
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
提供给我们的只有 $A$ 和 $\mathbf{b}$。从中求解 $\mathbf{s}$ 的问题就是“搜索LWE问题（Search LWE problem）”。&lt;/p>
&lt;p>由于混入了误差 $e_i$，如果尝试使用高斯消元法，在方程加减的过程中误差会呈指数级放大，从而无法得到正确的答案。乍一看只是简单的线性方程组，但仅仅加入了这种微小的噪声，问题的难度就骤升至NP困难级别。&lt;/p>
&lt;h2 id="43-判定lwe问题decision-lwe">4.3 判定LWE问题（Decision LWE）
&lt;/h2>&lt;p>在密码学理论的证明中，频繁使用的是搜索LWE问题的一个变种——“判定LWE问题（Decision LWE problem）”。&lt;/p>
&lt;p>判定LWE问题是指，给定从以下两个分布中获取的样本列表，判定它们来自哪一个分布的问题：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LWE分布&lt;/strong>: 刻意计算出的 $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$&lt;/li>
&lt;li>&lt;strong>均匀随机分布&lt;/strong>: 由完全随机选择的矩阵 $A$ 和向量 $\mathbf{u}$ 构成的 $(A, \mathbf{u})$&lt;/li>
&lt;/ol>
&lt;p>令人惊讶的是，如果恰当地选择LWE问题的参数，从LWE分布中获得的样本数对，与完全随机的数据对之间将变得“计算上不可区分（Computationally Indistinguishable）”。这个性质成为了基于LWE的密码能够生成“与随机数无法区分的密文”的理论依据。&lt;/p>
&lt;h2 id="44-从最坏情况复杂度到平均情况复杂度的归约regev定理">4.4 从最坏情况复杂度到平均情况复杂度的归约（Regev定理）
&lt;/h2>&lt;p>Oded Regev最大的贡献，就是通过数学证明将LWE问题的难度与前文所述格问题（SVP和CVP）的难度联系在了一起。&lt;/p>
&lt;p>他使用量子归约（Quantum reduction）证明了：“如果存在能在平均情况下（对于随机选择的 $A$ 和 $\mathbf{e}$）在多项式时间内求解LWE问题的算法，那么就存在能在多项式时间内求解任意格的最坏情况（最困难的情况）Gap-SVP的量子算法”。（后来Peikert等人也证明了经典归约）。&lt;/p>
&lt;p>这在密码学理论中是一个梦幻般的性质。因为它消除了“密码被破解，可能只是因为我们恰好选择了一个弱密钥（平均情况的一部分）”的担忧，并提供了强有力的保证：“如果平均的LWE能被解决，那么格上所有最困难的问题都能被解决（所以LWE绝对是困难的）”。&lt;/p>
&lt;div class="mermaid">graph TD
A["最坏情况格问题 (Gap-SVP, SIVP)"] -->|量子/经典归约| B["平均情况LWE问题"]
B -->|密码学构造| C["基于LWE的密码系统 (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-使用lwe构建公钥密码方案regev密码">5. 使用LWE构建公钥密码方案（Regev密码）
&lt;/h1>&lt;p>理解了LWE问题的困难性之后，我们来看看Oded Regev提出的基本公钥密码方案，了解如何利用它进行加解密。这里我们将讲解加密1比特消息 $M \in \{0, 1\}$ 的最基本机制。&lt;/p>
&lt;h2 id="51-密钥生成key-generation">5.1 密钥生成（Key Generation）
&lt;/h2>&lt;ol>
&lt;li>作为系统参数，确定作为模数的素数 $q$、维度 $n$ 以及方程数量 $m$（$m > n \log q$）。&lt;/li>
&lt;li>作为私钥，随机选择向量 $\mathbf{s} \in \mathbb{Z}_q^n$。&lt;/li>
&lt;li>生成随机矩阵 $A \in \mathbb{Z}_q^{m \times n}$。&lt;/li>
&lt;li>从离散高斯分布等误差分布中选择一个小的误差向量 $\mathbf{e} \in \mathbb{Z}_q^m$。&lt;/li>
&lt;li>计算向量 $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$。&lt;/li>
&lt;li>公钥（Public Key）为 $(A, \mathbf{b})$。&lt;/li>
&lt;li>私钥（Secret Key）为 $\mathbf{s}$。&lt;/li>
&lt;/ol>
&lt;p>公钥本身正是“LWE问题的一个实例”。由于从公钥 $(A, \mathbf{b})$ 求出私钥 $\mathbf{s}$ 等同于求解搜索LWE问题，因此其安全性得到了保障。&lt;/p>
&lt;h2 id="52-加密encryption">5.2 加密（Encryption）
&lt;/h2>&lt;p>爱丽丝使用鲍勃的公钥 $(A, \mathbf{b})$，对1比特的消息 $M \in \{0, 1\}$ 进行加密。&lt;/p>
&lt;ol>
&lt;li>选择一个随机的二进制向量（分量为0或1）$\mathbf{r} \in \{0, 1\}^m$。&lt;/li>
&lt;li>作为密文的前半部分，计算向量 $\mathbf{u} = A^T \mathbf{r} \pmod q$。（$A^T$ 是 $A$ 的转置矩阵。也就是说，将 $A$ 中对应 $\mathbf{r}$ 分量为1的行进行相加）。&lt;/li>
&lt;li>作为密文的后半部分，计算标量 $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$。
（如果消息 $M$ 为0，则什么都不加；如果为 $1$，则加上正好是 $q$ 一半的值 $\lfloor \frac{q}{2} \rfloor$）。&lt;/li>
&lt;li>密文（Ciphertext）即为 $(\mathbf{u}, v)$。&lt;/li>
&lt;/ol>
&lt;p>加密直观的含义是，对于公钥矩阵 $A$ 和向量 $\mathbf{b}$，取其“随机子集的和”。由于判定LWE问题的困难性，该密文 $(\mathbf{u}, v)$ 看起来与完全随机的向量和均匀随机数不可区分（语义安全性：Semantic Security）。&lt;/p>
&lt;div class="mermaid">flowchart LR
M["消息 M 属于 {0,1}"] --> Enc
PK["公钥 (A, b)"] --> Enc
r["随机二进制向量 r"] --> Enc
subgraph Enc ["加密过程"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["密文 (u, v)"]&lt;/div>
&lt;h2 id="53-解密decryption">5.3 解密（Decryption）
&lt;/h2>&lt;p>鲍勃使用私钥 $\mathbf{s}$ 对密文 $(\mathbf{u}, v)$ 进行解密。&lt;/p>
&lt;ol>
&lt;li>计算以下值： $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>如果计算结果接近 $0$，则输出 $M=0$；如果接近 $\lfloor \frac{q}{2} \rfloor$，则输出 $M=1$。&lt;/li>
&lt;/ol>
&lt;p>为什么这样就能解密呢？让我们从数学上展开来看。
回想一下 $\mathbf{b} = A \mathbf{s} + \mathbf{e}$。&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>在这里，公式中的 $\mathbf{s}^T A^T \mathbf{r}$ 被完美地抵消消失了！
剩下的只有 $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$。&lt;/p>
&lt;p>$\mathbf{e}$ 是分量极小的噪声向量，而 $\mathbf{r}$ 是分量为0或1的二进制向量。因此，它们的内积 $\mathbf{e}^T \mathbf{r}$（如果参数选择得当）也会保持在一个相对较小的值。&lt;/p>
&lt;ul>
&lt;li>如果 $M=0$，结果变为 $\mathbf{e}^T \mathbf{r}$，这是一个接近 $0$ 的小值。&lt;/li>
&lt;li>如果 $M=1$，结果变为 $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$，它将位于 $q$ 的一半值 $\lfloor \frac{q}{2} \rfloor$ 的附近。&lt;/li>
&lt;/ul>
&lt;p>如果参数设计使得误差 $\mathbf{e}^T \mathbf{r}$ 的绝对值能够控制在 $\frac{q}{4}$ 以内，鲍勃只需观察计算结果是更接近 $0$ 还是 $\lfloor \frac{q}{2} \rfloor$，就能准确地判定（恢复）消息 $M$。这就是基于LWE的密码能够正常运作的精妙机制。&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["密文 (u, v)"] --> Dec
SK["私钥 s"] --> Dec
subgraph Dec ["解密过程"]
direction TB
calc["计算 D = v - s^T * u mod q"]
check["检查 D 是更接近 0 还是 q/2"]
end
calc --> check
Dec --> M_out["恢复出的消息 M"]&lt;/div>
&lt;h1 id="6-使用具体数值的lwe密码玩具示例">6. 使用具体数值的LWE密码玩具示例
&lt;/h1>&lt;p>仅仅罗列公式可能很难有切实的感受，所以让我们实际设定非常小的数值参数，来追踪一下从加密到解密的计算过程。
（※在现实的密码系统中，为了确保安全性，通常会使用 $n$ 为500以上、$q$ 为数千以上的值）&lt;/p>
&lt;p>&lt;strong>【参数设定】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>模数 $q = 17$ （素数。因此取值范围在 $0$ 到 $16$ 之间）&lt;/li>
&lt;li>维度 $n = 2$&lt;/li>
&lt;li>方程数量 $m = 4$&lt;/li>
&lt;li>假设要加密消息 $M = 1$。&lt;/li>
&lt;li>消息的偏移量：$\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. 密钥生成阶段】&lt;/strong>
鲍勃随机选择私钥 $\mathbf{s}$、矩阵 $A$ 以及误差向量 $\mathbf{e}$。
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>接着计算公钥 $\mathbf{b}$。
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
将其对 17 取模。($66 = 17 \times 3 + 15$ 等)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
加上误差向量 $\mathbf{e}$。
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>公钥为 $A$ 和 $\mathbf{b} = (16, 0, 11, 1)^T$。&lt;/p>
&lt;p>&lt;strong>【2. 加密阶段】&lt;/strong>
爱丽丝加密消息 $M = 1$。
选择随机向量 $\mathbf{r}$。这里设 $\mathbf{r} = (1, 0, 1, 0)^T$。&lt;/p>
&lt;p>计算 $\mathbf{u}$。
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>计算 $v$。
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
加上对应消息 $M=1$ 的值 $\lfloor 17/2 \rfloor = 8$。
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>爱丽丝将密文 $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$ 发送给鲍勃。&lt;/p>
&lt;p>&lt;strong>【3. 解密阶段】&lt;/strong>
鲍勃收到密文后，使用私钥 $\mathbf{s} = (3, 4)^T$ 进行解密。
解密处理公式：计算 $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$。&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>在这里，在模17的世界里，$-8$ 等于 $9$（$-8 + 17 = 9$）。
判定得到的值 $D = 9$ 是更接近 $0$ 还是 $8$（$\lfloor 17/2 \rfloor$）。
由于 $9$ 显然比 $0$ 更接近 $8$，所以鲍勃成功地正确恢复出了 $M = 1$！&lt;/p>
&lt;p>为什么会变成 $9$ 呢？回想一下刚才的证明。
误差部分为 $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$。
因此，计算结果变为 $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$，我们确认了计算得出了与理论一致的值。&lt;/p>
&lt;h1 id="7-走向实用化的演进ring-lwe-与-module-lwe">7. 走向实用化的演进：Ring-LWE 与 Module-LWE
&lt;/h1>&lt;p>到目前为止我们所解释的标准LWE问题（Standard LWE）拥有极其强大的安全性证明，但在实际应用中却有一个致命的弱点。那就是“密钥尺寸巨大”和“计算成本高昂”。&lt;/p>
&lt;p>在Standard LWE中，公钥包含一个巨大的矩阵 $A \in \mathbb{Z}_q^{m \times n}$。当参数 $n$ 达到数百至数千时，这个矩阵的尺寸会达到几兆字节，每次在互联网通信协议（如TLS）中传输都会显得过于沉重。另外，矩阵与向量的乘法需要 $\mathcal{O}(n^2)$ 的计算量。&lt;/p>
&lt;p>为了解决这个问题，人们引入了将多项式环（Polynomial rings）这种代数结构融入格中的“Ring-LWE（RLWE）”和“Module-LWE（MLWE）”。&lt;/p>
&lt;h2 id="71-ring-lwe-的直觉">7.1 Ring-LWE 的直觉
&lt;/h2>&lt;p>在Ring-LWE中，将向量和矩阵替换为多项式环 $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$ 上的元素（多项式）。（这里的 $n$ 通常选择为2的幂）。&lt;/p>
&lt;p>Standard LWE的公钥是一个矩阵 $A$，而在Ring-LWE中则使用单一的多项式 $a(x)$。私钥 $s(x)$ 和误差 $e(x)$ 也变成了多项式。
方程如下所示：
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>因为这是多项式的乘法，所以通过使用类似于快速傅里叶变换（FFT）的“数论变换（Number Theoretic Transform: NTT）”，可以将计算量急剧削减到 $\mathcal{O}(n \log n)$。此外，由于公钥的尺寸也从矩阵缩小到了单一的多项式，数据尺寸减少到了 $\mathcal{O}(n)$。这在通信带宽上带来了压倒性的优势。&lt;/p>
&lt;p>从数学上看，Ring-LWE并不是一般的格，而是归结为被称为“理想格（Ideal Lattice）”的具有特殊对称性的格上的问题。&lt;/p>
&lt;h2 id="72-module-lwe-与-nist-的标准化kyber--ml-kem">7.2 Module-LWE 与 NIST 的标准化（Kyber / ML-KEM）
&lt;/h2>&lt;p>Ring-LWE虽然高效，但也存在着一些担忧，即理想格特殊的代数结构未来可能会成为被攻击的突破口。因此，结合了Standard LWE的保守安全性与Ring-LWE的高效性，做到了“两全其美”的，便是“Module-LWE（MLWE）”。&lt;/p>
&lt;p>在Module-LWE中，考虑的是以多项式为元素的小型矩阵和向量。也就是说，处理的是环上的模（Module）。
目前，NIST选定作为PQC密钥封装机制（KEM）标准的“CRYSTALS-Kyber”（标准化名称：ML-KEM），正是基于这个Module-LWE问题的困难性所构建的。&lt;/p>
&lt;h1 id="8-为什么对量子计算机也是安全的">8. 为什么对量子计算机也是安全的？
&lt;/h1>&lt;p>最后，我们来探讨一下核心问题：“为什么人们认为格密码即使使用量子计算机也无法被破解？”。&lt;/p>
&lt;p>量子计算机能够破解RSA密码和椭圆曲线密码的Shor算法，其本质是一个求解“隐藏子群问题（Hidden Subgroup Problem: HSP）”的算法。RSA和ECC背后的数学结构（有限阿贝尔群）具有周期性，通过使用被称为量子傅里叶变换（QFT）的量子算法特有操作，可以一口气提取出这个周期（隐藏的子群）。&lt;/p>
&lt;p>然而，格问题有着根本的不同。尽管格也具有周期性，但在SVP和CVP中需要求解的是“最短距离”或“去除噪声”这种几何上的非线性性质。即使直接套用像Shor算法中那样的“阿贝尔群上的量子傅里叶变换”，也无法高效地提取出成为格问题解答的有用信息。迄今为止，尚未发现能够在多项式时间内求解SVP或LWE的量子算法，人们普遍相信，即便拥有量子计算机的并行计算能力，也只有近乎穷举的搜索（如利用Grover算法带来的平方根加速程度）才是有效的手段。&lt;/p>
&lt;h1 id="9-总结">9. 总结
&lt;/h1>&lt;p>本文从格密码的数学直觉出发，详细讲解了从格的几何学定义，到LWE问题的公式化，再到构建公钥密码的全过程。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>格（Lattice）&lt;/strong> 是由基向量的整数系数线性组合表示的离散空间，在高维空间中，寻找接近正交的“好基”（SVP）是非常困难的。&lt;/li>
&lt;li>&lt;strong>LWE问题（Learning With Errors）&lt;/strong> 是求解带噪声的线性方程组的问题，由于它被归约到格的最坏情况问题的困难性，从而提供了强大的安全性依据。&lt;/li>
&lt;li>利用LWE问题，通过刻意添加或消除噪声的巧妙机制，实现了加解密（&lt;strong>Regev密码&lt;/strong>）。&lt;/li>
&lt;li>在现实的协议中，为了提高通信效率和计算速度，采用了使用多项式环的 &lt;strong>Ring-LWE&lt;/strong> 和 &lt;strong>Module-LWE&lt;/strong>，这成为了NIST标准 &lt;strong>ML-KEM&lt;/strong> 的基础。&lt;/li>
&lt;/ol>
&lt;p>在量子计算机这一前所未有的计算范式转变日益逼近的背景下，脱胎于经典线性代数和数论深渊的“格密码”，将承担起未来互联网安全基石的重任，这着实是一个充满浪漫色彩的故事。作为格密码基础的数学绝非高不可攀，只要具备线性代数和概率的基础知识，就足以理解其美妙的结构。希望本文能为您理解作为PQC核心的格密码提供一些帮助。&lt;/p></description></item><item><title>零知识证明（ZKP）的机制与最新在Web3及安全领域的应用</title><link>http://kenji.blog/zh-cn/p/zero-knowledge-proofs-zkp-web3-security/</link><pubDate>Fri, 11 Sep 2026 19:00:00 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/zero-knowledge-proofs-zkp-web3-security/</guid><description>&lt;img src="http://kenji.blog/p/zero-knowledge-proofs-zkp-web3-security/img/eyecatch.jpg" alt="Featured image of post 零知识证明（ZKP）的机制与最新在Web3及安全领域的应用" />&lt;h2 id="引言">引言
&lt;/h2>&lt;p>在现代数字社会中，数据隐私和可扩展性已成为最重要的两个课题。随着个人信息泄露和被滥用的风险不断增加，“在不向对方透露关于自己信息的情况下，证明自己拥有该信息”的技术需求变得日益强烈。实现这一点的正是&lt;strong>零知识证明（Zero-Knowledge Proof: ZKP）&lt;/strong>。&lt;/p>
&lt;p>零知识证明是20世纪80年代由Shafi Goldwasser、Silvio Micali和Charles Rackoff首次提出的密码学理论概念，但在很长一段时间内仅停留在理论研究阶段。然而，随着区块链技术和Web3的崛起，情况发生了巨大变化。以太坊等公有链面临着可扩展性问题（处理能力的极限）和隐私问题（所有交易都是公开的），而ZKP作为能同时解决这两大问题的“魔法棒”，一跃成为了众人瞩目的焦点。&lt;/p>
&lt;p>本文将极尽详细地、从技术深处探讨零知识证明的基本概念、目前成为主流的&lt;strong>zk-SNARKs&lt;/strong>及&lt;strong>zk-STARKs&lt;/strong>深奥的数学和密码学机制，以及ZK-Rollups、去中心化身份（DID）等在Web3与安全领域的最新应用实例。&lt;/p>
&lt;hr>
&lt;h2 id="什么是零知识证明zkp">什么是零知识证明（ZKP）？
&lt;/h2>&lt;p>零知识证明（ZKP）是指在证明者（Prover）向验证者（Verifier）证明某个命题为真时，“除了该命题为真这一事实外，不传递任何其他信息”的协议。&lt;/p>
&lt;h3 id="zkp必须满足的3个条件">ZKP必须满足的3个条件
&lt;/h3>&lt;p>要成立为ZKP，必须严格满足以下3个特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>完备性（Completeness）&lt;/strong>
如果命题为真，且证明者和验证者双方都正确遵循协议，那么验证者必须以压倒性的概率接受（Accept）该证明。&lt;/li>
&lt;li>&lt;strong>可靠性（Soundness）&lt;/strong>
如果命题为假，那么无论证明者拥有多么强大的计算能力，或是多么恶意的证明者，都不可能欺骗验证者使其接受证明（除极小且可忽略的概率外）。&lt;/li>
&lt;li>&lt;strong>零知识性（Zero-Knowledge）&lt;/strong>
如果命题为真，验证者除了“命题为真”这一事实外，无法从证明过程中获取任何其他信息。从验证者的视角来看，其能够模拟证明过程（存在模拟器）这一事实，通过数学定义证明了这一点。&lt;/li>
&lt;/ol>
&lt;h3 id="交互式证明与非交互式证明">交互式证明与非交互式证明
&lt;/h3>&lt;p>ZKP有两种形式：证明者和验证者需要进行多次通信的&lt;strong>交互式证明&lt;/strong>，以及证明者只需发送一次证明数据即告完成的&lt;strong>非交互式证明&lt;/strong>。&lt;/p>
&lt;h4 id="交互式证明interactive-zkp">交互式证明（Interactive ZKP）
&lt;/h4>&lt;p>早期的ZKP被设计为交互式协议。著名的“阿里巴巴山洞”的故事就是对此的形象比喻。一般协议的流程如下：&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Prover as "Prover (证明者)"
participant Verifier as "Verifier (验证者)"
Note over Prover, Verifier: "交互式证明协议的基本流程"
Prover->>Verifier: "1. 发送承诺 (Commitment)"
Verifier->>Prover: "2. 发送随机挑战 (Challenge)"
Prover->>Verifier: "3. 计算并发送响应 (Response)"
Note over Verifier: "验证响应 (Verification)"
Verifier-->>Prover: "4. 接受或拒绝 (Accept / Reject)"
Note over Prover, Verifier: "※为了提高准确率，此过程会重复数十次"&lt;/div>
&lt;p>这种方法虽然强大，但要求验证者必须在线，将其应用于区块链这种异步的分布式系统中会非常不便。在区块链中，任何人必须能够随时验证过去的证明。&lt;/p>
&lt;h4 id="菲亚特-沙米尔变换fiat-shamir-heuristic与非交互化">菲亚特-沙米尔变换（Fiat-Shamir Heuristic）与非交互化
&lt;/h4>&lt;p>将交互式证明转化为非交互式证明（Non-Interactive Zero-Knowledge Proof: NIZK）的革命性方法就是&lt;strong>菲亚特-沙米尔变换&lt;/strong>。&lt;/p>
&lt;p>它不再由验证者发送“随机挑战”，而是由证明者使用自身的承诺和公开信息的哈希值，自我生成一个“伪随机挑战”。前提是密码学哈希函数（例如SHA-256或Keccak等）作为随机预言机（Random Oracle）发挥作用，证明者无法提前预测或操纵挑战，从而在保持与交互式证明同等安全性的情况下，仅通过发送一次消息就能完成证明。&lt;/p>
&lt;hr>
&lt;h2 id="zk-snarks的技术细节">zk-SNARKs的技术细节
&lt;/h2>&lt;p>目前在ZKP中被最广泛使用的是&lt;strong>zk-SNARKs&lt;/strong>（Zero-Knowledge Succinct Non-Interactive Argument of Knowledge，零知识简洁非交互式知识论证）。顾名思义，它具备零知识性（zk），证明体积非常小且验证高速（Succinct），是一种非交互式（Non-Interactive）的知识论证（Argument of Knowledge）。&lt;/p>
&lt;p>zk-SNARKs的基础是高级代数几何和密码学理论。它将程序的执行和计算转化为对特定多项式方程的验证。&lt;/p>
&lt;h3 id="1-转化为算术电路与r1csrank-1-constraint-system">1. 转化为算术电路与R1CS（Rank-1 Constraint System）
&lt;/h3>&lt;p>首先，将想要证明的任意计算（算法或智能合约的逻辑）转化为由加法门和乘法门组成的&lt;strong>算术电路（Arithmetic Circuit）&lt;/strong>。&lt;/p>
&lt;p>接着，将该算术电路转化为名为**R1CS（Rank-1 Constraint System，一阶约束系统）**的矩阵方程集合。R1CS的问题是：对于变量向量 $x$，找到满足以下约束的矩阵 $A, B, C$。&lt;/p>
$$ (A \cdot x) \circ (B \cdot x) = C \cdot x $$
&lt;p>在这里，$\circ$ 表示哈达玛乘积（逐元素乘积）。这个约束确保了电路中所有的逻辑门（特别是乘法门）都被正确计算。&lt;/p>
&lt;h3 id="2-转化为qapquadratic-arithmetic-program">2. 转化为QAP（Quadratic Arithmetic Program）
&lt;/h3>&lt;p>由于R1CS的矩阵约束数量庞大，逐一验证它们是非常低效的。因此，利用拉格朗日插值法，将这些约束压缩成一个单一的多项式方程。这就是&lt;strong>QAP（Quadratic Arithmetic Program，二次算术程序）&lt;/strong>。&lt;/p>
&lt;p>通过向QAP的转化，需要证明的问题归结为：“特定的多项式 $P(x)$ 是否能被另一个已知多项式 $Z(x)$ 整除？”这一问题。&lt;/p>
$$ P(x) = L(x) \cdot R(x) - O(x) $$
&lt;p>在这里，$L(x), R(x), O(x)$ 分别是由矩阵 $A, B, C$ 各行对应的多项式组合而成。如果证明者知道正确的解（Witness），由于在 $P(x)$ 的每个根（求值点）上的值都为0，那么 $P(x)$ 就将目标多项式 $Z(x)$ 作为其因式。即存在一个多项式 $H(x)$，使得下式成立：&lt;/p>
$$ P(x) = H(x) \cdot Z(x) $$
&lt;p>验证者只需在一个随机的秘密点 $s$ 上，检查该方程 $P(s) = H(s) \cdot Z(s)$ 是否成立，就能瞬间验证整个计算是否正确执行。这就是“简洁性（Succinct）”的秘密所在。&lt;/p>
&lt;h3 id="3-椭圆曲线密码学与配引bilinear-pairings">3. 椭圆曲线密码学与配引（Bilinear Pairings）
&lt;/h3>&lt;p>但是，如果验证者知道秘密点 $s$，证明者就可以伪造虚假的多项式来满足方程（导致可靠性崩溃）。因此，必须在谁也不知道 $s$ 的情况下对其进行加密（利用同态加密），并在加密状态下进行计算。&lt;/p>
&lt;p>实现这一目标的是&lt;strong>椭圆曲线配对（Bilinear Pairings）&lt;/strong>。
配对 $e$ 是一种特殊的函数，能够从两个加密后的值中计算出相当于它们乘积的加密值。&lt;/p>
$$ e(g_1^a, g_2^b) = e(g_1, g_2)^{ab} $$
&lt;p>证明者即使不知道 $s$ 本身，也能利用 $s$ 的幂的加密值（这被称为 CRS: Common Reference String，公共参考字符串）计算出多项式 $P(s)$ 和 $H(s)$ 的加密值。验证者使用配对函数，在加密值的状态下验证 $P(s) = H(s) \cdot Z(s)$ 的关系是否成立。&lt;/p>
&lt;h3 id="4-可信设置trusted-setup">4. 可信设置（Trusted Setup）
&lt;/h3>&lt;p>zk-SNARKs（特别是早期的Groth16等）最大的弱点在于生成秘密点 $s$ 的过程，即需要所谓的&lt;strong>可信设置（Trusted Setup）&lt;/strong>。如果 $s$ 的生成者保留了该值而没有将其销毁，他们就可以生成任意的虚假证明（Toxic Waste，有毒废料问题）。&lt;/p>
&lt;p>为了防止这种情况，会执行被称为“仪式（Ceremony）”的过程，利用多方计算（MPC）。许多参与者合作提供随机性，只要至少有一位参与者诚实地销毁了自己的随机值，整个系统的安全性就能得到保障。然而，为了消除这种依赖关系，研究人员长年以来一直在不断努力。&lt;/p>
&lt;hr>
&lt;h2 id="zk-starks的技术细节">zk-STARKs的技术细节
&lt;/h2>&lt;p>为了解决对可信设置的依赖以及量子计算机破解椭圆曲线密码学的风险，&lt;strong>zk-STARKs&lt;/strong>（Zero-Knowledge Scalable Transparent Argument of Knowledge，零知识可扩展透明知识论证）应运而生。&lt;/p>
&lt;p>由Eli Ben-Sasson等人开发的STARKs，正如其“透明性（Transparent）”之名，完全不需要可信设置；而正如其“可扩展性（Scalable）”之名，它具有在计算量增加时，证明体积和验证时间仍能保持高效的特点。&lt;/p>
&lt;h3 id="1-多项式承诺与fri协议">1. 多项式承诺与FRI协议
&lt;/h3>&lt;p>zk-STARKs不使用椭圆曲线密码学，而是将安全性基础完全建立在&lt;strong>哈希函数&lt;/strong>上。因此，它具有抗量子计算密码学（Post-Quantum Cryptography）的特性。&lt;/p>
&lt;p>计算的验证在被转化为名为AIR（Algebraic Intermediate Representation，代数中间表示）的格式后，利用一维或多维多项式的性质进行。STARKs的核心在于**FRI（Fast Reed-Solomon Interactive Oracle Proof of Proximity，快速里德-所罗门交互式预言机近似证明）**协议。&lt;/p>
&lt;p>FRI协议是一种验证“某函数是否足够接近特定次数的多项式（Proximity）”的技术。证明者将多项式的值作为默克尔树（Merkle Tree）的叶子节点进行承诺（多项式承诺）。&lt;/p>
&lt;div class="mermaid">graph TD
Root["Merkle Root (承诺)"] --> Node0["Node 0"]
Root --> Node1["Node 1"]
Node0 --> Leaf0["P(x_0)"]
Node0 --> Leaf1["P(x_1)"]
Node1 --> Leaf2["P(x_2)"]
Node1 --> Leaf3["P(x_3)"]&lt;/div>
&lt;p>验证者要求公开随机的几个点，并利用默克尔证明确认它们包含在承诺中。通过递归地重复这一过程，可以以压倒性的概率保证原始多项式的次数实际上很低。&lt;/p>
&lt;h3 id="zk-snarks与zk-starks的比较">zk-SNARKs与zk-STARKs的比较
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">特性&lt;/th>
&lt;th style="text-align:left">zk-SNARKs&lt;/th>
&lt;th style="text-align:left">zk-STARKs&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>密码学假设&lt;/strong>&lt;/td>
&lt;td style="text-align:left">椭圆曲线、配对&lt;/td>
&lt;td style="text-align:left">抗碰撞哈希函数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>可信设置&lt;/strong>&lt;/td>
&lt;td style="text-align:left">需要（Plonk等为通用型）&lt;/td>
&lt;td style="text-align:left">不需要（Transparent）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>抗量子性&lt;/strong>&lt;/td>
&lt;td style="text-align:left">无&lt;/td>
&lt;td style="text-align:left">有&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>证明体积&lt;/strong>&lt;/td>
&lt;td style="text-align:left">非常小（~200 Byte）&lt;/td>
&lt;td style="text-align:left">较大（数十 KB）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>证明生成计算成本&lt;/strong>&lt;/td>
&lt;td style="text-align:left">高&lt;/td>
&lt;td style="text-align:left">相对SNARKs较低&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>验证成本（Gas费）&lt;/strong>&lt;/td>
&lt;td style="text-align:left">非常低（恒定）&lt;/td>
&lt;td style="text-align:left">低（对数级增长）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>近年来，随着Plonk和Halo2等“不需要可信设置，或只需进行一次设置的SNARKs”的出现，SNARKs和STARKs的界限正逐渐变得模糊，但它们之间基础数学方法的差异依然重要。&lt;/p>
&lt;hr>
&lt;h2 id="零知识证明在web3与安全领域的最新应用">零知识证明在Web3与安全领域的最新应用
&lt;/h2>&lt;p>从理论走向实践的ZKP，目前正在Web3和网络安全的最前沿掀起一场革命。&lt;/p>
&lt;h3 id="1-采用zk-rollups实现以太坊的终极扩容">1. 采用ZK-Rollups实现以太坊的终极扩容
&lt;/h3>&lt;p>像以太坊这样的L1（第一层）区块链，因为过于重视去中心化和安全性，在可扩展性上受到了很大的限制（区块链不可能三角）。解决这一问题的L2（第二层）决定性方案就是&lt;strong>ZK-Rollups&lt;/strong>。&lt;/p>
&lt;p>在ZK-Rollup中，数千笔交易在链下（L2）被执行和处理，并生成“一个ZKP（有效性证明）”来证明它们都已被正确执行。L1链上的智能合约只需验证这个证明即可。&lt;/p>
&lt;div class="mermaid">flowchart LR
Users["Users (发送Tx)"] --> Sequencer["Sequencer (收集・执行Tx)"]
Sequencer --> Prover["Prover (生成ZKP)"]
Sequencer --> L1Contract["L1 Smart Contract (发布Tx数据)"]
Prover --> L1Contract["提交ZKP (证明)"]
L1Contract --> Verify["验证 &amp; 更新状态"]&lt;/div>
&lt;p>ZK-Rollups最大的优势在于，与Optimistic Rollups（如Arbitrum或Optimism等）不同，它不需要为了欺诈证明（Fraud Proof）而设置挑战期（通常为7天）。由于其正确性在密码学上得到了保证，在证明被验证的瞬间，向L1提取资金（确定性，Finality）即告完成。目前，zkSync、Starknet、Scroll、Polygon zkEVM等项目正展开激烈的开发竞争，与EVM（以太坊虚拟机）兼容的&lt;strong>zkEVM&lt;/strong>的实现正在促使生态系统快速增长。&lt;/p>
&lt;h3 id="2-隐私保护身份zkp-for-identity">2. 隐私保护身份（ZKP for Identity）
&lt;/h3>&lt;p>数字世界中的个人认证方式也将被ZKP从根本上改变。
例如，面对“你满18岁了吗？”这个问题，在传统系统中需要出示驾驶证或护照，从而将姓名、地址等不必要的个人信息也交给了对方。&lt;/p>
&lt;p>如果使用ZKP，就可以基于公共机构颁发的数字证书（Verifiable Credential），在数学上仅仅证明“根据我的出生日期计算，在当前日期我已年满18岁”这一&lt;strong>事实&lt;/strong>。验证者只需验证证书的签名和ZKP，无法得知用户的出生日期和具体身份。&lt;/p>
&lt;p>在Worldcoin这样的人格证明（Proof of Personhood）项目中，也没有直接保存和共享虹膜数据，而是引入了ZKP机制，仅仅证明“是一个独一无二的人类”。&lt;/p>
&lt;h3 id="3-机密智能合约与企业应用">3. 机密智能合约与企业应用
&lt;/h3>&lt;p>公有链“所有数据都公开”的特性，曾经是企业在区块链上处理机密交易或供应链信息时的巨大障碍。&lt;/p>
&lt;p>利用ZKP技术（例如Aleo或Aztec等专注于隐私的网络），可以在保持交易输入值、输出值甚至执行的智能合约逻辑本身加密的状态下，仅将状态更新的正确性记录在公有链上。这使得在享受公有链高安全性的同时，能够防止DeFi（去中心化金融）中的抢跑（MEV），或在企业间构建机密联盟网络成为可能。&lt;/p>
&lt;hr>
&lt;h2 id="zkp未来的挑战与展望">ZKP未来的挑战与展望
&lt;/h2>&lt;p>ZKP毫无疑问是下一代的基础技术，但仍存在一些挑战。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>证明生成的计算成本与硬件加速&lt;/strong>
ZKP的生成需要进行庞大的多项式运算、FFT（快速傅里叶变换）以及MSM（多标量乘法）。目前，为加速这一证明生成过程，开发专用硬件（FPGA或ASIC），即所谓的&lt;strong>ZKP挖矿&lt;/strong>（Prover Network）的研究正在迅速推进。&lt;/li>
&lt;li>&lt;strong>标准化与开发者体验（DX）的提升&lt;/strong>
目前，用于编写ZKP电路的专用语言（如Circom、Cairo、Noir、Leo等）五花八门。统一这些语言的标准规范，以及能从现有的Rust或C++代码自动生成ZKP电路的编译器的成熟，将是普通软件工程师能够广泛应用ZKP的关键。&lt;/li>
&lt;/ol>
&lt;h2 id="结语">结语
&lt;/h2>&lt;p>零知识证明（ZKP）已经从单纯的“提高加密货币匿名性的技术”，进化为“重新定义整个互联网信任机制的通用技术”。在深奥的数学公式与密码学理论中计算出的微小证明，将无限扩展区块链的可扩展性，并成为坚固保护我们隐私的盾牌。&lt;/p>
&lt;p>在迈向Web3的真正大规模普及（Mass Adoption）以及构建安全、隐私的下一代互联网的过程中，零知识证明将继续作为最重要的一块拼图发挥作用。ZKP技术的未来发展绝对不容错过。&lt;/p>
&lt;hr>
&lt;p>&lt;em>参考文献与相关链接&lt;/em>&lt;/p>
&lt;ul>
&lt;li>Groth, J. (2016). &amp;ldquo;On the Size of Pairing-based Non-interactive Arguments&amp;rdquo;&lt;/li>
&lt;li>Ben-Sasson, E., et al. (2018). &amp;ldquo;Scalable, transparent, and post-quantum secure computational integrity&amp;rdquo;&lt;/li>
&lt;li>Vitalik Buterin&amp;rsquo;s blog on zk-SNARKs and zk-STARKs&lt;/li>
&lt;/ul></description></item><item><title>什么是完全同态加密（FHE）？解密下一代安全的核心</title><link>http://kenji.blog/zh-cn/p/fully-homomorphic-encryption-fhe-explained/</link><pubDate>Fri, 11 Sep 2026 11:00:00 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/fully-homomorphic-encryption-fhe-explained/</guid><description>&lt;img src="http://kenji.blog/p/fully-homomorphic-encryption-fhe-explained/img/eyecatch.jpg" alt="Featured image of post 什么是完全同态加密（FHE）？解密下一代安全的核心" />&lt;p>随着云计算和AI技术作为社会基础设施的普及，“数据隐私”与“数据利用”之间的权衡已成为最重要的问题之一。虽然医疗数据、金融信息和个人生物特征信息等高度机密数据在云端交由AI进行分析的需求日益增长，但出于安全考虑，不少企业仍对向外部发送数据犹豫不决。&lt;/p>
&lt;p>传统的加密技术（如AES和RSA等）擅长保护存储中的数据（Data at Rest）和网络传输中的数据（Data in Transit）。然而，&lt;strong>当服务器端对数据进行搜索或机器学习等处理（计算）时（Data in Use），必须先解密恢复为明文&lt;/strong>。如果在解密的这一时刻服务器遭到黑客攻击，或者内部的恶意管理员窥探数据，将直接导致信息泄露。&lt;/p>
&lt;p>克服“处理时解密”这一根本弱点的梦幻技术，便是&lt;strong>完全同态加密（Fully Homomorphic Encryption: FHE）&lt;/strong>。利用FHE，可以在保持数据加密且完全不解密的情况下进行计算处理，并仅将结果的密文返回给客户端。&lt;/p>
&lt;p>本文将从FHE的概念、历史、Craig Gentry的突破性进展、数学基础（如Ring-LWE），到其面临的最大挑战“噪声”及其解决方案（自举，Bootstrapping），以及最新的实现库，全面深入地解析作为下一代安全核心的FHE。&lt;/p>
&lt;hr>
&lt;h2 id="1-什么是同态加密基本概念">1. 什么是同态加密？基本概念
&lt;/h2>&lt;p>“同态（Homomorphic）”是代数术语，指在具有某种结构的集合之间，能够保持运算结构不变地进行映射的性质。在密码学理论中，“同态性”指的是&lt;strong>明文空间中的运算与密文空间中的运算相对应&lt;/strong>的性质。&lt;/p>
&lt;p>用简单的数学公式表示，设明文 $m_1$ 和 $m_2$ 的加密函数为 $E(\cdot)$，解密函数为 $D(\cdot)$。当明文上的运算（如加法或乘法等）记为 $\circ$，密文上的运算记为 $\diamond$ 时，成立以下关系：&lt;/p>
$$ D(E(m_1) \diamond E(m_2)) = m_1 \circ m_2 $$
&lt;p>也就是说，对密文 $E(m_1)$ 和 $E(m_2)$ 施加某种运算 $\diamond$ 后，将其结果解密，会与原始明文之间进行 $\circ$ 运算的结果一致。&lt;/p>
&lt;h3 id="云计算中的数据流">云计算中的数据流
&lt;/h3>&lt;p>使用FHE的云处理架构与传统的完全不同。下图展示了利用FHE进行安全数据处理的流程。&lt;/p>
&lt;div class="mermaid">graph TD
A["客户端 (持有私钥)"] -->|1. 加密明文 x: E(x)| B["云服务器 (仅加密数据)"]
B -->|2. 在密文状态下应用函数 f: E(f(x))| B
B -->|3. 计算结果的密文 E(y)| A
A -->|4. 使用私钥解密: y = f(x)| A
style A fill:#d4edda,stroke:#28a745
style B fill:#f8d7da,stroke:#dc3545&lt;/div>
&lt;p>服务器虽然接收到加密后的数据 $E(x)$，但由于没有私钥，绝对无法得知数据的内容。然而，通过利用FHE的性质，可以对密文应用函数 $f$（例如机器学习的推理模型）并生成 $E(f(x))$。客户端接收到该结果后，通过自己的私钥解密，便可获得目标结果 $y = f(x)$。&lt;/p>
&lt;hr>
&lt;h2 id="2-同态加密的发展历史phe-she-fhe">2. 同态加密的发展历史：PHE, SHE, FHE
&lt;/h2>&lt;p>同态加密并不是一蹴而就达到现在的“完全”形态的。根据能够实现的运算类型和次数，它大致可分为三个阶段。&lt;/p>
&lt;h3 id="partially-homomorphic-encryption-phe-部分同态加密">Partially Homomorphic Encryption (PHE: 部分同态加密)
&lt;/h3>&lt;p>PHE是&lt;strong>仅能&lt;/strong>无限制地进行加法或乘法其中&lt;strong>一种运算&lt;/strong>的加密方式。实际上，具有这种性质的加密算法自古就已存在。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RSA加密（对乘法的同态性）&lt;/strong>
RSA加密无意中具有乘法同态性。设明文为 $m_1, m_2$，公钥为 $(e, N)$，则：
$$ E(m_1) = m_1^e \pmod N $$
$$ E(m_2) = m_2^e \pmod N $$
将它们相乘：
$$ E(m_1) \times E(m_2) = (m_1 \cdot m_2)^e \pmod N = E(m_1 \times m_2) $$
这样，密文之间的乘法就对应于明文的乘法。&lt;/li>
&lt;li>&lt;strong>Paillier加密（对加法的同态性）&lt;/strong>
1999年发明的Paillier加密具有加法同态性。它已被实际应用于电子投票（汇总加密选票，仅解密最终结果）等场景中。&lt;/li>
&lt;/ul>
&lt;h3 id="somewhat-homomorphic-encryption-she-有限同态加密">Somewhat Homomorphic Encryption (SHE: 有限同态加密)
&lt;/h3>&lt;p>这是一种可以同时执行加法和乘法的加密方式，但可运算的&lt;strong>次数（电路深度）有限制&lt;/strong>。由于后文将提到的“噪声”积累，当进行超过一定次数的乘法运算后，就会变得无法解密。2005年的BGN（Boneh-Goh-Nissim）加密等就属于此类，但在进行实际复杂的计算（如深度学习等）时存在局限性。&lt;/p>
&lt;h3 id="fully-homomorphic-encryption-fhe-完全同态加密">Fully Homomorphic Encryption (FHE: 完全同态加密)
&lt;/h3>&lt;p>这是一种可以&lt;strong>无限制次数&lt;/strong>地同时执行加法和乘法运算的加密方式。正如信息论中的图灵完备性一样，只要能够无限地组合加法（相当于XOR）和乘法（相当于AND），在原理上就意味着可以在保持加密状态下执行任何可计算的函数和算法。&lt;/p>
&lt;p>FHE长期以来被称为“密码学界的圣杯”，甚至有人认为它是不可能实现的。然而，在2009年，当时正在斯坦福大学攻读博士学位的 &lt;strong>Craig Gentry&lt;/strong> 提出了基于理想格（Ideal Lattices）的首个FHE方案，震惊了世界。&lt;/p>
&lt;hr>
&lt;h2 id="3-fhe的数学基础lwe问题和ring-lwe">3. FHE的数学基础：LWE问题和Ring-LWE
&lt;/h2>&lt;p>目前主流的许多FHE方案都基于&lt;strong>LWE（Learning With Errors，容错学习）问题&lt;/strong>，这是“格密码（Lattice-based Cryptography）”——也以抗量子计算机密码（Post-Quantum Cryptography）而闻名——中的一个数学难题。&lt;/p>
&lt;h3 id="lwe问题的直观理解">LWE问题的直观理解
&lt;/h3>&lt;p>使用高斯消元法等方法，求解线性方程组是很容易的。&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 \equiv 12 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 \equiv 8 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>然而，如果在该方程组的结果中加入极微小的“随机误差（噪声）” $e$，会发生什么呢？&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 + e_1 \equiv 13 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 + e_2 \equiv 7 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>仅仅加入这个误差 $e$，寻找秘密变量向量 $\vec{s}$ 的问题就会转变为一个即使使用现代超级计算机或量子计算机也难以破解的NP困难问题。这就是LWE问题。&lt;/p>
&lt;h3 id="ring-lwe问题rlwe">Ring-LWE问题（RLWE）
&lt;/h3>&lt;p>标准的LWE问题由于包含矩阵运算，存在密钥尺寸非常大（甚至可能达到千兆字节级别）且计算效率低下的问题。为了解决这一问题，引入了使用多项式环上运算的&lt;strong>Ring-LWE（RLWE）问题&lt;/strong>。&lt;/p>
&lt;p>在RLWE中，元素属于多项式环 $R_q = \mathbb{Z}_q[x] / (x^N + 1)$（其中 $N$ 是2的幂，$q$ 是作为模的素数）。
设私钥为多项式 $s(x)$，一个随机多项式为 $a(x)$，小噪声多项式为 $e(x)$，那么公钥就是以下对：&lt;/p>
$$ (a(x), b(x)) \quad \text{where} \quad b(x) = -a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>在加密时，将利用这种多项式的性质对明文 $m(x)$ 进行编码，并生成密文。&lt;/p>
&lt;hr>
&lt;h2 id="4-最大障碍噪声与gentry的自举bootstrapping">4. 最大障碍“噪声”与Gentry的自举（Bootstrapping）
&lt;/h2>&lt;p>在理解FHE时，最重要的概念就是**“噪声管理”**。&lt;/p>
&lt;p>在基于LWE/RLWE的密码中，为了保证安全性，会有意加入较小的“噪声（误差）”。
将明文 $m$ 的密文 $c$ 解密的过程，粗略地说，可以用以下公式表示：&lt;/p>
$$ D(c) = (c \cdot s) \pmod q = m + \text{noise} $$
&lt;p>在解密时，通过舍入等操作去除这个 &lt;code>noise&lt;/code> 即可得到正确的明文 $m$。然而，一旦在密文之间进行同态运算（尤其是乘法），这种噪声就会急剧放大。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>同态加法&lt;/strong>: 噪声以加法的方式增加（$e_1 + e_2$）。这种增加相对较慢。&lt;/li>
&lt;li>&lt;strong>同态加法的同态性数学表示&lt;/strong>:
$$ E(m_1) \oplus E(m_2) = E(m_1 + m_2) $$&lt;/li>
&lt;li>&lt;strong>同态乘法&lt;/strong>: 噪声呈爆炸性倍乘（因为它包含了 $e_1 \times e_2$ 等项）。仅仅经过几次乘法运算，噪声就会超过阈值 $q/2$，导致无法进行正确的舍入处理，从而解密失败。&lt;/li>
&lt;li>&lt;strong>同态乘法的同态性数学表示&lt;/strong>:
$$ E(m_1) \otimes E(m_2) = E(m_1 \times m_2) $$&lt;/li>
&lt;/ul>
&lt;p>这就是FHE长期无法实现，只能停留在SHE（次数受限）阶段的原因。&lt;/p>
&lt;h3 id="自举bootstrapping的魔力">自举（Bootstrapping）的魔力
&lt;/h3>&lt;p>Craig Gentry的天才贡献在于他发明了一种被称为**“自举（Bootstrapping）”**的降噪技术。这是密码学领域的一次范式转变。&lt;/p>
&lt;p>直观上，这个操作就是“在密文充满噪声而崩溃之前，在保持加密的状态下对其进行‘解密’清理，然后重新放入一个新密文中”。&lt;/p>
&lt;ol>
&lt;li>假设有一个噪声变得很大的密文 $C_{noisy}$。&lt;/li>
&lt;li>客户端预先将使用公钥“加密后的私钥 $sk$” $E_{pk}(sk)$（称之为自举密钥）发送给服务器。&lt;/li>
&lt;li>服务器对 $C_{noisy}$ 执行同态的&lt;strong>解密电路（Decryption Circuit）&lt;/strong>。&lt;/li>
&lt;li>具体来说，就是利用 $E_{pk}(sk)$ 对 $E_{pk}(C_{noisy})$ 进行“在加密空间内的解密”。&lt;/li>
&lt;li>尽管这个解密电路本身也是同态运算，会产生新的噪声，但其输出的新密文 $C_{fresh}$ 的噪声会被重置为一个特定的“固定水平”。&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["高噪声密文 C_noisy"] --> B["同态解密电路 (Eval_Dec)"]
C["加密后的私钥 E(sk)"] --> B
B --> D["低噪声密文 C_fresh"]
style B fill:#ffeeba,stroke:#ffc107&lt;/div>
&lt;p>通过在计算过程中定期执行这种自举操作，理论上就可以计算无限深度的电路（实现了FHE）。然而，在Gentry最初的方案中，这种自举处理一次需要数十分钟甚至数小时，计算成本高得令人绝望。&lt;/p>
&lt;hr>
&lt;h2 id="5-fhe的世代与主要方案的演进">5. FHE的世代与主要方案的演进
&lt;/h2>&lt;p>为了使FHE走向实用化，全世界的密码学家们竞相改进算法。如今，FHE主要可分为四个世代或家族。&lt;/p>
&lt;h3 id="第二代整数的精确运算-bgv-bfv">第二代：整数的精确运算 (BGV, BFV)
&lt;/h3>&lt;p>这是在2011年至2012年间出现的 &lt;strong>BGV（Brakerski-Gentry-Vaikuntanathan）&lt;/strong> 和 &lt;strong>BFV（Brakerski/Fan-Vercauteren）&lt;/strong> 方案。它们以RLWE为基础，适合进行整数的模运算（精确计算）。
其特点是支持类似SIMD（单指令多数据）的批处理（Batching）技术，可以将数千个数据槽塞入一个巨大的多项式密文中，从而一次性进行并行计算。&lt;/p>
&lt;h3 id="第三代加速自举-gsw-fhew-tfhe">第三代：加速自举 (GSW, FHEW, TFHE)
&lt;/h3>&lt;p>2013年的 &lt;strong>GSW（Gentry-Sahai-Waters）&lt;/strong> 方案使FHE的结构变得更加简单。在其基础上发展而来的，便是当今的主流方案之一：&lt;strong>TFHE（Fast Fully Homomorphic Encryption over the Torus）&lt;/strong>。
TFHE的特点在于其自举速度极快（毫秒级）。它擅长在门级（如AND、XOR等逻辑电路）进行运算，且密文尺寸相对较小，非常适合快速评估任意逻辑电路。&lt;/p>
&lt;h3 id="第四代专注于近似计算与机器学习-ckks">第四代：专注于近似计算与机器学习 (CKKS)
&lt;/h3>&lt;p>2017年由Cheon等人提出的 &lt;strong>CKKS（Cheon-Kim-Kim-Song）&lt;/strong> 方案，可以说是当前AI与机器学习隐私保护领域的终极技术。
相较于以往的FHE固执于“精确的整数计算”，CKKS支持在加密状态下进行**“浮点数的近似计算”**。在神经网络训练或推理等允许微小误差的实数计算中，它展现出压倒性的性能优势。&lt;/p>
&lt;p>下表总结了根据不同目的选择方案的方法。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">方案名称&lt;/th>
&lt;th style="text-align:left">擅长的数据类型&lt;/th>
&lt;th style="text-align:left">推荐的使用用例&lt;/th>
&lt;th style="text-align:left">特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>BFV / BGV&lt;/strong>&lt;/td>
&lt;td style="text-align:left">整数 (Integer)&lt;/td>
&lt;td style="text-align:left">精确的统计计算、金融数据汇总、数据库搜索&lt;/td>
&lt;td style="text-align:left">通过SIMD批处理实现高吞吐量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CKKS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">实数 (Real/Complex)&lt;/td>
&lt;td style="text-align:left">机器学习 (DNN, 逻辑回归)、信号处理&lt;/td>
&lt;td style="text-align:left">利用近似计算实现加速、重缩放&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>TFHE&lt;/strong>&lt;/td>
&lt;td style="text-align:left">布尔值 (Boolean)&lt;/td>
&lt;td style="text-align:left">任意逻辑电路、字符串搜索、非线性函数评估&lt;/td>
&lt;td style="text-align:left">超高速自举（毫秒级）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="6-实践fhe库及概念性代码">6. 实践：FHE库及概念性代码
&lt;/h2>&lt;p>如今，有许多开源库可供使用，即使没有深厚的密码学知识，也可以轻松利用FHE。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Microsoft SEAL (Simple Encrypted Arithmetic Library)&lt;/strong>：支持BFV、BGV和CKKS的C++库，是行业标准之一。其Python绑定版本 &lt;strong>TenSEAL&lt;/strong> 在AI工程师中非常受欢迎。&lt;/li>
&lt;li>&lt;strong>Zama (Concrete)&lt;/strong>：基于TFHE的框架。可以使用Rust/Python编写，并提供了将现有的PyTorch模型编译并运行在FHE上的功能（Concrete ML）。&lt;/li>
&lt;li>&lt;strong>OpenFHE&lt;/strong>：PALISADE的继任者，支持所有主要方案的综合性C++库。&lt;/li>
&lt;/ul>
&lt;h3 id="使用pythontenseal进行fhe编程的示例">使用Python（TenSEAL）进行FHE编程的示例
&lt;/h3>&lt;p>在这里，我们展示一段使用CKKS方案，在加密状态下对实数向量进行加法和乘法运算的概念性Python代码示例。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tenseal&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">ts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 上下文设置 (包含密钥生成)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用CKKS方案，将多项式的次数设置为8192&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SCHEME_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CKKS&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">poly_modulus_degree&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coeff_mod_bit_sizes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate_galois_keys&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_scale&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">40&lt;/span> &lt;span class="c1"># 实数的缩放因子&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 客户端：数据加密&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.5&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">4.0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 将明文向量转换为密文 (原本应该在客户端执行)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 服务器端：在加密状态下进行运算 (保护Data in Use)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 服务器不知道明文，但可以执行加法和乘法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 客户端：结果解密&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 只有拥有私钥的客户端才能看到结果&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_add&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_mul&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;解密后的加法结果: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_add&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 输出示例: [3.5000001, 5.5000001, 7.5000002] (因为是近似计算，会包含微小误差)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;解密后的乘法结果: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_mul&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 输出示例: [3.0000002, 7.5000005, 14.0000003]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>正如上述代码所示，可以通过像 &lt;code>enc_v1 + enc_v2&lt;/code> 这样重载常规Python运算符，直观地编写密文之间的计算。在服务器端，它可以在完全不知道向量内容的情况下完成向量运算。&lt;/p>
&lt;hr>
&lt;h2 id="7-fhe的挑战性能与硬件加速">7. FHE的挑战：性能与硬件加速
&lt;/h2>&lt;p>FHE在理论上提供了完美的安全性，但其实用化面临的最大挑战是**“性能开销”**。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>计算开销&lt;/strong>：与明文计算相比，密文计算在CPU上的速度要慢几千倍甚至几万倍。多项式的乘法以及自举过程都需要进行大量的FFT（快速傅里叶变换）或NTT（数论变换）计算。&lt;/li>
&lt;li>&lt;strong>数据大小膨胀 (Ciphertext Expansion)&lt;/strong>：只需几个字节的明文，加密后就可能变成数兆字节。这会严重挤占内存带宽和网络带宽。&lt;/li>
&lt;/ol>
&lt;h3 id="硬件解决方案的探索">硬件解决方案的探索
&lt;/h3>&lt;p>为了克服这一开销，世界各地正在研发FHE专用的硬件加速器（支持ASIC、FPGA、GPU等）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GPU加速&lt;/strong>：正在利用NVIDIA等强大的GPU，对NTT运算和自举进行并行化的尝试。据报道，其速度相比纯软件实现提升了数十倍（例如：100x.ai，Zama的TFHE-rs CUDA backend）。&lt;/li>
&lt;li>&lt;strong>DARPA DPRIVE 项目&lt;/strong>：美国国防高级研究计划局（DARPA）正在推进旨在将FHE的计算速度提升至与明文处理执行速度同等水平（开销控制在10倍以内）的专用硬件开发项目“DPRIVE (Data Protection in Virtual Environments)”，Intel、Microsoft、Intellectual Ventures等公司均有参与。&lt;/li>
&lt;li>&lt;strong>FPU (FHE Processing Unit) 的出现&lt;/strong>：Cornami、Optalysys等初创公司正着手研发使用光计算或特殊硅架构的FHE专用芯片。&lt;/li>
&lt;/ul>
&lt;p>在不久的将来，也许会迎来如同AI领域中NPU（Neural Processing Unit）一般，服务器或云基础设施标配“FPU”的时代。&lt;/p>
&lt;hr>
&lt;h2 id="8-期待的应用用例">8. 期待的应用用例
&lt;/h2>&lt;p>随着FHE逐渐达到实用的速度，它有望在以下领域带来颠覆性的创新。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>医疗与基因组分析的隐私保护&lt;/strong>：
通过对多家医院拥有的患者病历数据和DNA数据使用FHE加密，并在云端交由AI进行训练，可以在不违反隐私法规（如HIPAA和GDPR）的前提下，开展高精度的癌症诊断模型或新药研发。&lt;/li>
&lt;li>&lt;strong>金融机构的欺诈检测与反洗钱 (AML)&lt;/strong>：
相互竞争的银行之间无需透露客户的账户信息或交易记录，即可在加密状态下比对彼此的数据，从而实现跨行分析，以检测庞大的非法汇款网络。&lt;/li>
&lt;li>&lt;strong>安全的AI推理API (MaaS: Model as a Service)&lt;/strong>：
用户可以将自己的声音、面部图像或提示词加密后发送给AI服务（如ChatGPT等LLM）。AI提供商在完全不知道用户输入内容的情况下生成回答，并以密文形式返回。这将完全消除“AI会学习/窥探个人信息”的担忧。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="9-结论密码学的未来走向不可见计算">9. 结论：密码学的未来走向“不可见计算”
&lt;/h2>&lt;p>正如20世纪70年代公钥加密（RSA）的发明使得互联网上的安全通信（如HTTPS）成为可能一样，Craig Gentry发明的FHE是密码学历史上最重要的里程碑之一。&lt;/p>
&lt;p>如今，完全同态加密（FHE）已经走出实验室理论的范畴，进入了由Microsoft、IBM、Intel、Google以及众多初创企业为了实用化而展开激烈竞争的阶段。尽管仍面临计算成本和数据大小等挑战，但得益于算法的精进和硬件加速器的演进，其性能正以超越摩尔定律的速度持续提升。&lt;/p>
&lt;p>在几年后，“对加密数据进行计算”将不再是一件特别的事情，而将成为云服务中标准数据保护的最佳实践。在数据驱动型社会中，FHE能够实现&lt;strong>极致隐私保护与数据充分利用的完美结合&lt;/strong>，它无疑是下一代安全的核心。&lt;/p></description></item></channel></rss>