引言
如果你能直接对加密数据进行计算,而无须先将其解密,会发生什么?这就是同态加密(Homomorphic Encryption, HE)所承诺的革命性能力。自 Rivest 等人在 1978 年首次提出这一概念以来,同态加密经历了从理论谜题到可工程化方案的戏剧性转变——Gentry 在 2009 年首次构造出全同态加密(FHE)方案,彻底改变了密码学乃至整个云计算安全的格局。
本文将从数学直觉出发,逐步拆解同态加密的核心原理,对比 BFV、CKKS、BGV 三大主流方案的技术特性,并通过 Microsoft SEAL 与 OpenFHE 两个主流库展示实际代码实现。我们将看到:同态加密不再只是学术论文中的概念,它正走进银行风控、医疗基因组分析、隐私保护机器学习等真实生产系统。
1. 从部分同态到全同态:三十年理论演进
1.1 同态加密的基本定义
一个加密方案被称为同态的,如果它满足以下性质:给定任意两个明文 m₁ 和 m₂,存在某个运算 ⊕ 使得:
Dec(Enc(m₁) ⊕ Enc(m₂)) = m₁ m₂
这意味着你可以在密文空间直接执行运算,解密后的结果等同于对明文执行相同运算。关键在于,执行运算的一方自始至终接触不到明文数据。
1.2 部分同态(PHE):只能用一种运算
在同态加密发展的前三十年里,研究者只能构造出支持单一类型运算的方案:
RSA 乘法同态:Enc(m₁) × Enc(m₂) = Enc(m₁ × m₂)。RSA 天然满足乘法同态,因为它基于模幂运算:(g^m₁ × g^m₂ = g^(m₁ m₂))。但 RSA 不支持加法运算。
Paillier 加法同态:Enc(m₁) × Enc(m₂) = Enc(m₁ m₂)。Paillier 基于复合剩余类问题,天然支持加法同态,被广泛用于电子投票和隐私保护求和场景。但它不支持乘法。
1.3 层次同态(SHE):有限深度电路
介于 PHE 和 FHE 之间,研究者构造出了支持有限次加法和乘法组合的方案——即层次同态加密(Somewhat Homomorphic Encryption, SHE)。SHE 能计算任意多项式,但要求多项式的深度(乘法层数)不超过噪声预算允许的上限。一旦噪声增长超过阈值,密文就无法正确解密。
1.4 自举(Bootstrapping):Gentry 的突破性洞见
Craig Gentry 在 2009 年的博士论文中提出了改变密码学进程的关键思想:自举(Bootstrapping)。
核心思路是:将一个「接近耗尽噪声预算」的密文,使用加密的私钥重新加密一遍,从而「刷新」密文、重置噪声水平。这相当于用同态的方式执行解密操作——在密文上运行解密算法,产生一个同一条明文的新密文,但噪声预算被恢复到初始水平。
有了自举,理论上可以无限次刷新密文,从而支持任意深度的计算电路——这就是全同态加密(Fully Homomorphic Encryption, FHE)。
2. 三大主流方案深度对比
目前工程实践中,最广泛使用的 FHE 方案是 BFV、CKKS 和 BGV。它们都基于环上容错学习(Ring-LWE)问题,但在数据编码、噪声管理和适用场景上有显著差异。
2.1 BFV:精确整数运算的理想选择
BFV(Brakerski/Fan-Vercauteren)方案对整数明文进行精确运算,不存在近似误差。其核心特性:
- 明文空间:整数环 ℤ_t,其中 t 是明文模数
- 精度特点:完全精确,无舍入误差
- 典型应用:精确求和、COUNT 聚合、整数条件下的 WHERE 子句过滤
- 参数约束:t 必须小于密文模数 q,且满足 t | (q-1) 以保证正确性
BFV 是数据库密文查询、精确财务结算等场景的首选方案。它的优势在于「所见即所得」——解密后的结果与明文计算完全一致。
2.2 CKKS:浮点近似计算的王者
CKKS(Cheon-Kim-Kim-Song)是目前机器学习场景最流行的 FHE 方案。它的关键创新是支持近似浮点数算术:
- 明文空间:复数(或实数)向量,编码在分圆多项式的系数中 精度特点:最低位包含近似误差(通常 30-40 位精度),结果为近似值
- 缩放因子:引入 Δ 缩放因子模拟浮点运算,乘法后执行重缩放(Rescale)保持精度
- 典型应用:隐私保护机器学习推理、近似统计、信号处理和基因组分析
CKKS 之所以在 AI 领域流行,根本原因在于:神经网络的推理天然容忍微小的数值误差,而精确整数运算的溢出风险反而更难以处理。CKKS 让「在加密数据上跑 ResNet」成为可能。
2.3 BGV:整数模运算的多面手
BGV(Brakerski-Gentry-Vaikuntanathan)与 BFV 类似,都处理精确整数运算,但采用不同的噪声管理策略:
- 明文空间:模 t 整数环
- 噪声管理:模切换(Modulus Switching)替代重缩放,逐层降低密文模数和噪声
- 精度特点:完全精确,无近似误差
- 典型应用:需要高深度计算且要求精确结果的场景,如多层 mux 电路
BGV 在需要控制最终密文模数大小的应用中表现出色,它与 BFV 的主要区别在于噪声管理路径不同——BFV 直接按比例缩小,BGV 逐层降级密文模数。
2.4 三种方案选型速查表
| 维度 | BFV | CKKS | BGV |
|---|---|---|---|
| 明文类型 | 精确整数 | 近似浮点数 | 精确整数 |
| 精度 | 完全精确 | 30-40位近似 | 完全精确 |
| 噪声管理 | 重缩放 | 重缩放 | 模切换 |
| 最佳场景 | 精确聚合 | 密态ML推理 | 深度精确计算 |
| 主流库 | SEAL/OpenFHE | SEAL/OpenFHE/HElib | OpenFHE/HElib |
3. 工程实践:Microsoft SEAL 入门指南
Microsoft SEAL(Simple Encrypted Arithmetic Library)是目前使用最广泛的 C FHE 库。虽然它没有官方 C API,但其设计清晰、文档完善,是理解同态加密工程实现的最佳切入点。
3.1 环境搭建
# 安装依赖(Ubuntu/Debian)
sudo apt install build-essential cmake git
# 克隆并编译 SEAL
git clone https://github.com/microsoft/SEAL.git
cd SEAL
cmake -S . -B build -DSEAL_BUILD_TESTS=ON
cmake --build build -j$(nproc)
sudo cmake --install build
# 验证编译
./build/native/tests/sealtest3.2 CKKS 方案完整示例
#include "seal/seal.h"
using namespace seal;
using namespace std;
// 隐私保护线性回归推理:w·x b
void encrypted_linear_inference() {
// 1. 设置 CKKS 参数
EncryptionParameters params(SCHEME_TYPE::ckks);
params.set_poly_modulus_degree(8192);
params.set_coeff_modulus(CoeffModulus::Create(
8192, { 60, 40, 40, 60 }));
double scale = pow(2.0, 40);
// 2. 创建密码学上下文
SEALContext context(params);
KeyGenerator keygen(context);
auto secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
RelinKeys relin_keys;
keygen.create_relin_keys(relin_keys);
GaloisKeys galois_keys;
keygen.create_galois_keys(galois_keys);
// 3. 准备工具
Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
Decryptor decryptor(context, secret_key);
CKKSEncoder encoder(context);
// 4. 加密输入数据
vector

发表评论 取消回复