例如,假设您拥有一家小型企业,并将您的销售数据库存储在一些云计算提供商那里。(本博客的编辑可以推荐一个……)由于您的数据是保密的,您希望将其加密存储在服务器上。但现在,当你拿着手机,想要知道你去年的平均销售额是多少,邮编是02142?由于您的数据是加密的,因此似乎需要下载整个数据库,对其进行解密,然后执行搜索,这在某种程度上违背了将计算外包出去的初衷。使用同态加密,服务器可以在加密的数据库上执行此计算,并向您发送答案的加密,而不需要在此过程中了解任何信息。
这个例子很酷,但并不是FHE重要的唯一原因。密码学家(至少是我们)对FHE感到兴奋的主要原因是它是一种“终极密码工具”。当然,FHE并不能解决世界上所有的密码问题,事实上,对于它所解决的许多问题,都存在非基于FHE的解决方案,这些解决方案更有效或基于更弱的假设。但是基于FHE的结构通常在概念上更简单,尤其是FHE提供了一种统一的方法来实现诸如多方安全计算、私有信息检索、电子投票、零知识
等密码概念。基于这个原因,我们认为FHE(以及它的一些推论)应该在任何密码学导论课程中教授。当然,这种构造现在可能还不实用,但是我们在加密课程中教授高级主题的原因并不是为了让学生学习如何实现,比如电子投票。这是为了让学生们对密码学中惊人的可能性敞开心扉,在密码学中,几乎每一个你能想象到的概念都可以被构造出来(有些甚至是你之前不敢想象的……)。而且,坦率地说,我们也教授这类主题,让学生们在经过一学期艰苦的安全定义和规约之后,能够看到一些很酷的东西。
为了证明这一点,在这篇文章的其余部分,我们将展示如何使用完全同态加密来轻松地实现两种规范的加密工具——两方安全计算和零知识证明系统。在下一篇文章中,我们将详细介绍如何构建一个FHE方案。
Two party secure computation from FHE.
为了演示FHE如何以一种概念清晰的方式产生规范的先前结果,让我们考虑两方的安全计算任务。在这个设置中,Alice和Bob分别持有输入{x,y},并希望计算它们的输入的某个函数{f(x,y)},但有一个重要的限制,即Alice不应该学习输出{f(x,y)}之外的任何关于{y}的内容,同样,Bob不应该学习关于{x}的任何不必要的信息。两方安全计算(及其泛化为{k>2}方)是一个非常普遍的概念,它捕获了大量的加密应用程序。例如,多方计算允许丹麦甜菜种植户参与拍卖,出售他们的甜菜,而不披露他们的私人供求曲线;或者允许银行计算他们的总风险概况,而不披露他们的私有投资组合信息。实际上,几乎任何加密任务都可以转换到这个非常通用的框架中。
以下是如何使用完全同态加密实现两方安全计算:
Alice为FHE生成密钥,并将{c=E(x)}发送给Bob。
Bob对{c}运行同态计算{c’=E(f(x,y))},并将{c’}发送给Alice。
Alice解密{c’}并将答案发送给Bob。
其思想是,Bob只看到{x}的加密,而Alice实际上只看到(加密){f(x,y)},因此他们都只学习输出{f(x,y)}。当然,稍微想一下就会发现这个协议有一些问题——我们怎么知道Bob是在{c}上计算{f}而不是其他函数呢?我们如何确定Alice对{c’}的解密是正确的呢?实际上,该协议只在所谓的诚实但奇怪的模型中提供安全性(这已经是一项重要的任务,已知的结构至少需要一节课的时间)。但是,它可以被转换成一个完全安全的协议,方法是让Bob提供零知识证明,证明他在步骤2中正确地计算了{c’},而Alice在步骤3中提供零知识证明,证明她发送了一个有效的{c’}解密。零知识证明用于保证Bob和Alice正确地执行它们的步骤,但是(正如它们的名字所暗示的)它们对Alice和Bob的私有输入没有任何提示,因此不会损害安全性。(密码学家可能会注意到这个协议的另一个微妙之处是,为了确保安全性,我们需要同态加密来满足一个称为“函数隐私”或“重加密”的属性;幸运的是,所有已知的FHE结构都可以修改为具有这种特性。
NP的零知识证明具有相当优雅的结构,但正如我们下面所描述的,也可以直接使用FHE得到。特别地,基于FHE的构造没有经过Cook-Levin定理,并且具有比标准的通信效率更高的优势(例如,(非基于PCP)零知识证明结构。实际上,请注意上面协议中的通信只涉及输入{x}和输出{f(x,y)}的加密。这比以前的非基于FHE的安全计算结构要高效得多,以前的安全计算涉及到的通信与计算函数{f}所需的门的数量成比例。事实上,使用FHE可以将计算{f}的任何(非安全的)协议转换为通信复杂度只有多对数开销的安全协议。这在设置中非常有用,例如我们上面提到的,其中一个或两个输入可以是非常大的数据库,我们不希望在双方之间传输。
Zero knowledge proofs from FHE.
我们现在描述Alice如何使用FHE向Bob证明在zero knowledge中存在某个字符串{w},使得{g(w)=1},其中{g}是一个任意的(有效计算的)函数。以下是我们对此类协议的第一次cut:
- Alice为FHE生成密钥,并将{c=E(w)}发送给Bob。
- Bob对{c}运行同态计算{c’=E(g(w))}并将其发送给Alice。
- Alice解密{c’}并将答案发送给Bob {b}。Bob检查{b=1}。
再说一遍,我们的第一次cut不够好。我们怎么知道Alice并不总是把{1}发送给Bob?我们如何确定Bob正确地计算了{c’},而不是使用它来要求Alice解密,比如,{w}的第一个位?
幸运的是,这个问题很容易解决。要修复第一个问题,在第二步中Bob可以将{c’}设置为概率为{1/2}的{0}加密,而不是{E(g(w))}。然后他会希望看到在最后一步,Alice总是根据Bob的随机选择返回正确的{0}或{1}值。这将确保如果{g(w)=0},那么Bob将以至少{1/2}的概率拒绝,当然可以通过重复放大。
我们仍然没有解决Alice的问题——她如何确定Bob实际上正确地计算了{c’}(通过对它求值{g},或者将它设置为{0}的加密),而不是设置{c’=E(w_1)}?为此,我们稍微修改了最后一步。Alice只向{b}发送一个承诺,而不是发送答案{b}。然后,我们添加一个额外的步骤,其中Bob表示他在步骤2中使用的所有随机性,允许Alice验证它是否被正确执行,并且只有在这时Alice才打开对{b}的承诺。新协议可以证明是安全的。(最后一个微妙之处是,取决于我们对FHE的定义有多严格,只有当Alice为加密选择了公共参数时,函数privacy/rerandomization属性才可能有效;这可以通过一个初始的“剪切和选择”步骤来保证,在这个步骤中,Alice生成两组密钥,Bob选择其中一组用于协议,而对于另一组,Alice需要显示相应的密钥和私有随机性。
————————————————————————————
Outsourcing storage and computations.
同态加密最直接的应用可能是将存储和计算外包出去,而不暴露敏感信息。假设有一家小公司试图将其计算设施转移到云上,但它担心云提供商会访问该公司的机密信息。一个简单的解决方案是在将机密信息存储到云中之前对其进行加密,但是公司如何才能在每次操作时使用这些信息而不将其发送回本地(这会破坏将其外包的目的)?同态加密为这个难题提供了一个优雅的解决方案。公司可以将信息以加密的形式保存在云中,云提供商可以处理此表单中的信息,只将处理后的结果发送回公司进行解密。
PIR and other private queries.
同态加密的另一个直接应用是支持对数据库或搜索引擎的私有查询。最简单的例子是私有信息检索,其中服务器持有一个大型数据库(例如,美国专利数据库),客户端希望检索该数据库的一条记录,而服务器不知道检索的是哪条记录。同态加密允许用户对要检索的记录的索引进行加密。服务器可以计算加密索引上的函数 f d b ( i ) = d b [ i ] f_{db}(i) = db[i] fdb(i)=db[i],将加密后的结果返回给客户端,客户端可以对其解密并获得明文记录。同样的解决方案也适用于对数据库的SQL查询或对搜索引擎的自由形式查询的更复杂的设置。在这两种情况下,服务器都有一些处理查询的过程,可以将其形式化为函数 g d b ( q u e r y ) = a n s w e r g_{db}(query) = answer gdb(query)=answer。因此,客户机可以在将查询发送到服务器之前对其进行加密,服务器可以对加密的查询求 g d b g_{db} gdb的值并返回加密的答案。
** **Beyond Homomorphic Encryption
同态加密虽然多种多样,但当然不能解决密码学中的每一个问题。