#public-key #mpc #fhe #client-server #unsigned-integer

bin+lib phantom-zone

基于全同态加密的多方计算库

1 个不稳定版本

0.1.0 2024年7月8日

密码学 类别中排名 #585

Download history 63/week @ 2024-07-02 51/week @ 2024-07-09

每月下载量 114

MIT 许可证 MIT

495KB
11K SLoC

Phantom zone 类似于超人被锁定的区域,可以观察区域外的一切,但外界的人却看不见或听见超人。然而我们的幽灵区域并非为了锁定任何人。相反,它是一个与现实平行的全新区域。这是一个你和他人可以传送自己的区域,可以执行任意操作,当你返回时,只会记住预定义的记忆集。把这个区域想象成一台计算机,在返回输出后从地球上抹去自己,不留任何痕迹。

更正式地说,幽灵区域是一个实验性的多方计算库,它使用多方全同态加密来在多个实体的私有输入上计算任意函数。

目前幽灵区域的函数有限。它可以编写使用加密的无符号8位整数(称为 FheUint8)的电路,并且仅支持最多8个实体。FheUint8 支持与常规 uint8 相同的算术运算,但有一些例外,如下所述。我们计划在未来扩展 API 到其他有符号/无符号类型。

我们提供了两种类型的多方协议,两者仅在密钥生成过程上有所不同。

  1. 非交互式多方协议,客户端需要向服务器发送一条消息,然后服务器可以评估加密客户端输入上的任意函数。
  2. 交互式多方协议,一个两轮协议,在第一轮中,客户端相互作用生成集体公钥,在第二轮中,客户端将他们的服务器密钥份额发送到服务器,然后服务器可以评估加密客户端输入上的任意函数。

理解库处于实验阶段,如果您想将其用于应用程序但发现其功能不足,请不要犹豫,提出问题或联系。我们不希望您抑制那些富有创意的马!

如何使用

以下是一个简要概述。请参阅详细示例,特别是 non_interactive_fheuint8interactive_fheuint8,了解如何实例化和运行协议。

非交互式多方

每个客户端被分配一个id,称为user_id,表示在参与多方协议的客户端总数中的序列号。客户端在学习他们的user_id后,一次性将他们的服务器密钥份额和私入数据的加密上传到服务器。然后,服务器可以评估客户端私入数据的任意函数。将来,可以由参与协议的固定参与者集合提供新的私入数据。

交互式多方

与非交互式多方类似,每个客户端被分配user_id。在学习他们的id后,客户端参与一个两轮协议。在第一轮中,客户端生成公钥份额,互相分享,并汇总公钥份额以产生集体公钥。在第二轮中,客户端使用集体公钥生成他们的服务器密钥份额并加密他们的私入数据。服务器从每个客户端接收服务器密钥份额和私入数据的加密。服务器汇总服务器密钥份额后,可以评估客户端私入数据的任意函数。将来,任何人只要有访问集体公钥,都可以提供新的私入数据。

多方解密

为了解密某些计算结果获得的输出密文,客户端上线。他们从服务器下载输出密文,生成解密份额,并与其他方分享。客户端在收到其他方的解密份额后,汇总份额并解密密文。

参数选择

我们提供参数来运行最多8方的多方协议。

$\leq$ # Parties 交互式多方 非交互式多方
2 InteractiveLTE2Party NonInteractiveLTE2Party
4 InteractiveLTE4Party NonInteractiveLTE4Party
8 InteractiveLTE8Party NonInteractiveLTE8Party

如果您有使用超过8方的用例,请提出一个问题。我们愿意为超过8方找到合适的参数。

支持<= N方的参数不得用于超过N方的多方计算。这将导致失败概率增加。

功能选择

要使用库进行非交互式多方,您必须添加non_interactive_mp功能标志,例如--features "non_interactive_mp"。要使用库进行交互式多方,您必须添加interactive_mp功能标志,例如--features "interactive_mp"

FheUInt8

我们为所有基本算术运算(+,-,x,/,%)和比较运算提供API。

默认情况下,所有算术运算都进行环绕(即FheUint8为$\mod{256}$)。我们还提供了overflow_{add/add_assign}overflow_sub,它们返回一个标志密文,如果加法/减法溢出则设置为True,否则为False

除法运算(/)返回quotient,余数运算(%)返回remainder,满足dividend = division x quotient + remainder。如果需要同时获取quotientremainder,则可以使用div_rem。在除以零的情况下,将设置除以零错误标志,并且将quotient设置为255,将remainder设置为等于dividend

除以零错误标志

在加密域中,在运行时无法通过除以零进行恐慌。相反,我们设置一个局部标志div_by_zero_flag,可以通过div_by_zero_flag()访问,该标志存储一个布尔加密文本,表示在执行过程中是否进行了除以零的尝试。假设除以零检测对您的应用程序至关重要,我们建议在多方解密过程中解密标志加密文本以及其他输出加密文本。

除以零标志是线程局部变量。如果您在单个程序中连续运行多个不同的FHE电路而不停止线程(即,在单个程序中),您必须在启动下一个顺序电路执行之前使用reset_error_flags()重置除以零错误标志。

有关更多详细信息,请参阅div_by_zero示例。

使用mux的if和else

在加密域中,分支是昂贵的,因为必须执行所有分支。因此,成本随条件分支数量的指数增长。一般来说,我们建议修改代码以最小化条件分支。然而,如果代码无法修改为无分支,我们提供了FheUint8s的mux API。mux根据选择位选择两个FheUint8s之一。有关更多详细信息,请参阅if_and_else示例。

安全性

[!警告] 代码尚未经过审计,我们目前不提供任何除密码学参数之外的安全保证。我们不推荐在生产环境中部署它或用于处理敏感数据。

所有提供的参数都根据lattice estimator是$2^{128}$环操作安全的,并且失败概率为$\leq 2^{-40}$。然而,有两个关键点需要注意

  1. 用户不得为同一密文生成两个不同的解密份额,因为这可能导致密钥恢复攻击。为了避免这种情况,我们建议用户维护一个本地表,列出密文与任何之前生成的解密份额。然后,只有在密文不在表中时才生成新的解密份额,否则返回现有份额。我们相信这应该由库处理,并将在未来添加对此的支持。
  2. 用户不得为同一应用程序种子运行MPC协议超过一次并产生不同的输出,因为这可能导致密钥恢复攻击。我们相信这应该由库处理,并将在未来添加对此的支持。

致谢

  • 我们感谢Barry Whitehat和Brian Lawrence进行了许多有益的讨论。
  • 我们感谢Vivek Bhupatiraju和Andrew Lu就迷人的幻影区域应用进行了许多富有洞察力的讨论。
  • 非交互式多方RLWE密钥生成方案是由Jean Philippe和Janmajaya设计的新协议。我们感谢Christian Mouchet对该协议的审查和有益的建议。
  • 我们感谢Yao Wang帮助解决rust编译器问题。

参考文献

  1. 高效FHEW引导与小型评估密钥,及其在门限同态加密中的应用
  2. 基于环学习错误的多方同态加密

依赖项

~4MB
~75K SLoC