想象你有一份祖传的私房菜谱和一批珍稀食材,你想请一位米其林大厨为你做一桌宴席,但既不想让任何人看到菜谱,也不想让食材离开视线。传统做法只能把菜谱告诉大厨,或者派一个信得过的人盯着后厨。现在有了全同态加密(FHE),就像发明了一种“魔法保险库”:菜谱和食材全部锁入其中,大厨可以隔着玻璃用机械臂在保险库内自由切菜、炒菜、装盘,整个过程他看不到任何真实内容,而你最后用钥匙打开保险库,得到一盘热气腾腾的佳肴。 这套魔法保险库是用数学构造出来的:加密后的数据之间可以进行加法和乘法计算,计算后的结果解密后与直接计算的结果一致。于是,机器学习模型也可以在密文上推理——医院无需暴露病人数据就能让云端AI模型给出诊断,银行无需泄露用户特征就能完成风控评分。本文将从FHE的基础概念讲起,带你理解加密推理的完整流程、CKKS/BGV方案如何选、计算开销与精度损失从何而来,以及性能优化和工程部署等实战要点。
FHE是隐私计算的技术制高点,掌握密文推理的设计与优化,能让你在医疗、金融等高合规场景中构建真正可落地的数据安全服务,成为稀缺的隐私计算工程师。
可视化演示
展示Apriori算法挖掘的频繁项集和关联规则,节点表示商品项,连线表示关联关系,支持切换视图模式。
本节配有交互动效(进入视口后自动加载,约 3KB)。
项集视图 紫色节点表示商品项 粉色节点表示高关联项 sup(X→Y)=P(X∪Y) 点击切换查看关联规则
同态加密基础
魔法保险库中最神奇的一点:大厨隔着玻璃用机械臂在内部翻炒,虽然看不见食材,但出来的菜和明火直炒的味道一模一样。这是因为保险库的机械臂被设计成只能做加法和乘法两种动作,而这两种动作恰好能组合出几乎所有的加工方式。全同态加密(FHE)正是这样一台“魔法机械臂”——它允许我们在加密数据上直接执行数学计算。
在密码学里,同态加密打破了“先解密再计算”的传统流程。给定两个明文数字 a 和 b,你用公钥加密得到 Enc(a) 和 Enc(b),然后对它们做某种密文运算,这个运算结果解密后,恰好等于对 a 和 b 直接做同样运算的结果。这里的运算包括加法和乘法,两者都支持时,理论上就能构造任意计算。
同态加密按能力分为三类:只支持加法或乘法的叫部分同态(PHE);支持有限次加法和乘法的叫半同态(SHE);支持任意深度计算的叫全同态(FHE)。FHE 的核心技术是 Gentry 在 2009 年提出的“自举”(Bootstrapping),它像给保险库定期保养,把累积的噪声刷新回初始水平,让计算可以无限进行下去。
回到比喻:你不需要把菜谱告诉大厨,只要保险库的机械臂会“加料”和“翻倍”,它就能复刻任意烹饪流程。这就是 FHE 让数据“可用不可见”的本质。
- Enc 加密函数将明文数据变成无法直接读取的密文,可以理解为把食材锁入保险库。
- 明文 a、b参与计算的原始数据,比如病人特征或模型权重。
- ⊕ 同态运算符可以是加法或乘法,表示密文上能执行这两种运算。
- 等式含义密文计算后解密,等同于明文直接计算后再加密。
加密推理方案
把整个厨房搬进保险库后,问题来了:做一道菜要切、炒、炖、调味,机械臂却只会加法和乘法,该如何完成?机器学习的推理同样面临这个挑战——神经网络由线性层(矩阵乘法)和非线性激活函数(如 ReLU、sigmoid)组成。FHE 能精确处理线性部分,但激活函数必须用多项式来“模仿”。
在隐私保护推理中,通常有两种策略:模型所有者把模型权重加密后交给服务端,客户端把输入数据也加密后上传;服务端在密文上逐层执行计算,最后把加密结果返回客户端,由客户端用私钥解密。整个过程服务端既看不到用户数据,也看不到模型的具体参数。
为了让非线性函数能在密文上运行,需要用泰勒展开或最小二乘拟合出多项式近似。以 sigmoid 函数为例,我们可以在某个区间内用一个 n 次多项式近似它。n 越高,逼近越精准,但乘法深度也随之增加,噪声和计算成本都会上升。
大厨虽然只会“加”和“乘”,但凭借精心设计的“模拟菜谱”(多项式),做出的菜和原版几乎一样好吃——这就是加密推理的核心思想。
- σ(x) 激活函数常见的有 sigmoid 和 ReLU,用于给模型引入非线性分类能力。
- P(x) 逼近多项式用幂级数求和来近似激活函数。
- 系数 ai通过最小二乘法或泰勒展开求得的拟合系数。
- 次数 n 的意义n 越高近似越准,但乘法深度越大,密文噪声增长越快。
方案选型策略
保险库也有不同型号:有的擅长精确称重配比,有的擅长快速估算分量。全同态加密同样有多个具体方案,其中最主流的就是 CKKS 和 BGV。选错方案,就像让精密的烘焙师傅去炒大锅菜,效果自然不理想。
CKKS 方案专为浮点数近似计算设计。它先把实数明文放大到整数域,再进行加密和计算,过程中还会自动缩放,非常适合神经网络推理中大量出现的连续特征。BGV(及其变体 BFV)则直接在整数模空间上运算,能保证精确结果,更适合需要严格一致性的场景,比如数据库查询、统计计数、整数权重模型。
在机器学习推理中,模型参数和用户特征大都是浮点数,因此 CKKS 通常是首选。但如果你的模型已经做了 8-bit 量化,变成整数权重,BGV/BFV 也可以胜任。选型时还要考虑计算深度、安全强度、密文尺寸和现有库的支持程度。简单说:小数多、要逼近,选 CKKS;整数多、要精确,选 BGV。
选择保险库型号,要看你保存的是“克数精确的骨料”(整数)还是“大致适量的调料”(浮点)。CKKS 和 BGV 各司其职,共同撑起 FHE 在推理中的落地。
- m 明文消息可以是模型权重、输入特征或中间激活值。
- Δ 缩放因子通常取 2^40 这样的大数,决定定点表示的精度。
- ⌊·⌉ 四舍五入取整把放大后的数变为整数,准备进入加密空间。
- 编码结果编码后的明文槽才能被 CKKS 加密并参与同态运算。
开销与精度控制
保险库虽然安全,但机械臂每翻炒一次,内部都会产生一些轻微震动。工序越多,震动累积越明显,最终做出来的菜可能与预期有一点偏差。在 FHE 中,这种“震动”就是噪声;噪声一旦超过阈值,解密就会失败。
密文本身比明文大得多,通常会有几十到上千倍的膨胀。一次加密矩阵乘法,比明文慢两到三个数量级。更关键的是,每一项同态乘法都会让噪声规模增长,深度越大,噪声越大。如果计算路径上有连续 d 次乘法,我们需要预留足够的“噪声预算”,否则结果会被噪声淹没。
为控制开销与精度,工程师会削减模型的乘法深度:把激活函数多项式次数降低、对模型进行量化压缩、必要时使用 Bootstrapping 重置噪声。精度损失主要来自两处:CKKS 编码时浮点转定点的舍入误差,以及激活函数多项式近似带来的逼近误差。它们需要与性能开销一同权衡。
就像保险库越用越旧,噪声预算会随乘法深度消耗殆尽。懂得控制深度、定期“保养”,才能让加密推理既准确又持久。
- B 噪声上限密文的解密阈值,由安全参数和方案参数决定。
- B0 初始噪声加密瞬间就存在的基础噪声。
- d 乘法深度计算图中一条路径上的连续乘法次数。
- Δ 缩放因子每次乘法会引入与缩放因子相关的额外噪声。
性能优化技术
既然一台机械臂加工太慢,那就让许多食材同时进入保险库,一条流水线同时处理多份。CKKS 的 SIMD(单指令多数据)能力正是如此:一个密文中可以打包多个明文槽(slot),一次密文运算等价于对多个明文同时运算,相当于给推理过程加了“批量加速”。
除了 SIMD 批处理,常用的性能优化还有三类。一是模型压缩:对权重做量化和剪枝,减少参与密文乘法的参数数量;二是降低乘法深度:把 Deep ReLU 替换成低次多项式,或用泰勒展开近似整个残差块;三是硬件加速:利用 GPU/FPGA 对密文多项式乘法做并行化,以及使用 RNS 分解把大整数乘法拆成多个小模数乘法。
这些优化往往叠加使用。比如在医疗推理场景中,先把病人特征打包进同一个密文,再把神经网络裁剪成低深度结构,最后用 GPU 加速服务端计算,三层优化叠加后,吞吐量可以提升几十倍。核心思想始终是:减少乘法深度、减少密文数量、减少每个计算的耗时。
保险库的“流水线”让一次加工同时处理几十份食材,吞吐量大幅提升。性能优化不是魔法,而是对保险库内部结构和加工路径的精细设计。
- x 明文向量将 k 个样本的特征或中间激活值打包。
- w 权重向量模型参数也打包成同样长度。
- ⊗ 同态乘法密文向量之间的逐元素乘法。
- ⊙ 逐元素乘明文上等价的运算,得到 k 个乘积结果。
工程部署架构
单有保险库还不够,它需要放在一个装有监控、只有授权人员能进出的机房中,才能确保钥匙和保险库本身的安全。在 FHE 推理的工程实践中,这个“机房”就是可信执行环境(TEE),它与 FHE 形成互补:FHE 保护计算中的数据,TEE 保护计算环境和模型密钥。
一个典型的加密推理服务架构分为客户端和服务端。客户端持有私钥,用公钥加密输入数据后上传;服务端只保存密文模型,在密文上完成神经网络前向传播,把加密结果返回;客户端最后用私钥解密,得到明文预测。服务端从始至终接触不到任何明文,模型供应商也不需要暴露模型权重。
工程落地时要特别注意三点:一是密钥管理,私钥绝不能离开客户端,否则 FHE 形同虚设;二是参数选择,poly_modulus_degree、缩放因子和模数链要匹配模型深度,避免资源浪费或噪声超标;三是结果校验,客户端解密后需要做合理性检查,防止恶意服务端返回错误结果。
把保险库放进监控严密的机房,钥匙仍然留在你手里。FHE 与 TEE 联合,才能构建真正双向隐私保护的推理服务。
- Enc(x) 加密输入用户对推理样本进行加密。
- Enc(W) 加密模型模型所有者对权重加密后部署到服务端。
- Eval 同态评估服务端在密文上执行推理函数 f。
- Dec 解密结果客户端使用私钥解密,得到明文推理结果。
应用场景展望
保险库发明之后,医院、银行、政府纷纷来订购——因为大家都有不能公开的“传家宝”。医疗数据涉及患者隐私,金融数据涉及资金安全,政务数据涉及社会治理,这些场景正是 FHE 加密推理的用武之地。
在医疗领域,三甲医院可以把病人加密后的生命体征和影像特征发送给云端 AI 服务商,服务商在密文上完成疾病风险推理,返回加密结果,医院解密后直接使用。整个过程病人数据不出医院,模型参数不泄露给医院,实现了“双向隐私保护”。在金融领域,多家银行可以在不共享原始客户数据的前提下,用加密梯度做联合风控建模,把各自的反欺诈特征融合起来。
未来,FHE 还会与联邦学习深度绑定:各参与方本地计算梯度后加密上传,服务端在密文上聚合平均,再解密更新全局模型。这样一来,即使服务端是“诚实但好奇”的,也无法从梯度推导出任何客户的隐私信息。隐私计算的下一个十年,正是由 FHE 推动的。
各家把自己的食材锁进保险库,联合做出一桌宴席,却不必分享家传秘方。FHE 让数据在密文上流动,为医疗、金融和政务场景带来了前所未有的安全协作可能。
- Wt 全局模型第 t 轮联邦学习中的服务端模型权重。
- ∇i 本地梯度第 i 个参与方在本地数据上训练得到的梯度。
- Enc(∇i) 加密梯度参与方上传前先加密,保护梯度信息。
- 平均与解密服务端在密文上求和平均后解密,再按学习率更新。
AI 应用场景
医疗隐私诊断预测
阶段:模型推理部署 / 隐私计算
解决的问题:传统上医院不敢把病人数据直接交给云端 AI 服务商,因为一旦泄露就是重大医疗事故;服务商也不想公开模型权重。FHE 让医院加密数据后上传,服务端在密文上推理,返回加密结果,医院解密获得诊断。服务商看不到患者数据,医院拿不到模型参数。
具体案例:某三甲医院与影像 AI 公司合作,利用 CKKS 加密病人的生命体征和影像特征,在云端完成心衰风险评估推理。整个过程中患者数据不出院,模型精度损失控制在 1% 以内,单次推理耗时约 2 秒,满足非实时诊断场景需求。
银行跨行联合风控
阶段:联邦建模 / 跨机构推理
解决的问题:单一银行数据维度不足,跨行共享原始客户数据又违反《个人信息保护法》。FHE 让多家银行加密本地模型梯度,服务端在密文上完成梯度聚合,防止攻击者从梯度反推出客户原始特征。
具体案例:多家股份制银行组建隐私计算联盟,使用 BGV 方案加密聚合梯度,联合训练反欺诈模型。模型上线后覆盖客户量提升 3 倍,误报率下降 15%,且全程无需交换任何明文客户数据。
政务数据安全协同
阶段:多方数据融合 / 加密查询推理
解决的问题:政府和公共服务机构之间数据共享受阻,主要原因是数据主权和合规风险。FHE 可以在密文上直接完成跨部门数据匹配和统计推理,例如社保、税务、公安数据联合分析而不泄露个体记录。
具体案例:某市大数据局搭建隐私计算平台,采用 FHE 实现不同部门密文数据的联合统计,用于人口流动分析和社会救助对象识别,数据提供方全程只交出密文和最终统计结果。
Python 演示
import tenseal as ts def create_context(): # 创建 CKKS 上下文,poly_modulus_degree 和 coeff_mod_bit_sizes 控制安全级别与精度 context = ts.context( ts.SCHEME_TYPE.CKKS, poly_modulus_degree=8192, coeff_mod_bit_sizes=[60, 40, 40, 60] ) context.global_scale = 2 ** 40 context.generate_galois_keys() return context def encrypted_linear_predict(ctx, W, b, x): # 加密输入向量 enc_x = ts.ckks_vector(ctx, x) # 在密文上计算线性模型 y = W * x + b enc_y = enc_x.dot(W) + b return enc_y def main(): ctx = create_context() W = [1.0, 2.0, 3.0] b = 0.5 x = [1.0, 2.0, 3.0] enc_y = encrypted_linear_predict(ctx, W, b, x) pred = enc_y.decrypt()[0] true = sum(wi * xi for wi, xi in zip(W, x)) + b print("加密推理结果:", pred) print("明文验证结果:", true) if __name__ == "__main__": main()
context = ts.context(ts.SCHEME_TYPE.CKKS, ...)创建 CKKS 上下文,相当于选好保险库型号和钥匙规格。context.global_scale = 2 ** 40设置全局缩放因子,控制浮点转定点的精度。context.generate_galois_keys()生成 Galois 密钥,用于向量旋转和批量操作。enc_x = ts.ckks_vector(ctx, x)把明文向量 x 加密成密文向量,相当于把食材锁入保险库。enc_y = enc_x.dot(W) + b在密文上完成点积和加法,同态计算出加密预测值。pred = enc_y.decrypt()[0]用私钥解密,取出第一个结果,得到明文预测。
常见误区
误区FHE 既然叫“全同态加密”,就应该能对任意函数直接计算,ReLU、sigmoid 都可以无损使用。
正解FHE 底层只支持加法和乘法组成的多项式运算。ReLU、sigmoid 等非线性函数必须先做多项式近似,近似本身会带来误差,而且多项式次数越高,噪声和计算成本越大。就像保险库里的机械臂只会“加料”和“翻倍”,它做不了需要看火候的复杂动作。
为何常见:因为“全同态”听起来像是支持所有操作,初学者容易忽略底层运算只有加乘这一条铁律。
误区CKKS 加密推理应该和明文推理一模一样,小数点后任何一位都不能差。
正解CKKS 本质是近似同态加密方案。明文先乘以缩放因子再取整,计算过程中噪声不断累积,最后结果只能做到误差在可接受范围内。这和“尝起来味道几乎一样”是一个道理,而不是“每一粒盐都精确相同”。
为何常见:把加密当成无损封装,忽略了浮点转定点的舍入和噪声增长对数值精度的影响。
误区现在有 GPU 加速、SIMD 批处理,FHE 推理延迟应该能降到和明文推理一个量级。
正解即使经过各种优化,单次密文推理仍比明文慢大约 100 到 1000 倍。密文膨胀、多项式模乘、噪声预算管理都带来巨大开销,优化只能缩小差距,不能抹平数量级差异。
为何常见:只看优化后的加速比,忽略了每个密文乘法背后都隐藏着大量大整数运算。
误区数据都全同态加密了,服务端和模型都安全了,其他安全措施可以全部撤掉。
正解FHE 保护的是计算过程中的数据机密性,但模型仍可能被恶意查询或窃取,密钥管理、访问控制、可信执行环境(TEE)依然需要。FHE 和 TEE 是互补关系,而非替代关系。
为何常见:把 FHE 当成“银弹”,忽略了工程安全是一个分层体系,任何一个环节的裸奔都会导致整体防线崩溃。
面试题
Q1. 关于FHE的同态性质,正确的说法是?
- A.密文运算结果与明文计算不一致
- B.密文加法等同明文加法← 正确答案
- C.只有乘法支持同态计算
- D.每次计算都需要先解密
答案:B。FHE 的核心性质是密文上的运算等价于明文上的运算,B 正确。A 说反了,C 忽略了加法同态,D 是传统加密而非同态加密。就像保险库机械臂在密文上翻炒,结果等价于明文烹饪。
Q2. CKKS方案主要适合哪类数据?
- A.大整数精确统计
- B.二值逻辑判断
- C.浮点数近似计算← 正确答案
- D.字符串模式匹配
答案:C。CKKS 专为浮点近似计算设计,支持自动缩放和实数编码,适合神经网络推理。BGV 才适合大整数精确计算,二值和字符串匹配也不是 CKKS 的目标场景。
Q3. 关于FHE相比TEE的优势,正确的有?
- A.数据在计算全程保持密文← 正确答案
- B.不依赖可信硬件环境← 正确答案
- C.计算性能与明文相同
- D.能够抵抗量子计算攻击
答案:AB。FHE 在计算过程中数据始终是密文,且不依赖特定可信硬件,因此 A、B 正确。FHE 性能远低于明文,C 错误;D 的量子抗性取决于底层困难问题,不是所有 FHE 方案都天然抗量子。
Q4. 在CKKS方案中,缩放因子Δ的主要作用是?
- A.提高加密速度
- B.压缩密文大小
- C.放大浮点数保留精度← 正确答案
- D.增加密钥长度
答案:C。CKKS 把浮点数 m 放大 Δ 倍后取整,再进入加密计算,这样避免浮点直接加密带来的精度丢失。缩放因子本质上负责格式化,与加密速度和密文大小无关。
Q5. 多项式近似ReLU,次数越高会导致?
- A.计算越快且噪声越小
- B.精度越高但噪声越大← 正确答案
- C.完全消除近似误差
- D.无法进行同态计算
答案:B。多项式次数越高,对 ReLU 的逼近越精确,但乘法深度也越大,噪声增长更多。类似机械臂的动作越复杂,内部震动越严重。B 正确,其他选项过于绝对。
Q6. 关于CKKS与BGV方案选型,正确的说法有?
- A.CKKS适合浮点ML推理← 正确答案
- B.BGV适合整数精确计算← 正确答案
- C.BGV也支持浮点自动缩放
- D.两者选择与数据类型无关
答案:AB。CKKS 面向浮点近似,BGV 面向整数精确,A、B 正确。BGV 不支持浮点自动缩放,这是 CKKS 的特性;选型当然和数据类型强相关,D 错误。
Q7. 下列哪些属于FHE性能优化常用手段?
- A.SIMD批处理多个样本← 正确答案
- B.降低模型乘法深度← 正确答案
- C.使用GPU并行加速← 正确答案
- D.增加缩放因子无限制
答案:ABC。SIMD 批处理、降低乘法深度、GPU 并行都是常见优化手段。增加缩放因子可以提升精度,但会带来更大的模数和噪声预算压力,不能无限增加,因此 D 错误。
Q8. 在加密推理流程中,客户端持有私钥,服务端返回加密结果后,客户端需要做什么?
- A.本地解密得到推理结果← 正确答案
- B.将私钥发给服务端
- C.放弃本次推理结果
- D.直接使用密文结果
答案:A。私钥必须留在客户端,服务端返回密文后由客户端解密得到明文预测,A 正确。B 会让 FHE 失去意义,C 和 D 都没有完成推理目的。
Q9. 噪声预算与乘法深度的关系是什么?
- A.乘法深度越深,噪声越小
- B.噪声随乘法深度线性递减
- C.噪声随乘法深度近似指数增长← 正确答案
- D.噪声与乘法深度无关
答案:C。每次同态乘法都会使噪声显著放大,深度越深噪声越大,通常呈近似指数增长趋势。控制乘法深度是 FHE 推理设计的关键。
Q10. 在联邦学习+FHE聚合梯度的场景中,哪一步符合FHE作用?
- A.本地明文训练后直接上传
- B.加密梯度后密文聚合← 正确答案
- C.服务端解密后平均
- D.服务端明文聚合
答案:B。FHE 的作用是让参与方把梯度加密上传,服务端在密文上直接平均,全程看不见明文梯度。B 正确,A 和 D 没有加密,C 在服务端解密会泄露梯度。