Laconic Private Set-Intersection From Pairings (2022)

news/2024/11/16 2:44:25/文章来源:https://www.cnblogs.com/lockegogo/p/18333571

Laconic Private Set-Intersection From Pairings (2022)

[!IMPORTANT]

论文地址: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\) 为交集中的元素。证明过程如下:

imgimg

勘误:服务端需计算 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 实现和应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

供热从清洁走向智慧

清洁供热是一种以末端需求为核心的拉动式供热方式,可以通过全面实施智慧供热,实现热电协同、多能互补,以打通供热最后一公里,使供热更加智慧化、高效化、绿色化。“清洁供热是一种以末端需求为核心的拉动式供热方式,可以通过全面实施智慧供热,实现热电协同、多能互补,以…

netty核心流程(一):服务端如何建立连接

为了接收连接请求, Netty 服务端应该做些什么事情? 根据Java NIO 的知识,服务端在准备接收客户端连接之前做了下面几个工作,我们可以带着问题往下看。服务端对连接请求是如何初始化的? 如何把用户定义的处理逻辑 childHandler 加入到 Netty 的处理流程里? 如何在 Socket …

Logisim-008-16位无符号比较器

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

springboot项目使用自定义starter

首先是自定义的starter部分 pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:…

SQL执行顺序和逻辑

SQL执行顺序和逻辑 MySQL的执行顺序:(9) SELECT (6) SUM(聚合函数) (10) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> …

后缀数组 - half

后缀数组 后缀数组可以解决有关后缀的问题废话。那么暴力做法肯定是把每个后缀全部取出来,然后按照字典序排序,但是这样复杂度是 \(\Theta(n^2\log n)\) 的。 后缀数组可以解决以下问题:最长重复子串 多个串的最长公共子串 不同子串个数算法详解 面对这些问题,我们需要 \(3…

Misc专项

一:文件操作与隐写 1、文件类型的识别 1、文件头完好情况: (1)file命令 使用file命令识别:识别出file.doc为jpg类型(2)winhex 通过winhex工具查看文件头类型,根据文件头部内容去判断文件的类型eg:JPG类型(3)notepad++ 下载HEXeditor插件,查看文件的头部信息,和010e…

zookeeper未授权访问(CVE-2014-085)

漏洞描述 默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据 漏洞影响 Apache ZooKeepe…

如何自动实现本地AD中禁用的用户从地址列表中隐藏掉?

我的博客园:https://www.cnblogs.com/CQman/ 如何自动实现本地AD中禁用的用户从地址列表中隐藏掉?需求信息:用户本地AD用户通过ADConnect同步到O365,用户想实现在本地已做同步的OU中禁用某一用户后,其可以自动实现把该用户从地址列表中隐藏掉。用户的ADConnect同步工具装在…

go高并发之路——消息中间件kafka(上)

一般高并发的业务都是某个时间段的请求量特别大,比如本人负责的直播业务,基本上一天就两个高峰段:早上和晚上的特定时间段。其它的时间里,流量基本都比较平稳。那么面对流量高峰,我们可以采取哪些措施呢?常见的有服务器和DB提前扩容、监控告警(盯监控)、流量削峰、加缓…

数组及数组JVM内存划分day4

java中第一个存储数据的容器:数组特点:1、数组的长度大小是固定的2、同一个数组中,存储的元素数据类型是一样的数组的定义语句格式:数据类型[] 数组名;举例:int[] arr; // 定义了一个可以存储int类型的一维数组,数组名叫做arr数组没有初始化,无法直接使用,数组是我们第…

借助流程表单设计器开源为流程化办公赋能

借助流程表单设计器做好数据管理工作,为行业发展贡献整套低代码技术平台解决方案。在经济高速发展的今天,想要实现流程化办公和数字化转型,需要利用更优质的平台为其加油助力。低代码技术平台、流程表单设计器开源为各行各业流程化办公高效赋能,一起摆脱信息孤岛、部门沟通…