Archipelago

Lec 9全同态加密 I(FHE)

讲义完成更新于 2026-09-16

Lec 9 全同态加密 I(FHE)

MIT 6.5610 · Lecture 9 · 关键词:同态加密、部分/层级/全同态、LWE 上的加法与乘法、噪声增长、GSW 说明:以标准 FHE 处理撰写(Gentry 2009 / GSW 2013),要点与本课"FHE 1"一致。


TL;DR

  • 全同态加密允许直接在密文上计算,并让解密结果等于对明文执行同一计算。
  • LWE 密文的线性运算自然增长噪声,乘法则更快消耗噪声预算。
  • GSW 类构造与自举说明“可计算性”来自控制噪声,而不是让密文变成明文。

0. 目标

在密文上直接计算,无需解密。给定 Enc(x1),…,Enc(xn)\mathrm{Enc}(x_1),\dots,\mathrm{Enc}(x_n) 与任意电路 ff,能算出 Enc(f(x1,…,xn))\mathrm{Enc}(f(x_1,\dots,x_n)),且服务器全程不知明文。

级别能力
部分同态(PHE)只支持一种运算(RSA 乘法同态 / Paillier 加法同态)
有限/层级同态(SHE/Leveled)支持有限深度的加法+乘法电路
全同态(FHE)支持任意深度电路

1. LWE 密文的天然同态

回忆 L7:LWE 密文携带小噪声,解密靠噪声 <q/4< q/4。

  • 加法:两密文相加 → 明文相加,噪声相加(线性增长,便宜)。
  • 乘法:可设计成明文相乘,但噪声相乘式放大(昂贵)。

定理

核心矛盾——噪声预算 每次运算消耗噪声预算(尤其乘法);一旦累积噪声超过 q/4q/4,解密失败。故朴素 LWE 方案只能算有限深度电路(层级 FHE)。要做到"全"同态,必须有办法刷新噪声。


2. GSW:把密文做成矩阵

GSW (Gentry–Sahai–Waters 2013) 把密文表示为矩阵 C\mathbf{C},使得对秘密向量 s\mathbf{s}(近似特征向量)有 C⋅s≈μ⋅s(modq),\mathbf{C}\cdot\mathbf{s} \approx \mu\cdot\mathbf{s} \pmod q, 即 μ\mu 是密文矩阵的"近似特征值",s\mathbf{s} 是近似特征向量。

🔎 同态由线性代数自然给出:

  • 加法 C1+C2\mathbf{C}_1+\mathbf{C}_2:特征值相加 → μ1+μ2\mu_1+\mu_2。
  • 乘法 C1⋅C2\mathbf{C}_1\cdot\mathbf{C}_2:(C1C2)s≈C1(μ2s)=μ2(C1s)≈μ1μ2s(\mathbf{C}_1\mathbf{C}_2)\mathbf{s}\approx\mathbf{C}_1(\mu_2\mathbf{s})=\mu_2(\mathbf{C}_1\mathbf{s})\approx\mu_1\mu_2\mathbf{s} → μ1μ2\mu_1\mu_2。 配合 bit-decomposition(G−1G^{-1} 小工具技巧) 控制乘法的噪声放大,使其可控但仍随深度累积。

3. 通向"全"同态:Bootstrapping 预告

Gentry 的突破:自举(bootstrapping)——把"解密电路"本身当成一个同态可计算的函数,在密文上同态地运行解密,从而得到一个噪声被"重置"到低水平的新密文。

🔎 直觉:密文噪声快超预算时,不真正解密(那需要私钥),而是把私钥也加密后,在密文层面跑一遍解密电路 → 输出同一明文、但噪声回到初始水平的"刷新密文"。条件是解密电路足够浅,能在剩余噪声预算内被同态求值(circular security 假设:用公钥加密自己的私钥仍安全)。L10 展开。


4. 工程视角

  • FHE = "把计算外包给不可信云、却不泄露数据" 的终极工具:隐私机器学习推理、加密数据库查询、隐私分析。
  • 现实瓶颈:性能。FHE 比明文计算慢几个数量级;bootstrapping 尤其昂贵。
  • 实用库/方案:BGV、BFV(整数)、CKKS(近似实数/适合 ML)、TFHE(快速 bootstrapping,适合布尔电路)。
  • 与 MPC(L13)取舍:FHE 单方外包但慢;MPC 多方交互但常更快。

5. 全同态加密基础小结

  • 同态级别:部分 → 层级 → 全。
  • LWE 密文加法便宜、乘法噪声放大;噪声预算 q/4q/4 限制深度。
  • GSW 把密文做成矩阵,明文 = 近似特征值,加/乘对应矩阵加/乘。
  • "全"同态靠 bootstrapping 刷新噪声(L10)。

我的理解

可以把同态密文理解为携带“噪声预算”的类型;每个运算都会消耗预算,超出上限就失去正确性。