安全多方计算技术(MPC)简介

技术的突破是推动区块链行业前进的引擎,币安中国区块链研究院与链闻 ChainNews 同为密切关注区块链与密码学等领域技术发展前沿的组织,故而联合推出「他山之石」专栏,向中文世界读者介绍全球范围最值得关注的区块链技术进展,以及在金融等产业最新的应用分析与动态,以期为中国的区块链行业「攻玉」提供借鉴和思考。 

*本文已取得作者授权链闻和币安中国区块链研究院翻译转载
在本文中,我们将简要介绍一下多方计算和混淆电路的背景知识,解释我们怎样使用MPC(多方计算)技术来建立私人支付渠道,并讨论我们怎样选择合适的软件框架来实现我们的MPC协议。
概述
安全多方计算(MPC)技术能使彼此不信任的多方正确计算任何函数,同时还能保证各方输入和输出信息的私密性。MPC可被视为一种提供可信任第三方的方式,即使实际上并不需要这一可信任方。理想情况下,可信任的第三方从各方处获得秘密的输入信息,计算函数,然后将结果安全返回各方。而现实中,我们可以使用MPC来代替这一可信的第三方。
今天,MPC技术已广泛用于解决许多方面的问题,例如网络广告、私人联系信息查找(用于发信息)、分布式密钥管理等等。在设定中,我们计算的函数用于检查链下状态方面支付型代币的正确性、计算比特币交易中的ECDSA(椭圆曲线数字签名算法)签名、发布新支付型代币等。一方的输入信息是该方私密的签名密钥,另一方提出比特币交易,提供支付型代币。
在开始探讨细节前,我们先定义两个对MPC下任何联合计算都非常重要的高级属性:私密性和正确性。在私密性方面,任何一方都只知道他们自己的输出结果。而且所有各方从MPC获得的输出结果都可以保证是正确的。
在MPC协议中,通常会考虑两个基本的对抗模型:半诚实模型和恶意模型。如果半诚实模型中的MPC协议是安全的,则只要各参与方遵守协议规范,即可保证私密性和正确性。另一方面,恶意安全模型可确保诚实方的安全(即使参与方中的某些子集试图背离协议规范,以获得更多信息)。
为理解MPC,我们提供了一些关于建立区块的背景知识:茫然传输(Oblivious Transfer)和姚期智的混淆电路(Garbled Circuits)协议。

01 茫然传输
通过茫然传输(OT)协议,发送者Alice可发送一个请求的数据项给接收者Bob,而Alice并不确切知道她发送的是什么数据项。在基本情况下,只有两个可能的数据项,即X0和X1。Bob选择一个位元a ∈ {0,1}。OT协议能确保发送者不知道接收者的选择了位元a,确保接收者只知道Xa。OT是一种互动协议,能确保输出结果的正确性,还能保护发送者和接收者的私密信息。这是混淆电路协议中保证计算私密性的关键部分。
02 混淆电路
通过茫然传输(OT)协议,发送者Alice可发送一个混淆电路是MPC的一种实现方法。基本的双方协议代表着理想的函数(作为一种布尔电路),使混淆电路能进行大量的逐位运算(例如SHA256)来高效地计算函数。混淆电路有一个恒定的通信循环数,这对于慢速网络很有用。

更确切地说,混淆电路协议在双方间执行:一个混淆者和一个评估者,他们联合评估基于他们各自私密输入信息的任意函数f。本文中我们将处理f为单一输出函数时的特殊情况。使用“异或门”和“与门”将函数 f 编码为一个布尔电路。对于电路的每个输入值i,生成器都将选择一对随机密钥k0i和k1i(有时称为线标签),它们分别代表可能的输入位元0和1。通过这些密钥,混淆者可生成一个电路中所有门可能的输出结果的加密表。如果有对应于实际输入值的密钥,则评估者可获得正确的输出结果。

双方均知道此电路:Alice(作为混淆者)和Bob(作为评估者)。Alice有一个私密输入值x,Bob有一个私密输入值y。他们都想安全地计算f(x,y)。Alice给电路加密,发送混淆电路f′给Bob,同时还有她加密过的输入值(或称混淆过的x′)。使用茫然传输协议,Bob(作为接收者)可与Alice(作为发送者)互动,他知道自己的加密输入值y′(或混淆后的y′),Alice不知道他的私密输入值y。
Bob在收到加密的电路和加密的输入值后,他将开始逐门地计算电路,得到输出f(x,y)。混淆电路的结构能保证Bob仅知道f(x,y),即具体输入值的函数f,别的什么也不知道。对于更深度的混淆电路处理,我们推荐读者阅读Vitalik的初级读本。
03 MPC在zkChannels中的应用
在Bolt Labs公司,我们正在开发一种能在顾客和商家之间保持私密性的支付渠道(见我们关于zkChannels协议的博客文章)。这一渠道可使双方锁定款项由第三方托管,然后进行无限制的链下比特币转账/支付。随着每一次转账,双方合作更新渠道的余额,确保双方都能在得知新余额后关闭渠道,不会有丢失款项的风险。
我们使用MPC技术,以一种能保持私密性的方式实现了这一合作。即,每次支付都是匿名的:商家知道对方已经付款,但他们不知道具体由哪位顾客付的款。MPC为顾客计算两个输出结果:关于比特币交易的ECDSA签名,和支付型代币。如果顾客已准备关闭渠道,他们可使用比特币交易;否则他们可使用支付型代币来用于未来的状态更新(即另一种支付)。MPC的优点在于这两个输出结果均传送给顾客,而商家无法获得任何信息能了解是哪位顾客参与了协议。
我们采用以下方法做到了这一点:顾客与商家通过指定他们的私密输入值开始交易。顾客的私密输入值包括关于渠道的信息,其中有目前的状态和下一个状态。商家的私密输入值由一个ECDSA签名密钥和一个HMAC(哈希运算消息认证码)密钥组成。
根据MPC,它们构成一个格式正确的比特币交易摘要(反映出支付额),然后进行哈希运算,使用商家的ECDSA签名密钥给摘要签名。它们还计算基于更新状态的HMAC,以便形成新的支付型代币。此支付型代币能使顾客根据MPC证明他们在过去曾与商家有过互动,在渠道中有足够的余额。
总之,MPC的执行能保证各方都完全不知道其它方的私密输入值:商家不知道顾客的身份或渠道余额信息,顾客也不知道商家的私有密钥。在上述例子中,我们说明了MPC功能的几个高级方面;在不久后的学术文章,我们将公布技术详情。
04 软件框架选择和效能权衡
为执行MPC协议,我们使用了一种现有的软件框架来将MPC用于一个任意函数。我们选择Efficient Multi-Party(EMP)计算工具包。此框架有几个优点,使之很适合我们使用:其中特别是它支持半诚实模型和恶意安全模型中的多种协议,以及混淆电路模型中的所有协议。
在我们的实例中,商家扮演混淆者一角,顾客则扮演评估者一角。这是一个自然的选择,因为无疑只有顾客将收到计算结果。此外,混淆方有稍高一些的资源要求,因为混淆电路需要大量的加密操作,以便建立所有(逻辑)门的真值表。在EMP工具包中,这算不上是大开销,商家可自定义他们的硬件设置来应对这一负荷。
EMP工具包执行一个C语言库,该库用于描述安全功能。该库或者执行半诚实协议,或者将函数汇编成一个布尔电路。此电路可被传递给几个其它MPC协议中的一个,用于实现协议(包括几个能安全应对恶意攻击者的协议)。
我们的应用程序可分为几个主要的函数,包括大量的SHA256哈希运算、大量的输入验证,以及ECDSA签名。除签名外,所有这些函数基本上都是布尔运算:位移位、相等性检查和异或门掩膜运算。
EMP工具包将数据表示为加密(混淆)位元,将函数表示为布尔电路。MPC文献中的其它常见模型将数据表示为有限域内的秘密共享,将功能表示为算术运算电路。这些协议在基于位的运算中效率不高,而基于位的运算占我们应用程序的大部分。
部分现代框架[2]允许将布尔电路和算术运算电路混合起来一起计算,以便基于两种单独方法的优点来进行优化。在未来,我们将研究这些框架,以便优化我们应用程序中的ECDSA签名。如果需要更进一步了解其它MPC软件框架,可参阅Hastings等人更为全面的评估方法[1]。
*在此我们要特别感谢Colleen Swanson和Marcella Hastings,感谢他们的校对工作,以及他们关于本文的宝贵反馈。
参考文献
1. SoK:“多用途安全多方计算框架”:Marcella Hastings等人。
2. EzPC:简易的安全多方计算技术