首页 > 其他分享 >Laconic Private Set-Intersection From Pairings (2022)

Laconic Private Set-Intersection From Pairings (2022)

时间:2024-07-30 23:40:58浏览次数:16  
标签:Set Laconic Private right 计算 left 服务端 客户端

Laconic Private Set-Intersection From Pairings (2022)

论文地址:https://eprint.iacr.org/2022/529.pdf
代码地址:https://github.com/relic-toolkit/relic/tree/main/demo/psi-client-server
代码运行参考:RELIC 库学习

Laconic 算法介绍

Laconic 适用于算力和存储受限的客户端与算力和存储能力强大的服务器进行交互的场景。

问题:目前的 PSI 方案需要服务端和客户端之间进行复杂的计算,这对算力较弱的客户端很不友好,因为不可能要求其下载并保存巨量的数据,并基于这些数据完成复杂的计算。

2017 年,CDG 等人提出了 Laconic 的概念,Laconic 是一个在具有大输入的接收方 R(这里指服务端)和具有小输入的发送方 S(这里指客户端)之间的交互式协议,协议通常需要满足下列三个性质:

  1. 协议应当仅包含两条消息(也即 Laconic)
  2. 发送方(客户端)的总通信开销与接收方(服务端)的输入大小无关
  3. 接收方(服务端)的第一条消息应该可以被多个不同的发送方 \(S_i\)(客户端)复用,即计算一次,多次使用

本文所提出的两方 Laconic PSI,满足上述三个性质,旨在从理论和时间角度最大限度的减少发送方(客户端)的开销,发送方(客户端)的消息大小与其输入集合呈线性关系,发送方(客户端)的计算开销与接收方的输入无关。

但是,该算法需要在服务端进行大量的计算,服务端的压力比较大。

PSI Protocol

\(X_{-i}:=X \backslash\left\{x_i\right\}\):即将 \(x_i\) 从原集合中删除,剩下的元素组成的新的集合:

\[P(X, s) = \prod_{x \in X}(x-s) = \sum_{i=0}^{|X|} p(X, i) s^i \]

\[P(X, s)=P\left(X_{-i}, s\right) \cdot\left(x_i-s\right) \]

协议的具体流程如下:

序号 阶段 服务端 Receiver 客户端 Sender
服务端和客户端共享:
1. \(H:\{0,1\}^* \rightarrow\{0,1\}^\lambda\)
2. \(e: \mathbb{G}_1 \times \mathbb{G}_2 \rightarrow \mathbb{G}_T\)
0 Setup \(X=\left\{x_1, \ldots, x_m\right\}\)
获得 \(\operatorname{setup}_{\mathcal{R}}\)
可信第三方选择 \(s \in \mathbb{Z}_q^*\)
1. 计算 \(\operatorname{setup}_{\mathcal{R}}=\left(S_1, S_2, \ldots, S_m\right)\) 传给服务端:\(S_i=g_2^{s^i} \text { for } i=0, \ldots, m\)
2. 计算 \(\operatorname{setup}_{\mathcal{S}}=\left(S^{\prime}\right)\) 传给客户端:\(S^{\prime}=g_1^s\)
\(Y=\left\{y_1, \ldots, y_n\right\}\)
获得 \(\operatorname{setup}_{\mathcal{S}}\)
1 First Round 将 \(R\) 传给客户端
\(\to\)
获得 \(R\)
2 Second Round 获得 \((T_j, U_j)\) 将 \((T_j, U_j)\) 传给服务端
\(\leftarrow\)
计算 \((T_1, U_1, ..., T_n, U_n)\)
\(T_j = H\left(e\left(g_1^{t_j}, R\right)\right)\\ U_j = \left(S^{\prime} \cdot g_1^{-y_{\pi(j)}}\right)^{t_j}\)
3 RetrieveOutput 对每个 \((T_j, U_j)\) 对,计算:
For j = 1 to n:
For k = 1 to m:
如果 \(H\left(e\left(U_j, R_{-k}\right)\right) \stackrel{?}{=} T_j\),则表明 \(x_k = y_{\pi(j)}\), 即 \(x_k\)为交集中元素

从上述 Laconic-PSI Protocol 可知:

  1. 服务端与客户端仅有两次交互
  2. 客户端的总通信开销仅与客户端的输入大小有关:\((T_j, U_j)\)
  3. 服务端需要计算一个 R 和 m 个 \(R_{-k}\),每个值的计算量都非常大(\(R_{-k}=\left(\prod_{i=0}^{m-1} S_i^{p\left(X_{-k}, i\right)}\right)^r=\left(\prod_{i=0}^{m-1} g_2^{{s^i}\times {p\left(X_{-k}, i\right)}}\right)^r\)),这导致服务端的计算耗时比较大,但是可以复用。如果服务端数据保持不变,\(R\) 和所有的 \(R_{-k}\) 首次计算后可以在多个客户端之间进行复用,但是,一旦服务端数据发生改变(例如增加了新的数据),所有的 \(R\) 都需要重新计算
  4. 在最后的求交阶段(Retrieve Output),每个 $y_j $(或者说 \((T_j, U_j)\))需要和 m 个 \(R_{-k}\) 进行“比较”,也就是说,为了判断某个 $y_j $ 是否在交集内,我们最多需要计算 m 次,那么总的计算复杂度为 \(O(mn)\),这也导致服务端的计算耗时比较大。论文 4.4 中提到了分桶(bucketing)的优化方案,可以将这一步中的计算复杂度由 \(O(mn)\) 降低到 \(O(mn/t)\),但是该优化方案会增大 First Round 阶段服务端的计算和传输数据量,具体而言,优化方案的步骤如下:
    1. 使用哈希函数,将服务端的数据 X 先分装到 \(t\) 个哈希桶中,这样每个桶中的数据量为 \(m/t\)
    2. 使用相同的哈希函数,将客户端的数据 Y 也分装到 \(t\) 个哈希桶中,每个桶的数据量为 \(n/t\)
    3. 然后服务端和客户端对应的哈希桶独立地进行上述算法中 First Round 和 Second Round 的计算,即服务端需要对每个桶中的数据独立计算 R 和 \(m/t\) 个 \(R_{-k}\),客户端也对每个桶的数据独立计算 \((T_j, U_j)\)
    4. 这样在 Retrieve Output 阶段,需要比较的次数不再是 \(m \times n\),而是 $t \times m/t \times n/t = mn/t $
img

证明算法正确性

证明上述算法的正确性:即当 \(H\left(e\left(U_j, R_{-k}\right)\right) \stackrel{?}{=} T_j\) 时,可以证明 \(x_k = y_j\) 为交集中的元素。证明过程如下:

img img

勘误:服务端需计算 m (非 m-1)个 \(R_{-k}\) 值,k 取值从 1 到 m

与 NR-PSI 比较

服务端的集合大小 \(N_s\) >> 客户端的集合大小 \(N_c\)

两方交互次数 通信开销 客户端所需容量 何方计算交集? 计算交集时客户端的每个元素所需的比较次数 服务端计算量 当服务端增加新元素
NR-PSI 3 + 1 + 2 = 6 与服务端的集合大小线性相关 较大,需存储服务端的全部数据(哈希桶) 客户端 3 + s(布谷鸟哈希) 较小 仅需将新元素加密后插入哈希桶中,然后将新桶发送给客户端
Laconic PSI 2 与客户端的集合大小线性相关 较小,仅与客户端集合大小线性相关 服务端 \(N_s\) 较大 $$ 与 所有的 \(R_{-k}\) 都需要重新计算,计算量较大

NR-PSI 的交互次数计算如下:参考 隐私求交代码实践

  1. Base Phase:R-OT 需要两方进行 3 次交互
    1. 服务端 \(\to\) 客户端:\((h_0, h_1)\)
    2. 服务端 \(\leftarrow\) 客户端:\((v_0, v_1)\) 和 \(u\),OT 阶段结束
    3. 服务端 \(\leftarrow\) 客户端:\(u^i = G(k_{i,0})\bigoplus G(k_{i,1})\bigoplus r\),R-OT 结束
  2. Setup Phase:1 次,传输 CF
    1. 服务端 \(\to\) 客户端:Cuckoo Filter (CF)
  3. Online Phase:2 次
    1. 服务端 \(\leftarrow\) 客户端:\(b_{i,j} = c_{i,j} \bigoplus y_i[j]\)
    2. 服务端 \(\to\) 客户端:\(r_{i, j}^{1-b_{i, j}} \oplus\left(r_{i, j}^{b_{i, j}} \cdot a_j\right)\) 和 \(\tilde{g}\)

参考资料

  1. 双线性对在密码学中的应用(下)
  2. ECC 椭圆曲线原理
  3. ECC 椭圆曲线密码学的原理、公式推导、例子、Python 实现和应用

标签:Set,Laconic,Private,right,计算,left,服务端,客户端
From: https://www.cnblogs.com/lockegogo/p/18333571

相关文章

  • C++里memset的使用
    在C++中使用memset函数涉及几个关键点,‌包括函数的正确调用方式、‌参数的理解以及注意事项。‌memset函数是C和C++语言标准库中的一个函数,‌用于将内存区域设置为特定的值。‌它的基本语法如下:‌void*memset(void*s,intc,size_tn);第一个参数是一个指向要被填充的内存......
  • DC综合时set_ideal_network -no_propagate
    在DesignCompiler(DC)综合过程中,set_ideal_network命令用于指定理想网络(idealnetwork),这些网络通常不会被综合工具修改。这些网络的延迟和负载被忽略,从而简化了综合过程。举例set_ideal_network-no_propagate[all_high_fanout-nets-threshold256] set_ideal_ne......
  • Android开发 - setOnTouchListener 监听触控事件解析
    事件解析setOnTouchListener(newOnTouchListener(){});:事件分发解析MotionEvent.ACTION_DOWN:按下MotionEvent.ACTION_MOVE:滑动MotionEvent.ACTION_UP:抬起使用方法//部分区域调用需要对象:view.setOnTouchListener(newview.OnTouchListener(){})setOnTouchListe......
  • Django&rest_framework - 方法 get_queryset 被调用两次,还有其他更好的解决方案吗?
    目前,我有一个使用django和rest_framework来运行一些基本API的项目。问题是,当我使用rest_framework和DjangoModelPermissions上的通用库创建视图时,我的方法get_queryset被调用两次My权限类classDefaultModelPermissions(DjangoModelPermissions):"""......
  • STL用法总结(二)(deque,map,set)
    4.deque(双端队列)1.介绍首尾都可插入和删除的队列为双端队列#include<deque>//初始化定义deque<int>dq;2.方法函数代码含义q.push_back(x)/pusu_front(x)把x插入队尾/队首q.back()/front()返回队尾/队首元素q.pop_back()/pop_front()删除队尾/队首元素q.erase(ite......
  • 调和阶段setState干了什么?
    调和阶段:在react中,当组件的props或state发生变化时,react会开始一个新的渲染过程。这个渲染过程包括几个阶段,其中之一就是调和阶段。在这个阶段,react会比较新旧虚拟DOM树之间的差异,并计算出需要更新的最小集合。setState干了什么?触发更新:当你调用setState时,你实际是告诉Re......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-14 SPI MASET发送程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述SPI的发送器驱动......
  • 编译安卓系统源码时,执行 source build/envsetup.sh 的目的
    在编译安卓系统源码时,执行sourcebuild/envsetup.sh的目的是设置环境变量和提供一些编译所需的函数和工具。具体来说,这个脚本的作用包括:设置环境变量:envsetup.sh脚本会设置一些关键的环境变量,例如PATH和ANDROID_BUILD_TOP。ANDROID_BUILD_TOP是指向安卓源码根目录的路......
  • setpci 使用方法
    以设置PASIDcapabilityenable为例,假设通过lspci-s0d:00.0-vvvv显示如下..........在键入命令lspci-s0d:00.0-xxxx显示如下...........根据协议如下:那么可以对照如下因此,我们可以这样设置:setpci-s2d:00.020a.b=07设置完成后,lspci看一下结果,如下:就成功了......
  • 如何在QTextEdit中实现类似于PyQt6中QLineEdit的.setMaxLength的.setMaxLength?
    我正在寻找一种方法来实现上述内容。我创建了一个自定义QTextEdit,它在下面的QLabel中显示字符数和允许的字符数。当我创建此类的实例时,一切都按预期工作,除了我尝试重新创建的.setMaxLength函数。下面是我的自定义QTextEdit类classCustomTextEdit(QWidget):def__in......