阈值PSI

若交集数量超过某个给定阈值时,允许分布式的各个参与方在自己集合中找到交集,且除了交集外,得不到其他额外信息。

实现论文: Multi-Party Threshold Private Set Intersection with Sublinear Communication

源码地址:https://github.com/ontanj/tpsi

其中\(F_{TPSI-int}\)做出部分修改,因为基于TFHE无法实现自举(bootstrapping)技术。

用到的加密算法:

\(TAHE\):Paillier-https://github.com/niclabs/tcpaillier

\(TFHE\):BFV-https://github.com/ldsec/lattigo

接口:

(1)AHE_CryptosystemFHE_Cryptosystem实现同态运算

type AHE_Cryptosystem interface {

    // 密文+密文
Add(Ciphertext, Ciphertext) (sum Ciphertext, err error) // 密文^{明文}
Scale(cipher Ciphertext, factor *big.Int) (product Ciphertext, err error) // 加密
Encrypt(*big.Int) (Ciphertext, error) // 聚合明文
CombinePartials([]Partial_decryption) (*big.Int, error) // 计算加密矩阵
EvaluationSpace() gm.Space // 明文空间大小
N() *big.Int
}
type FHE_Cryptosystem interface {
AHE_Cryptosystem // 密文*密文
Multiply(Ciphertext, Ciphertext) (Ciphertext, error)
}

(2)AHE_settingFHE_setting包含参与方数量、阈值大小和通信方式

type AHE_setting interface {
// 阈值
Threshold() int // 参与方
Parties() int // AHE
AHE_cryptosystem() AHE_Cryptosystem // central方发布消息给其他方
Distribute(interface{}) // 其他方给central方传递消息
Send(interface{}) // central方给指定方发送消息
SendTo(int, interface{}) // central方等待来其他方的消息,并将其(按顺序)分组
ReceiveAll() []interface{} // 接手central方的消息
Receive() interface{} // 判断是否为central方
IsCentral() bool
}
type FHE_setting interface {
AHE_setting // FHE
FHE_cryptosystem() FHE_Cryptosystem
}

本实验是在一台机器上模拟多方通信,通过goroutine实现。

goroutine:在go语言中,每一个并发的执行单元叫做goroutine,如果一个程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。

运行:

go run main/main.go diff dj 7 main/elements

其中FTPSI-diff使用的是TAHE,阈值为7。

功能:

(1)TPSIdiffWorker,在交集测试下求交集和差集

(2)TPSIintWorker:在差集测试下求交集和差集

测试:

P1:0,3,6,9,13,16
P2:0,3,6,9,14,17
P3:0,3,6,9,14,15
P4:0,3,6,9,12,17
P5:0,3,6,9,13,15 T=7 //交集大时用TFHE求
go run main/main.go int bfv 7 main/elements
//差集小时用TAHE求
go run main/main.go diff dj 7 main/elements
//差集小时用TFHE求
go run main/main.go diff bfv 7 main/elements
s/秒 int diff
TFHE 515.532007 2391.952714
TAHE / 26.436323

总结

用FHE实现,效率是显而易见的!

阈值PSI代码的更多相关文章

  1. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  2. 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  3. 【图像算法】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    图像算法:图像阈值分割 SkySeraph Dec 21st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified Da ...

  4. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  5. Emgu学习之(四)——图像阈值

    http://www.cnblogs.com/CoverCat/p/5043833.html Visual Studio Community 2015 工程和代码:http://pan.baidu.c ...

  6. 【学习opencv第七篇】图像的阈值化

    图像阈值化的基本思想是,给定一个数组和一个阈值,然后根据数组中每个元素是低于还是高于阈值而进行一些处理. cvThreshold()函数如下: double cvThreshold( CvArr* s ...

  7. 【转】Emgu 图像阈值

    原文地址:http://www.cnblogs.com/CoverCat/p/5043833.html 转载,备查 Visual Studio Community 2015 工程和代码:http:// ...

  8. opencv之图像阈值化处理

    一.函数简介 1.threshold-图像简单阈值化处理 函数原型:threshold(src, thresh, maxval, type, dst=None) src:图像矩阵 thresh:阈值 ...

  9. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

随机推荐

  1. keil工程当中实现printf重定向串口打印

    之前是完全不知道printf可以重定向设置 最近才发现还有这等好事,可以让printf直接实现串口打印 在网上找了很多资料,终于实现了我想要的效果 原理:printf是通过调用底部的fputc来实现打 ...

  2. 基于Docker&Kubernetes构建PaaS平台基础知识梳理

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 基于Docker&Kubernetes构建Paa ...

  3. 关于我学git这档子事(2)

    将本地main分支push到远程dev分支(不同名分支间的push) 远程dev分支还未创建 (在push同时创建远程dev分支,并将本地main分支内容上传) git push -u --set-u ...

  4. DOM获取元素、修改元素

    ## DOM获取元素.修改元素### 1.DOM#### ①什么是DOM?作用? > DOM是文档对象模型 > 作用:操作网页内容,可以开发网页内容特效和实现用户交互.#### ②DOM对 ...

  5. 《Unix 网络编程》11:名字和地址转换

    名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...

  6. 牛客多校赛2K Keyboard Free

    Description 给定 \(3\) 个同心圆,半径分别为 \(r1,r2,r3\) ,三个点分别随机分布在三个圆上,求这个三角形期望下的面积. Solution 首先可以固定 \(A\) 点,枚 ...

  7. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  8. FlinkSQL 之乱序问题

    乱序问题 在业务编写 FlinkSQL 时, 非常常见的就是乱序相关问题, 在出现问题时,非常难以排查,且无法稳定复现,这样无论是业务方,还是平台方,都处于一种非常尴尬的地步. 在实时 join 中, ...

  9. Linux文件拷贝脚本

    在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一.我们从众多的目录手工筛选要下载或者删除 ...

  10. Java开发学习(三)----Bean基础配置及其作用范围

    一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...