安全多方计算(MPC)简述
1. 引言
安全多方计算(MPC,Multiparty Computation)协议:
- 使一组参与方能够在交互中计算一个依赖其私有输入的联合函数,同时除了计算结果外不泄露任何额外信息。
MPC 的潜在应用非常广泛:
- 隐私保护拍卖
- 私有 DNA 比对
- 隐私保护机器学习
- 门限密码学等等。
正因如此,自从 1980 年代被 Yao(针对双方计算,FOCS 1986)和 Goldreich、Micali 及 Wigderson(针对多方计算,STOC 1987)提出以来,MPC 一直是学术界的热门研究课题。近年来,MPC 的效率已足够高,可以投入实际使用,并已从理论研究对象转变为工业界应用技术。
本文将回顾 MPC 的定义、它解决的问题以及当前的应用情况。
需要注意的是,本文中的示例和引用并不全面,由于篇幅所限,许多高度相关的工作未能引用。
分布式计算研究的场景是:
- 若干相互独立但互联的计算设备(或参与方)希望联合计算某个函数。
如,这些设备可能是持有分布式数据库系统的服务器,而要计算的函数可能是对数据库的一种更新操作。
安全多方计算(MPC)的目标是在安全的方式下实现这些分布式计算任务。
- 传统分布式计算通常关注的是在机器崩溃或其他非恶意故障威胁下的计算问题,
- 而安全多方计算则关注于存在蓄意恶意行为的可能性(在分布式计算文献中,这类情况也称为拜占庭故障)。
- 也就是说,假设协议执行可能受到外部攻击者,或者部分参与方的攻击。
- 攻击的目标可能是窃取私有信息,或破坏计算结果的正确性。
因此,任何安全计算协议的两个核心要求是:
- 1) 隐私性(Privacy):不应泄露除必要信息以外的任何内容;更准确地说,参与方只能学到其输出,除此之外一无所知。
- 2) 正确性(Correctness):每个参与方都应获得正确的输出。攻击者不得使计算结果偏离参与方原本要计算的函数。
MPC 可以用于解决各种问题,使得在不损害隐私的前提下利用数据。如,假设要将某人的 DNA 与癌症患者的 DNA 数据库进行比对,以判断该人是否属于某种癌症的高风险人群。这一任务具有重要的健康和社会价值,但 DNA 信息高度敏感,不应泄露给私人机构。通过运行一个 MPC 协议,可以只揭示该人的 DNA 接近的癌症类别(或没有匹配),而不泄露关于任何人的其他 DNA 信息(既不泄露比对者的 DNA,也不泄露数据库中患者的 DNA)。
- 隐私性要求确保只揭示癌症类别,
- 正确性要求确保恶意方不能篡改结果(如让某人误以为自己患癌从而接受不必要的筛查)。
另一个例子是交易平台:参与方提交买卖报价,当买价 ≥ 卖价时撮合成交(成交价可能是买卖报价的某个函数)。在这种场景中,从博弈论角度看,隐藏参与方的真实报价是有益的,因为这些信息可能被用来人为抬价或压价。
- 隐私性保证只揭示买卖双方的匹配结果和成交价,
- 正确性保证成交价符合函数计算结果而非被恶意降低。
值得注意的是,有些场景中隐私性更重要(如 DNA 例子),而另一些场景中正确性更重要(如交易例子)。但在任何情况下,MPC 都能同时保证两者及更多安全性质。
术语说明:本文中除了“安全多方计算”(MPC 或 SMPC)之外,还有“安全函数求值”(SFE,secure function evaluation)的说法,这些概念高度重叠,常被互换使用。此外,MPC 的某些特例也有专门名称。如:
- “私有集合求交”(PSI,private set intersection)是安全计算私有集合交集的特例;
- “门限密码学”则是安全地计算数字签名或解密操作,使得没有任何单个参与方持有完整私钥。
2. MPC 的安全性
2.1 定义范式
正如前面提到的,MPC考虑的场景是:有一个对手(adversary)控制了部分参与方,试图攻击协议执行。被对手控制的参与方称为被腐化的参与方(corrupted parties),它们会按照对手的指令行事。安全协议应当能够抵御任何对手的攻击(至于对手的具体能力范围将在后文讨论)。
为了能够正式声明并证明一个多方计算协议是安全的,需要对“安全性”做精确的定义。已经有多种不同的定义被提出,这些定义旨在确保一些核心的安全性质,这些性质足够通用,能够涵盖大多数(如果不是全部)多方计算任务。下面描述最核心的几个性质:
- 1) 隐私性(Privacy):任何参与方都不应获得除其输出以外的额外信息。尤其是,关于其他参与方输入的任何信息,都只能通过输出推导出来。
如,在拍卖中,唯一揭示的出价是最高出价,很明显可以推断出其他所有出价都低于最高出价,但除此之外不应泄露关于落败出价的任何信息。 - 2) 正确性(Correctness):每个参与方都应确保其接收到的输出是正确的。
继续拍卖的例子,这意味着出价最高的参与方一定会获胜,并且包括拍卖员在内的任何人都不能影响这一结果。 - 3) 输入独立性(Independence of Inputs):被腐化的参与方必须在不依赖诚实方输入的情况下选择自己的输入。
这一性质在密封拍卖中至关重要,因为出价是保密的,各方必须独立确定出价。需要注意的是,输入独立性并不由隐私性自动推出。如,可能在不知道原始出价的情况下生成一个更高的出价。这种攻击在某些加密方案中是可行的(即,已知 $100 的加密,可以在不解密的情况下生成 $101 的有效加密)。 - 4) 输出保证交付(Guaranteed Output Delivery):被腐化的参与方不应能够阻止诚实方收到它们的输出。换句话说,对手不能通过拒绝服务(DoS)攻击来破坏计算。
- 5) 公平性(Fairness):被腐化的参与方只有在诚实方也收到输出时才能获得输出。不能出现这样的情况:被腐化方获得了输出,而诚实方没有。
这一性质在合同签署等场景中至关重要。如果被腐化方拿到了签署的合同而诚实方没有,那就非常严重。需要注意的是,输出保证交付蕴含公平性,但反之不成立。
在此强调,上述列表本身并不是安全性的形式化定义,而是一组应当对任何安全协议成立的要求。一个可能的定义方式是:列出这些要求,然后声明协议如果满足全部要求就是安全的。但这种方式并不令人满意,因为:
- 可能会遗漏重要的要求,不同应用对要求的侧重点不同,需要一个足够通用的定义来涵盖所有应用;
- 定义应足够简洁,以便显而易见地阻止所有可能的对手攻击。
目前的标准定义(2000年论文《Security and Composition of Multiparty Cryptographic Protocols》) 用一种更通用的方式形式化安全性—— 理想世界(Ideal World)与真实世界(Real World) 的思维实验:
- 假设存在一个完全可信(且不可被腐化)的外部参与方,愿意帮助参与方完成计算。
- 在理想世界中,所有参与方只需将自己的输入发送给这个可信方,由其计算出所需函数的结果,并将各自的输出返回。由于唯一的操作是发送输入给可信方,对手唯一的自由就是选择被腐化方的输入。在这种理想计算中,上述所有安全性质(甚至更多)都能成立——如,隐私性成立是因为参与方唯一接收到的消息是自己的输出,正确性成立是因为可信方不可被腐化,总能正确计算函数。
- 在真实世界中,不存在这样一个所有人都信任的外部方。参与方只能在没有外部帮助的情况下自行运行协议,其中部分参与方可能被腐化并串通。尽管如此,一个安全协议应当 模拟(emulate)理想世界,即:真实世界中运行协议的结果,与理想世界(有可信方参与)运行的结果在安全性上是等价的。
- 更精确地说,对于真实世界中任何成功攻击的对手,都应存在一个在理想世界中造成相同效果的对手。然而,理想世界中不可能成功发动攻击,因此真实世界中的攻击也必须失败。
形式化地,安全性是通过比较真实执行和理想执行的结果来建立的:
- 对于任何攻击真实协议执行的对手,存在一个攻击理想执行(有可信方参与)的对手,使得在真实与理想执行中,对手与参与方的输入/输出分布几乎一致。这样的真实协议执行被称为模拟理想/真实世界(ideal/real simulation paradigm)。
该定义能自动蕴含前面描述的所有性质:
- 隐私性:因为在真实与理想执行中,对手的输出相同,而在理想执行中,对手只能获得被腐化方的输出;
- 正确性:因为在真实与理想执行中,诚实方的输出一致,而理想执行中输出总是正确;
- 输入独立性:在理想执行中,所有输入在任何输出产生之前就已发送,因此腐化方在选择输入时无法知道诚实方的输入;
- 输出保证交付与公平性:在理想世界中,可信方总会返回所有输出,因此真实世界也必须如此。
在某些情况下,定义会放宽,不要求公平性和输出保证交付,这被称为可中止的安全性(security with abort)。此时对手可能获得输出,而诚实方没有。这种放宽的主要原因有两个:
- 1)某些情况下公平性本身无法实现(如,两方无法公平地抛硬币(见1986年论文《Limits on the Security of Coin Flips when Half the Processors are Faulty》));
- 2)有些协议在不保证公平性的前提下能更高效。
因此,如果应用不要求公平性(尤其是在只有一方接收输出的场景),这种放宽是有用的。
2.2 额外的定义参数
对手能力(Adversarial power)
前面给出的非形式化安全定义忽略了一个非常重要的问题:攻击协议执行的对手究竟有多大的能力。
之前已经提到,对手可以控制协议中的一部分参与方,但还没有明确这些被腐化方能做什么。对手能力主要由两个方面定义:
-
1)允许的对手行为(Allowed adversarial behaviour):
即被腐化方被允许采取的行动类型,主要分为三类:- 1.1) 允许的对手行为 —— 半诚实对手(Semi-honest adversaries):
在半诚实模型中,即使是被腐化的参与方也会严格按照协议执行。然而,对手可以获取这些参与方的内部状态(包括接收到的所有消息的记录),并试图利用这些信息来推断本应保密的数据。
这种模型的对手能力相对较弱,但在某些情况下已经足够,因为它确保了不存在无意的数据泄露。不过,在当今的安全环境中,这种保护通常不够。
半诚实对手又被称为“诚实但好奇”(honest-but-curious)或“被动对手”(passive)。有时也会考虑“失败停止型对手”(fail-stop),即半诚实对手可能会提前终止协议执行。 - 1.2) 允许的对手行为 —— 恶意对手(Malicious adversaries):
在这种模型中,被腐化的参与方可以根据对手的指令任意偏离协议规范。一般而言,能够抵御恶意对手的安全性是更理想的,因为它确保了任何攻击都不能成功。恶意对手又被称为“主动型对手”(active)。 - 1.3) 允许的对手行为 —— 隐匿对手(Covert adversaries) (见2007年论文《Security Against Covert Adversaries: Efficient Protocols for Realistic Adversaries》):
这类对手可能会采取恶意行为试图破坏协议,但安全保证是:如果对手尝试这种攻击,将会以预先设定的概率被检测到,这个概率可以根据应用需求调整。
与恶意模型不同的是,如果隐匿对手的攻击没有被检测到,它可能会成功作弊(如,获取诚实方的输入)。
这种模型适用于现实中一旦对手被抓到会有实际惩罚的场景,在这种情况下,对手预期攻击会得不偿失。
- 1.1) 允许的对手行为 —— 半诚实对手(Semi-honest adversaries):
-
2)腐化策略(Corruption strategy):
即参与方何时、如何被腐化。主要有三种模型:- 2.1) 腐化策略 —— 静态腐化模型(Static corruption model):
在这种模型中,对手控制的参与方集合在协议开始前就固定了。诚实方始终保持诚实,被腐化方也始终保持腐化。 - 2.2) 腐化策略 —— 自适应腐化模型(Adaptive corruption model):
对手不必一开始就固定腐化对象,而是可以在协议执行过程中动态选择要腐化的参与方。这种选择可以依赖于对手在执行过程中获得的信息,因此被称为“自适应”。
该模型反映了现实中“黑客”在执行过程中入侵某台机器的威胁,或者原本诚实的参与方中途转为恶意的情况。在这种模型中,一旦参与方被腐化,就会从此一直保持腐化状态。 - 2.3)腐化策略 —— 主动安全模型(Proactive security model) [30,7]:
在这种模型中,参与方可能只在某一段时间内被腐化。因此,诚实方可能在执行过程中被腐化(类似自适应模型),但被腐化的参与方也可能重新变为诚实方。
该模型适用于持续计算的场景中,外部攻击者可能会阶段性入侵系统。当发现入侵后,系统被清理,对手失去对这些机器的控制,被腐化方重新变为诚实方。
安全保证是:对手只能获取在它控制某个参与方期间,从该参与方本地状态中推导出的信息。这类对手有时也被称为“移动型对手”(mobile adversary)。
- 2.1) 腐化策略 —— 静态腐化模型(Static corruption model):
以上没有所谓的“唯一正确模型”,具体采用哪种定义和对手模型取决于应用场景和所要应对的威胁。
模块化顺序与并发组合(Modular sequential and concurrent composition)
在实际系统中,MPC 协议往往不是单独运行的,而是作为更大系统的一部分运行的。
在 2000年论文《Security and Composition of Multiparty Cryptographic Protocols》 中证明了这样一个强有力的结论:
- 如果在一个更大系统中运行 MPC 协议,那么它的行为与由一个不可腐化的可信方为参与方执行该计算的行为完全一致。
- 这个结论被称为模块化组合定理(modular composition theorem),它允许通过安全的子协议模块化地构建更大的协议,并分析在系统中使用 MPC 的安全性。
在这个背景下,一个重要问题是:MPC 协议是否与其他协议同时运行?
- 顺序组合(Sequential composition):MPC 协议可以作为其他协议的子协议运行,MPC 前后可以有任意消息交互,但在 MPC 执行的过程中,不允许与其他协议并行发送消息。这种情况称为独立运行场景(stand-alone setting),也是 2000年论文《Security and Composition of Multiparty Cryptographic Protocols》 中基础安全定义所考虑的场景。顺序组合定理表明,在这种设置下,MPC 协议的行为确实等同于由可信第三方执行计算的情况。
- 并发组合(Concurrent composition):在许多情况下,MPC 协议会与其他协议实例(包括其他 MPC 协议和非安全协议)同时运行。这种情况下,在独立运行定义下证明安全的协议,可能在并发环境中不再安全。
为了处理这种情况,提出了多种定义,其中最著名的是通用可组合性(universal composability, UC) (见2001年论文《Universally Composable Security: A New Paradigm for Cryptographic Protocols》)。在这种定义下被证明安全的协议,无论与哪些其他协议并发运行,行为都等同于理想执行。因此,UC 被视为 MPC 定义的黄金标准,但它需要付出效率和系统假设上的代价。
2.3 重要定义含义
理想模型与 MPC 在实践中的应用
理想/真实范式(ideal/real paradigm)在安全性定义上的一个重要意义在于,它让 MPC 在实际使用时更容易被理解和应用。
具体来说,开发者在使用某个 MPC 协议时,只需要考虑:如果由一个不可腐化的可信方执行该计算,系统是否安全?
如果在这种理想情况下系统是安全的,那么在(适当的组合假设下)替换为真实的 MPC 协议后,系统仍然是安全的。
这意味着,非密码学专家并不需要理解 MPC 协议的具体工作原理,甚至不需要理解安全性的形式化定义。理想模型提供了一个简单直观的抽象层,系统构建者可以直接利用它。
输入不受限制
虽然理想模型范式提供了简单的抽象,但其中有一个容易被误解的细节:MPC 协议的安全性与理想执行等价,而在理想执行中,对手可以输入任意值,且无法从通用角度阻止这种行为。
如,假设两个人想比较谁的工资更高(输出仅为这一比特信息,不泄露更多)。在理想执行中,其中一方完全可以输入一个极大值作为自己的工资(然后在 MPC 协议中“诚实”地执行),从而让输出显示自己工资更高。
因此,如果应用的安全性依赖于各方输入的正确性,就必须引入额外机制来保证这一点,比如要求输入数据带有签名,并在 MPC 协议中验证签名。根据具体协议,这可能会显著增加计算开销。
MPC 保护的是计算过程,而不是输出
另一个容易被误解的点是:MPC 确保计算过程不泄露额外信息,但这并不意味着输出本身不会泄露敏感信息。
举个极端的例子:假设两个人使用 MPC 计算他们工资的平均值。协议确实只输出平均值,但任意一方结合自己工资与平均值,就能精确算出对方的工资。
因此,使用 MPC 并不等于解决了所有隐私问题。MPC 保护的是过程,而输出函数本身是否会导致隐私泄露,仍需要额外分析。
在某些场景下(如门限密码学),这个问题不是问题,因为密码学函数的输出在安全假设下不会泄露密钥。但在其他场景中,这个问题可能更棘手。
3. MPC 的可行性
前面描述的安全性定义看起来非常苛刻:它不允许对手有任何成功的可能,并要求协议的行为与可信第三方执行计算的情形一致。
因此,人们可能会疑问:在这样的定义下,是否真的能实现安全协议?如果可以,又适用于哪些分布式计算任务?
令人惊讶的是,一些强有力的可行性结果已经被证明,这些结果显示:在恶意对手存在的情况下,任何分布式计算任务(函数)都可以安全地计算。
设 nnn 为参与方的数量,ttt 为可能被腐化的参与方的上限(被腐化方的身份未知),在此简要陈述其中最核心的结果:
- 1) 当 t<n3t < \frac{n}{3}t<3n(即少于三分之一的参与方被腐化时):
在假设存在同步的点对点网络且信道经过认证的情况下,可以实现 计算安全性 (computational security)下的、对任意函数的公平性与输出保证交付。
如果信道是私密的,还可以实现 信息论安全性(information-theoretic security)【18】【3】【9】。 - 2) 当 t<n2t < \frac{n}{2}t<2n(即保证有诚实多数时):
在假设参与方还可以访问广播信道的情况下,可以在计算安全性和信息论安全性下,实现任意函数的公平性与输出保证交付【18】【33】。 - 3) 当 t≥n2t \ge \frac{n}{2}t≥2n(即腐化方数量不受限制时):
依然可以实现安全多方计算协议,但不能保证公平性或输出保证交付【37】【18】。
在 2.2 节 末尾描述的并发组合场景下,也已经证明了任何函数都可以安全计算【6】【8】。
总结:
理论上,对于任何分布式计算任务,都存在安全多方计算协议。这正是 MPC 巨大潜力的来源:
- 无论要计算什么,都可以安全地计算!
不过,需要强调的是,这些可行性结果是理论性的,意味着它们在原理上是可能的,但并未考虑实际效率成本(这一点将在 4.6 节 中提到)。
注意事项:
- 上述可行性结果是在特定的模型和假设下证明的(如密码学难题假设和系统设置假设)。虽然这里不详细展开,但在使用时需要意识到这些前提条件的存在。
4. 技术
在过去三十多年中,研究人员提出了许多不同的技术来构造适用于不同场景、具有不同特性的 MPC 协议。
由于篇幅限制,这里无法一一列举,强烈推荐阅读2018年论文《A Pragmatic Introduction to Secure Multi-Party Computation》,那是一篇写得非常好且容易理解的 MPC 入门综述,里面包含了主要技术的详细介绍。
不过,为了说明 MPC 协议是如何构造的,在此会给出一些简单的例子来展示其基本工作原理。
4.1 Shamir 秘密共享
在诚实多数的 MPC 协议中,秘密共享通常是一个基本工具。因此,先简要介绍 Shamir 的秘密共享方案(见1979年论文《How to share a secret》)。
问题定义:
一个秘密共享方案解决了如下问题:
- 有一个 分发者(dealer)希望将一个秘密 sss 分发给 nnn 个参与方;
- 任何 t+1t+1t+1 个或更多参与方的集合都可以重构该秘密;
- 任何 ttt 个或更少的参与方都无法获得关于该秘密的任何信息。
满足上述要求的方案被称为 (t+1)(t+1)(t+1)-out-of-nnn 门限秘密共享方案(threshold secret-sharing scheme)。
Shamir 方案原理
Shamir 秘密共享方案利用了如下事实:
对于任意 t+1t+1t+1 个不同的点 (x1,y1),…,(xt+1,yt+1)(x_1, y_1), \dots, (x_{t+1}, y_{t+1})(x1,y1),…,(xt+1,yt+1),存在唯一一个阶数至多为 ttt 的多项式 q(x)q(x)q(x) 使得 q(xi)=yiq(x_i) = y_iq(xi)=yi 对每个 iii 成立。
此外,可以有效地重构该多项式 q(x)q(x)q(x),或者计算其上任意一点的值。
一种重构方法是使用 Lagrange 基多项式 ℓ1(x),…,ℓt+1(x)\ell_1(x), \dots, \ell_{t+1}(x)ℓ1(x),…,ℓt+1(x),其插值公式为:
q(x)=∑i=1t+1ℓi(x)⋅yiq(x) = \sum_{i=1}^{t+1} \ell_i(x) \cdot y_i q(x)=i=1∑t+1ℓi(x)⋅yi
从现在起,假设所有计算都在有限域 Zp\mathbb{Z}_pZp 中进行,其中 ppp 为素数且 p>np > np>n。
分发阶段:
为了分享一个秘密 sss,分发者随机选择一个阶数至多为 ttt 的多项式 q(x)q(x)q(x),并且满足 q(0)=sq(0) = sq(0)=s。
具体做法是:
- 设置 a0=sa_0 = sa0=s;
- 随机选择 a1,…,at∈Zpa_1, \dots, a_t \in \mathbb{Z}_pa1,…,at∈Zp;
- 令
q(x)=∑i=0tai⋅xiq(x) = \sum_{i=0}^t a_i \cdot x^i q(x)=i=0∑tai⋅xi - 然后,对于 i=1,…,ni = 1, \dots, ni=1,…,n,分发者将份额
yi=q(i)y_i = q(i) yi=q(i)
发送给第 iii 个参与方。
因为 p>np > np>n,可以保证每个参与方获得的 xxx 坐标不同。
重构阶段:
任意 t+1t+1t+1 个参与方可以通过插值恢复 q(x)q(x)q(x),进而得到 s=q(0)s = q(0)s=q(0)。
安全性分析:
- 如果少于或等于 ttt 个参与方合谋,它们只知道多项式上的 ttt 个点;
- 但对于任意 s′∈Zps' \in \mathbb{Z}_ps′∈Zp,都存在一个阶数至多为 ttt 的多项式经过这 ttt 个点且满足 q(0)=s′q(0) = s'q(0)=s′;
- 由于系数是随机选择的,这些多项式的分布是均匀的,因此秘密 sss 在所有可能值中是等概率的。
4.2 基于秘密共享的诚实多数 MPC
在大多数通用 MPC 协议(即可以计算任意函数的协议)中,第一步是将待计算的函数表示为布尔电路或算术电路。在基于秘密共享的诚实多数 MPC 中,算术电路由有限域 Zp\mathbb{Z}_pZp(其中 p>np > np>n,如上所述)上的加法门和乘法门组成。需注意到,算术电路是图灵完备的,因此任何函数都可以用这种形式表示。参与 MPC 协议的各方都拥有该电路,并假设他们之间可以进行安全通信。针对半诚实(semi-honest)对手的协议(至于恶意对手的情况需要额外处理,见后文)包括以下几个阶段:
- 1)输入共享(Input sharing)阶段
- 2)电路计算(Circuit evaluation)阶段
- 2.1)加法门计算
- 2.2)乘法门计算
- 3)输出重建(Output reconstruction)阶段
4.2.1 输入共享(Input sharing)阶段
在此阶段,每一方使用 Shamir 秘密共享将其输入与其他各方共享。具体来说,对于电路中的每个输入线,拥有该输入的参与方充当 Shamir 秘密共享的 dealer,将该值共享给所有参与方。所使用的秘密共享是 (t+1)(t+1)(t+1)-out-of-nnn 的门限方案,其中:
t=⌊n−12⌋t = \left\lfloor \frac{n-1}{2} \right\rfloor t=⌊2n−1⌋
即多项式的阶数为 ttt。这保证了协议在少数方被腐化时仍然安全,因为少数方无法从共享值中学习任何信息。在此步骤完成后,各方都持有电路输入线上值的秘密份额。
4.2.2 电路计算(Circuit evaluation)阶段
在此阶段,各方逐门计算电路,从输入门到输出门。协议维持以下不变式:对于任意一个电路门,如果各方持有输入线值的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享,那么它们也能得到输出线值的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享。
分为:
- 1)加法门计算
- 2)乘法门计算
4.2.2.1 加法门计算
假设各方分别持有输入线对应的多项式 a(x)a(x)a(x) 和 b(x)b(x)b(x) 的份额,即第 iii 个参与方持有 a(i)a(i)a(i) 与 b(i)b(i)b(i)。则输出线的值应当是:
a(0)+b(0)a(0) + b(0) a(0)+b(0)
的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享。计算方法是:每个参与方本地计算
c(i)=a(i)+b(i)c(i) = a(i) + b(i) c(i)=a(i)+b(i)
这相当于定义多项式
c(x)=a(x)+b(x)c(x) = a(x) + b(x) c(x)=a(x)+b(x)
它的阶数仍为 ttt,且满足 c(0)=a(0)+b(0)c(0) = a(0) + b(0)c(0)=a(0)+b(0)。因此,各方得到的是合法的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享。不需要额外通信即可完成加法门计算。
4.2.2.2 乘法门计算
同样,设输入线对应的多项式为 a(x)a(x)a(x) 和 b(x)b(x)b(x)。每个参与方可以本地计算:
c(i)=a(i)⋅b(i)c(i) = a(i) \cdot b(i) c(i)=a(i)⋅b(i)
这样定义了一个多项式 c(x)c(x)c(x),满足 c(0)=a(0)⋅b(0)c(0) = a(0)\cdot b(0)c(0)=a(0)⋅b(0)。但是 c(x)c(x)c(x) 的阶数为 2t2t2t,因此这是一个 (2t+1)(2t+1)(2t+1)-out-of-nnn 秘密共享,而不是所需的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享。因此需要进行 降阶步骤(degree reduction),将阶数从 2t2t2t 安全地降低到 ttt,同时保持 c(0)c(0)c(0) 不变。
由于 t<n/2t < n/2t<n/2,所以 nnn 个参与方持有的份额足以唯一确定一个阶数 2t2t2t 的多项式 c(x)c(x)c(x)。降阶过程如下(思路来自 2007年论文《Scalable and Unconditionally Secure Multiparty Computation》,此处仅描述基本原理):
-
假设各方持有一个随机值 rrr 的两个独立秘密共享:
- 一个基于阶数 2t2t2t 的多项式 R2t(x)R_{2t}(x)R2t(x);
- 一个基于阶数 ttt 的多项式 Rt(x)R_t(x)Rt(x);
并且满足 R2t(0)=Rt(0)=rR_{2t}(0) = R_t(0) = rR2t(0)=Rt(0)=r。
-
每个参与方本地计算:
d(i)=c(i)−R2t(i)d(i) = c(i) - R_{2t}(i) d(i)=c(i)−R2t(i)
于是 d(x)=c(x)−R2t(x)d(x) = c(x) - R_{2t}(x)d(x)=c(x)−R2t(x) 也是阶数 2t2t2t 的多项式。 -
各方公开并重建:
d(0)=a(0)⋅b(0)−rd(0) = a(0)\cdot b(0) - r d(0)=a(0)⋅b(0)−r -
每个参与方设置输出线份额:
c′(i)=Rt(i)+d(0)c'(i) = R_t(i) + d(0) c′(i)=Rt(i)+d(0)
由于 Rt(x)R_t(x)Rt(x) 是阶数 ttt 的多项式,c′(x)c'(x)c′(x) 也是阶数 ttt 的多项式,且:
c′(0)=Rt(0)+d(0)=r+(a(0)⋅b(0)−r)=a(0)⋅b(0)c'(0) = R_t(0) + d(0) = r + (a(0)\cdot b(0) - r) = a(0)\cdot b(0) c′(0)=Rt(0)+d(0)=r+(a(0)⋅b(0)−r)=a(0)⋅b(0)
因此各方最终得到合法的 (t+1)(t+1)(t+1)-out-of-nnn 秘密共享。
注意:d(0)d(0)d(0) 的公开不会泄露信息,因为 Rt(x)R_t(x)Rt(x) 完全掩盖了 c(x)c(x)c(x) 的值——即实际上其掩盖了 a(0)⋅b(0)a(0)\cdot b(0)a(0)⋅b(0) 值。
为了生成未知随机值 rrr 的两个独立秘密共享,每个参与方 iii 可作为 dealer,分别通过阶数 2t2t2t 的多项式 R2ti(x)R_{2t}^i(x)R2ti(x) 和阶数 ttt 的多项式 Rti(x)R_t^i(x)Rti(x) 来分享一个随机值 rir_iri。然后,每个参与方计算:
R2t(i)=∑j=1nR2tj(i),Rt(i)=∑j=1nRtj(i)R_{2t}(i) = \sum_{j=1}^n R_{2t}^j(i), \quad R_t(i) = \sum_{j=1}^n R_t^j(i) R2t(i)=j=1∑nR2tj(i),Rt(i)=j=1∑nRtj(i)
由于各方贡献了秘密随机值r1,⋯,rnr_1,\cdots, r_nr1,⋯,rn,而 r=∑j=1nrjr = \sum_{j=1}^n r_jr=∑j=1nrj,因此没有单个参与方知道 rrr。
4.2.3 输出重建(Output reconstruction)阶段
当各方得到输出线的份额后,可以通过互相交换份额并插值重建输出。如果不同的参与方应当得到不同的输出,也可以仅将相关份额发送给对应的参与方。
该协议在 半诚实对手模型 下是安全的,只要腐化的参与方少于 n/2n/2n/2。这是因为计算过程中各方看到的只有秘密份额(不会泄露被隐藏的值),以及 d(0)d(0)d(0) 的公开值(因随机共享掩盖而不泄露信息)。
若要在 恶意对手模型 下获得安全性,则必须使用额外机制防止作弊,详见 [4,10,16] 等工作中关于如何高效实现恶意安全的研究。
4.3 私有集合求交 (Private Set Intersection)
在第 4.2 节中,描述了一种通用安全计算方法,可以安全地计算任意函数。在许多情况下,这些通用方法实际上是最有效的(尤其是在考虑恶意对手时)。然而,在某些情况下,被求解函数的特定结构使得能够找到更快、更有针对性的解决方案。本节和下一节展示了两个这样的例子。
在私有集合求交协议中,两方分别持有私有集合,并希望找到它们的交集,同时不泄露交集以外的任何信息。在某些情况下,只需要交集的某种函数(如,仅交集大小)。关于这一问题已有大量研究,涵盖了半诚实和恶意对手的安全性,并考虑了不同的效率目标(少轮次、低通信量、低计算量等)。在此介绍 2016年论文《Efficient Batched Oblivious PRF with Applications to Private Set Intersection》 协议背后的基本思想(实际协议要复杂得多,但其核心概念较为简单)。
伪随机函数(PRF)FFF 是一个带密钥的函数,其性质是:
- 在给定输入上的输出看起来完全随机。
如,对于一组元素 x1,…,xnx_1, \ldots, x_nx1,…,xn,其值 Fk(x1),…,Fk(xn)F_k(x_1), \ldots, F_k(x_n)Fk(x1),…,Fk(xn) 看起来是随机的。特别地,给定 Fk(xi)F_k(x_i)Fk(xi),几乎不可能确定 xix_ixi 的值。
在下面的简单协议中,使用了一种称为 不可知伪随机函数计算(oblivious PRF evaluation) 的工具。这是一种特定的 MPC 协议:
- 第一方输入 kkk(密钥),
- 第二方输入 xxx,
- 第二方得到 Fk(x)F_k(x)Fk(x),
- 第一方则对 xxx 一无所知。
(注意:第二方只学到 Fk(x)F_k(x)Fk(x),而密钥 kkk 保持秘密。)
这种原语可以通过多种方式实现,这里不做展开。
设两方分别持有私有集合 x1,…,xnx_1, \ldots, x_nx1,…,xn 和 y1,…,yny_1, \ldots, y_ny1,…,yn(为简便起见假设两方集合大小相同,但这不是必须的)。协议过程如下:
- 1)第一方选择伪随机函数的密钥 kkk。
- 2)双方运行 nnn 次不可知 PRF 计算:在第 iii 次中,第一方输入 kkk,第二方输入 yiy_iyi。结果是第二方得到 Fk(y1),…,Fk(yn)F_k(y_1), \ldots, F_k(y_n)Fk(y1),…,Fk(yn),而第一方对 y1,…,yny_1, \ldots, y_ny1,…,yn 一无所知。
- 3)第一方本地计算 Fk(x1),…,Fk(xn)F_k(x_1), \ldots, F_k(x_n)Fk(x1),…,Fk(xn) 并发送给第二方(因为它知道 kkk)。
- 4)第二方计算集合 Fk(y1),…,Fk(yn)F_k(y_1), \ldots, F_k(y_n)Fk(y1),…,Fk(yn) 与 Fk(x1),…,Fk(xn)F_k(x_1), \ldots, F_k(x_n)Fk(x1),…,Fk(xn) 的交集,并输出所有满足 Fk(yj)F_k(y_j)Fk(yj) 在交集中对应的 yjy_jyj(第二方知道 yjy_jyj 与 Fk(yj)F_k(y_j)Fk(yj) 的对应关系)。
该协议除交集外不泄露任何信息:
- 第一方通过不可知 PRF 计算得不到 y1,…,yny_1, \ldots, y_ny1,…,yn 的任何信息;
- 第二方无法知道不在交集中的 xjx_jxj,因为 PRF 隐藏了其输入。
因此该协议在半诚实模型下是安全的。
在恶意模型下安全性更具挑战性。如,恶意第一方可能对第一个元素和后续元素使用不同的密钥,从而导致 y1y_1y1 是否出现在输出中取决于它是否是第二方集合中的第一个元素。
当今最高效的私有集合求交协议使用了高级哈希技术,能够在几秒钟内处理数百万个元素 [23,32,31]。
4.4 阈值密码学(Threshold Cryptography)
阈值密码学的目标是使一组参与方能够执行加密操作,而不需要任何单个参与方持有完整的私钥。这可以用于实现交易的多重签名,或用于保护私钥不被窃取(将密钥份额分布在多个设备上,攻击者必须攻破所有设备才能恢复密钥)。
下面用一个 简单的两方 RSA 协议 举例说明。但需要注意,对于更多方(以及其它密码体制),协议会复杂得多。
RSA 是一种公钥加密体制,其公钥为 (e,N)(e, N)(e,N),私钥为 (d,N)(d, N)(d,N)。基本 RSA 函数为:
y=xemodNy = x^e \bmod N y=xemodN
其逆函数为:
x=ydmodNx = y^d \bmod N x=ydmodN
RSA 可用于加密和签名(通过填充消息及其他技巧)。这里只考虑原始的 RSA 函数,并展示如何在两方之间安全地计算逆函数,而不让任意一方独立完成该函数。
协议设置:
- 第一方持有 (d1,N)(d_1, N)(d1,N)
- 第二方持有 (d2,N)(d_2, N)(d2,N)
- d1,d2d_1, d_2d1,d2 是随机值,满足:
d1+d2=d(modϕ(N))d_1 + d_2 = d \pmod{\phi(N)} d1+d2=d(modϕ(N))
其中 ϕ(N)\phi(N)ϕ(N) 为欧拉函数。
安全计算过程:
为了安全计算 ydmodNy^d \bmod NydmodN:
-
1)第一方计算:
x1=yd1modNx_1 = y^{d_1} \bmod N x1=yd1modN -
2)第二方计算:
x2=yd2modNx_2 = y^{d_2} \bmod N x2=yd2modN -
3)双方交换 x1,x2x_1, x_2x1,x2。
-
4)双方各自计算:
x=x1⋅x2modNx = x_1 \cdot x_2 \bmod N x=x1⋅x2modN
并通过验证 xe=y(modN)x^e = y \pmod Nxe=y(modN) 来确认结果正确,若验证成功则输出 xxx。
正确性:
结果是正确的,因为:
x=yd1⋅yd2modN=yd1+d2modϕ(N)modN=ydmodNx = y^{d_1} \cdot y^{d_2} \bmod N = y^{d_1 + d_2 \mod \phi(N)} \bmod N = y^d \bmod N x=yd1⋅yd2modN=yd1+d2modϕ(N)modN=ydmodN
安全性:
注意:第一方知道 d1d_1d1 和最终结果 xxx,它可以计算:
x2=x/yd1modNx_2 = x / y^{d_1} \bmod N x2=x/yd1modN
因此,第一方实际上可以自己生成它在协议中接收到的 x2=x/yd1modNx_2=x/y^{d_1}\mod Nx2=x/yd1modN (因为 x2=yd2=yd1+d2−d1=yd⋅y−d1=x/yd1modNx_2=y^{d_2}=y^{d_1+d_2-d_1}=y^d\cdot y^{-d_1}=x/y^{d_1}\mod Nx2=yd2=yd1+d2−d1=yd⋅y−d1=x/yd1modN),所以它并没有从协议中学到超过输出之外的任何信息。
完整的阈值密码学支持更复杂的场景,如 (t+1)(t+1)(t+1)-out-of-nnn 的多方签名,并且在任意 ttt 个腐化方的情况下仍保持安全。这需要额外的工具,但也可以高效实现;参见 2000年论文《Practical Threshold Signatures》 及相关文献。
近年来,阈值 ECDSA 引起了广泛关注,尤其是在加密货币保护方面 [26,17,27,14]。
4.5 不诚实多数 MPC
在第 4.2 节中,描述了一种通用协议,它在对手无法腐化超过少数参与方的情况下是安全的。而在 不诚实多数 的情形下(包括一个重要的特例——仅有两方,其中一方被腐化),需要完全不同的方法。
这一方向已有大量研究工作,从最早关注可行性的协议 [37,18,2],到最近大量聚焦于具体效率的研究。该方向的研究成果极为丰富,任何简短的介绍都难以公正地覆盖全部内容。因此,在此仅简要提及主要方法,详细内容推荐阅读 2018年论文《A Pragmatic Introduction to Secure Multi-Party Computation》。
主要的方法包括:
- GMW 协议:基于 Oblivious Transfer (OT) [18,21];
- 混淆电路(Garbled Circuits) [37,2];
- Cut-and-Choose 技术 [28];
- SPDZ 协议 [13];
- TinyOT 协议 [29];
- MPC-in-the-Head 方法 [22];
- 以及后续的诸多改进与优化。
注意,以上每种方法都有大量后续研究,持续改进协议效率。
4.6 高效与实用的 MPC
MPC 研究的前 20 年主要聚焦于 可行性:如何定义和证明在不同的对手模型与网络模型下的安全性,以及在何种密码学假设与系统设定下可以实现 MPC。
随后的十年,研究重点转向 效率提升。初期主要是算法层面的优化,减少密码学原语带来的开销。随后,研究扩展到其他方面,如内存与通信成本、利用硬件指令(如 AES-NI)、等等。
由于大多数通用协议都要求将待计算函数转换为电路表示,而手工构造电路极其困难,因此也出现了 MPC 专用编译器,能将高级语言代码自动编译为电路。这些编译器会针对 MPC 的特点进行优化:
- 在许多协议中,XOR 门几乎可以“免费”计算 (见2008年论文《Improved Garbled Circuit: Free XOR Gates and Applications》),而 AND/OR 门代价较高。因此编译器会尽量减少 AND 门的数量,即便代价是增加大量 XOR 门。
- 对某些协议而言,计算开销主要由电路规模决定;对另一些协议而言,则由电路深度主导。因此,不同的编译器会优化不同的指标。
关于通用 MPC 编译器及其实用性,见综述 2019年论文《SoK: General Purpose Compilers for Secure Multi-Party Computation》。
这些进展使得 MPC 的性能在短短几年内提升了几个数量级,为其在实践中的应用铺平了道路。如今,MPC 已经足够高效,可以应用于多种实际问题。更多重要进展可见 2018年论文《A Pragmatic Introduction to Secure Multi-Party Computation》第 4 章。
5. MPC 用例
MPC 有许多潜在应用,如:
- 在保护隐私的前提下比对 禁飞名单;
- 实现 私有 DNA 比对;
- 收集统计数据但只公布聚合结果;
- 等等。
直到最近,这些应用还几乎都停留在理论层面。但如今情况已完全不同:MPC 已经在多个实际场景中被部署使用,应用正快速增长。
以下是一些已经落地的案例:
- 波士顿薪酬差异 (见2018年论文《Accessible PrivacyPreserving Web-Based Data Analysis for Assessing and Addressing Economic Inequalities》)
2017 年,波士顿女性劳动力委员会利用 MPC 统计了来自 114 家公司的 166,705 名员工薪酬数据(覆盖波士顿地区约 16% 劳动力)。由于企业不愿公开原始数据,MPC 在此至关重要。结果显示,波士顿地区的性别薪酬差距甚至比美国劳工统计局此前估计的还要大。这个案例有力证明了 MPC 可以用于社会公益。 - 广告转化率 (见2017年论文《Private Intersection-Sum Protocol with Applications to Attributing Aggregate Ad Conversions》)
为了计算广告展示到实际购买的转化率,Google 需要计算“看过广告的人群”与“实际购买商品的人群”的交集大小。若商品不是在线购买的,则购买数据无法直接与广告匹配,需要双方共享各自的名单。Google 使用了一种保护隐私的集合求交协议来完成此计算。虽然该协议并非当今最高效的,但其实现简单且满足计算需求。 - 加密密钥保护 (见Unbound Tech、Sepior、Curv)
如第 4.4 节所述,阈值密码学允许在不集中存放私钥的情况下执行加密操作。许多公司使用阈值密码学代替传统硬件来保护密钥。在此应用中,MPC 并非在多个独立组织之间运行,而是在单个组织内部,用于生成和使用密钥,同时避免密钥被集中存放在单点被窃取。通过将密钥份额分散在不同环境中,攻击者极难窃取所有份额。此场景尤其适合 主动安全模型(proactive security model)。此外,MPC 还常用于保护加密货币的签名密钥,从而在技术层面实现严格的金融交易审批策略,或在托管方与客户之间分担密钥管理责任。 - 政府协作 (见Sharemind)
不同政府部门掌握公民的不同信息,若能相关联分析将带来重大价值。但隐私风险常常阻碍这种合作。如,加拿大在 2000 年废止了一个公民信息汇聚计划,因外界批评其在构建“老大哥数据库”。利用 MPC,爱沙尼亚政府能够安全地收集加密的收入税和教育数据,并分析“在学期间打工的学生是否更容易学业失败”。MPC 的使用保证了所有数据保护与隐私法规得到遵守,同时不损失数据效用。 - 隐私保护分析 (见Duality)
机器学习的应用快速增长。MPC 可以让机器学习模型在数据上运行,同时:- 不泄露模型(其本身可能是商业机密);
- 不泄露数据(数据归属方的隐私)。
此外,MPC 可用于跨组织的统计分析,如反洗钱、风险评分计算等。
6. 讨论
安全多方计算是一个 长期研究成功的典范 [36]。在最初的 20 年研究中,几乎没有实际应用可见,人们甚至怀疑 MPC 是否会真正被使用。
但在过去十年,MPC 的可用性发生了根本性转变:
- MPC 已经足够快,可以在实践中使用;
- MPC 得到工业界认可,并从学术研究对象转变为实际部署的技术。
当然,目前要部署 MPC 仍需要较高专业水平,还需要更多研究突破,使其能够:
- 处理更大规模的数据和更复杂的问题;
- 更易于非专家使用。
过去几年的进展,以及日益增多的应用研究,都预示着 MPC 在实践中的前景非常乐观。同时,MPC 的深层理论研究也在持续推进,确保应用方案建立在坚实的科学基础上。
参考资料
[1] Yehuda Lindell 2020年论文《Secure Multiparty Computation (MPC)》