同态加密与私有AI推理:从TFHE原理到工程落地实践
2026/9/4 23:39:03 网站建设 项目流程

最近在跟进隐私计算与 AI 推理交叉方向时,频繁看到同态加密的身影。尤其是 Google 在相关技术博客中提出的观点——用同态加密让私有 AI 变得可落地,引起了不少后端开发和算法工程师的关注。很多人一听到“同态加密”,第一反应是“性能损失太大、离工程太远”。但 Google 的思路和配套开源库,其实已经把这套技术往工程化方向推了一大步。这篇文章会从同态加密的核心概念讲起,结合 Google 在私有 AI 推理上的技术实践,拆解 FHE(全同态加密)在真实项目里的落地路径、代码怎么写、性能瓶颈在哪、以及常见的坑怎么避开。

如果你正在做 AI 模型部署、数据合规改造、隐私计算平台,或者只是对“加密状态下跑模型”这件事感兴趣,这篇文章应该能帮你建立一条从理论到工程实现的清晰索引。

1. 为什么私有 AI 需要同态加密

1.1 传统 AI 服务中的数据暴露问题

在常规的 AI 服务架构中,用户请求进入服务端之后,几乎都是明文状态。以一个典型的推理链路为例:用户把输入文本通过 HTTPS 发送到服务端,服务端在内存中加载模型,执行前向推理,然后把结果返回给用户。

在这条链路中,虽然有 TLS 加密传输,但 TLS 只保护“数据在网络上传输的过程”。数据一旦到达服务器内存,就是明文。这意味着:

  • 模型服务商可以看到用户提交的完整输入;
  • 用户的核心隐私数据在推理计算过程中对服务方完全透明;
  • 如果服务端被攻破,历史请求中的敏感信息可能被批量泄露;
  • 即使不涉及恶意攻击,安全审计与合规要求也往往禁止服务方接触某些明文数据。

对于医疗机构、金融机构、个人健康助手等场景,这种“明文可见”的推理模式是难以接受的。用户希望获得 AI 能力,但不愿意交出原始数据。

1.2 同态加密解决的核心问题

同态加密(Homomorphic Encryption,HE)是一种特殊的加密机制。与普通加密只支持“解密后读明文”不同,同态加密允许直接在密文上执行计算,并且计算后解密得到的结果,与直接对明文做同样的计算再加密,结果保持一致。

简单来说:

  • 普通加密:E(a)E(b)不能直接做加法或乘法。
  • 同态加密:E(a) + E(b) = E(a + b)E(a) * E(b) = E(a * b)

这意味着 AI 推理可以在完全不需要解密用户输入的情况下执行。用户把输入加密后发给云端,云端在密文上运行神经网络模型,然后把加密结果返回给用户,用户本地解密得到推理结果。整个过程,云端无法得知用户的真实输入内容,也无法得知推理结果的含义。

Google 在推动的方向,正是将这个“理论可行”变成“工程可用”。他们把 TFHE(全同态加密方案的一种)与 AI 推理模型结合,尝试在 Transformer、卷积网络等常见模型结构上,实现可接受的推理延迟。相比过去把同态加密视为纯学术方向,Google 的工作更关注真实模型、真实框架、真实算子如何落到密文计算上。

1.3 同态加密不是唯一选择,但形态最干净

做一个对比更方便理解。目前业界做 AI 隐私保护,主要有几种技术路线:

技术路线核心思路优势不足
可信执行环境(TEE)把推理放到 CPU/GPU 的受保护区域内性能损耗小、改造量小依赖硬件厂商信任边界
安全多方计算(MPC)多方持有分片,协同计算不依赖单一信任点通信开销大、协议复杂
联邦学习数据不出本地,只交换梯度/参数适合分布式训练场景推理阶段仍需中心化
同态加密(HE/FHE)直接在密文上推理隐私保护最彻底、云端只能看到密文性能开销大、算子适配难
差分隐私向数据或查询结果注入噪声防止个体信息被推断会损失精度

同态加密在“安全形态”上是最干净的。因为云端自始至终只持有密文,即使服务器完全被攻破,攻击者拿到的也只是一堆无法解密的随机密文。Google 的定位是把这条最干净的技术路径尽量拉近生产可用。

2. 同态加密与 AI 结合的核心原理

2.1 从部分同态到全同态

要理解 Google 在 TFHE 上做 AI 推理的难点,得先理解同态加密家族的发展脉络。

第一代同态加密只支持加法或乘法中的一种运算,称为部分同态加密(PHE)。例如 RSA 具备乘法同态性,Paillier 具备加法同态性。问题是,神经网络推理既需要加法也需要乘法,部分同态无法覆盖。

第二代方案支持有限次数的加法和乘法,称为 Somewhat Homomorphic Encryption(SHE)或 leveled HE。例如 BGV、BFV 方案,可以支持一定深度的电路计算,但深度一大,噪声增长导致无法正确解密。

第三代全同态加密(FHE)的关键突破是 “自举(Bootstrapping)” 技术。自举可以对密文中的噪声进行“重置”,允许理论上无限深度的计算。TFHE 是当前 FHE 家族中最适合做布尔电路和查表运算的方案之一。

2.2 TFHE 为什么适合 AI 推理

AI 推理中的大量操作本质上是线性的:矩阵乘法、卷积、BatchNorm 推理阶段的缩放,这些可以用密文加法和密文乘法表示。

但 AI 推理也包含非线性操作:ReLU、GeLU、Sigmoid、Softmax 等激活函数。这些函数无法直接用加法与乘法组合来精确计算。在 TFHE 中有一个非常重要的原语——可编程自举(Programmable Bootstrapping,PBS),可以在刷新噪声的同时,对一个函数进行查表求值。

这意味着 TFHE 可以把非线性激活函数转换成一个查表操作,并同步完成噪声刷新。这使得在深度的 Transformer 结构上运行密文推理成为可能。Google 公布的实验结果中,就包含了对 Transformer 模型进行 FHE 推理的实践探索。

不过,目前公开的 FHE 推理仍以 CPU 实现为主。同态加密的硬件加速方案虽然已有研究,但工程生态还不够成熟。因此,在实际工程中,常见做法是:

  • 把模型量化到低比特位宽(如 8-bit、16-bit);
  • 用多项式或查找表近似非线性激活函数;
  • 将模型按层转换为 TFHE 电路;
  • 对核心算子做并行化与 batch 化优化。

2.3 明文域与密文域的编码映射

同态加密并不是直接对浮点数做运算,而是对整数多项式环上的元素运算。要把 AI 模型中的浮点张量映射到密文空间,需要经过编码环节。

常见的做法是定点量化编码:

原始浮点值 x ----> 缩放因子 s ----> 四舍五入为整数 x_int ----> 对模数 q 取模,形成密文空间中的整数表示

使用 TFHE 等库进行开发时,输入的浮点数类型(如 float、double)需要转换成整数。例如:

// 编码:将浮点数映射到 [0, 2^16-1] 的整数域 uint32_t encode_double(double value) { double scaled = value * scaling_factor; int64_t rounded = llround(scaled); // 处理负数映射与取模逻辑 return static_cast<uint32_t>(rounded & mask); }

在推理结束之后,服务端返回的是密文结果。用户拿到密文后本地解密,得到一个整数,再除以缩放因子还原为浮点数。编码方式直接决定精度损失与噪声控制。尤其要注意,一旦在密文上做乘法,密文值的范围会变大,相应的缩放因子与模数选取都要提前设计好。

3. 版本环境与生态现状

3.1 主流同态加密开源库选择

在同态加密与 AI 结合的技术栈中,目前比较活跃的开源库主要有以下几个方向:

库名所属机构核心语言适用方向
Microsoft SEAL微软C++、Python 绑定BFV、CKKS 方案,适合数值计算
HElibIBMC++BGV 方案,支持自举
PALISADE / OpenFHE开源社区C++、Python多种方案统一接口
TFHE 系列法国/社区C++、Rust布尔电路、查表与自举
Google 内部 FHE 工具链GoogleC++ 为主Transformer 推理、加密搜索等

Google 在相关工作中更多提到的是基于 TFHE 类方案做的 AI 推理尝试。对于普通开发者而言,先选择一个有 Python 绑定的库做实验是最务实的路径。

3.2 运行环境建议

FHE 本身是纯 CPU 计算密集任务,对指令集和底层数学库比较敏感。建议使用 Linux 环境进行实验。示例环境如下:

  • 操作系统:Ubuntu 20.04 / 22.04
  • 编译器:GCC 9 以上
  • 语言版本:C++17 或 Python 3.8 以上
  • 构建工具:CMake 3.16 以上
  • CPU:建议支持 AVX2 / AVX-512
  • 内存:至少 16GB(小规模实验可放宽)

版本需要根据你的实际环境调整。同类库迭代速度较快,不同版本的 API 差异不小,建议以官方仓库 README 为准。

3.3 第一个最小可运行示例

先不急着直接上模型推理,而是跑通一个最基础的“密文加法”示例,理解库的基本开发流程。以下是基于 TFHE 风格开源库的伪代码思路,实际 API 以你选择的库为准。

// 示例思路:密文上的加法 // 1. 初始化参数与密钥 auto parameters = create_parameters(8); // 8-bit 明文空间 auto context = create_context(parameters); auto secret_key = context.generate_secret_key(); // 2. 加密两个整数 auto ct1 = encrypt(secret_key, 12); auto ct2 = encrypt(secret_key, 30); // 3. 在密文上执行加法 auto result_ct = add(ct1, ct2); // 4. 解密并输出 auto plain = decrypt(secret_key, result_ct); std::cout << "解密结果:" << plain << std::endl; // 期望输出 42

这个例子虽然简单,但包含了 FHE 开发的完整闭环:密钥管理、加密、运算、解密。后面接入 AI 模型时,所有复杂的推理算子最终都会落到这一层次的操作上。

4. 用 TFHE 做一个简化版私有 AI 推理

4.1 案例目标

为了演示“同态加密 + 神经网络推理”的端到端流程,我们做一个简化版隐私推理:客户端加密一个特征向量,云端在密文上运行一个已经训练好的小型神经网络,返回加密的预测结果,客户端解密得到预测标签。

说明:这是一个教学 Demo,用于展示流程与代码组织方式。真实场景中的模型规模、算子和密钥管理要比这里复杂得多。

4.2 项目结构设计

private-ai-demo/ ├── CMakeLists.txt ├── README.md ├── include/ │ └── demo_he.h ├── src/ │ ├── demo_he.cpp │ ├── server_inference.cpp │ └── client_main.cpp ├── models/ │ └── simple_model.json └── scripts/ ├── train_model.py └── run_demo.sh

为了便于理解,可以把整个流程拆成三部分:

  • client 端:生成密钥,加密输入特征;
  • server 端:加载模型权重,在密文上执行推理,返回密文结果;
  • client 端:解密结果,得到预测标签。

4.3 模型定义与量化脚本

在模型进入 FHE 推理之前,通常先在明文环境中对它做量化。常见做法是把神经网络的权重和输入映射到整数环。以 Python 训练脚本为例:

# 文件路径:scripts/train_model.py import json import numpy as np # 构造一个简单的二分类模型:2 层全连接 rng = np.random.default_rng(42) w1 = rng.uniform(-0.5, 0.5, size=(8, 4)) b1 = np.zeros(4) w2 = rng.uniform(-0.5, 0.5, size=(4, 2)) b2 = np.zeros(2) # 量化权重到 16-bit 整数域 SCALE = 1024.0 def quantize(arr): return np.round(arr * SCALE).astype(np.int32).tolist() model_dict = { "w1": quantize(w1), "b1": quantize(b1), "w2": quantize(w2), "b2": quantize(b2), "scale": SCALE } with open("models/simple_model.json", "w", encoding="utf-8") as f: json.dump(model_dict, f, indent=2) print("模型已保存到 models/simple_model.json")

在真实项目中,可以使用 PyTorch 的torch.quantization或 ONNX Runtime 的量化工具。务必注意:不同推理框架的量化算法会影响 FHE 推理的最终精度,建议在选型前用业务数据做精度对比。

4.4 服务端:加载权重并执行密文推理

服务端只做两件事:读取明文模型权重,在密文上做计算。参考代码如下:

// 文件路径:src/server_inference.cpp // 示例结构,不依赖具体 FHE 库实现 #include <iostream> #include <vector> #include <fstream> #include <nlohmann/json.hpp> using json = nlohmann::json; // 简化:表示一个密文向量 struct CipherVector { std::vector<int64_t> data; }; // 密文上的线性层 CipherVector linear_layer(const CipherVector& input, const std::vector<int64_t>& weight, const std::vector<int64_t>& bias) { // 执行密文乘法与加法,这里仅演示计算思路,实际 FHE 乘法需要使用密文乘法算子 // 注意:密文乘法会导致噪声增长,真实实现需要引入 relinearization 或 bootstrap CipherVector output; for (size_t j = 0; j < bias.size(); j++) { int64_t acc = bias[j]; for (size_t i = 0; i < input.data.size(); i++) { acc += input.data[i] * weight[j * input.data.size() + i]; } output.data.push_back(acc); } return output; } int main() { // 读取量化后的模型 std::ifstream model_file("../models/simple_model.json"); json model = json::parse(model_file); // 假设已获取加密输入,代码演示中构造一个密文向量 std::vector<int64_t> fake_cipher_input = {10, 20, 30, 40}; CipherVector ct_input{fake_cipher_input}; // 第一层 CipherVector h1 = linear_layer(ct_input, model["w1"], model["b1"]); // 非线性激活在 TFHE 中通过可编程自举完成,这里略过 // 第二层 CipherVector logits = linear_layer(h1, model["w2"], model["b2"]); std::cout << "服务端密文推理完成,输出密文维度: " << logits.data.size() << std::endl; return 0; }

这里需要再次说明:上面的代码只用于展示服务端的基本代码组织方式。真正的 TFHE 乘法、自举与线性层重排要复杂得多,必须使用专门的密文乘法接口,并考虑噪声增长。完整可运行的工程可以参考 OpenFHE 与 Google 公布的示例项目。

4.5 客户端:加密输入并解密输出

客户端负责密钥生成、输入加密和结果解密。

// 文件路径:src/client_main.cpp #include <iostream> #include <vector> // 模拟密钥与加密操作,实际应使用 FHE 库提供的密钥类 struct DemoKey { uint64_t secret_value; }; int64_t encrypt_value(const DemoKey& key, int64_t plaintext) { // 演示用:密文 = 明文 + 噪声,真实实现与多项式环运算有关 return plaintext + key.secret_value; } int64_t decrypt_value(const DemoKey& key, int64_t ciphertext) { return ciphertext - key.secret_value; } int main() { DemoKey key{12345}; std::vector<int64_t> features = {10, 20, 30, 40}; std::cout << "客户端加密输入" << std::endl; for (auto v : features) { int64_t ct = encrypt_value(key, v); std::cout << "密文: " << ct << std::endl; } // 实际应由服务端完成推理,这里模拟解密服务端返回结果 int64_t encrypted_result_from_server = 50000; int64_t result = decrypt_value(key, encrypted_result_from_server); std::cout << "解密结果: " << result << std::endl; return 0; }

需要重点指出,密钥绝不能发送到服务端。真实的 FHE 项目密钥管理非常严格,需要区分私钥、公钥、计算密钥,计算密钥可以交给服务端完成指定操作,但是不能推算出私钥或原始明文。

4.6 端到端推理的通信与流程设计

从上面的代码可以抽象出一个完整的请求流程,下面的步骤描述了客户端与服务端在私有推理中的职责边界。

阶段客户端服务端
准备生成公私钥对加载明文模型,转换权重
请求加密输入特征接收密文
计算密文上执行前向推理
返回接收密文结果返回密文预测结果
结果本地解密得到标签无法看到输入和输出明文

这种“客户端加密,服务端算”的模式,在不改变现有 REST/JSON 通信体系的前提下,为 AI 服务增加了一种隐私保护模式。当然,代价是计算速度比明文推理慢几个数量级。这也是 Google 等机构正在攻关的核心痛点。

5. 性能瓶颈与常见问题排查

5.1 为什么 FHE 推理非常慢

同态加密的最大瓶颈是计算开销。相比明文推理,FHE 的密文运算开销通常要高出 2 到 5 个数量级。主要原因包括:

  • 密文尺寸大:单个密文占用的多项式环元素较多,内存访问频繁。
  • 自举操作昂贵:每次可编程自举都需要执行多次多项式乘法,对 CPU 流水线压力大。
  • 网络模型深:Transformer 等模型层数深,每层非线性激活都需要自举。
  • 参数选取保守:安全强度要求越高,多项式维度与噪声参数越宽,计算量越大。

针对性能问题,业界目前在尝试的方向包括:GPU 加速自举、专用 FPGA/ASIC 设计、算法层面的密文打包(SIMD 技术)、减少非线性激活次数、使用查找表预计算等。

5.2 高频报错与排查清单

在实际开发 FHE 推理的过程中,以下几类问题出现频率较高:

问题现象常见原因排查思路
解密结果乱码编码/解码不一致检查缩放因子、取模方向、明文空间
自举次数过多导致极慢激活函数太多合并相邻线性层,减少激活数量
乘法后噪声过大无法解密没有在乘法后做密钥切换或重线性化在乘法和加法之间加入密钥切换
模型精度下降明显量化位宽太低增大缩放因子,换成 16-bit 明文空间
编译报错找不到头文件依赖路径不对检查 CMake 与依赖库安装路径
不同 FHE 库之间对不齐参数不兼容统一使用同一库的序列化格式

5.3 隐私推理中的安全性注意事项

同态加密解决了“计算过程中”的隐私保护,但并不能解决所有问题。工程使用时至少要注意:

  • 模型权重如果是服务端的资产,FHE 推理不应让客户端轻易提取模型。目前的 FHE 推理中,客户端往往需要参与生成公钥或推理密钥,恶意客户端可能通过构造特殊输入来探测模型结构。这个领域仍在研究中,不要认为 FHE 天然保护模型。
  • 侧信道攻击仍然存在。CPU 时间、功耗、访存模式可能泄漏算子类型,高安全场景需要额外处理。
  • 密文结果返回后,客户端是否会泄露结果给第三方,已经超出 FHE 的保护范围。
  • 密钥管理是系统工程。生产中应使用 KMS 或硬件密码模块保护私钥,明文私钥落盘是大忌。

6. 同态加密在 AI 工程中的落地建议

6.1 从哪类场景开始试点

不是所有 AI 场景都适合用 FHE。建议从下面几个特征判断场景优先级:

  • 单次推理的数据量不大;
  • 推理涉及高敏感数据,合规上要求“服务方不可见”;
  • 推理延迟在秒级甚至分钟级别可以接受;
  • 模型规模不大,或可通过蒸馏压缩成小型模型。

典型方向包括:医疗影像初筛、金融风险辅助判断、个人健康 AI 助手、加密数据库上的 AI 分析等。

不要在一个高频低延迟的在线推荐系统里强行引入 FHE,那会在当前技术条件下让性能和成本双双失控。

6.2 架构上提前预留接口

如果你预计未来可能引入同态加密,在系统架构上可以提前做几件事:

  • 把推理服务做成模型无关的网关;
  • 在数据接入层做统一的张量编码模块,避免业务代码直接操作浮点张量;
  • 预留请求指纹与时间戳字段,便于追踪密文请求。
  • 将密钥管理与推理服务解耦,避免因密钥访问影响推理路径。

例如,请求结构中增加一个security_level字段,服务器根据字段决定走明文推理还是密文推理,灰度发布时非常有用:

{ "request_id": "6b7f4a2c9e5d4f8a", "security_level": "fhe", "cipher_input": "base64-encoded-ciphertext", "timestamp": 1710000000 }

6.3 工程化落地时的人员与成本评估

FHE 并不是“调用一个加密库就完事”。它需要同时具备密码学基础、AI 模型优化能力与后端工程能力。团队里至少要有一个人能把非线性激活函数转化为查找表并且估算噪声预算,否则遇到精度问题会很难排查。

预算评估上要同时考虑:

  • FHE 处理的额外耗时带来的服务器资源成本;
  • 研发与排错周期远高于明文推理;
  • 模型每次迭代都需要重新做量化、编译和电路优化;
  • 审计与合规文档也需要单独准备。

6.4 隐私计算与现有 AI 合规体系的关系

在国内的合规语境下,AI 服务的用户数据保护通常涉及数据分类分级、个人信息保护、数据出境评估等。同态加密本身是隐私增强技术(PET)的一种。它能帮助企业在“数据可用不可见”的框架下处理敏感数据,但必须注意:

  • 使用同态加密不等于自动合规,还需要结合访问控制、审计日志、最小化采集等措施;
  • 无论采用哪种技术,都不能突破用户的合法授权范围;
  • 如果业务涉及数据库变更、生产环境调整,务必先在测试环境验证 FHE 推理任务,开启完整备份并遵循最小权限变更流程。

7. 总结与下一步学习建议

同态加密不再只是论文里的概念。Google 在多份公开材料中已经展示了使用 TFHE 类方案执行 AI 推理的工程路径,行业里也有了 OpenFHE、Concrete 等持续迭代的开源项目。对于普通开发者,比较友好的上手方式是先跑通一个密文上的基础运算,再用小型网络模拟“加密输入 -> 云上推理 -> 本地解密”的场景。

重点掌握的链路是:

  1. 理解 FHE 中的加法、乘法与自举;
  2. 掌握从浮点张量到整数环的编码方法;
  3. 学会分析模型中的线性和非线性算子;
  4. 跑一个最小闭环 Demo;
  5. 逐渐引入量化、查找表和性能测试。

如果你是后端开发者,建议关注 API 设计与任务拆分的思路;如果你是算法工程师,建议从量化与模型压缩入手;如果你是架构师,更值得关注的是密钥管理、灰度发布和混合明文/密文网关这类系统层面的问题。

后续可以进一步研究 Google 实验中的模型结构压缩方案,以及配套的硬件加速动态。如果本文对你有帮助,建议收藏备用,后续还会补充更多关于隐私计算与 AI 模型部署结合的工程笔记。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询