小区业委会想统计各户节水情况,做一张“节水光荣榜”,但没人愿意交出自家水表读数。于是老王想了个主意:大家不用报总数,只报“这个月比上个月少用了多少吨”——这就是联邦学习只传梯度的思想。可问题来了:多报几轮,老王拼拼凑凑还是能猜出你家用水量。于是又有两件工具登场:差分隐私像是“报数时故意说个大概,外加撒一把胡椒”,让单个人怎么都不可信;同态加密像是“把精确数封进透明焖烧罐”,老王隔着罐子能摇匀数字,却看不见里面写了什么。把两件工具叠起来——先撒胡椒,再封罐子——既防外人猜,又防老王偷看。这就是差分隐私与同态加密融合联邦学习的核心思路。本文就从这座“集体厨房”讲起,带你认识隐私预算、CKKS与Paillier选型、精度损失这些概念。

岗位关联

掌握这套融合技术,你就能在医疗、金融等高隐私场景设计出既合规又不牺牲模型效果的联邦学习系统,这是隐私计算工程师最值钱的能力之一。

目录
  1. 可视化演示
  2. 联邦学习隐私缺口
  3. 差分隐私基石
  4. 同态加密原理
  5. 融合架构设计
  6. 权衡与调优
  7. 精度损失分析
  8. 方案选型指南
  9. 系统落地实践
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示联邦学习中差分隐私(DP)和同态加密(HE)融合保护数据隐私的流程,数据经双重保护后安全聚合为全局模型。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DP+HE融合保护 差分隐私添加噪声防止推理攻击,同态加密保证传输安全 DP(noise)+HE(encrypt)→Secure Aggregation 绿色DP路径添加拉普拉斯噪声,橙色HE路径加密梯度,紫色聚合器融合双重保护

联邦学习隐私缺口

小区业委会的老王想表扬节水先进户,但各家都不肯交出真实水表数。他只好立下新规矩:大家不报总数,只交一张便条,上面写“这个月比上个月少了多少吨”。各家在自己家里看表、算差值、交便条——数据不出门,出门的只有“变动量”。联邦学习正是这个思路:客户端用自己的本地数据训练模型,不把数据交给中央服务器,只上传训练产生的“变动量”——梯度;服务器把大家的梯度按样本量加权平均,更新全局模型,再下发下一轮参数。这个“先本地训练、再聚合更新”的循环,就是经典的联邦平均算法(FedAvg)。

但只传梯度真的安全吗?研究表明,攻击者可以根据梯度反向推算出训练样本的细节,甚至恢复出人脸图像,这就是“梯度反演攻击”(Deep Leakage from Gradients)。更常见的是“半诚实服务器”威胁:老王表面上只是收便条,背地里却偷偷记录每一次上传的数值。便条虽然不写总数,但多报几轮,老王依然能拼凑出每户的用水习惯。所以联邦学习只是缩小了暴露面,并没有真正关上隐私的窗户。

只传变动量的规矩虽然保护了原始数据,却挡不住老王的持续观察。想要彻底关上隐私的窗户,得给便条动两番手脚:先加胡椒,再上锁。

w(t+1)=w(t)−η∑k=1Knkn∇fk(w(t))w^{(t+1)} = w^{(t)} - \eta \displaystyle \sum_{k=1}^{K} \frac{n_k}{n} \nabla f_k \left( w^{(t)} \right)
这条公式刻画了联邦学习的核心:第 t 轮的全局模型参数,沿着所有客户端本地梯度方向的加权平均,迈出学习率 η 的一小步。
  1. 全局参数$w^{(t)}$ 是第 t 轮开始时服务器下发的模型参数,好比老王发给各家的“基准水表底数”。
    w(t)\displaystyle w^{(t)}
  2. 本地梯度$\nabla f_k(w^{(t)})$ 是客户端 k 在自己数据上算出的下降方向,好比每户算出的“节水变动量”。
    ∇fk(w(t))\displaystyle \nabla f_k \left( w^{(t)} \right)
  3. 加权系数$\frac{n_k}{n}$ 是按本地样本数占比加权,样本多的客户端意见权重更大,好比数据多的家庭更能代表整栋楼的平均趋势。
    nkn\displaystyle \frac{n_k}{n}
  4. 学习率与更新沿着梯度反方向乘上学习率 $\eta$ 走一小步,得到新一轮参数,好比老王按平均变动量统一微调下个月的节水目标。
    w(t+1)=w(t)−η⋅(⋯ )\displaystyle w^{(t+1)} = w^{(t)} - \eta \cdot (\cdots)

差分隐私基石

老王的便条规矩做了升级:每家报数时必须“加胡椒”——明明少了 2 吨,偏要写成“1 到 3 吨之间”。这样单看任何一张便条,老王都猜不出真实值;但全楼几百张便条放在一起平均,胡椒的辣味相互抵消,整体趋势依然准确。这“一勺胡椒”的数学名字,就叫差分隐私。它保证:无论你的数据在不在数据集里,最终输出的统计结果几乎不会改变,外人自然无法通过结果反推你是否参与。

形式化地说,一个随机算法 $\mathcal{M}$ 满足 ε-差分隐私,当且仅当对任意一对只差一条记录的“相邻数据集” D 和 D',以及任意输出集合 S,两个输出分布的概率之比被限制在 $e^{\varepsilon}$ 倍以内。ε 就是“隐私预算”,它像老王的“猜谜额度”:额度越小,胡椒撒得越猛,老王越难猜中单户数据;额度越大,结果越精确,但隐私风险也越高。

实现差分隐私的常用机制有两种:拉普拉斯机制适合数值型查询,按 L1 敏感度添加拉普拉斯噪声;高斯机制则基于 L2 敏感度,满足 (ε,δ)-差分隐私,更适合梯度这类高维向量。总之,胡椒的颗粒大小由敏感度和预算共同决定。但要注意:胡椒只是让数字“失真”,老王如果从便条上看到完整数字本身,依然能读出信息——要防止这一步,就得请出同态加密这把锁。

Pr⁡[M(D)∈S]≤eε⋅Pr⁡[M(D′)∈S]\Pr\left[ \mathcal{M}(D) \in S \right] \le e^{\varepsilon} \cdot \Pr\left[ \mathcal{M}(D') \in S \right]
ε 越小,两个数据集上的输出分布越接近,个体信息就越难被识别;ε=0 表示完全无法区分,但需要无穷大的噪声,实践中通常取 1~10。
  1. 相邻数据集D 与 D' 只差一条记录,好比“1001 户”和“1000 户”的水电表册,仅仅是老张那页的有无之别。
    D, D′\displaystyle D,\ D'
  2. 随机算法$\mathcal{M}$ 是加噪的统计查询过程,好比“报数时撒胡椒”的便条生成程序。
    M(⋅)\displaystyle \mathcal{M}(\cdot)
  3. 输出集合$S$ 是算法所有可能输出中的任意一组,无论哪种回答,两次计算落入该集合的概率都不能差太多。
    Pr⁡[M(D)∈S]\displaystyle \Pr[\mathcal{M}(D) \in S]
  4. 隐私预算$e^{\varepsilon}$ 是概率比值的上限,ε 越小比值越接近 1,旁人越难分辨数据是否在册,隐私保护越强。
    eε\displaystyle e^{\varepsilon}

同态加密原理

老王又想出新招:大家把写有精确数的纸条封进“透明焖烧罐”再交上来。这种罐子有魔力——老王不用开罐,只要把两个罐子按特定方式碰一碰,罐里的数字就会自动相加。他摇匀所有的罐子,最后用业委会办公室的专用钥匙打开总罐,得到的就是全楼的加总结果。罐子里的数字全程没有暴露给任何人,这就是同态加密。

最经典的半同态方案是 Paillier:它基于大整数分解难题,加密时用公钥把明文 m 变成模 $n^2$ 下的密文,而两个密文相乘再解密,正好等于两个明文相加。这个性质叫“加法同态”,正是联邦学习聚合梯度最需要的操作。另一类全同态方案 CKKS 则更进一步,支持密文上的乘法和加法,适合神经网络里大量的矩阵乘法,但代价是计算结果带有近似误差。

罐子虽好,代价也明显:密文比明文大得多,摇罐(做同态运算)也远比直接看纸条费劲。Paillier 只支持加法,想做乘法就得另请 CKKS。好消息是,联邦学习里服务器要做的本来就是“求和平均”——加法同态正好够用。但单独一把锁仍不够:老王虽然看不见罐内数字,却能看到“哪家交了罐子、交了几次”这类元信息。于是差分隐私和同态加密必须配合使用。

D(E(m1)⋅E(m2) mod n2)=(m1+m2) mod n\mathrm{D}\left( \mathrm{E}(m_1) \cdot \mathrm{E}(m_2) \bmod n^2 \right) = (m_1 + m_2) \bmod n
这是 Paillier 加法同态的灵魂等式:密文相乘对应明文相加,服务器可以在看不见任何明文的情况下完成求和。
  1. 加密函数$\mathrm{E}(m_1)$、$\mathrm{E}(m_2)$ 是两户分别把明文纸条封进密封罐,罐外的“飘浮数字”就是密文。
    E(m1), E(m2)\displaystyle \mathrm{E}(m_1),\ \mathrm{E}(m_2)
  2. 密文相乘服务器不开罐,只把两个罐子按魔法规则碰一下,等价于让罐内数字相加。
    E(m1)⋅E(m2) mod n2\displaystyle \mathrm{E}(m_1) \cdot \mathrm{E}(m_2) \bmod n^2
  3. 解密函数$\mathrm{D}(\cdot)$ 回到持有私钥的办公室,打开碰过的罐子得到两数之和。
    D(⋅)\displaystyle \mathrm{D}(\cdot)
  4. 取模回卷$\bmod n$ 表示结果超出范围就自动回卷,好比钟表走到 12 点从头开始,只要原始数据远小于 n 就不受影响。
    (m1+m2) mod n\displaystyle (m_1 + m_2) \bmod n

融合架构设计

最稳妥的流程从此确立:每家先在自家厨房里按约定好的“胡椒配方”把真实梯度加噪(差分隐私),再封进焖烧罐(同态加密),最后交到老王手里。老王把所有罐子摇匀(密文聚合),交出总罐;业委会办公室解密后,得到的是一个“糊了一层胡椒”的全楼均值。这个过程中,老王既看不到任何一家罐内的精确数字(同态加密保证),单个罐内的数字本身又是失真的(差分隐私保证)——双重保险,缺一不可。

完整的融合流水线分四步:第一步,各客户端本地训练得到梯度;第二步,客户端按隐私预算给梯度添加高斯噪声;第三步,用 Paillier 或 CKKS 将加噪后的梯度加密上传;第四步,服务器在密文域执行同态加法聚合,解密后下发全局模型。这种“先扰动、再加密、后聚合”的范式称为分层加密架构:差分隐私管住“发布层”的输出,同态加密管住“传输与聚合层”的内容。

这里有一个容易踩坑的细节:如果每家只加方差为 $\sigma^2$ 的噪声,K 家平均后噪声方差会变成 $\sigma^2 / K$——噪声被“平均掉了”,隐私保护反而失效。因此正确做法是让每家噪声标准差放大 $\sqrt{K}$ 倍,平均后恰好回到目标强度。这套架构还有一个变体叫“混合隐私策略”:敏感层用本地差分隐私,非敏感层由服务器在解密后统一加全局噪声。老王从头到尾只见过一堆罐子和一个糊一点的均值——这就是融合架构的全部秘密。

wagg=D(⨁i=1KE(wi+ξi))=1K∑i=1Kwi+1K∑i=1Kξiw_{agg} = \mathrm{D}\left( \bigoplus_{i=1}^{K} \mathrm{E}\left( w_i + \xi_i \right) \right) = \frac{1}{K}\sum_{i=1}^{K} w_i + \frac{1}{K}\sum_{i=1}^{K} \xi_i
服务器解密后得到的是“梯度均值 + 噪声均值”,只要本地噪声按参与方数量的平方根缩放,最终噪声大小正好符合全局隐私预算。
  1. 本地加噪$w_i + \xi_i$ 表示每家先采一次高斯噪声 $\xi_i$ 撒在梯度上,再进入加密流程。
    wi+ξi\displaystyle w_i + \xi_i
  2. 加密上传$\mathrm{E}(\cdot)$ 把加噪后的梯度锁进密文罐,罐子在网络中传输无人能读。
    E(wi+ξi)\displaystyle \mathrm{E}\left( w_i + \xi_i \right)
  3. 密文聚合$\bigoplus$ 表示同态加法运算,服务器把所有罐子的内容合并成一个大罐子。
    ⨁i=1KE(⋅)\displaystyle \bigoplus_{i=1}^{K} \mathrm{E}(\cdot)
  4. 解密与平均$\mathrm{D}(\cdot)$ 打开总罐,再除以 K 得到平均梯度,胡椒也被平均稀释。
    1K∑i=1Kξi\displaystyle \frac{1}{K}\sum_{i=1}^{K} \xi_i

权衡与调优

厨房里没有免费的午餐。胡椒撒多了,汤就喝不出原来的鲜味;罐子做太厚,摇一次累得气喘吁吁。差分隐私与同态加密的融合,本质上是在“隐私强度、模型精度、计算开销”三者间走钢丝。隐私预算 ε 是这根钢丝的起点:ε 越小,需要添加的噪声越大,梯度的偏差就越大,模型收敛越慢、最终精度越低;ε 越大,结果越精准,但隐私承诺越弱。

隐私预算还有一个让人头疼的性质——组合性。联邦学习通常要跑几十上百轮,每一轮都在消耗额度。如果每轮都用 ε 的预算,T 轮下来的总预算就是 T 倍 ε;预算耗尽后,统计结果就不能再对外发布了。这就是串行组合定理。因此实际系统里必须精打细算:要么减少通信轮次,要么在早期轮次用大噪声、后期用小噪声(噪声调度),要么借助 Rényi 差分隐私对多轮组合做更紧的跟踪。

计算开销是另一头大象。Paillier 的单次加密要做大数模幂运算,比普通 TLS 通信慢几个数量级;CKKS 的乘法深度每增加一层,参数规模就翻倍。工程上的组合优化手段包括:只对关键层做同态加密(分层加密)、对梯度做 Top-k 稀疏化减少加密数量、用 GPU 并行加速模幂、把多个值打包进一个 CKKS 明文槽(SIMD)。优秀的“掌勺人”会给最重要的步骤留足预算,次要步骤少撒胡椒、甚至不撒。

εtotal=∑t=1Tεt\varepsilon_{total} = \sum_{t=1}^{T} \varepsilon_t
串行组合定理:总隐私预算等于各轮预算之和。设计者必须把“额度券”分配到每一轮,花完即止。
  1. 单轮预算$\varepsilon_t$ 是第 t 轮允许的隐私预算,好比这一轮发给老王的“猜谜额度券”。
    εt\displaystyle \varepsilon_t
  2. 逐轮累加求和符号表示 T 轮的总额度是各轮之和,额度券不能透支,更不能跨项目挪用。
    ∑t=1Tεt\displaystyle \sum_{t=1}^{T} \varepsilon_t
  3. 预算分配轮数越多,每轮分到的额度越小,对应的噪声越大;必须在轮次数量与单轮精度之间做取舍。
    εtotal\displaystyle \varepsilon_{total}

精度损失分析

费尽周折端上桌的汤,味道总归和理想有差距。误差来自三个环节:第一,胡椒本身就带辣味——差分隐私噪声让梯度估计产生统计偏差;第二,把小数写成整数记录时的四舍五入——浮点梯度必须量化成定点整数才能交给 Paillier;第三,分子料理罐乳化时的鲜味损耗——CKKS 的近似运算和重缩放会引入舍入误差。三层偏差叠加在一起,就是融合方案相比明文训练的全部精度代价。

把它们写成公式就是总误差等于三项之和:$L_{noise}$ 随隐私预算 ε 减小而增大,ε 越小噪声方差越大;$L_{quant}$ 由量化位宽 b 决定,位宽越小截断误差越大;$L_{enc}$ 来自加密方案的固有近似,Paillier 因为是精确加密所以这一项为零,CKKS 则随多项式次数和缩放因子变化。理解了误差从哪来,才能对症下药:想要更小噪声,就增大 ε 或减少轮次;想要更小量化误差,就提高缩放因子但会增大明文空间压力;想减少 CKKS 舍入,就得加大参数并接受更高延迟。

在神经网络这类非凸模型上,噪声还会让优化目标发生偏移,导致收敛到更差的局部最优。实践中常用“先明文验证精度、再加隐私预算”的方式确定可接受的 ε 范围。尝味师必须清楚偏差来自哪一层,才能对症调味。

Ltotal=Lnoise(ε)+Lquant(b)+Lenc(λ)L_{total} = L_{noise}(\varepsilon) + L_{quant}(b) + L_{enc}(\lambda)
总精度损失被拆解为三个独立来源:DP 噪声、定点量化、加密近似。工程调优就是对这三项做权衡。
  1. 噪声损失$L_{noise}(\varepsilon)$ 是差分隐私胡椒带来的统计偏差,ε 越小这一项越大。
    Lnoise(ε)\displaystyle L_{noise}(\varepsilon)
  2. 量化损失$L_{quant}(b)$ 是浮点转定点时的四舍五入误差,位宽 b 越小误差越大。
    Lquant(b)\displaystyle L_{quant}(b)
  3. 加密损失$L_{enc}(\lambda)$ 是加密参数 λ(如 CKKS 多项式次数)引起的数据舍入,Paillier 精确加密这项为 0。
    Lenc(λ)\displaystyle L_{enc}(\lambda)

方案选型指南

选罐子要看菜谱:做老火靓汤用古法陶罐——密封无损但只能摇匀加法;做法式分子泡沫汤得用分子料理罐——能隔罐乳化乘法,但鲜味有损耗。对应到加密方案:Paillier 是“陶罐”,只支持加法同态,但计算精确、实现成熟;CKKS 是“分子料理罐”,支持加法和乘法,适合神经网络,但结果是近似的。联邦学习里梯度聚合本身是加法,似乎陶罐就够用;可一旦模型里还有乘法运算,比如服务器需要做模型加权组合,就必须上分子料理罐。

选型还需算一笔“罐子重量”的账。Paillier 的密文空间是模 $n^2$,128 位明文会膨胀成 2048 位密文,扩张率达到 16 倍;CKKS 的密文包含多个多项式,扩张率更高,但支持 SIMD 批量打包,可以把几百个数值塞进一个罐子。因此:参与方多、算力弱、模型是逻辑回归等线性模型、精度要求苛刻时,选 Paillier;参与方算力强、模型是深度网络、能接受一定近似误差时,选 CKKS。实际混合方案更常见:内层用 CKKS 做特征计算,外层用 Paillier 做精确聚合,或反过来。

好厨师会在厨房里同时备两种罐子:精确的陶罐负责调味基料,法式罐负责需要“起泡”的神经网络层。更重要的是,把差分隐私当作“最后一道胡椒”,在同态加密之上再盖一层安全网——两把锁各管一段,谁也撬不开整条链。

Expand=∣Enc(m)∣∣m∣≈2048128=16\mathrm{Expand} = \frac{| \mathrm{Enc}(m) |}{| m |} \approx \frac{2048}{128} = 16
密文扩张率是选型的关键指标:Paillier 的 128 位明文加密后变成 2048 位,通信量随之放大 16 倍。
  1. 明文位长$|m|$ 是业务数值的二进制长度,比如 128 位。
    ∣m∣\displaystyle | m |
  2. 密文位长$|\mathrm{Enc}(m)|$ 是加密后的长度,Paillier 在大数模 $n^2$ 下至少 2048 位。
    ∣Enc(m)∣\displaystyle | \mathrm{Enc}(m) |
  3. 扩张倍数比值 16 表示密文比明文大 16 倍,通信量随参与方数量线性放大,这就是“罐子太重”的直接代价。
    2048128=16\displaystyle \frac{2048}{128} = 16

系统落地实践

把整套理论搬进真实厨房,还需要三样基础设施:一间钥匙房(密钥管理)、一张时间表(协议同步)、一次出锅前的尝味(结果验证)。密钥管理上,Paillier 的私钥不能只放在一家手里,否则老王就能私自解密所有罐子;实际采用分布式密钥生成(DKG)或多方安全计算,让私钥碎片分布在多方,解密时必须协同完成。时间表层面,所有客户端要按协议同时开火、同一轮提交,防止掉队者被单独观察。尝味环节则是对解密结果的差分隐私校验,确保噪声强度符合承诺。

医疗场景是这套技术的最佳舞台:多家医院的影像科联合训练诊断模型,不共享任何影像数据。每家医院本地训练、加噪、用 Paillier 加密上传,中心服务器密文聚合后解密下发——病历不出院,模型照样学。隐私预算按病种分配,罕见病投入更多额度以保证罕见病灶的识别精度。金融场景则更偏爱 CKKS:银行间联合建模反欺诈逻辑回归,特征向量打包进明文槽批量加密,配合 GPU 加速把单轮训练延迟压到秒级,同时用本地差分隐私保护高净值客户的敏感交易特征。

安全聚合协议则是最底层的骨架:各客户端先用 Diffie-Hellman 密钥协商生成成对的掩码,上传时互相抵消,服务器只能看到总和。配合同态加密的“双保险”,整套系统在医疗、金融等强监管场景下,就能既满足数据合规,又保住模型效果——这正是一台合格“隐私厨房”的全部功力。

Cost=Tenc+Tcomm+Tagg\mathrm{Cost} = T_{enc} + T_{comm} + T_{agg}
端到端耗时由三部分构成:客户端加密时间、密文传输时间、服务器聚合时间。优化时抓住最大的瓶颈逐个击破。
  1. 加密耗时$T_{enc}$ 是客户端做同态加密的时间,Paillier 的大数模幂是主要瓶颈,可用 GPU 并行加速。
    Tenc\displaystyle T_{enc}
  2. 通信耗时$T_{comm}$ 是密文上行传输的时间,受扩张率影响,需要结合 Top-k 稀疏化和批处理压缩。
    Tcomm\displaystyle T_{comm}
  3. 聚合耗时$T_{agg}$ 是服务器做同态求和的时间,加法开销小,但需防止恶意客户端注入超量噪声或投毒梯度。
    Tagg\displaystyle T_{agg}

AI 应用场景

多中心医疗影像联合诊断

阶段:模型训练阶段的隐私保护设计

解决的问题:传统方案要求各医院把影像数据集中到一家数据中心,但医疗数据受《个人信息保护法》与医院内部规定约束,根本无法出院。AI 方案让各医院本地训练、加噪、同态加密后上传模型更新,中心服务器只在密文域聚合,病历影像永不离开医院,同时满足模型精度与监管合规。

具体案例:某省级肿瘤专科联盟牵头,5 家三甲医院用 Paillier + 中央差分隐私联合训练肺结节检测模型。每家医院在本地 GPU 上微调 ResNet,对梯度添加 σ=0.8 的高斯噪声后用 Paillier 加密上传,联盟中心聚合后解密下发。训练 30 轮后模型 AUC 达到 0.92,与明文集中训练仅差 1.3 个百分点,但任何一方都无法还原其他医院的原始影像。

银行反欺诈联合建模

阶段:特征工程与模型推理阶段的加密计算

解决的问题:多家银行各自掌握部分用户交易特征,传统做法是共享黑名单样本,但涉及客户资金隐私。AI 方案用 CKKS 同态加密让各银行在密文上直接计算交叉特征和逻辑回归预测值,再配合本地差分隐私防止服务器通过查询接口反推个体交易记录。

具体案例:某金融科技平台与 3 家城商行联合训练反欺诈模型。交易特征向量用 CKKS 打包成明文槽批量加密,服务器在密文域完成矩阵乘法和 sigmoid 近似计算;高净值客户的交易序列额外添加本地差分隐私噪声。最终欺诈召回率提升 18%,而各家银行的原始流水全程未出本地数据库。

政务数据可信统计

阶段:数据发布阶段的隐私预算分配

解决的问题:政府部门间共享统计数据(如企业用电、人口流动)时,直接发布明细会暴露个体行为。融合方案先用同态加密做密文域求和,再对最终结果施加差分隐私噪声,实现“可统计、不可溯源”的可信数据发布。

具体案例:某市发改委联合统计局、电力公司,用 Paillier 聚合各园区企业用电量,对月度统计报告施加 ε=2 的拉普拉斯噪声后公开。企业用电明细只有电力公司自己可见,发改委拿到的只是带噪声的统计值,但总量预测误差控制在 3% 以内。

Python 演示

python58 行
"""差分隐私 + 简化Paillier同态加密 融合联邦学习演示"""import random  # ---------- 简化版 Paillier 同态加密(仅教学演示, 密钥远小于真实场景) ----------P, Q = 613, 997            # 两个小素数N = P * Q                  # 公钥模数N2 = N * NG = N + 1                  # 生成元LAMBDA = (P - 1) * (Q - 1)  # 私钥参数  def L(x):    return (x - 1) // N  def encrypt(m, r=None):    r = r if r is not None else random.randrange(1, N)    return (pow(G, m % N, N2) * pow(r, N, N2)) % N2  def decrypt(c):    return (L(pow(c, LAMBDA, N2)) * pow(LAMBDA, -1, N)) % N  # ---------- 联邦学习流程 ----------def client_update(secret_grad, scale, eps, K):    """量化 -> 本地DP加噪(放大sqrt(K)倍) -> Paillier加密"""    noisy = int(secret_grad * scale) + int(random.gauss(0, (K ** 0.5) / eps))    return encrypt(noisy)  def server_aggregate(ciphers):    """服务器在密文域执行同态加法(对应明文求和)"""    acc = 1    for c in ciphers:        acc = (acc * c) % N2    return acc  if __name__ == "__main__":    scale = 100          # 定点量化缩放因子    eps = 1.0            # 隐私预算    K = 5                # 参与客户端数    grads = [0.3, -0.1, 0.5, 0.2, -0.4]     ciphers = [client_update(g, scale, eps, K) for g in grads]    enc_sum = server_aggregate(ciphers)   # 密文求和    plain_sum = decrypt(enc_sum)          # 解密得到加噪整数和     if plain_sum > N // 2:                # 修正负整数        plain_sum -= N    avg_est = (plain_sum / scale) / K     # 反量化并取平均    avg_true = sum(grads) / K     print("真实均值: %.4f" % avg_true)    print("融合估计: %.4f" % avg_est)    print("误差: %.4f" % abs(avg_est - avg_true))
目的:用教学级小素数的简化 Paillier 完整走一遍“量化→加噪→加密→密文聚合→解密”的融合联邦学习流程,直观看到差分隐私噪声如何被平均、同态加密如何保护单个值。
  1. P, Q = 613, 997两个小素数构成公钥模数,真实场景需 1024 位以上,这里只为跑通流程。
  2. noisy = int(secret_grad * scale) + int(random.gauss(0, (K ** 0.5) / eps))梯度先乘缩放因子量化成整数,再加入按 $\sqrt{K}$ 放大的高斯噪声。
  3. return encrypt(noisy)加噪后的明文立刻用 Paillier 加密,从此明文不再出现。
  4. acc = (acc * c) % N2服务器在密文域做同态加法,累乘密文等价于累加明文。
  5. plain_sum = decrypt(enc_sum)只有持有私钥的机构能解密总罐,得到的是“梯度总和 + 噪声总和”。
  6. if plain_sum > N // 2: plain_sum -= N负整数在模 N 下表现为大数,超过 N/2 判定为负数并修正。
  7. avg_est = (plain_sum / scale) / K反量化再取均值,噪声被平均摊薄,结果贴近真实均值。

常见误区

误区我刚接触时觉得,同态加密把梯度变成密文,外人看不到,这不就是隐私保护吗?为什么还要再加差分隐私,多此一举吧?

正解两者解决的问题完全不同。同态加密防的是“传输和聚合过程中被偷看”,它保护的是内容本身;差分隐私防的是“通过多次统计结果反推个体”,它保护的是单条记录的存在性。老王就算打不开罐子,也能观察到“某户每次都在同一时间交罐子”,这种元信息和统计推断是加密管不了的。只有差分隐私出手,让每个罐子里的数字本身失真,才能真正切断反推路径。

为何常见:因为两者都冠着“隐私”二字,初学者很容易把加密的保密性和扰动的非显著性混为一谈。

误区隐私预算 ε 听起来像“预算”,预算越充足、能加更多保护,所以是不是 ε 设得越大越好?

正解恰恰相反,ε 越小隐私越强。ε 控制的是两个相邻数据集的输出分布差异上限:ε 越小,差异越接近 0,攻击者越无法判断某条数据在不在集里;ε=0 意味着完全无法区分,但需要无穷大噪声,任何统计结果都失去意义。实践中 ε 通常取 1~10,超过 10 的隐私保护基本形同虚设。

为何常见:“预算”这个词的日常语义是“越多越好”,与隐私领域中“越小越强”的约定相冲突,导致望文生义。

误区反正服务器最后要取平均,我在本地随便加一点小噪声,聚合后噪声就自动抵消了,隐私保护不费吹灰之力。

正解如果每家只加方差 $\sigma^2$ 的噪声,K 家平均后噪声方差变成了 $\sigma^2/K$,噪声确实变小了,但隐私保护强度也同步缩水——攻击者面对的是一个几乎无噪的均值,个体信息照样能反推出来。正确做法是按 $\sqrt{K}$ 倍放大本地噪声,让平均后的噪声恰好满足目标差分隐私保证。噪声被平均,是设计者算好的结果,不是天上掉馅饼。

为何常见:直觉上“误差取平均会抵消”在随机噪声场景下确实成立,但忽略了隐私强度与噪声大小的线性关系。

误区同态加密就是把明文换个形式,解密后应该原样返回,所以无论是 Paillier 还是 CKKS,模型精度都应该和明文训练一模一样。

正解Paillier 是精确加密,解密结果严格等于明文,确实无损;但 CKKS 是近似同态加密,为了支持浮点乘法和深度计算,每次密文乘法后都要做“重缩放”来压制噪声增长,这个过程会舍入掉一些低比特数据,属于原理性的近似损失。所以选 CKKS 时必须在文档里明确“近似误差”并预留模型精度余量。

为何常见:人们习惯把“加密”想象成无损变换,忽略了 CKKS 牺牲精确性换取乘法能力的本质。

面试题

Q1. 联邦学习中客户端上传给服务器的核心内容是什么?

单选题 · easy

  • A.全部原始训练数据
  • B.模型梯度或参数更新← 正确答案
  • C.用户明文标签集合
  • D.本地数据的加密副本

答案:B。联邦学习的设计原则就是“数据不动模型动”,客户端只上传本地训练产生的梯度或模型参数,原始数据始终留在本地。选项 A 是传统集中训练的做法,C 和 D 均为未定义的传输内容。这好比各家只交“节水变动量”便条,而不交水表总数的道理。

Q2. 差分隐私中隐私预算 ε=0 表示什么?

单选题 · easy

  • A.隐私保护为零,完全泄露
  • B.完美隐私但需无穷大噪声← 正确答案
  • C.输出结果与输入完全一致
  • D.不需要添加任何噪声

答案:B。ε=0 要求两个相邻数据集的输出分布完全相同,攻击者彻底无法区分数据是否在集内,这是完美隐私。但实现它需要向数据添加无穷大的噪声,任何统计结果都会失去意义,所以实践中 ε 取 1~10。选项 A 混淆了 ε 的方向,C 和 D 描述的是无噪声情况,恰好是隐私最弱的状态。

Q3. 差分隐私与同态加密最核心的区别是什么?

单选题 · mid

  • A.前者只用于图像,后者只用于文本
  • B.前者扰动数据防推断,后者加密内容防偷看← 正确答案
  • C.前者计算更快,后者精度更高
  • D.两者没有任何区别

答案:B。差分隐私通过注入噪声让“单条数据是否在集内”难以被统计结果反推,保护的是存在性;同态加密通过密码学手段让数据在密文域可计算,保护的是内容不可见。两者是互补关系而非替代关系。选项 A 无依据,C 和 D 是混淆概念。

Q4. 下列哪些属于常用的同态加密方案?

多选题 · mid

  • A.Paillier← 正确答案
  • B.CKKS← 正确答案
  • C.AES
  • D.RSA

答案:AB。Paillier 是半同态加密方案,支持加法同态;CKKS 是近似全同态加密方案,支持加法和乘法。AES 是对称加密,不支持同态运算;RSA 虽然历史上被讨论过乘法同态性质,但语义安全性不足且非主流同态方案。这好比只有“陶罐”和“分子料理罐”能隔着罐子做菜,普通保鲜盒和行李锁都不行。

Q5. Paillier 同态加密直接支持的密文运算是什么?

单选题 · mid

  • A.密文相乘对应明文相加← 正确答案
  • B.密文相加对应明文相乘
  • C.密文相乘对应明文相乘
  • D.密文异或对应明文相加

答案:A。Paillier 的核心性质是 $\mathrm{D}(\mathrm{E}(m_1)\cdot\mathrm{E}(m_2)) = m_1+m_2$,即两个密文相乘等于对应明文相加,这正是联邦学习聚合梯度所需的操作。选项 B 是代数上不成立的反向关系,C 是乘法同态(Paillier 不支持),D 属于 XOR 同态方案如 Goldwasser-Micali。

Q6. K 个客户端参与联邦学习,本地噪声标准差要放大多少倍才能保证聚合后噪声强度不变?

单选题 · mid

  • A.K 倍
  • B.2K 倍
  • C.$\sqrt{K}$ 倍← 正确答案
  • D.1/K 倍

答案:C。K 个独立噪声平均后方差缩小 K 倍,若想聚合后噪声贡献的方差仍为 $\sigma^2$,本地噪声方差需放大到 $K\sigma^2$,即标准差放大 $\sqrt{K}$ 倍。选项 A 放得过大导致精度浪费,B 无依据,D 会进一步削弱隐私,让攻击者更容易反推个体。

Q7. CKKS 同态加密相比 Paillier 的主要劣势是什么?

单选题 · hard

  • A.不支持任何密文运算
  • B.计算结果是近似的且有舍入误差← 正确答案
  • C.密钥长度固定为 128 位
  • D.只能加密整数不能加密浮点

答案:B。CKKS 为支持浮点乘法和深度计算引入了重缩放操作,每次运算都会舍入掉部分低位数据,因此是“近似加密”。Paillier 是精确加密但只支持加法。选项 A 错误,CKKS 支持乘加;C 错误,CKKS 参数远大于 128 位;D 错误,CKKS 恰恰擅长浮点向量的打包运算。

Q8. 在“本地 DP + 同态加密”融合架构中,服务器能够看到的信息包括哪些?

多选题 · hard

  • A.单个客户端的明文梯度
  • B.单个客户端的密文梯度← 正确答案
  • C.所有密文聚合后的总密文← 正确答案
  • D.解密后的加噪聚合结果← 正确答案

答案:BCD。服务器能收到每个客户端上传的密文梯度(B),能在密文域做加法得到总密文(C),如果服务器持有私钥,解密后看到的是加噪后的聚合结果(D),因为明文已经被差分隐私扰动,看到也无害。选项 A 在正确架构中不会出现,单个客户端的明文梯度从不离开本地。

Q9. 某联邦学习系统运行 T 轮,每轮隐私预算均为 ε,若采用串行组合定理且要求总预算不超过 E,则每轮最大预算为多少?

单选题 · extreme

  • A.ε = E
  • B.ε = E/T← 正确答案
  • C.ε = T·E
  • D.ε = E/T²

答案:B。串行组合定理说明总预算等于各轮预算之和,即 E = T·ε,故每轮预算 ε = E/T。这意味着轮次越多,单轮能分到的“胡椒额度”越少,每轮噪声越大,模型精度损失越高。选项 A 忽略累加效应,C 和 D 是代数方向错误,好比把一周的饭钱一天花光,后面几天只能饿肚子。

Q10. 融合方案中精度损失的主要来源不包括下列哪一项?

单选题 · mid

  • A.差分隐私噪声引起的统计偏差
  • B.浮点梯度转定点整数的量化误差
  • C.密文尺寸膨胀带来的通信开销← 正确答案
  • D.CKKS 重缩放引入的舍入误差

答案:C。精度损失指模型输出与明文训练的偏差,主要来自噪声(A)、量化(B)和 CKKS 近似(D)。密文尺寸膨胀(C)影响的是通信带宽和延迟,属于性能开销而非统计精度损失。这好比汤的鲜味损失来自胡椒、刀工和火候,而“碗太重端不动”是力气问题,不是味道问题。