又到月底,四名合租室友——阿辰、阿汐、阿明、阿久——站在客厅里,面对一张水电燃气账单面面相觑。每个人房间里的空调开多久、热水器烧多少次,只有自己心里清楚;谁也不想当众报出“我这个月用了 400 度电”,因为那等于承认自己天天在房间开 party。但总账单必须有人付,钱必须按人头分摊。有没有一种办法:所有人都不知道别人用了多少,却能一起算出总费用? 这就是安全多方计算(Secure Multi-Party Computation,MPC)要解决的核心难题。它像一场精心设计的“集体结算仪式”:每个人把自己的数字“拆碎”、“加密”、“分发”,经过一系列看似随机的交换后,最终每个人都得到正确的总账单,却始终无法还原出任何一个人的原始用量。本文从合租账单出发,走近 MPC 的两大基石——不经意传输与秘密共享,再走进姚氏混淆电路、GMW 协议,最后看看这项技术如何保护银行和医院的联合建模。
对 AI 从业者而言,MPC 是隐私保护机器学习的“安全底座”。理解它,你才能回答“多方联合训练时,梯度如何不泄露原始数据”,也才能在设计隐私计算方案时选对协议、说清安全边界。
目录
可视化演示
展示不经意传输OT协议、Yao混淆电路与GMW多方协议的核心机制及性能对比,支持三模式交互切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
不经意传输(OT)协议 发送方持有m0/m1两条消息 接收方选择b获取m_b 发送方不知选择,接收方不知另一条 OT: S不知b, R不知m_{1-b} OT是MPC基础构件实现双方隐私保护。
合租账单的世纪难题
客厅里,四份个人用量数据就像四位室友紧闭的房门——每扇门后都是隐私,但整栋楼的账单必须一起算。阿辰提议:“不如我们把数字写纸上交给物业?”阿汐立刻反对:“那等于公开了我所有生活习惯。”阿明补充:“请个中介代算?可中介知道得太多,万一他出去说怎么办?”阿久想了想:“那我们就自己设计一套规则:每个人都不交出真实数字,但合在一起却能算出正确的总和——这就是安全多方计算的起点。”
安全多方计算研究的是这样一类问题:n 个互不信任的参与方,各自持有私有输入 x_i,希望通过协同执行一个协议,共同计算出某个函数 f 的输出。每个参与方最终只获得自己应得的那份输出(比如总金额),却无法从协议过程中推断出其他任何人的私有输入。合租场景里,f 就是“求四个房间用电量之和”,输出是“总费用 608 元”。
为什么这件事难?因为协议的所有参与方都可能“偷看”:他们会记录收到的每一条消息,并进行数学推理。MPC 的协议设计必须做到——即使某个参与方把收到的全部消息拿到超级计算机上演算一万年,也算不出别人的输入。这种安全性质不依赖“大家自觉”,而是由密码学机制强制保证。
合租的故事到这里只是抛出了问题。要真正实现“同算不同见”,还需要两类神奇的“工具”:一类负责在两人之间私密地传递单个信息,叫不经意传输;另一类负责把数字切碎后分发给众人,叫秘密共享。它们就像账本结算仪式中的“魔法信封”和“分饼刀”。
- 协议符号 Π代表参与方之间约定好的一整套消息交换与计算规则,就像室友们共同制定的“分摊账本使用章程”。
- 私有输入 x_i第 i 个参与方独有的数据,比如阿辰房间的 120 度电。它是协议的“原料”,但绝不对外公开。
- 函数输出 y_i计算结束后每个参与方获得的结果分量。对合租场景,所有分量都等于“总费用”,但数字只归自己所有。
不经意传输:投币电话亭里的两个信封
阿明开了一家深夜小卖部,室友们常来买零食。阿汐想买一份宵夜,但阿明不记得她想要哪一款,而阿汐又不想告诉他自己今晚想吃什么(因为这暴露了她打算熬夜追剧)。阿明想出一个办法:他把两张“购买凭证”分别装进两个一模一样的深色信封,摆在柜台上。阿汐只拿走其中一个信封,走进投币电话亭里打开。阿明站在外面,完全不知道阿汐拿了哪个信封;阿汐也只能打开自己选的那一个,另一个信封在她手里如同被焊死。这就是 1-out-of-2 不经意传输(Oblivious Transfer,OT)——密码学中大名鼎鼎的“魔法信封”。
形式化地说,发送方(阿明)持有两条消息 m₀ 和 m₁,接收方(阿汐)持有一个选择位 b ∈ {0,1}。OT 协议完成后,接收方获得 m_b,发送方无法得知 b 的取值;同时接收方对 m_{1-b} 一无所知。“不知选择”与“只见其一”必须同时成立,缺一不可。
OT 之所以是 MPC 的“地基构件”,是因为它是实现安全两方计算的最小原语:姚氏混淆电路、GMW 协议、安全求交,最终都归约为若干次 OT 调用。密码学家甚至证明了——OT 是构造一切安全多方计算的充分条件,有了它,就拥有了搭建任意隐私计算大厦的砖块。
回到小卖部场景:阿汐心满意足地买走了宵夜,阿明至今不知道她选的是哪张凭证。而这种“彼此都看不见对方心思”的交换能力,将成为我们接下来构建姚氏混淆电路的一块关键积木——求值方需要用 OT 来悄悄“领取”属于自己那一行的电路密钥。
- 两个消息 m₀ 与 m₁相当于两个深色信封里的凭证。发送方对它们的内容完全清楚,这正是他要保护的信息。
- 选择位 b接收方根据自己的意图生成一个 0 或 1。整个协议中,没有任何人(包括发送方)能读出这个比特。
- 空输出 ⊥表示发送方在协议结束后没有得到任何与 b 相关的信息——他连一个比特的线索都捞不到。
- 接收方输出 m_b接收方最终解开的是自己选中的信封,拿到 m_b,而另一个信封中的内容 m_{1-b} 对他永不可见。
秘密共享:把西瓜切成几块才算够
阿辰提议:“我们把各自用量做成碎片分给每个人吧!”阿汐问:“切成多少块?每人拿几块?”阿久机智地说:“切碎后必须保证——任何一个人手里的碎片数量少于某个阈值,就完全拼不出原数字;只有凑够阈值,才能复原。”这就引出了秘密共享(Secret Sharing)的核心思想:把一个秘密拆成若干碎片,分发给不同的参与者,任何少于阈值 t 的碎片集合都无法获得关于秘密的任何信息,只有不少于 t 份碎片才能重构秘密。
最经典的方案由 Shamir 在 1979 年提出,利用了数学中一个优美的性质:通过平面上任意 k 个点,可以唯一确定一条 k-1 次多项式曲线。如果把秘密 s 藏在曲线的“0 点高度”(即常数项)中,那么 k-1 次多项式 f(x) 上的 n 个点就是 n 份碎片。少于 k 个点时,过这些点的曲线有无数条,在每个高度上都能穿过某条曲线——秘密完全被淹没在可能性的海洋中。
合租的“拆西瓜”仪式其实很优雅:阿辰把 120 度电变成一条随机曲线的秘密高度,切出四块“西瓜”,阿辰自己留一块,另三块分给三位室友。每块西瓜单独尝起来都寡淡无味,但任何三个人把瓜皮拼在一起,就能还原出完整的 120 度电——不过别担心,协议只会让这个还原发生在“总账本”内部,而不是在任何一个人的手心里。秘密共享给了我们“拆分”的能力,下一步还需要一门“算术”来让碎片在计算过程中保持加密。
- 秘密 s 藏在常数项多项式在 x=0 处的取值恰好等于 s,所以“找回秘密”就等价于“确定曲线在 0 点的高度”。
- 随机系数 a₁ 到 a_{t-1}它们像撒在秘密周围的迷雾,让少于 t 个点的人看到无数条可能的曲线,无法猜测 s。
- 次数 t-1决定了重建秘密所需的最少点数。t 就是阈值——凑够 t 个点才够,少一个都不行。
- n 个点即 n 份碎片把 x=1,2,…,n 分别代入 f(x),得到 n 个坐标点,发给 n 个参与者。每个点只是曲线上的一个孤点,单独看毫无意义。
姚氏混淆电路:给真值表贴上乱码标签
四个室友想算的不只是“总和”,有时候还要算“谁的用量最高”、“我的用量是否超过平均值”等复杂问题。为了支持任意函数计算,姚期智先生在 1986 年提出了一个天才方案——姚氏混淆电路(Yao's Garbled Circuit)。它把函数视作一座由逻辑门(与门、或门、非门)搭成的电路,然后像给每条导线贴上“乱码标签”一样,把整个电路“加密”成一张谁也看不懂的加密图纸。
想象这样一幕:阿辰和阿汐各有一份私人数字,他们想比较大小,但谁都不想先亮牌。阿辰作为“电路生成方”,把“比较大小”的电路每一根导线的 0/1 都替换成两把随机密钥——导线为 1 时用钥匙 k₁,为 0 时用钥匙 k₀。接着,他把每个门的真值表写在一张张加密备忘贴上:只有同时握有两根输入线的正确钥匙,才能拧开对应抽屉,取出输出线的钥匙。然后他把整叠加密备忘贴寄给阿汐。
阿汐是“电路求值方”,她手里需要自己那根输入线的钥匙。这另一把钥匙正好通过前面学过的不经意传输安全取得——阿辰不知道她选了哪把。阿汐逐门解密,最终得到输出线的钥匙,再对照规则反推出结果。整个过程中,阿汐看到了“被加密后的电路迷宫”,却永远不知道阿辰那根线上到底接的是 0 还是 1。
姚氏电路让合租故事进入新阶段:室友们可以安全地比较“谁的空调开最久”、“谁的用电量排前三”,却依旧不知道每人的具体数字。不过姚氏方案主要面向两方,如果想扩展到四个室友集体算复杂账单,就需要一个更“多边主义”的协议——GMW。
- 两个输入密钥 k_x^a 与 k_y^b对应这根输入导线的真实状态 a 和 b 的“替身”。求值者看到的是随机乱码,猜不出它代表 0 还是 1。
- 门的逻辑函数 g(a,b)它是真值表的核心,比如与门 g=AND。加密备忘贴上写的是“用输入钥匙加密输出钥匙”的规则,而非明文结果。
- 输出密钥 k_{g(a,b)}^z门根据输入算出的输出状态 z,同样用一把随机密钥代替,作为下一层门的“入场券”。
GMW 协议:每人握一块拼图,一起拼出世界
姚氏混淆电路像一位导演包办了整部戏的道具,而 GMW 协议(Goldreich-Micali-Wigderson,1987)则像四位室友围坐一桌,每个人亲手握着所有秘密的“一块拼图”,通过不断交换局部信息,共同完成整幅拼图。它的核心思想是:每个参与方不直接拥有任何完整的中间结果,而是拥有该结果的“加法份额”——就像把每个数字拆成 n 份随机碎片,每人拿一份,所有碎片相加才等于原数字。
GMW 协议将目标函数同样表示为布尔电路,但逐门处理的方式不同。对于异或门,参与方可以在本地直接对份额做异或,无需通信——因为“秘密的异或”就是“异或后的秘密”。对于与门,则需要在参与方之间进行一轮交互式乘法协议(通常借助预先生成的 Beaver 三元组),保证结果的份额依然正确分布,却不泄露任何一方的原始输入。每个逻辑门都对应一次或多轮消息交换,电路跑了多少层,各方就交换了多少轮。
如果说 Yao 电路适合“两个人对着一堆加密备忘贴慢慢算”,GMW 则天然适合“四个人围桌拼拼图”。它的代价是每一扇与门都要在全网广播消息,通信量随电路规模线性增长;但换来的好处是支持任意多方参与、且无需可信设置。合租四人组既能算总和,也能算更复杂的“每人该摊多少钱”,而任何人都看不到别人的水量和电量。
- 秘密 x 被拆成两份份额a 和 b 分别由两个参与方持有,它们相加(异或)才等于 x,单独一份与随机数无异。
- 异或的局部计算双方各自把自己的两份份额异或,得到新的两份份额——合在一起就是目标结果。
- 与门需要交互异或门虽然免费,但与门(相当于普通乘法)必须配合预先共享的随机三元组来“安全相乘”,这也是 GMW 通信开销的主要来源。
安全模型:协议的“信任假设”说明书
阿汐担心:“如果阿辰在协议里故意不改数据怎么办?”这个问题触及了 MPC 安全模型的分水岭。现实中,安全多方计算协议都建立在特定的信任假设之上,按参与方的“破坏力”分成两个层次:半诚实模型(semi-honest)与恶意模型(malicious)。
半诚实模型假设所有参与方会严格按协议步骤执行,不会中途篡改消息或提前退出,但他们会把收到的全部中间消息记录并分析——就像室友虽然按规矩交了碎片,但会偷偷把碎片抄下来研究,试图推理别人的用量。恶意模型则假设参与方会主动作弊:提交伪造的输入、发送错误消息、甚至联合多人串通攻击,协议必须在这些恶意行为下仍然保证安全和正确。
密码学家定义安全的标准方法是模拟范式:把协议的实际执行与一个“理想世界”对照。理想世界中存在一个完全可信的神谕(上帝),各方直接把秘密交给它,它算出结果再分发给各方。如果真实协议的执行效果与理想世界在计算上不可区分,就说明协议没有泄露任何不该泄露的信息——因为理想世界里上帝只听秘密、从不外传。
合租四人组的协议该选哪种安全模型?半诚实模型开销小、效率高,适合“大家基本守规矩,但有点八卦”的合作场景;恶意模型则像请了一位公证律师全程监督,开销大得多,适合涉及真金白银的金融场景。安全模型不是缺陷,而是协议的“信任说明书”——告诉我你担心什么,我为你定制多强的防护。
- 真实执行 Real_Π(x)指的是在真实协议 Π 中,攻击者视角下看到的全部消息序列和输出,如同一盘录像带。
- 理想执行 Ideal_F(x)假设存在可信神谕 F,各方把秘密交给它,由它计算后分发结果——攻击者的录像带只有“输入”和“输出”两幕。
- 计算不可区分 ≈^c任何高效算法都分辨不出两盘录像带的差别。既然理想世界绝对安全,真实世界也就同样安全。
应用部署:当 MPC 走进机器学习
医院、银行、互联网公司手握海量高价值数据,却因隐私法规无法直接共享。MPC 的登场让“数据不动,模型动”成为可能。在隐私保护机器学习中,MPC 最常见的用法是安全聚合:各参与方在本地用私有数据训练模型,只上传梯度(模型更新的方向),由 MPC 协议把所有人的梯度安全地加起来,再下发平均后的梯度更新模型。由于梯度全程以碎片形式流转,任何参与方都看不到别人的原始梯度,也就无法反推出对方的训练数据。
联邦学习与安全聚合的结合是目前最火热的落地形态。以一个跨医院联合训练诊断模型为例:三家医院各自拥有不同的病人数据(影像、检验指标),它们的样本不能出医院,却想让模型学习到三家数据的联合规律。现实中,这套流程已在多家真实机构中应用:银行间联合反欺诈模型,在样本不出域的情况下提升欺诈识别准确率;医疗机构利用 MPC 安全求交,找出多位患者的共同特征空间,而不暴露每一位患者的病历明细。
回到合租的比喻:四位室友现在不仅是分摊账单,还合办了一家“联合健身房”——每个人贡献自己的锻炼数据来训练一个健康建议模型,但谁也不想让别人看到自己每周只去了一次。有了 MPC 安全聚合,模型能给出合理的训练计划,室友们的数据却始终锁在各自的手机里。这就是“数据可用不可见”的现实魔法。
- 模型参数 θ表示当前共享的机器学习模型的权重,是所有机构共同维护的一串数字。
- 学习率 η控制模型每一步更新的大小,类似走路时迈步的幅度。
- 安全聚合的平均项N 家机构的梯度在 MPC 保护下求和并被平均。MPC 保证求和过程无人能看到单个 g_k。
挑战与趋势:效率与安全的赛跑
尽管 MPC 理论优美,工程落地却有一道现实鸿沟——效率。合租四人第一次用 MPC 算账单,开了整整四个小时的会,发了上千条消息,每个人手机都收到一堆乱码碎片。在大规模机器学习中,模型有数百万参数,梯度交换次数以亿计,MPC 的通信开销便成了拦路虎。
通信瓶颈主要来自两个方面。其一,Yao 混淆电路需要对电路中的每个门都传送一张加密表,电路规模与函数复杂度成正比;其二,GMW 协议中每个与门都需要一轮甚至多轮广播,参与方越多,消息量随 n² 增长。研究者们于是尝试“混合协议”:同一个计算任务里,把 Yao 电路、GMW、同态加密、秘密共享按各自优势组合——能本地算的用秘密共享,需跨方比较的用 Yao,需批量算术的用同态加密。这种“组合拳”正是当前 MPC 框架的主流方向。
好消息是工程侧已在快速追赶:GPU 并行加速批量密码学运算,可信执行环境(TEE)把部分 MPC 步骤搬进硬件安全区,OT 扩展技术用少量基础 OT 扩展出海量 OT,专用协议(如 SPDZ、ABY 等框架)把大规模秘密共享计算变成工程可用的工具包。合租四人下次算账单也许只需几秒,而多机构联合训练千亿参数模型,正从论文走向生产环境。
- 电路规模 |C|整个函数被编译成多少扇逻辑门。函数越复杂,门越多,通信量越大。
- 安全参数 κ决定密码学原语强度的核心长度,如密钥位数。κ 越大,安全性越高,通信与计算开销也越大。
- 线性增长通信总量随着电路规模线性增加,这意味着优化电路结构(比如用更少的乘法门)能直接成比例地降低开销。
AI 应用场景
银行联合反欺诈模型
阶段:多方联合建模与预测
解决的问题:传统反欺诈模型由单家银行基于自有数据训练,样本量小、特征稀疏,黑产团伙跨行作案难以识别。若直接把交易明细合并到一方,又违反《个人信息保护法》且涉及商业机密。利用 MPC 做安全求交与安全聚合,多家银行在数据不出域的前提下联合训练逻辑回归或 XGBoost 模型,欺诈识别准确率提升 15% 以上。
具体案例:某头部金融科技公司联合 5 家城商行,用 MPC 协议对 8000 万条脱敏交易记录做安全求交,找出跨行共用设备、共用收货地址的异常聚集,在不交换任何原始交易的前提下训练出跨行欺诈评分卡,上线后拦截资金损失超 2 亿元。
多中心医疗影像协作诊断
阶段:分布式训练与推理
解决的问题:三家三甲医院各自拥有数千例 CT 影像,但受伦理审查与数据安全法规限制,影像无法集中到一方。MPC 安全聚合使各院在本地训练模型、仅上传加密梯度,共同优化一个肺结节检测模型,且对任何一方都不泄露病人影像与梯度信息。
具体案例:某医疗 AI 公司与三家医院合作,利用 SPDZ 协议实现 3 方安全聚合,训练 ResNet-50 肺结节分类模型。相比单院模型,AUC 从 0.89 提升至 0.94,全程无任何影像文件离开医院内网。
广告主与媒体方安全归因
阶段:跨域数据统计与关联分析
解决的问题:广告主想知道“看过我这支广告的用户是否真的购买了商品”,但媒体方不愿公开用户浏览明细,广告主更不愿透露成交名单。MPC 支持两方安全求交与安全统计:双方把用户标识经过哈希与 OT 协议处理,只输出交集规模和转化率,双方均无法反推对方的全量用户列表。
具体案例:某电商平台与视频媒体采用基于 OT 扩展的安全归因方案,实现跨域转化率实时计算,延迟小于 500ms,归因准确率与明文计算完全一致。
Python 演示
# -*- coding: utf-8 -*-"""Shamir 秘密共享 + 多方安全求和 演示"""import random P = 2**127 - 1 # 大素数,所有运算在模 P 下进行 def mod_inv(a): # 模逆:乘法下的"倒数",用于拉格朗日插值中的除法 return pow(a, P - 2, P) def split_secret(secret, n, k): # 把秘密塞进常数项,随机生成 k-1 个系数 coeff = [secret] + [random.randint(1, P - 1) for _ in range(k - 1)] shares = [] for x in range(1, n + 1): y = 0 for power, c in enumerate(coeff): y = (y + c * pow(x, power, P)) % P shares.append((x, y)) return shares def reconstruct(points, k): # 拉格朗日插值:取 k 个点,计算 f(0) total = 0 for i in range(k): xi, yi = points[i] num, den = 1, 1 for j in range(k): if i == j: continue xj, _ = points[j] num = (num * (-xj)) % P den = (den * (xi - xj)) % P total = (total + yi * num * mod_inv(den)) % P return total def secure_sum(values, n=4, k=3): # 多方求和:每人把用量拆成 n 份碎片,分给所有人 all_shares = [split_secret(v, n, k) for v in values] local_sums = [] for j in range(n): s = 0 for i in range(n): s = (s + all_shares[i][j][1]) % P local_sums.append(s) # 任取 k 个本地和即可还原总费用 return reconstruct([(j + 1, local_sums[j]) for j in range(k)], k) if __name__ == "__main__": random.seed(42) bills = [120, 210, 95, 178] # 四个室友各自房间的用电量(度) total = secure_sum(bills) print("每人用量(隐私):", bills) print("安全算出的总用量:", total) print("真实总用量(核对):", sum(bills))
coeff = [secret] + [random.randint(1, P - 1) for _ in range(k - 1)]把秘密作为多项式常数项,其余系数随机生成,构成一条隐藏秘密的曲线。for x in range(1, n + 1): y = ...在曲线上取 n 个点作为碎片,每人拿一个坐标点。num = (num * (-xj)) % P拉格朗日插值的分子部分,用“负数坐标”构造出 x=0 处的权重。den = (den * (xi - xj)) % P分母部分,消除其他点对当前点的干扰。mod_inv(den)用费马小定理求模逆,把除法转化为模意义下的乘法。local_sums.append(s)每个参与方把收到的全部碎片相加,得到本地和,此时他依然拼不出任何人的原始数字。reconstruct([(j + 1, local_sums[j]) for j in range(k)], k)任意 k 份本地和即可通过插值还原总费用,少于 k 份完全失效。
常见误区
误区我以为安全多方计算就是找一家可信机构(比如银行或公证处),大家把数据交给它,它算完再告诉结果。不然数据在多方之间传来传去,怎么可能安全?
正解MPC 的终极目标恰恰是消除对任何单一可信第三方的依赖。协议本身通过秘密共享、不经意传输等密码学手段,让数据以碎片或密文形式流转,任何一方(甚至包括服务器)都无法拼凑出完整数据。合租室友不需要“物业中介”,他们自己围坐一圈就能完成安全结算。
为何常见:日常生活中“找公证人”是解决信任问题的最直观方案,人们本能地认为第三方托管是唯一出路,忽略了密码学协议可以在“无信任假设”下自行保证安全。
误区不经意传输嘛,就是接收方不知道另一个消息是什么,发送方不知道他选的是哪个——这俩不是都因为“看不见”吗?不是同一件事吗?
正解这是两个独立的隐私性质,出于完全不同的机制。发送方“不知道选哪个”是因为协议保证了选择位 b 在计算上不可猜测;接收方“不知道另一个内容”是因为另一个消息在数学上被加密/隐藏。二者缺一不可:如果只隐藏选择,接收方可能拿到两个消息;如果只隐藏内容,发送方可能通过输出反推选择位。
为何常见:初学者容易把“隐私”理解成一个笼统的模糊概念,事实上 MPC 中的每个隐私主张都有严格的、可证明的数学边界。
误区既然秘密可以被拆成碎片分给所有人,那直接把数据拆开、各算各的、最后合起来不就行了吗?MPC 不就是这么简单?
正解Shamir 秘密共享只解决了“存储与重构”问题,并不解决“在不重构秘密的前提下计算函数”的问题。要做加法可以直接对碎片加,但做乘法、比较、逻辑运算就需要额外的协议配合(如 Beaver 三元组、混淆电路)。秘密共享是积木,而不是城堡。
为何常见:直觉上“拆分-计算-合并”听起来很自然,但碎片之间的计算需要特殊的代数结构支撑,普通函数无法直接作用于碎片。
误区半诚实模型下大家都会按协议执行,那不就是理想安全环境吗?攻击者在这种模型下什么都干不了。
正解半诚实参与者会主动偷看——他们会完整记录收到的每条消息并进行分析推理,只是不篡改消息、不中途退出。这意味着协议仍然要保证“从消息中推不出隐私”,只是不需要防御伪造输入等主动破坏。合租故事里“有点八卦的室友”就是半诚实模型:他悄悄打量你的碎片,但不会把你的碎片调包。
为何常见:“半诚实”给人“一半诚实”的印象,仿佛攻击力很小,实际上它针对的是被动窃听攻击,这在真实网络环境中已经是很强的威胁。
误区现在服务器算力这么强,MPC 不就是在普通计算外套一层加密吗?跟 HTTPS 一样,多加几百毫秒应该就能搞定。
正解MPC 的开销远非“套一层壳”。Yao 电路需要对每个逻辑门传输加密表,GMW 的每个与门都涉及多轮广播,通信量通常比明文计算高出数个数量级。对百万级参数的深度学习模型,梯度聚合的通信开销可能是明文方案的几十倍到上千倍。这正是研究者不断优化协议、引入硬件加速的原因。
为何常见:人们习惯用“加密解密”的线性思维理解安全计算,忽略了 MPC 中多项式插值、OT 扩展、电路求值等操作的复杂度和网络通信成本。
面试题
Q1. 安全多方计算最核心的隐私目标是什么?
- A.所有参与方都能看到每个人的私有输入值
- B.恶意参与方完全无法影响最终的计算结果
- C.参与方协同算出结果但不泄露各自的私有输入← 正确答案
- D.计算结果只返回给发起整个计算的参与方
答案:C。MPC 的目标是“同算不同见”:大家共同算出正确结果,但任何一方的私有输入都不被其他人获知。A 恰恰是 MPC 要避免的;B 属于“正确性”而非“隐私性”;D 描述了输出分发规则,不是隐私目标本身。
Q2. 在 1-out-of-2 不经意传输中,发送方掌握的信息是?
- A.接收方最终具体选择了哪一个消息
- B.接收方没有选择哪一个消息的具体数值
- C.两条消息的具体内容,但不知道接收方的选择← 正确答案
- D.接收方选择位 b 的比特值及其推导过程
答案:C。OT 中发送方知道 m₀ 和 m₁ 两个消息内容,但对接收方的选择位 b 一无所知。A、B、D 都涉及接收方的选择信息,这是协议刻意隐藏的。这正是“魔法信封”的精髓:信封里的内容是你的,但你不知道我拿了哪封。
Q3. Shamir 秘密共享中,恢复原始秘密最少需要多少份份额?
- A.任意拿到一份份额即可完整恢复全部秘密
- B.全部 n 份份额全部到齐才能恢复秘密
- C.达到阈值 t 份任意份额即可恢复秘密← 正确答案
- D.至少要超过一半份额才能恢复秘密
答案:C。Shamir 方案用 t-1 次多项式藏秘密,任意 t 个曲线上的点都能唯一确定曲线,进而算出 f(0)=s;少于 t 个点则曲线不唯一,秘密完全不可判定。B 是“全有或全无”方案的特征,D 则是常见的直觉误区。
Q4. 姚氏混淆电路中,电路生成方和求值方分别负责什么?
- A.求值方生成电路,生成方负责逐门解密求值
- B.生成方构造混淆电路,求值方用密钥逐门求值← 正确答案
- C.双方共同在线生成电路并且同时进行求值计算
- D.可信第三方生成电路,双方各自独立求值运算
答案:B。Yao 协议里生成方把函数编译成加密电路并寄出,求值方通过不经意传输拿到自己的输入密钥,然后逐门解密、最终得到结果。A 角色颠倒,C 与“非交互生成”的设计不符,D 引入了不必要的可信第三方。
Q5. GMW 协议与姚氏混淆电路的主要区别是什么?
- A.GMW 只支持两个参与方,姚氏电路支持任意多方
- B.GMW 将秘密拆分为多方份额并进行门级交互求值← 正确答案
- C.GMW 无需任何通信即可完成全部电路的安全计算
- D.GMW 只能计算加法类函数而无法处理乘法类函数
答案:B。GMW 把每个秘密拆成份额发给所有参与方,每扇门(尤其与门)都要交互求值,天然支持多方。Yao 电路更适用于两方场景,且生成方需要预先构造电路。C 和 D 都与 GMW 支持任意布尔电路的特性相悖。
Q6. 半诚实安全模型不考虑以下哪种攻击行为?
- A.参与方严格按协议执行但记录消息并推理隐私
- B.参与方联合其他人在事后分析中间结果
- C.参与方主动篡改消息内容或者提前中断协议← 正确答案
- D.参与方利用收到的碎片尝试反推他人的输入
答案:C。半诚实模型防御“被动偷看”:允许参与者记录、分析、推理,但不允许主动破坏协议。C 描述的篡改和中断是恶意模型要防御的行为。合租比喻中,半诚实室友会打量你的碎片,但他不会把你的碎片调包。
Q7. 联邦学习中的安全聚合主要利用 MPC 的什么能力?
- A.在不知道各机构原始梯度的情况下完成平均更新← 正确答案
- B.让所有机构共同共享同一份完整的原始训练数据
- C.加密所有机构的模型推理接口并对外提供服务
- D.用差分隐私噪声完全替代梯度更新所需的信息
答案:A。安全聚合通过秘密共享和 OT 等 MPC 技术,把各机构梯度拆碎再汇总,任何一方都看不到单个机构的梯度,却能算出平均梯度。B 违背数据不出域原则,C 是推理阶段加密而非训练聚合,D 混淆了差分隐私与 MPC。
Q8. MPC 部署到实际系统时最大的工程瓶颈通常是?
- A.无法保证多个参与方最终输出结果的一致性
- B.电路级联引发的通信开销远高于明文计算← 正确答案
- C.参与方无法协商共同使用的密码学安全参数
- D.MPC 无法处理超过两个参与方的计算场景
答案:B。MPC 每个逻辑门都要传输加密表或进行多轮广播,通信量随电路规模和参与方数量快速增长,这是落地中最棘手的瓶颈。A 是协议设计本身就可以保证的性质,C 属于工程配置问题,D 与 GMW 等支持多方协议的实际情况不符。
Q9. 下列哪些属于不经意传输的实现或扩展方式?
- A.基于 RSA 公钥密码体制来构造基础不经意传输← 正确答案
- B.使用 OT 扩展技术把少量基础 OT 扩展为大量 OT← 正确答案
- C.基于椭圆曲线离散对数难题构造不经意传输← 正确答案
- D.直接把两则消息明文广播给所有网络参与方
答案:ABC。OT 的经典实现基于 RSA、ElGamal 等公钥密码体制,OT 扩展则用对称密码把少量基础 OT 放大为任意多 OT,大幅降低开销。D 是明文广播,完全没有任何隐私保护,不属于 OT。
Q10. 关于 MPC 的安全模型,下列说法正确的有?
- A.恶意模型需要防御参与方提交伪造输入数据← 正确答案
- B.半诚实模型假设参与方不主动破坏协议运行← 正确答案
- C.模拟范式要求真实执行与理想执行不可区分← 正确答案
- D.恶意模型下的协议开销通常比半诚实模型更小
答案:ABC。恶意模型要抵抗主动攻击,包括伪造输入、篡改消息、中断协议;半诚实模型只防被动推理。模拟范式是证明 MPC 安全的标准方法:真实视图与理想世界不可区分即安全。D 说反了——恶意模型需要更多校验与冗余,开销更大。