🧮 同态加密

在密文上直接计算,解密后等于明文计算结果——密码学的"圣杯"。
从 Gentry 2009 年的理论突破到 CKKS/BFV 的工程实践,AI 隐私推理的终极方案。

🧠 同态加密:密码学的"圣杯"

同态加密 (Homomorphic Encryption, HE) 是一种特殊的加密方案,允许在密文上直接进行计算,计算结果解密后等于对明文进行相同计算的结果。

用数学语言描述:对于加密函数 E 和运算

Decrypt( E(a) ⊙ E(b) ) = a ⊙ b

# 即:加密(a) 与 加密(b) 做运算,解密后 = a 与 b 做运算

三种同态级别

🔄 半同态 (PHE)

支持:仅一种运算(加法或乘法)

代表:Paillier(加法同态)、RSA(乘法同态)

成熟度:⭐⭐⭐⭐⭐ 极成熟,工业级

用途:电子投票(加密票数相加)、隐私聚合统计

性能:接近明文计算(仅 2-5× 开销)

🔄🔄 某些同态 (SHE)

支持:加法 + 乘法,但乘法深度有限

代表:早期 BFV/BGV 方案

成熟度:⭐⭐⭐⭐ 实用

限制:乘法次数有上限(噪声增长问题)

性能:100-1000× 开销

🔄🔄🔄 全同态 (FHE)

支持:加法 + 乘法,无限深度

代表:CKKS、BFV、BGV + 自举 (Bootstrapping)

成熟度:⭐⭐⭐ 研究活跃/早期商用

突破:Gentry 2009 自举技术解决噪声问题

性能:1,000-100,000× 开销

FHE 的核心难题:噪声增长

FHE 方案基于格密码 (Lattice-based Cryptography)。每次运算都会在密文中累积"噪声":

Gentry 的天才想法是自举 (Bootstrapping):用密文的加密版本("重加密密钥")对密文本身执行解密电路,"刷新"噪声。这等价于在加密状态下运行解密函数——有点像"提着自己的鞋带把自己提起来"(所以叫 Bootstrapping)。

自举的性能代价:自举是 FHE 最昂贵的操作。2009 年 Gentry 原始方案的自举需要约 30 分钟。到 2025 年,优化的自举实现(如 TFHE 的 FFT 自举)已降至约 10-100 毫秒——提升了约 6 个数量级。但即使如此,FHE 整体仍比明文慢数千倍。

FHE 的发展里程碑

2009
Gentry 的 FHE 方案 — 第一个理论可行的全同态加密方案。基于理想格,自举极慢(分钟级),但证明了可行性
2011-2012
BGV 方案 — Brakerski-Gentry-Vaikuntanathan 提出基于标准格的 FHE 方案,效率大幅提升。支持整数算术
2012
BFV 方案 — Brakerski-Fan-Vercauteren 方案,BGV 的简化变体。Microsoft SEAL 的默认方案。适合精确整数计算
2016
TFHE 方案
— Chillotti 等人提出快速自举方案,自举时间降至 13ms(当时记录)。适合任意布尔电路
2017
CKKS 方案 — Cheon-Kim-Kim-Song 提出近似数同态加密方案,支持浮点运算!这是 AI/ML 应用的关键突破
2019
Google FHE 转译器 — Google 开源全同态加密转译器,可以将 C++ 代码自动编译为 FHE 等效程序
2020
Microsoft SEAL 3.5 — 支持 CKKS 和 BFV,API 简化,开发者友好度大幅提升
2022
OpenFED — FHE + 联邦学习结合的框架出现,隐私 AI 推理从概念走向原型
2023
FHE 硬件加速 — Intel、DARPA、Crypto3 等推出 FHE 加速方案。FHE 性能从 100,000× 降至 1,000-5,000×
2024-2025
FHE 商用化加速 — Zama 的 fhEVM(链上 FHE)、FHE.org 推动标准化、多款 FHE 芯片流片。AI 隐私推理从实验室走向早期商用

📋 主要 FHE 方案对比

特性BFV / BGVCKKSTFHE
计算域整数模 q (ℤq)近似实数 (ℝ 近似)布尔/任意电路
精度精确(无精度损失)近似(可控精度损失)精确(位级操作)
自举方式模切换 + 自举模切换 + 近似自举逐位自举(最快)
最佳用途精确整数运算、数据库查询🧠 AI/ML 推理(浮点运算)任意计算、比较、分支
加法性能快(~1ms)快(~1ms)中等
乘法性能中等(~10-50ms)中等(~10-50ms)中等
自举性能慢(~秒级)中等(~100ms)⚡ 最快(~10-20ms)
比较运算❌ 极难❌ 不支持✅ 原生支持
AI/ML 友好度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
代表库Microsoft SEAL, OpenFHEMicrosoft SEAL, HEAANTFHE-lib, OpenFHE
为什么 CKKS 是 AI/ML 的首选?AI 模型的核心运算是矩阵乘法和激活函数,这些涉及浮点运算。BFV/BGV 只支持精确整数,要将浮点数编码为整数需大量缩放。CKKS 原生支持近似实数运算——虽然结果是近似的,但精度可控(类似浮点误差),且性能远优于整数编码方案。CKKS 的论文发表于 2017 年,迅速成为 FHE for AI 的事实标准。

CKKS 编码详解

CKKS 的核心创新是将实数向量编码为多项式:

编码过程:
1. 取 N/2 个实数值: z = (z₁, z₂, ..., z_{N/2})
2. 将实数向量编码为多项式 m(X),使 m(ζⱼ) = Δ·zⱼ
   其中 ζⱼ 是单位根,Δ 是缩放因子
3. 加密多项式 m(X) 得到密文

计算过程:
- 加法: E(m₁) + E(m₂) = E(m₁ + m₂)   → 解码后 z₁ + z₂
- 乘法: E(m₁) × E(m₂) = E(m₁ × m₂)   → 解码后 z₁ * z₂ (缩放因子平方)
- 旋转: Rotate(E(m), k) → 解码后循环移位 k 位

关键操作:
- Rescale: 乘法后缩放因子翻倍,需"重新缩放"恢复原始精度
- Rotate: SIMD 式并行 — 一次操作处理 N/2 个值

CKKS 的 SIMD 并行能力

CKKS 支持批处理 (Batching)——将多个实数值打包到一个密文中,一次运算同时处理所有值。这是 CKKS 性能的关键:

乘法深度与噪声预算

FHE 计算有一个关键概念:乘法深度 (Multiplicative Depth)。每做一次乘法,噪声增长,可用的"噪声预算"减少。当预算耗尽,必须自举刷新噪声。

乘法深度所需多项式度数密文大小典型操作
1-2N = 212 - 214~100KB简单线性运算
3-5N = 214 - 215~500KB小型神经网络层
6-10N = 215 - 216~1-2MB多层网络,需自举
10+N = 216+~4MB+深度网络,多次自举

🤖 同态加密的 AI 应用

🧠 隐私 AI 推理

场景:用户有隐私数据(医疗影像、金融数据),想用 AI 模型做推理,但不信任云服务商。

流程:用户加密数据 → 发送密文到云 → 云在密文上运行模型推理 → 返回加密结果 → 用户解密得到推理结果。云端全程不接触明文。

性能:小型模型(< 1M 参数)在 2025 年约分钟级延迟。大型模型仍不现实。

🔒 隐私保护推荐系统

场景:推荐系统需要用户行为数据,但用户不想泄露个人偏好。

流程:用户加密行为向量 → 服务端在密文上计算推荐分 → 返回加密推荐 → 用户解密。服务端不知道用户看了什么。

现实:已有学术原型,工业部署正在探索。

🏥 医疗数据联合分析

场景:多家医院想联合训练模型,但受 HIPAA/合规限制不能共享患者数据。

流程:各医院加密本地数据 → 在密文上执行联邦聚合 → 训练全局模型。各方的原始数据不出本地。

注意:FHE + 联邦学习是常见组合。FHE 保护聚合步骤的隐私。

💰 金融风控隐私计算

场景:银行、保险、征信机构想联合评估风险,但各自数据受监管限制。

流程:各方加密特征 → 在密文上运行风控模型 → 返回加密风险评分 → 解密。

现实:IBM 等已有金融 FHE 解决方案原型。

FHE AI 推理性能现状(2025)

模型/任务输入维度FHE 延迟明文延迟慢多少倍
逻辑回归~100 特征~1-10 秒~0.1 ms~10,000×
小型 NN (2-3 层)~1K~10-60 秒~1 ms~10,000-60,000×
CNN 小模型28×28 图像~分钟级~10 ms~10,000×
Transformer 层~512 维~小时级~10 ms~100,000×
GPT 推理任意不现实秒级N/A
⚠️ 诚实的性能评估:FHE 目前比明文慢约 10,000-100,000 倍。这意味着一个明文 1ms 的推理在 FHE 下需要 10-100 秒。对实时交互场景(聊天机器人、推荐),这不可接受。但对离线批处理场景(夜间风控计算、医疗研究),延迟可以接受。硬件加速有望在 3-5 年内将差距缩小到 1000× 以下。

加速 FHE 的路径

🖥️ 硬件加速

  • GPU 加速:CuHE、HEonGPU,5-50× 加速
  • FPGA:DARPA DPRIVE 项目,100× 目标
  • ASIC:Intel、Crypto3、Fabric Crypto 等在研发 FHE 专用芯片
  • 预期:3-5 年内 ASIC 可达 1000× 加速

📐 算法优化

  • 快速自举:TFHE 的 FFT 自举已达 ~10ms
  • 稀疏编码:利用数据稀疏性减少计算
  • 近似计算:CKKS 的天然近似,可接受更低精度换取速度
  • 模型适配:设计 FHE 友好的模型架构(少乘法、浅网络)

🤝 混合方案

  • FHE + TEE:TEE 处理非线性运算,FHE 处理线性运算
  • FHE + DP:FHE 保护计算隐私,DP 保护输出隐私
  • FHE + MPC:拆分计算,MPC 处理非线性部分
  • 分层加密:低敏感用普通加密,高敏感用 FHE

🛠️ FHE 工具与库

语言支持方案特点适合
Microsoft SEALC++ / C# / PythonBFV, CKKS最成熟的 FHE 库之一,API 友好,文档完善通用 FHE 开发
OpenFHEC++ / PythonBFV, BGV, CKKS, TFHE统一接口支持所有方案,开源社区活跃研究 + 原型
HEAANC++ / PythonCKKSCKKS 的原始实现,浮点运算优化好CKKS 研究
TFHE-libC++ / RustTFHE最快的自举实现,支持任意布尔电路任意电路
Zama ConcretePython / RustTFHE 变体Python-first API,开发者体验最好快速原型
Google FHE 转译器C++ → FHEBFV自动将 C++ 编译为 FHE 程序低门槛入门
PySyftPython集成多种FHE + MPC + FL 统一框架隐私 AI 研究

💻 代码示例

Python + TenSEAL:CKKS 快速上手

TenSEAL 是 SEAL 的 Python 封装,最适合入门 CKKS 同态加密:

# pip install tenseal
import tenseal as ts
import numpy as np

# 创建 CKKS 上下文
context = ts.context(
    ts.SCHEME_TYPE.CKKS,
    poly_modulus_degree=8192,    # 多项式度数
    coeff_mod_bit_sizes=[60, 40, 40, 40, 40, 60]  # 模切换链
)
# 生成 Galois 密钥(旋转操作需要)和重线性化密钥
context.generate_galois_keys()
context.global_scale = 2**40   # 缩放因子

# ===== 加密两个向量 =====
vec1 = [1.0, 2.0, 3.0, 4.0]
vec2 = [5.0, 6.0, 7.0, 8.0]

enc_vec1 = ts.ckks_vector(context, vec1)
enc_vec2 = ts.ckks_vector(context, vec2)

# ===== 同态加法 =====
enc_add = enc_vec1 + enc_vec2
dec_add = enc_add.decrypt()
print(f"加法: {dec_add}")  # ≈ [6.0, 8.0, 10.0, 12.0]

# ===== 同态乘法 =====
enc_mul = enc_vec1 * enc_vec2
dec_mul = enc_mul.decrypt()
print(f"乘法: {dec_mul}")  # ≈ [5.0, 12.0, 21.0, 32.0]

# ===== 同态标量乘法 =====
enc_scaled = enc_vec1 * 3
dec_scaled = enc_scaled.decrypt()
print(f"标量乘: {dec_scaled}")  # ≈ [3.0, 6.0, 9.0, 12.0]

# ===== 同态内积 =====
enc_dot = enc_vec1.dot(enc_vec2)
dec_dot = enc_dot.decrypt()
print(f"内积: {dec_dot}")  # ≈ [70.0]

# ===== 密文-密文乘法后需要重线性化 =====
enc_result = (enc_vec1 * enc_vec2) + enc_vec1
dec_result = enc_result.decrypt()
print(f"复合运算: {dec_result}")  # ≈ [6.0, 14.0, 24.0, 36.0]

Python + TenSEAL:加密 NN 推理

import tenseal as ts
import numpy as np

# 模拟一个简单的 2 层神经网络
# Layer 1: Linear(4 → 2) + ReLU(近似)
# Layer 2: Linear(2 → 1)
np.random.seed(42)
W1 = np.random.randn(2, 4) * 0.5  # 权重矩阵
b1 = np.zeros(2)                    # 偏置
W2 = np.random.randn(1, 2) * 0.5
b2 = np.zeros(1)

# CKKS 上下文(更大参数以支持更多乘法深度)
context = ts.context(
    ts.SCHEME_TYPE.CKKS,
    poly_modulus_degree=16384,
    coeff_mod_bit_sizes=[60, 40, 40, 40, 40, 40, 60]
)
context.generate_galois_keys()
context.global_scale = 2**40

# 加密输入
x = [0.5, -0.3, 0.8, 0.1]
enc_x = ts.ckks_vector(context, x)

# Layer 1: 矩阵-向量乘法 + 偏置
# 注意:在 FHE 中,权重是明文(服务端模型),输入是密文
enc_h = enc_x.matmul(W1.tolist()) + b1.tolist()

# ⚠️ ReLU 是非线性运算,FHE 不直接支持!
# 方案 1:使用多项式近似(如 x → 0.5x + 0.1875x³ - 0.0039x⁵)
# 方案 2:省略激活函数(对小型网络影响有限)
# 方案 3:用 TFHE 做非线性部分

# 方案 1 示例:3次多项式近似 ReLU (仅在小范围内有效)
# f(x) ≈ 0.5x + 0.1875x³ — 在 [-1, 1] 范围内近似
enc_h_approx = enc_h  # 跳过 ReLU 近似,直接做下一层

# Layer 2
enc_output = enc_h_approx.matmul(W2.tolist()) + b2.tolist()

# 解密结果
output = enc_output.decrypt()
print(f"加密推理结果: {output}")
print(f"明文推理结果: {W2 @ (W1 @ np.array(x) + b1) + b2}")

Zama Concrete-ML:FHE 机器学习(最简方案)

# pip install concrete-ml
from concrete.ml.sklearn import LinearSVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成数据
X, y = make_classification(n_samples=1000, n_features=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 训练模型(自动量化为 FHE 兼容)
model = LinearSVC(n_bits=8)  # 8位量化
model.fit(X_train, y_train)

# 明文推理
y_pred_clear = model.predict(X_test)
print(f"明文准确率: {(y_pred_clear == y_test).mean():.4f}")

# FHE 推理 — 编译模型
model.compile(X_train)

# 加密推理(完整 FHE 流程:加密 → 密文推理 → 解密)
y_pred_fhe = model.predict(X_test, execute_in_fhe=True)
print(f"FHE 准确率: {(y_pred_fhe == y_test).mean():.4f}")
print(f"明文 vs FHE 一致性: {(y_pred_clear == y_pred_fhe).mean():.4f}")

OpenSSL:实际生产中的加密实践(非 FHE)

# 生成 AES-256 密钥
openssl rand -hex 32

# AES-256-CBC 加密文件(注意:生产环境用 GCM 而非 CBC)
openssl enc -aes-256-cbc -salt -pbkdf2 -in secret.txt -out secret.enc

# AES-256-GCM 加密(需要 OpenSSL 3.0+)
openssl enc -aes-256-gcm -in secret.txt -out secret.enc -K $(openssl rand -hex 32) -iv $(openssl rand -hex 12)

# 生成 RSA-4096 密钥对
openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:4096
openssl rsa -in private.pem -pubout -out public.pem

# 用 RSA 公钥加密 AES 密钥(混合加密方案)
openssl rsautl -encrypt -pubin -inkey public.pem -in aes_key.bin -out aes_key.enc

# 用 RSA 私钥解密 AES 密钥
openssl rsautl -decrypt -inkey private.pem -in aes_key.enc -out aes_key.bin

⚖️ FHE vs 其他隐私计算技术

维度FHEMPCTEEDP
信任假设仅密码学假设非共谋假设信任硬件厂商信任数据收集方
计算方可见明文?❌ 完全不可见❌ 每方只看碎片⚠️ 理论上不可见,但侧信道风险✅ 可见(加噪后发布)
通信轮次1 轮(离线计算)多轮交互1 轮1 轮
计算开销10,000-100,000×10-100×1.1-1.5×1-2×
通信开销2-50×10-1000×
非线性运算⚠️ 难(多项式近似)✅ 可以但贵✅ 原生支持N/A
适合的 AI 任务推理(未来)训练 + 推理训练 + 推理训练数据保护
成熟度研究→早期商用早期商用生产级生产级
实际选型策略:
  • 低延迟实时场景 → TEE(1-2× 开销,硬件隔离)
  • 离线批处理 + 最高隐私 → FHE(无需信任任何方)
  • 多方协作 → MPC(多方安全计算,非共谋假设)
  • 数据发布/统计 → DP(差分隐私,数学保证)
  • 最佳实践:混合方案 — TEE 做实时推理,FHE 做离线审计,DP 做输出保护

🔮 FHE 前沿方向

🖥️ FHE 专用芯片

多家公司正在研发 FHE 加速芯片。预期 2026-2028 年出现首个商用 FHE ASIC,有望将性能提升 100-1000×。DARPA 的 DPRIVE 项目投资超千万美元。

🌐 FHE on Blockchain

Zama 的 fhEVM 让智能合约能处理加密状态。链上 FHE 意味着:合约可以看到加密数据并计算,但矿工/验证者看不到明文。这是链上隐私的基础设施。

🧠 FHE 友好的 AI 架构

传统 NN 对 FHE 不友好(ReLU 非线性、深度网络)。研究者正在设计 FHE 原生架构:用低次多项式替代 ReLU、浅而宽的网络、知识蒸馏到 FHE 友好的小模型。

📐 通用 FHE 编译器

Google 的 FHE 转译器、Zama 的 Concrete 编译器正在让开发者用高级语言(C++/Python)写程序,自动编译为 FHE 电路。降低使用门槛是普及的关键。

⚡ 紧凑 FHE 方案

2024-2025 年的研究正在探索更紧凑的 FHE 方案:更小的密文、更快的自举、更低的噪声增长。理论突破可能随时发生。

🔐 FHE 标准化

NIST、ISO、IETF 正在推进 FHE 标准化。标准化是大规模部署的前提——不同厂商的 FHE 实现需要互操作性。预计 2026-2027 年出现正式标准。

📖 学习资源

📚 入门

  • FHE.orgfhe.org 社区和教程
  • Microsoft SEAL 教程 — 最佳 FHE 入门实践
  • Zama 博客zama.ai/blog 最易懂的 FHE 内容
  • Concrete-ML 文档 — FHE ML 实操

🔬 深入

  • Gentry 原始论文 — A Fully Homomorphic Encryption Scheme (2009)
  • CKKS 论文 — Homomorphic Encryption for Arithmetic of Approximate Numbers (2017)
  • TFHE 论文 — Faster Fully Homomorphic Encryption (2016)
  • IACR ePrint — 最新 FHE 论文

🛠️ 实操

  • TenSEAL — Python FHE 入门首选
  • Concrete-ML — FHE 机器学习
  • OpenFHE — 统一 FHE 库
  • SEAL — 工业级 FHE 库