引言

如果你能直接对加密数据进行计算,而无须先将其解密,会发生什么?这就是同态加密(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 三种方案选型速查表

维度BFVCKKSBGV
明文类型精确整数近似浮点数精确整数
精度完全精确30-40位近似完全精确
噪声管理重缩放重缩放模切换
最佳场景精确聚合密态ML推理深度精确计算
主流库SEAL/OpenFHESEAL/OpenFHE/HElibOpenFHE/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/sealtest

3.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                        
                    
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部