想象小镇新开了一家“拼图密室”俱乐部。五位侦探实习生各持一张写有线索的卡片,想合作确定“谁是最终嫌疑人”,却谁也不肯把自己的卡片给别人看。这听起来像道无解的难题——不交换数据,怎么联合计算?俱乐部的老板拿出三样工具:一台能把卡片切成随机噪点碎片的碎纸机、一张挂在墙上像乐高说明书一样的拼图蓝图,以及一个让人“盲选”物件的双抽屉金属盒。实习生们把卡片塞进碎纸机,每人捏着几片噪点碎片,按照墙面蓝图一步步拼装,遇到拼不上的交叉销钉就用盲选盒交换一下,走出店门时,答案已经出现在每个人心里——而各自的卡片内容始终无人知晓。 这个“碎片拼图协作”的场景,就是GMW安全多方计算协议的真实缩影。GMW由Goldreich、Micali和Wigderson于1987年提出,是安全多方计算领域公认的奠基性工作:它让任意多个互不信任的参与者,在各自输入完全保密的前提下,共同计算任意函数并拿到正确结果。整篇学习旅程可以概括成三件宝贝——秘密共享(碎纸机)、布尔电路(蓝图)和不经意传输(盲选盒),GMW就是把这三件宝贝组装成完整流水线的经典方案。
对AI从业者而言,GMW是你理解隐私计算系统底层骨架的钥匙:掌握它,才能在联合建模、隐私求交、多方风控等场景中看懂协议原理,并做出正确的工程选型。
目录
可视化演示
步进式展示GMW协议核心流程:异或秘密共享拆分输入、布尔电路表示、异或门本地评估、与门遗忘传输评估及多方协议对比,理解隐私计算经典方案。
本节配有交互动效(进入视口后自动加载,约 3KB)。
异或秘密共享 输入比特b拆分为n份,各份异或等于原始值b 每方持有1份份额,单方无法还原原始输入 b = b1 ⊕ b2 ⊕ b3 秘密共享:拆分输入保护隐私
协议概述:拼图俱乐部的创立
小镇上新开的拼图密室有个奇特规矩:每次挑战,每个人都带来一张记着线索的卡片,想合作算出最终嫌疑人,但谁都不许把自己的卡片给别人看。这听起来像悖论——不交换数据,怎么联合计算?俱乐部的秘密,就藏在安全多方计算(MPC)这门学问中:n个参与方各持私有输入xᵢ,共同计算一个函数f,最后每个人都得到正确输出,但除了自己的输入和最终输出外,学不到任何额外信息。
GMW协议正是这个领域最经典的方案之一,由Goldreich、Micali和Wigderson在1987年提出。它做出了一个震撼性的理论承诺:“任何可高效计算的函数,都能被多方安全地计算。”GMW立足半诚实模型(semi-honest):所有参与者都会严格遵守协议步骤,但会好奇地从中间消息中推断他人的秘密。这就像俱乐部的实习生们虽然守规矩,眼睛却总忍不住往别人桌上的碎片瞟。
回到俱乐部:实习生们把卡片投入碎纸机时,就已经踏上了GMW的旅程。他们不知道,墙上那张巨大的蓝图才是整场拼图的核心——那就是下一节要讲的布尔电路。
- 目标函数f表示大家共同想算的结果函数,比如“求所有人预算的总和”或“判断分数是否都超过阈值”。
- 参与方输入x₁到xₙ是每位参与者私有的数据,例如各自的账单金额或信用特征,任何人都不能直接看到。
- 参与方输出y₁到yₙ是计算结束后每个人分别拿到的结果,它们可能相同(如共同求和)或不同(如各自排名)。
- 变换箭头箭头表示协议把“看不见别人输入”的各方,引导到“得到正确输出”的状态。
布尔电路:墙上的拼图蓝图
拼图密室墙上挂着一张巨大的蓝图,像乐高说明书一样把最终图案拆解成几百个标准积木块。实习生们不需要理解别人卡片上的内容,只要按照蓝图的指引,把积木一块块拼上去即可。这张蓝图,就是密码学家口中的“布尔电路”。
任何可计算的函数——无论是信用评分、求交集还是统计均值——理论上都能转换为一张由与门(AND)、异或门(XOR)、非门(NOT)构成的布尔电路。输入是比特,输出也是比特。电路的大小由门的总数衡量,深度则由最长路径上的门数决定,这两者直接关系到GMW的计算与通信开销。这种转换并不抽象:硬件编译器可以把高级语言翻译成逻辑门网表,正如蓝图把最终图案分解成积木块。
在GMW中,没人把真实比特直接喂给电路,而是把每个比特拆成“噪点碎片”再送进蓝图。这正是俱乐部的碎纸机——秘密共享机制,我们下一节细看。
- 电路本身C是函数f对应的布尔电路,由若干逻辑门组成,是GMW协议的计算对象。
- 内部门函数g₁到gₘ是电路内部的逻辑门,每个门执行AND、XOR、NOT三种基本运算中的一种。
- 输出门g_out是电路最后一层负责汇总结果的门,它的输出就是整个函数的返回值。
- 输入向量x表示所有参与方输入比特串的拼接,整个电路对这份拼接输入做加工。
秘密共享:碎纸机与噪点负片
拼图密室入口摆着一台神秘的碎纸机。实习生把卡片塞进去,出来的不是纸条,而是几张布满随机噪点的透明负片。每张负片单独看如同雪花屏般毫无意义;但把它们叠在一起对着光,原始卡片的内容便清晰浮现。更妙的是,任何一张负片丢失,都不会泄露原图的半点信息。
这套机制对应密码学中的秘密共享,GMW使用其中最简洁的一种——XOR共享(布尔共享)。设秘密是一个比特s,要分给n个人:随机生成前n-1个份额,最后一个份额取s与所有随机份额的异或,于是所有份额的异或正好还原s。任意少于n份的份额集合,在信息论意义上不泄露s的任何信息。这使得电路求值中的每个中间值都能以份额形式存在,没有任何参与者能看到真实值。
碎片分好后,实习生们各捏着几片噪点进入工坊。接下来,他们要按蓝图把碎片拼起来——有些积木轻轻一扣即合,有些则需要“魔法交换盒”帮忙。
- 原始秘密s是参与者想要保护的真实比特,比如账单金额的某一位,只有本人知晓。
- 随机份额s₁到sₙ₋₁是均匀随机生成的比特,每个份额看起来与s毫无关联。
- 补足份额sₙ由s与前n-1个份额异或得到,它保证所有份额异或后恰好还原s。
- 异或还原等号左边所有份额逐比特异或时,噪点相互抵消,秘密如显影般浮现。
门求值:两种积木的拼法
拼图蓝图上只有两种核心积木:XOR积木和AND积木。实习生们很快发现,XOR积木是“阴阳块”——两块形状完全互补,放在桌上一推就能咬合成一个完整方块,不需要询问任何人。AND积木则麻烦得多:两块积木的接缝处有一根交叉销钉,必须借助柜台上的盲选盒才能插好。
密码学中的对应关系极其精确。设导线a的共享为(a₁,a₂),导线b的共享为(b₁,b₂)。XOR门的计算利用了异或的同态性质:各方只要把自己手上的两份碎片本地异或,就能得到输出a⊕b的份额,全程零通信。AND门则没有这种好运。把(a₁⊕a₂)和(b₁⊕b₂)相乘并展开后,会出现a₁b₂和a₂b₁两个交叉项——每项都同时涉及双方的秘密份额,任何一方都不能独自完成。GMW的做法是:利用不经意传输(OT)让双方交换交叉项而不泄露各自碎片。
把交叉项比作积木上那根销钉:正因为它连接两块碎片,才必须借用盲选盒。下一节,我们走进柜台,看看这个盲选盒内部到底发生了什么。
- 共享输入a₁与a₂是a的两份XOR份额,b₁与b₂是b的两份XOR份额,分别由两方持有。
- 分配律展开把两个共享和的乘积按位展开成四项,这是AND门求值的数学基础。
- 本地对角项a₁b₁与a₂b₂各自只涉及单方手上的碎片,可以由各方独立算出。
- 交叉项a₁b₂与a₂b₁横跨两方,任何一方都不能单独计算,必须求助OT。
不经意传输:柜台上的盲选盒
俱乐部柜台摆着一个带两个抽屉的金属盒,叫“盲选盒”。发送方把两个不同的小物件分别放进左右抽屉,然后转过身去;接收方用自己的钥匙只打开其中一个抽屉,取走里面的物件。发送方全程不知道对方打开了哪一边,而接收方也只知道自己拿走的那件,另一边的东西对他永远是个谜。
这个“盲选盒”就是密码学中的不经意传输(Oblivious Transfer, OT),具体地说是1-out-of-2 OT。在AND门求值中,它精确派上用场:计算交叉项a₁b₂时,P1作为发送方提供(0, a₁),P2作为接收方用选择位b₂去取。若b₂=0,P2取到0;若b₂=1,P2取到a₁。于是P2得到a₁∧b₂,而P1完全不知道b₂的值。OT协议可以通过RSA、ElGamal等公钥密码构造,它的安全性有两大要点:接收方的选择位对发送方隐藏,而发送方未被选中的消息对接收方隐藏。
有了碎纸机(秘密共享)和盲选盒(OT),再配合蓝图(电路),整个工坊就能完整运转了。实习生们从进门到出门的全程,就是下一节的完整协议流程。
- 功能符号OT表示不经意传输的功能抽象,输入输出都写在括号中。
- 发送方输入(m₀, m₁)是发送方准备的两条候选消息,在AND门中就是(0, a₁)。
- 接收方选择位b是接收方的私密比特,决定取两条消息中的哪一条,且发送方无法获知。
- 输出分配箭头右侧表示发送方得到空输出⊥,接收方得到m_b——正是它选中的那条消息。
计算流程:从进店到拼完离店
让我们跟拍一位实习生走一趟拼图密室。进门后第一件事,是把线索卡塞进碎纸机——这条“输入阶段”将每个输入比特拆成n份XOR份额,分别发给所有成员。随后大家进入大厅,面对蓝图开始“电路评估阶段”:按拓扑顺序逐门处理,遇到XOR门就本地拼一下,遇到AND门就两两到柜台用盲选盒交换一次。最后是“输出恢复阶段”:所有人将自己最终输出比特的份额亮出来,异或得到明文结果。
三个阶段串起来就是GMW协议的完整骨架。输入阶段的安全性来自秘密共享的信息论隐藏;电路评估阶段由XOR门零泄露和OT的双盲性共同保证;输出阶段因为输出本身就以份额形式存在,公开份额只暴露了协议设计允许暴露的结果。从性能角度看,在线通信轮数直接由电路深度决定——同一深度上相互独立的AND门可以并行调用OT,而总通信量则与AND门总数线性相关。
走出拼图密室时,实习生们手里只剩一堆用过的碎纸片,但每个人都知道了答案。有人小声问:城里另一家“算术工坊”也做类似的事,到底哪家更强?这就引出了GMW与BGW的对比。
- 协议实例Π_GMW表示整个GMW协议,由三个阶段顺序组合而成。
- 输入阶段Input环节,每个参与方对自己的输入比特执行XOR共享并分发份额。
- 评估阶段Evaluate环节,所有参与方按电路拓扑逐门求值,XOR门本地算、AND门用OT协作算。
- 输出阶段Output环节,各方汇总输出份额,通过异或恢复明文结果并各自输出。
协议对比:拼图工坊与算术工坊
小镇的另一头有一家“算术工坊”,招牌上写着BGW协议。它不玩拼图积木,而是用数字卡片做算术:把秘密用Shamir多项式插值拆成数值份额,加法和数乘随时可以本地做,只有乘法门需要一轮交互。拼图俱乐部(GMW)则擅长逻辑判断:它把一切计算都碾成布尔比特,用XOR/AND门逐位加工。
两者的分野恰在电路类型:GMW基于布尔电路,适合比较、选择、位运算等逻辑任务,AND门用OT处理;BGW基于算术电路(域上的加乘),适合求和、求均值、多项式计算等数值任务。秘密共享底层也不同:GMW用XOR共享(模2加法),BGW用Shamir共享(域上算术)。选择哪家取决于任务性质:若要计算“三个数是否都小于阈值”,布尔电路像乐高一样直观;若要计算“几千人工资的平均值”,算术电路能省下大量通信。在同样规模下,GMW的AND门每次都要跑OT,开销通常高于BGW的乘法共享,但GMW在恶意安全扩展上更自然。
两间工坊各有拥趸,但真正让拼图俱乐部名扬四方的,是它能把抽象杂技变成可落地的流水线。最后一节,我们看看工程上如何把这份蓝图搬进真实的隐私计算系统。
- 通信量T_comm表示协议总通信开销,正比于电路中AND门的个数。
- AND门数量|C_AND|是布尔电路中AND门的数目,每个AND门都要消耗一次OT级别的通信。
- 安全参数κ是类似密钥长度的安全参数,决定OT实例的密码强度。
- 通信轮数R_rounds与电路深度d成正比,说明同层AND门可以并行求值,减少来回等待。
工程实践:把拼图工坊搬上流水线
拼图俱乐部门庭若市后,老板决定把手工流程改成生产流水线:引进一台“预处理器”,在营业前批量生产盲选盒;让不同拼图桌同时开工;还定制了一批“标准销钉包”减少AND门的现场操作。这些工程改造正是GMW从理论走向工业界的真实路径。
工程上最关键的性能瓶颈永远是AND门数量,因为每个AND门都意味着一次OT。优化主线有两条:一是减少AND门——把电路改写得更浅更小(如用更优的逻辑综合工具、将比较运算改成算术友好形式);二是摊薄OT成本——用OT扩展(OT Extension)把少量公钥OT扩展成海量对称密钥OT,离线预处理阶段先算好,在线阶段只需高效的异或和哈希运算。有了这些加速,GMW已落地于隐私求交、联合风控、匿踪查询等场景。现代开源框架如ABY、EMP-toolkit、MP-SPDZ都实现了GMW风格的安全计算,让工程师不必从零手写OT和份额逻辑。
如今,拼图工坊的流水线日夜不停。实习生们依然不知道彼此的卡片内容,但答案总能准时出现在出口的屏幕上。这就是GMW协议跨越三十余年依然活跃的原因——它把“不可能”的安全合作,变成了一张可以量产的拼图蓝图。
- 扩展OT集合OT^m_ext表示最终获得的m次不经意传输实例,用于支撑m个AND门的求值。
- 基础OT数量O(κ)次基础OT是启动种子,κ为安全参数(如128),通常只需几十到一百多次。
- 哈希运算O(m)次哈希(如AES、SHA)把随机种子扩展成m个独立OT,属于对称密钥级别的廉价操作。
AI 应用场景
场景1:多机构联合风控评分
阶段:模型推理阶段
解决的问题:传统风控中,单家机构只有部分客户特征,想联合多家数据又面临法律与隐私限制。人工脱敏后共享数据不仅损失信息,还容易遭到重识别攻击。GMW将逻辑回归、评分卡等模型转换为布尔电路,让各机构在输入绝对保密的情况下联合完成推理,输出分数仅供参与方使用。
具体案例:三家银行各自持有同一贷款申请人在本行的存款、流水、逾期记录特征。通过GMW协议,三方以份额形式输入特征,在布尔电路上运行训练好的信用评分模型,最终共同恢复“风险分”,而任意一方都无法推断其他机构的原始特征。小型电路规模下,一次联合推理可控制在秒级,满足实时风控决策需求。
场景2:广告归因中的隐私集合求交
阶段:数据预处理与特征对齐
解决的问题:广告平台与电商平台需要找出“看过广告且完成购买”的共同用户,但两边都不愿交出全量用户ID。传统求交直接用哈希列表匹配,容易被字典攻击枚举。GMW把哈希后的ID比较函数转化为布尔电路,双方以秘密共享方式逐位比较,最终只得到交集统计,保护非交集用户。
具体案例:某广告平台与品牌方通过GMW协议执行百万级用户ID的安全求交,将交集结果用于训练转化率预测模型。相比直接传哈希表,攻击者无法通过暴力枚举反推出非交集用户,整体方案通过数据安全合规审查。
Python 演示
import os def xor_share(secret): """把 0/1 比特拆成两份 XOR 份额""" s1 = os.urandom(1)[0] & 1 s2 = secret ^ s1 return s1, s2 def ot_send(choice, m0, m1): """模拟 1-out-of-2 OT:接收方按 choice 取得消息""" return m0 if choice == 0 else m1 def gmw_and_gate(a1, b1, a2, b2): """两方 AND 门求值:输入为两侧份额,输出仍为两份 XOR 份额""" t1 = a1 & b1 t4 = a2 & b2 x1 = ot_send(b2, 0, a1) x2 = ot_send(b1, 0, a2) return t1 ^ x2, t4 ^ x1 def main(): a = 1 b = 1 a1, a2 = xor_share(a) b1, b2 = xor_share(b) print(f"输入: a={a}, b={b}") print(f"份额: a1={a1}, a2={a2}, b1={b1}, b2={b2}") c1, c2 = gmw_and_gate(a1, b1, a2, b2) result = c1 ^ c2 print(f"输出份额: c1={c1}, c2={c2}") print(f"AND 结果: {result}") assert result == (a & b), "GMW AND 门计算出错" print("正确性验证通过:c1 ^ c2 = a & b") if __name__ == "__main__": main()
s1 = os.urandom(1)[0] & 1生成均匀随机的比特,作为第一份份额。s2 = secret ^ s1用异或补出第二份份额,保证两份份额合起来能还原秘密。def ot_send(choice, m0, m1):模拟盲选盒OT,接收方只能按选择位取走一条消息。x1 = ot_send(b2, 0, a1)P2 通过OT得到 a1*b2 的交叉项,而 P1 不知道 b2 的取值。x2 = ot_send(b1, 0, a2)P1 通过OT得到 a2*b1 的交叉项,而 P2 不知道 b1 的取值。return t1 ^ x2, t4 ^ x1把本地对角项与交换来的交叉项合并成两方各自的输出份额。assert result == (a & b)验证两份额异或后,恰好等于真实AND门输出。
常见误区
误区看到GMW也用布尔电路、也用OT,就以为它跟姚氏混淆电路(GC)是同一个东西,甚至以为GMW就是把整个电路做加密混淆。
正解姚氏混淆电路是“单方生成加密电路、另一方单独评估”的两方方案;GMW则是“所有参与方各自持有秘密份额、按门逐层协作求值”的多方方案。GMW不需要加密混淆每个门,而是靠份额加OT完成每个门的安全求值。
为何常见:两者都基于布尔电路并利用OT,外表相似;但“混淆”是加密查找表,而“共享”是碎片分布,机制完全不同。
误区总觉得把份额发给别人时可能被中途拦截,所以必须用加密信道,不然秘密就泄露出去了。
正解XOR共享的保密性是信息论意义上的:单份份额是均匀随机比特,与原始秘密统计独立。即使份额被偷看,也得不到关于s的任何信息。加密传输是为了防篡改与恶意干扰,而不是为了隐藏份额本身。
为何常见:我们习惯用加密解决保密问题,忽略了信息论安全这种更彻底的“完美隐藏”。
误区教学材料里都写“半诚实模型”,于是认为恶意参与者一捣乱GMW就彻底失效,不能用于任何对抗场景。
正解原始GMW论文提出了“GMW编译器”:利用可验证秘密共享、零知识证明、承诺等工具,可以把半诚实协议编译成恶意安全协议,只是开销显著增大。现代工程常结合MAC等技术实现恶意安全。
为何常见:入门教程为简化普遍只展开半诚实模型,容易让人误以为这是GMW的能力边界。
误区以为每个门都要经过OT或广播一次,所以电路有100个门就要100个通信轮次或100条消息。
正解XOR门完全可以本地计算,只有AND门需要交互;总通信消息量正比于AND门数量,但通信轮数正比于电路深度(同一层的AND门可并行执行)。
为何常见:把姚氏混淆电路“发送整个电路”的模式套到GMW上,忽略了GMW逐门并行求值的特性。
面试题
Q1. GMW 协议以哪种电路作为计算模型?
- A.算术电路模型
- B.神经网络模型
- C.布尔电路模型← 正确答案
- D.决策树模型
答案:C。GMW将任意函数编译为布尔电路(AND/XOR门)进行秘密共享求值。算术电路是BGW的模型,神经网络和决策树属于上层机器学习模型,不是GMW的底层电路。
Q2. GMW 协议中 XOR 门的求值方式是?
- A.本地异或零通信← 正确答案
- B.调用OT完成传输
- C.广播全部份额
- D.公钥加密后计算
答案:A。XOR具有同态性,参与方只需把手中对应份额本地异或即可得到输出份额,全程零交互、零通信,这正是GMW中XOR门的主要优势。
Q3. GMW 的 AND 门为什么必须使用 OT?
- A.为了给输出结果加密
- B.为了验证协议正确性
- C.为了减少通信轮数
- D.为了计算交叉项← 正确答案
答案:D。AND门展开后出现a₁b₂和a₂b₁两个交叉项,每项都涉及双方的秘密份额,任何一方都无法独自计算。OT恰好让双方交换交叉项而不泄露各自选择位。
Q4. 关于 GMW 协议,以下说法正确的有?
- A.支持任意数量的参与方← 正确答案
- B.每个门都需要OT传输
- C.理论上可扩展到恶意模型← 正确答案
- D.AND门求值无需交互
答案:AC。GMW支持n方参与;XOR门本地零交互,只有AND门需要OT。原始论文给出了应对恶意敌手的编译器(承诺加零知识证明),方案可扩展到恶意安全,只是代价更大。
Q5. GMW 输出恢复阶段,参与者如何得到最终结果?
- A.丢弃自己手里的全部份额
- B.再跑一次OT传输
- C.重新执行整条电路
- D.汇总输出份额异或恢复← 正确答案
答案:D。输出阶段各方公开自己手中的输出比特份额,所有份额异或即可还原明文。公开输出份额不会泄露中间值,因为输出本身就是协议设计允许大家得到的内容。
Q6. GMW 在线协议的通信轮数与什么因素相关?
- A.电路里门总数的大小
- B.参与方数量的二次方
- C.电路最深层的长度← 正确答案
- D.输入比特数量的对数
答案:C。同一深度上相互独立的AND门可以并行执行OT,因此在线轮数与电路深度(最深层的长度)成正比。门总数决定通信量,深度决定轮数。
Q7. 关于 GMW 与 BGW 的对比,正确的有?
- A.GMW处理逻辑运算更自然← 正确答案
- B.BGW处理数值运算更自然← 正确答案
- C.BGW只能支持两方参与
- D.两者都基于秘密共享← 正确答案
答案:ABD。GMW基于布尔电路配XOR共享,擅长比较、位逻辑;BGW基于算术电路配Shamir共享,擅长加减乘数值运算。Shamir秘密共享天然支持门限多方,因此BGW远不止两方。
Q8. 秘密 s 被拆成 n 份 XOR 份额,只拿到 n-1 份能获得关于 s 的信息吗?
- A.一定能完整还原
- B.有一半概率还原
- C.不能获得任何信息← 正确答案
- D.能还原但概率取决于 s
答案:C。XOR共享具有信息论安全性:n-1份份额的联合分布与s完全独立,无论s是0还是1,观察到的份额模式完全相同,因此零信息泄露。
Q9. 在 1-out-of-2 OT 中,接收方最终知道什么?
- A.自己选中的那条消息← 正确答案
- B.发送方的两条完整消息
- C.两条消息的异或结果
- D.发送方的选择过程
答案:A。OT保证接收方恰好获得m_b(选择位对应的消息),对m_{1-b}一无所知;发送方也不会知道b的取值。这正是AND门交叉项计算所需的安全属性。
Q10. 以下哪些属于 GMW 工程化的有效优化手段?
- A.用OT扩展降低公钥开销← 正确答案
- B.用Beaver三元组离线预处理← 正确答案
- C.把XOR门全部替换成AND门
- D.对无关门做批并行求值← 正确答案
答案:ABD。OT扩展用少量基础OT生成海量对称OT,极大降低公钥操作;Beaver三元组在离线阶段预生成随机掩码,加速在线AND门求值;对同层无关门做批并行可摊薄通信等待。把XOR门改成AND门会无谓增加通信瓶颈,是错误方向。