☰
加法秘密共享与Beaver三元组:安全多方计算中的乘法协议实现
2026/10/16 1:16:31 网站建设 项目流程

1. 从"把秘密切成碎片"说起:加法秘密共享到底在解决什么问题

第一次接触安全多方计算(Secure Multi-Party Computation,MPC)的人,往往会被各种协议名词绕晕。但如果只让我挑一个最基础、最值得先啃透的构件,我会毫不犹豫地选加法秘密共享。原因很简单:它几乎是所有主流MPC协议的"地基",无论是做隐私求和、隐私统计,还是更复杂的机器学习推理,底层都绕不开它。

先讲清楚它要解决的问题。假设有若干个参与方,各自手里有一份敏感数据,谁都不想把自己的原始数据暴露给别人,但又想联合起来算出一个结果。比如三家医院想统计某种疾病的联合发病率,但每家都不愿意把病人数据交出去;又比如几个机构想算各自的资金总额,但谁也不想让对方知道自己的具体数字。这类"数据不动、结果共享"的需求,就是安全多方计算要干的事。

加法秘密共享的核心思路非常朴素:把一个秘密值拆成若干份随机碎片,分给不同参与方,任何单一方拿到的碎片都毫无意义,但所有碎片加起来恰好等于原值。用生活化的类比,就像把一张百元钞票换成一把零钱,分给几个人保管,单看某个人手里的零钱你根本猜不出总额,但大家把零钱凑一起,总额分毫不差。

形式化一点说,假设秘密值为 $x$,参与方有 $n$ 个。我们生成 $n-1$ 个随机数 $r_1, r_2, \dots, r_{n-1}$,然后令最后一份为:

$$r_n = x - \sum_{i=1}^{n-1} r_i \pmod{p}$$

这里的 $p$ 通常取一个大素数,所有运算都在模 $p$ 的有限域上进行。这样每个参与方 $i$ 拿到 $r_i$,单独看它就是一个均匀分布的随机数,和 $x$ 没有任何可计算的关联;但把 $r_1$ 到 $r_n$ 全部加起来,模 $p$ 之后正好还原出 $x$。

这里有个容易被忽略但极其关键的细节:为什么一定要在有限域上做,而不是直接用整数?因为如果直接用整数,碎片 $r_i$ 的取值范围会泄露信息。比如秘密是100,你拿到一个碎片是5000,那你立刻就知道这个碎片不可能是"小份额",从而对原值产生推断。而在模 $p$ 的有限域里,每个碎片都是 $[0, p-1]$ 上均匀分布的随机数,从信息论角度讲,单个碎片对原值的互信息为零,这才是真正的"零泄露"。这个性质叫做完美保密性(perfect secrecy),是加法秘密共享最迷人的地方——它不是"计算上难破解",而是"信息论上根本不可能破解"。

理解了这一点,你就明白了加法秘密共享的定位:它是一种信息论安全的秘密切分方案,安全性不依赖任何计算困难假设,哪怕攻击者拥有无限算力也无可奈何。代价是它需要参与方之间进行交互,而且对参与方数量有要求(通常要求所有参与方都在线才能还原)。这个取舍,是后面所有讨论的起点。

2. 碎片怎么切、怎么还原:加法共享的完整操作链路

2.1 两方场景下的最简实现

先从最简单的两方场景入手,把流程走一遍,后面再推广到多方。假设Alice和Bob两方,Alice持有秘密 $x$,想把它共享给Bob(或者说两方共同持有)。

操作步骤是这样的:

  1. Alice在有限域 $\mathbb{Z}_p$ 上随机采样一个数 $r$,作为Bob的碎片。
  2. Alice计算自己的碎片 $s_A = x - r \pmod{p}$。
  3. Alice把 $r$ 发给Bob,自己保留 $s_A$。

还原的时候,两方各自拿出碎片相加:$s_A + r = (x - r) + r = x \pmod{p}$,秘密就回来了。

这个流程简单到几乎不像"密码学",但它的安全性恰恰藏在那一步随机采样里。Bob拿到的 $r$ 是纯随机的,和 $x$ 没有任何关系;Alice手里的 $s_A$ 看起来也是随机的(因为 $r$ 随机,$x - r$ 也随机)。所以任何单方都无法推断 $x$。这就是两方加法共享的全部精髓。

2.2 推广到N方:碎片生成的一般公式

当参与方变成 $n$ 个时,思路完全一样,只是随机数多生成几个。假设参与方集合是 $P_1, P_2, \dots, P_n$,秘密 $x$ 要被切分成 $n$ 份:

  • 对 $i = 1$ 到 $n-1$,随机采样 $r_i \in \mathbb{Z}_p$;
  • 令 $r_n = x - \sum_{i=1}^{n-1} r_i \pmod{p}$;
  • 把 $r_i$ 分发给参与方 $P_i$。

还原时,所有参与方把碎片汇总相加,模 $p$ 即得 $x$。

这里有个实操中经常踩的坑:随机数的质量直接决定安全性。如果你用了一个伪随机数生成器,而它的种子被猜到,或者随机数分布有偏,那么碎片就不再是均匀随机的,安全性会大打折扣。我在早期做Demo的时候,图省事用了一个简单的线性同余生成器,结果碎片分布明显不均匀,虽然功能上能跑通,但安全性形同虚设。后来换成密码学安全的随机数生成器(比如基于哈希的PRG或者系统提供的安全随机源),才真正达标。这一点在工程实现里必须重视,随机数不是"随便一个数",而是安全性的命根子。

2.3 还原的两种模式:全量还原与门限还原

加法秘密共享默认是"全量还原"——必须所有 $n$ 个碎片都到齐才能还原。这和Shamir秘密共享那种"任意 $t$ 个就能还原"的门限方案不同。加法共享没有门限特性,少一份就还原不出来。

这个特性在实际系统里既是限制也是优势。限制在于,如果某个参与方掉线,整个计算就卡住了;优势在于,它的结构极其简单,加法运算天然可并行、可组合,特别适合作为更复杂协议的底层构件。很多MPC框架(比如做隐私求和、隐私聚合的场景)就是看中了它这种"简单粗暴但高效"的特点。

如果你确实需要门限特性,通常的做法是在加法共享之上再叠加一层转换,或者直接选用Shamir方案。但那是另一个话题了,这里先把加法共享本身吃透。

3. 加法共享上的乘法:为什么"直接相乘"会翻车

3.1 一个看似自然却错误的做法

搞定了加法共享,下一个自然的问题就是:能不能在共享状态下做乘法?也就是说,Alice和Bob各自持有 $x$ 和 $y$ 的碎片,能不能在不还原 $x$、$y$ 的前提下,算出 $xy$ 的共享?

很多人第一反应是:既然加法共享还原靠相加,那乘法是不是各自把碎片相乘就行了?也就是如果 $x = x_A + x_B$,$y = y_A + y_B$,那 $xy = (x_A + x_B)(y_A + y_B) = x_A y_A + x_A y_B + x_B y_A + x_B y_B$。

问题就出在这个展开式上。如果Alice手里只有 $x_A$ 和 $y_A$,她只能算出 $x_A y_A$;Bob手里只有 $x_B$ 和 $y_B$,他只能算出 $x_B y_B$。但交叉项 $x_A y_B$ 和 $x_B y_A$ 需要双方的数据交叉相乘,单方根本算不出来。而如果为了算交叉项把碎片发给对方,那就等于泄露了碎片,安全性直接崩盘。

所以结论很明确:加法共享对加法是"同态的",对乘法不是。直接相乘会翻车,翻在交叉项上。

3.2 交叉项才是拦路虎:问题的本质拆解

把上面的展开式再仔细看一遍:

$$xy = \underbrace{x_A y_A}{\text{Alice能算}} + \underbrace{x_B y_B}{\text{Bob能算}} + \underbrace{x_A y_B + x_B y_A}_{\text{需要交叉,单方算不了}}$$

前两项各自在自己手里就能算,问题全在后两项。这两项的本质是:Alice的碎片和Bob的碎片之间的乘积。要算它,就必须让某一方的碎片"碰到"另一方的碎片,而这正是秘密共享要极力避免的事情。

那怎么办?业界的标准思路是引入辅助信息——通常是一个预先准备好的"乘法三元组"(Beaver三元组),或者借助同态加密、不经意传输等工具来安全地计算交叉项。下面重点讲最经典的Beaver三元组方案,因为它是理解乘法协议的最佳入口。

3.3 Beaver三元组:把"在线计算"变成"离线准备+在线组合"

Beaver三元组的核心思想非常巧妙:把耗时的、需要交互的部分提前离线做好,在线阶段只做轻量的加减法。具体来说,预先准备一个三元组 $(a, b, c)$,满足 $c = ab$,并且 $a$、$b$、$c$ 都以加法共享的形式分发给各方。注意,这个三元组和我们要算的 $x$、$y$ 没有任何关系,它是"通用"的。

有了这个三元组,计算 $xy$ 的共享就变成了一套固定的流程:

  1. 各方联合计算 $d = x - a$ 的共享,以及 $e = y - b$ 的共享。由于 $x$、$a$ 都是加法共享,$x - a$ 的共享就是各自碎片相减,纯本地操作,不需要交互。
  2. 把 $d$ 和 $e$ 还原出来(这一步需要交互,但还原的是 $d$、$e$,不是 $x$、$y$,所以不泄露原始秘密)。
  3. 各方本地计算 $z = c + d \cdot b + e \cdot a + d \cdot e$ 的共享。注意 $d$、$e$ 现在是公开值,所以 $d \cdot b$、$e \cdot a$、$d \cdot e$ 都可以在各方本地完成。

最后得到的 $z$ 的共享,恰好就是 $xy$ 的共享。为什么?因为:

$$xy = (a + d)(b + e) = ab + ae + db + de = c + ae + db + de$$

而 $c$、$a$、$b$ 都是共享状态,$d$、$e$ 是公开值,所以每一项都能在共享状态下算出来。整个在线阶段只需要一次交互(还原 $d$ 和 $e$),其余全是本地运算,效率极高。

3.4 三元组从哪来:离线阶段的几种生成路径

Beaver三元组虽好,但"预先准备一个 $c = ab$ 的共享三元组"这件事本身也不简单。生成三元组的常见路径有几条:

  • 基于同态加密:一方用同态加密方案加密 $a$ 和 $b$,在密文上算出 $c$ 的密文,再通过安全分发把 $c$ 的共享给到各方。这条路径安全性依赖同态加密的计算困难假设。
  • 基于不经意传输(OT):通过OT协议让各方在不泄露自己输入的前提下,共同生成满足 $c = ab$ 的共享。这是很多高效MPC框架(如基于OT扩展的方案)的主流做法。
  • 基于预计算和可信第三方:如果存在一个可信的第三方,可以直接生成三元组并分发。但现实中可信第三方往往不存在,所以这条路径更多用于理论分析。

这里要强调一个实操经验:三元组的生成成本,往往决定了整个乘法协议的性能上限。在线阶段虽然快,但如果离线阶段生成三元组很慢,整体吞吐就上不去。所以很多工程优化都集中在"如何批量、高效地生成三元组"上,比如用OT扩展技术把少量基础OT扩展成海量OT,从而批量产出三元组。这个思路在隐私机器学习推理里特别常见,因为推理过程要跑成千上万次乘法,三元组的生成效率直接决定能不能实用。

4. 从两方到多方:乘法协议的扩展与工程取舍

4.1 两方乘法协议的完整走查

把上面的理论落到两方场景,完整走一遍。Alice持有 $x_A$、$y_A$,Bob持有 $x_B$、$y_B$,目标是算出 $xy$ 的共享。预先双方共享了一个Beaver三元组:Alice持有 $a_A, b_A, c_A$,Bob持有 $a_B, b_B, c_B$,满足 $(a_A + a_B)(b_A + b_B) = c_A + c_B$。

在线阶段:

  1. Alice本地算 $d_A = x_A - a_A$,$e_A = y_A - b_A$;Bob本地算 $d_B = x_B - a_B$,$e_B = y_B - b_B$。
  2. 双方交换 $d_A, d_B$ 和 $e_A, e_B$,各自算出 $d = d_A + d_B$,$e = e_A + e_B$。此时 $d$、$e$ 是公开的。
  3. Alice本地算 $z_A = c_A + d \cdot b_A + e \cdot a_A + d \cdot e$(注意 $d \cdot e$ 这一项要约定好由谁加,通常只由一方加,避免重复);Bob本地算 $z_B = c_B + d \cdot b_B + e \cdot a_B$。
  4. 最终 $z_A + z_B = xy$,乘法完成。

整个在线阶段只有一轮交互(交换 $d$、$e$),通信量极小。这就是Beaver三元组的威力。

4.2 多方场景下的复杂度变化

推广到 $n$ 方时,思路一致,但细节变复杂。主要变化在于:

  • 三元组要在 $n$ 方之间共享,生成和分发更麻烦;
  • 还原 $d$、$e$ 时,需要所有方参与,通信轮数和消息量随 $n$ 增长;
  • 如果某些方恶意行为,还需要额外的验证机制来保证正确性。

在诚实多数(honest majority)假设下,多方乘法协议可以做得比较高效;但在恶意多数场景下,为了保证安全,往往要引入消息认证码(MAC)等机制来检测作弊,开销会显著上升。这个取舍在选型时非常关键:如果你的场景里参与方都是可信机构,只是不想暴露数据,那诚实多数假设下的高效协议就够了;如果参与方之间可能互相使坏,那就得付出额外的安全成本。

4.3 性能与安全的权衡:几个真实的工程考量

在实际项目里做加法共享上的乘法,我总结了几条经验:

第一,优先考虑是否需要乘法。很多场景其实只需要加法(比如隐私求和、隐私均值),那就完全不用碰乘法协议,直接用加法共享,简单又高效。不要为了"技术先进"而引入不必要的乘法。

第二,三元组尽量批量化、预生成。在线阶段越轻越好,把重活都放到离线。如果业务有明显的波峰波谷,可以在低谷期预生成三元组池,高峰期直接取用。

第三,注意有限域的选择。域太小会导致溢出和安全性不足,域太大则运算变慢。常见做法是选128位左右的大素数,兼顾安全性和性能。如果做的是定点数或浮点数的隐私计算,还要额外处理编码问题,把实数映射到有限域上,这一步很容易出错,需要仔细设计。

第四,通信是瓶颈,不是计算。在局域网环境下,计算开销往往可以忽略,真正拖慢速度的是网络往返。所以协议设计要尽量减少交互轮数,Beaver三元组方案之所以受欢迎,就是因为它把在线交互压到了一轮。

5. 踩坑实录:我在实现加法共享乘法时遇到的几个真实问题

5.1 负数处理不当导致结果错乱

有限域上的运算全是模 $p$ 的,但业务数据里经常有负数。我第一次实现的时候,直接把负数丢进模运算,结果还原出来的值总是差一个 $p$。后来才想明白:在 $\mathbb{Z}_p$ 里,$-3$ 其实表示为 $p - 3$。如果编码阶段没统一处理,解码时就会出错。解决办法是在编码时把所有数映射到 $[0, p-1]$,负数加上 $p$ 变成正数,解码时再根据业务范围判断是否需要减回去。这个坑看起来低级,但在实际项目里非常常见,尤其是数据里混有正负值时。

5.2 三元组复用导致安全性崩塌

Beaver三元组有个铁律:一个三元组只能用一次。我早期为了省事,想复用同一个三元组算多次乘法,结果发现如果攻击者拿到两次计算中公开的 $d$、$e$,就能联立方程解出 $a$、$b$,进而威胁到秘密。这个坑的本质是:三元组复用会让公开值之间产生关联,破坏随机性假设。正确做法是每次乘法都用一个全新的三元组,用完即弃。这也是为什么三元组生成效率如此重要——它直接决定了你能做多少次乘法。

5.3 随机数生成器的隐蔽缺陷

前面提过随机数质量的问题,这里再展开一个更隐蔽的坑:不同参与方用了相同的随机种子。如果两方在生成碎片时碰巧用了相同的种子,生成的随机数就一样,碎片之间的独立性被破坏,安全性直接归零。这个坑在多机部署时特别容易踩,因为如果各机器的环境配置相同,某些随机源可能产生相同的初始状态。解决办法是确保每个参与方使用独立的、密码学安全的随机源,并且在协议设计上加入随机性验证机制。

5.4 通信同步问题导致协议卡死

多方协议里,如果某一方因为网络问题没及时响应,整个协议就会卡住。我遇到过一次,某个参与方的消息因为超时被丢弃,其他方一直在等,整个流程僵死。后来加了超时重传和异常处理机制才稳定下来。这个经验告诉我:分布式协议一定要考虑容错,不能假设所有参与方永远在线、永远及时。尤其是在跨机构场景下,网络质量参差不齐,容错设计是必须的。

6. 这套东西能用在哪些场景:从隐私求和到隐私推理

加法秘密共享加上乘法协议,组合起来就是一套完整的"隐私计算引擎",能支撑很多实际应用。

最直接的是隐私求和与隐私统计。多个机构想算联合总量、均值、方差,但都不想暴露自己的数据。加法共享天然适合这类场景,各方把数据共享出去,汇总相加即可,全程不泄露原始值。如果涉及方差这种需要乘法的统计量,就叠加Beaver三元组方案。

再往上是隐私机器学习推理。模型推理本质上是大量的矩阵乘法和加法,如果把输入数据和模型参数都用加法共享表示,再用乘法协议处理乘法,就能实现"数据不出域、模型不泄露"的推理。这条路在隐私保护要求高的行业(如医疗、金融)很有价值。当然,实际工程里还要处理非线性激活函数、定点数编码等一堆细节,复杂度比纯线性运算高得多。

还有隐私集合求交、隐私拍卖、隐私投票等场景,底层也常常用到加法共享和乘法协议。可以说,掌握了这两个构件,你就拿到了进入安全多方计算世界的钥匙。

需要提醒的是,加法秘密共享有一个天然限制:它需要参与方在线交互。如果你的场景里参与方无法实时通信,或者通信成本极高,那可能要考虑其他方案(比如基于同态加密的非交互方案)。选型时一定要先想清楚:参与方能不能实时在线?通信开销能不能接受?安全假设是诚实多数还是恶意多数?这几个问题的答案,直接决定你该用哪套协议。

7. 写在最后:几个我反复验证过的实操建议

如果你正准备动手实现加法共享上的乘法,这几条建议或许能帮你少走弯路。

第一,先把加法共享跑通,再碰乘法。加法共享的实现极其简单,但它是所有后续工作的基础。把碎片生成、分发、还原的流程写扎实,把有限域运算、负数处理、随机数生成这些细节都调对,再去叠加乘法协议。跳过这一步直接上乘法,很容易在调试时搞不清是加法层的问题还是乘法层的问题。

第二,三元组生成单独做成一个模块。它和乘法协议本身是解耦的,可以独立测试、独立优化。把三元组池化、批量化,在线阶段只管取用,这样性能调优的边界很清晰。

第三,用小规模参数先验证正确性,再放大到安全参数。开发阶段可以用小素数(比如 $p = 2^{31} - 1$)快速验证逻辑,确认无误后再换成128位大素数。这样调试效率高很多,因为小参数下数值直观,容易发现逻辑错误。

第四,永远不要低估随机数的重要性。我见过太多Demo因为随机数问题而安全性归零。用密码学安全的随机源,确保各方随机性独立,这是底线,不能省。

第五,把通信轮数和消息量当作核心指标来优化。在真实部署里,网络往返往往比计算慢几个数量级。Beaver三元组方案之所以经典,就是因为它把在线交互压到了一轮。设计自己的协议时,也要时刻问自己:这一轮交互能不能省?这个消息能不能合并?

这套东西我前后折腾了挺长时间,从最初连有限域都搞不清,到后来能独立实现完整的乘法协议,中间踩的坑基本都写在上面的章节里了。加法秘密共享和它上面的乘法运算,看起来是密码学里偏理论的内容,但真正动手实现之后你会发现,工程细节才是决定成败的地方。理论给你方向,工程给你结果,两者缺一不可。

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

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

立即咨询