1.Source language
EzPC代码实现了一个简单的2PC计算,服务器和客户端可以共同计算一个函数,并确保输入的私密性和计算结果的安全传递。
2.EzPC compiler
1.EzPC编译器的输入输出:
- EzPC编译器接受一个源程序作为输入,并生成一个C++程序作为输出。
- 输出的C++程序包含特定于各方的代码(分别对应服务器和客户端的输入输出),以及通用的计算代码。
2.程序的拆分:
- 编译器将输入程序拆分为公共组件和秘密组件。
- 公共组件翻译为普通的C++代码,而秘密组件则翻译为调用2PC后端(ABY)的API。
代码示例解析
公共组件:
- 公共组件是指不涉及敏感数据的部分,例如循环索引。
- 例如,在图1的示例中,编译器发现内积循环中的数组索引i是公共的,因此不需要隐藏访问位置。于是,将这个for循环编译为C++的for循环,可以直接执行(代码中的第11行)。
秘密组件:
- 秘密组件涉及敏感数据的操作,需要使用加密技术。
- EzPC编译器根据加密计算的成本选择合适的表示形式:算术电路或布尔电路。
加密成本意识
算术电路:
- 对于内积计算,算术表示更高效,因此编译器使用算术电路构建器(acirc)来生成相应的电路(代码中的第12和13行)。
布尔电路(Yao电路):
- 对于与b的比较和条件表达式计算,布尔表示更高效,因此编译器使用Yao电路构建器(ycirc)来生成相应的电路(代码中的第19到24行)。
转换操作
- 使用算术和布尔表示需要在它们之间进行转换。
- EzPC编译器会适当地加入这些转换门。例如,在代码的第17行,编译器将a_acc转换为布尔表示,然后再将其输入到比较和多路复用器电路中。
3 Circuit generation and evaluation
电路生成和评估
编译和执行C++代码:
- EzPC编译器的输出是一个C++代码。接下来的步骤是将这个C++代码编译并执行。
- 编译和执行过程中,程序中所有的公共部分(例如数组访问等)会被直接计算和消除。
电路生成:
- 在公共部分被计算掉之后,剩下的部分是涉及秘密数据的计算。
- 这些计算会被转换成一个包含算术和布尔门(逻辑门)的电路。
同时,还会生成合适的转换门,用于在算术表示和布尔表示之间进行转换。
2PC协议评估电路:
- 生成的电路会通过一个2PC协议进行评估。
- 2PC协议保证双方在计算过程中各自的输入保持私密,仅计算结果公开。
4 总结
EzPC的特点和优势
高级编程接口:
-
EzPC允许用户用高级语言编写程序,而不需要处理底层的加密细节。编写的程序接近于“理想”功能,易于理解和维护。
混合电路生成: -
与之前的框架(如CBMC-GC、ObliVM、SMCL和Wysteria)不同,这些框架生成的协议仅使用算术电路或布尔电路中的一种。EzPC则首次结合了算术共享和混淆电路(garbled circuits),以提高性能。
形式化的正确性和安全性: -
EzPC提供了严格的正确性和安全性保证,确保生成的协议在理论上是正确且安全的。
高性能和可扩展性:
- 生成的协议在性能上有显著优势。EzPC生成的协议在一些功能上(如安全预测和矩阵分解)可以与最近的手工协议相匹配,甚至在某些情况下性能可以提高到19倍。
工作流程
高级语言编写程序:
- 用户用EzPC编写高层次的2PC程序。例如,服务器提供一个分类器的权重和阈值,客户端提供输入向量。
编译程序:
-
EzPC编译器将这些高层次程序编译为C++代码。
-
编译器识别公共部分和秘密部分,公共部分直接转换为C++代码,秘密部分则转换为调用2PC后端API(如ABY)的代码。
生成混合电路: -
编译后的代码在执行时,会生成包含算术和布尔门的混合电路。
-
编译器会选择最优的表示方式(算术或布尔)来生成电路,并在必要时加入转换门进行表示转换。
执行电路: -
生成的电路通过2PC协议执行,确保双方输入的隐私性,同时计算出预期结果。