在密文上直接计算,解密后等于明文计算结果——密码学的"圣杯"。
从 Gentry 2009 年的理论突破到 CKKS/BFV 的工程实践,AI 隐私推理的终极方案。
同态加密 (Homomorphic Encryption, HE) 是一种特殊的加密方案,允许在密文上直接进行计算,计算结果解密后等于对明文进行相同计算的结果。
用数学语言描述:对于加密函数 E 和运算 ⊙:
Decrypt( E(a) ⊙ E(b) ) = a ⊙ b # 即:加密(a) 与 加密(b) 做运算,解密后 = a 与 b 做运算
支持:仅一种运算(加法或乘法)
代表:Paillier(加法同态)、RSA(乘法同态)
成熟度:⭐⭐⭐⭐⭐ 极成熟,工业级
用途:电子投票(加密票数相加)、隐私聚合统计
性能:接近明文计算(仅 2-5× 开销)
支持:加法 + 乘法,但乘法深度有限
代表:早期 BFV/BGV 方案
成熟度:⭐⭐⭐⭐ 实用
限制:乘法次数有上限(噪声增长问题)
性能:100-1000× 开销
支持:加法 + 乘法,无限深度
代表:CKKS、BFV、BGV + 自举 (Bootstrapping)
成熟度:⭐⭐⭐ 研究活跃/早期商用
突破:Gentry 2009 自举技术解决噪声问题
性能:1,000-100,000× 开销
FHE 方案基于格密码 (Lattice-based Cryptography)。每次运算都会在密文中累积"噪声":
Gentry 的天才想法是自举 (Bootstrapping):用密文的加密版本("重加密密钥")对密文本身执行解密电路,"刷新"噪声。这等价于在加密状态下运行解密函数——有点像"提着自己的鞋带把自己提起来"(所以叫 Bootstrapping)。
| 特性 | BFV / BGV | CKKS | TFHE |
|---|---|---|---|
| 计算域 | 整数模 q (ℤq) | 近似实数 (ℝ 近似) | 布尔/任意电路 |
| 精度 | 精确(无精度损失) | 近似(可控精度损失) | 精确(位级操作) |
| 自举方式 | 模切换 + 自举 | 模切换 + 近似自举 | 逐位自举(最快) |
| 最佳用途 | 精确整数运算、数据库查询 | 🧠 AI/ML 推理(浮点运算) | 任意计算、比较、分支 |
| 加法性能 | 快(~1ms) | 快(~1ms) | 中等 |
| 乘法性能 | 中等(~10-50ms) | 中等(~10-50ms) | 中等 |
| 自举性能 | 慢(~秒级) | 中等(~100ms) | ⚡ 最快(~10-20ms) |
| 比较运算 | ❌ 极难 | ❌ 不支持 | ✅ 原生支持 |
| AI/ML 友好度 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 代表库 | Microsoft SEAL, OpenFHE | Microsoft SEAL, HEAAN | TFHE-lib, OpenFHE |
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 支持批处理 (Batching)——将多个实数值打包到一个密文中,一次运算同时处理所有值。这是 CKKS 性能的关键:
FHE 计算有一个关键概念:乘法深度 (Multiplicative Depth)。每做一次乘法,噪声增长,可用的"噪声预算"减少。当预算耗尽,必须自举刷新噪声。
| 乘法深度 | 所需多项式度数 | 密文大小 | 典型操作 |
|---|---|---|---|
| 1-2 | N = 212 - 214 | ~100KB | 简单线性运算 |
| 3-5 | N = 214 - 215 | ~500KB | 小型神经网络层 |
| 6-10 | N = 215 - 216 | ~1-2MB | 多层网络,需自举 |
| 10+ | N = 216+ | ~4MB+ | 深度网络,多次自举 |
场景:用户有隐私数据(医疗影像、金融数据),想用 AI 模型做推理,但不信任云服务商。
流程:用户加密数据 → 发送密文到云 → 云在密文上运行模型推理 → 返回加密结果 → 用户解密得到推理结果。云端全程不接触明文。
性能:小型模型(< 1M 参数)在 2025 年约分钟级延迟。大型模型仍不现实。
场景:推荐系统需要用户行为数据,但用户不想泄露个人偏好。
流程:用户加密行为向量 → 服务端在密文上计算推荐分 → 返回加密推荐 → 用户解密。服务端不知道用户看了什么。
现实:已有学术原型,工业部署正在探索。
场景:多家医院想联合训练模型,但受 HIPAA/合规限制不能共享患者数据。
流程:各医院加密本地数据 → 在密文上执行联邦聚合 → 训练全局模型。各方的原始数据不出本地。
注意:FHE + 联邦学习是常见组合。FHE 保护聚合步骤的隐私。
场景:银行、保险、征信机构想联合评估风险,但各自数据受监管限制。
流程:各方加密特征 → 在密文上运行风控模型 → 返回加密风险评分 → 解密。
现实:IBM 等已有金融 FHE 解决方案原型。
| 模型/任务 | 输入维度 | 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 |
| 库 | 语言 | 支持方案 | 特点 | 适合 |
|---|---|---|---|---|
| Microsoft SEAL | C++ / C# / Python | BFV, CKKS | 最成熟的 FHE 库之一,API 友好,文档完善 | 通用 FHE 开发 |
| OpenFHE | C++ / Python | BFV, BGV, CKKS, TFHE | 统一接口支持所有方案,开源社区活跃 | 研究 + 原型 |
| HEAAN | C++ / Python | CKKS | CKKS 的原始实现,浮点运算优化好 | CKKS 研究 |
| TFHE-lib | C++ / Rust | TFHE | 最快的自举实现,支持任意布尔电路 | 任意电路 |
| Zama Concrete | Python / Rust | TFHE 变体 | Python-first API,开发者体验最好 | 快速原型 |
| Google FHE 转译器 | C++ → FHE | BFV | 自动将 C++ 编译为 FHE 程序 | 低门槛入门 |
| PySyft | Python | 集成多种 | FHE + MPC + FL 统一框架 | 隐私 AI 研究 |
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]
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}")
# 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}")
# 生成 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 | MPC | TEE | DP |
|---|---|---|---|---|
| 信任假设 | 仅密码学假设 | 非共谋假设 | 信任硬件厂商 | 信任数据收集方 |
| 计算方可见明文? | ❌ 完全不可见 | ❌ 每方只看碎片 | ⚠️ 理论上不可见,但侧信道风险 | ✅ 可见(加噪后发布) |
| 通信轮次 | 1 轮(离线计算) | 多轮交互 | 1 轮 | 1 轮 |
| 计算开销 | 10,000-100,000× | 10-100× | 1.1-1.5× | 1-2× |
| 通信开销 | 2-50× | 10-1000× | 1× | 1× |
| 非线性运算 | ⚠️ 难(多项式近似) | ✅ 可以但贵 | ✅ 原生支持 | N/A |
| 适合的 AI 任务 | 推理(未来) | 训练 + 推理 | 训练 + 推理 | 训练数据保护 |
| 成熟度 | 研究→早期商用 | 早期商用 | 生产级 | 生产级 |
多家公司正在研发 FHE 加速芯片。预期 2026-2028 年出现首个商用 FHE ASIC,有望将性能提升 100-1000×。DARPA 的 DPRIVE 项目投资超千万美元。
Zama 的 fhEVM 让智能合约能处理加密状态。链上 FHE 意味着:合约可以看到加密数据并计算,但矿工/验证者看不到明文。这是链上隐私的基础设施。
传统 NN 对 FHE 不友好(ReLU 非线性、深度网络)。研究者正在设计 FHE 原生架构:用低次多项式替代 ReLU、浅而宽的网络、知识蒸馏到 FHE 友好的小模型。
Google 的 FHE 转译器、Zama 的 Concrete 编译器正在让开发者用高级语言(C++/Python)写程序,自动编译为 FHE 电路。降低使用门槛是普及的关键。
2024-2025 年的研究正在探索更紧凑的 FHE 方案:更小的密文、更快的自举、更低的噪声增长。理论突破可能随时发生。
NIST、ISO、IETF 正在推进 FHE 标准化。标准化是大规模部署的前提——不同厂商的 FHE 实现需要互操作性。预计 2026-2027 年出现正式标准。