基于DH密钥交换

基于Diffie–Hellman密钥交换的协议

Diffie-Hellman密钥交换协议是用来解决在公开网络中,密钥传输的问题。

关于DH密钥交换协议

传统的 PSI 协议针对 2 个参与方设计, Meadows 基于公钥加密和利用 Diffie-Hellman 密钥交换的乘法同态性质提出了第1个PSI协议, 随后, 由Huberman 等人[7]对 Meadows[6]的方案做出了完整描述。

定义:Diffie-Hellman​密钥交换算法:

两个全局公开的参数,一个素数​q和一个整数a​,其中a是q​的一个原根。

A和B希望交换一个密钥,用户A选择一个作为私钥的随机数XAXA<q),并计算公钥YA=aXAmodq。B对XB的值保密存放而使YB能被A公开获得。

用户A产生共享秘密密钥的计算方式是K= (YB)XAmodq.同样,用户B产生共享秘密密钥的计算是K= (YA)XBmodq 。这两个计算产生相同的结果:

K=YBXAmodq=aXBmodqXAmodq=aXBXAmodq

=aXAXBmodq=aXAmodqXBmodq=YAXBmodq

因此相当于双方已经交换了一个相同的秘密密钥。

因为XAXB是保密的,任意一方可以利用的参数只有q,a, YAYB .因而如果一方想要破解对方的随机数,只能取离散对数来确定密钥。

由上述密钥交换算法,我们可以看出此协议适用于交换密钥,从而用于对比对比两元素是否相同。设发送方A持有集合X=x1,…,xn,接收方B持有集合Y=y1,…,yn,那么求出集合双方的交集实质可以转换为判断集合X中的每一个元素是否在集合Y中,也就是执行n次隐私成员查询。双方的交互分为两轮:

第一轮:首先A选择一个Hash函数H,并随机选择一个数a,将自己所有元素进行hash,并将Hx1a,…,Hxnamod p  打乱顺序后发送给B。同时 B也随机选择一个数b,将自身所有元素hash,将Hy1b,…,Hymbmod p 打乱顺序后发送给A。

第二轮:在双方收到对方发来的集合后,A将Hy1ab,…,Hymab mod p发送给B,B将Hx1ab,…,Hxnabmod p发送给A。现在集合双方可以通过以下方式计算出交集:对于在交集中的元素xi=yjHxiab一定在于双方的hash集合中都会出现,因为Hxiab=Hyiab。同样的,若xi不在交集中,仅存在于一方的集合中,那么Hxiab存在于双方的hash集合中的概率为可忽略的。

在协议的设计之初,这个方案被用于测试双方的交集大小是否满足超过一个门限,因此我们上述所说明的协议仅仅揭示交集的大小而不揭示交集的具体内容。如果想要求出交集的具体信息,我们可以仅在第一轮交互时打乱顺序,第二轮不打乱顺序,在这种情况下,A或B可以在第二轮收到的集合中找到哪些hash值在交集中,并根据其在集合中的位置,找到对应于自身集合中的哪些元素。具体来说,假设A根据双方第二轮的交互信息中发现,B发给自己的集合中的第i个元素Hxab,也存在于自己发给B的集合中,且B是诚实方不作恶的话,那么A可以确定,自己第一轮发送给B的集合中的第i个元素Hxa所对应的元素x一定在双方集合中的交集中。

基于多项式

参考文献:Freedman M, Nissim K, Pinkas B. Efficient private matching and set intersection[C/OL]// Proc of the 23rd Int Conf on the Theory and Applications of Cryptographic Techniques. Berlin: Springer, 2004[2020-10-16].

2004 年,由 Freedman 等人借助不经意多项式求值和同态加密构造了第1个安全 PSI 协议,这也是首个基于多项式的协议。

这个协议的构造需要使用一种语义安全的公钥加密方案,需要保留加法的群同态性,并允许常数乘。Paillier同态加密及其后续构造满足此性质。具体的说,在仅有加密公钥而没有撕咬的情况下,加密算法需要支持以下两种操作:(1)给定enc(m1)和 enc(m2),我们可以高效计算enc(m1+m2)(2)给定enc(m1)和常数c,我们可以计算enc(cm1)。我们将基于以上两种性质,在给定一个k次多项式P的系数的密文a0,…,ak,以及明文y,我们能够计算P(y)的密文。

这个协议的主要执行过程是:首先生成同态机密的密钥对(pk,sk)然后将公钥发送给服务器端,同时将自己的元素的集合X=x1,…,xn编码为多项式P,其中

P(x)=x1-xx2-xxn-x=u=0nauxu.

对于这个多项式,我们可以发现如果属于X集合中的元素代入多项式,则多项式的结果为0;反之若将一个不属于集合X的元素带入多项式,则多项式的结果并不为0.

之后,我们将多项式的(n+1)个系数使用同态加密后获密文,将密文集合发送给服务器端。

服务器S收到同态加密的多项式后,对于y∈Y,其可以利用加密算法的同态性质来计算S的每个输入处的多项式,即计算Enc(P(y))=Enc(u=0nauyu).之后,服务器端选择一个随机值r,利用同态性计算密文乘r,从而得到一个中间结果Enc(rP(y)),并加上其输入的密文,即,S计算Enc(rP(y)+y).最后,服务器端得到集合{Enc(rP(y)+y)}y∈Y,这个集合里元素的数目与服务器端的集合数目相同。服务器将集合的顺序打乱后(不打乱的话可能泄露服务器端的元素)返回给客户端。客户端将所有收到的密文解密,由于对于双方交集中的每一个元素,P(y)=0,因此这个计算的结果是对应元素的值的密文Enc(y),而对于所有其他值,由于r的存在,结果都是随机的。因此,解密之后客户端就可以根据解密的结果判断出对应的元素是否在交集中,从而输出交集。

这个协议的一个缺点是,对于较大的集合,多项式的次数过高,从而会使同态加密的运算中指数的计算代价过高。针对这个问题,作者又提出了使用hash函数将元素映射到B个桶中,每个桶中至多有M个元素,这样可以针对每个桶设置一个最高次数为M的低次多项式。服务器端采用相同的Hash函数将元素进行映射,客户端将相对应同理的元素和多项式进行集合交集判断。具体做法是:客户端为每个箱子定义了一个M次的多项式:所有被hash函数h映射到箱子的项被定义为多项式的根,如果桶没有被映射满的话,则客户端添加根为0的因式,以达到多项式的最高次为M。也就是说,如果h将l个元素映射到某一个桶中,那么首先计算这些元素所对应的多项式,然后将多项式乘xM-l(我们这里假设0不是一个有效的输入),最后,我们能够得到B个M次的多项式,他们总共有n个非0根。

客户端C将加密的多项式系数以及映射关系发送给服务器S之后,S对自己集合中的每一个元素,首先找到对应映射到的桶的加密的多项式,然后计算加密多项式的值,其余步骤与前面相同。

基于OPRF(茫然伪随机函数)的PSI

参考文献:Pinkas, B., T. Schneider, G. Segev, and M. Zohner. 2015. “Phasing: Private Set Intersection Using Permutation-based Hashing”.

In: 24th USENIX Security Symposium. Ed. by J. Jung and T. Holz. USENIX Association.

515–530. url: https://www.usenix.org/conference/usenixsecurity15.

假设A持有一组输入X,B有一组输入Y,二者的大小都为n,通过不经意伪随机函数,我们可以构造出一个非常朴素的隐私集合求交算法:

1.A构造n个不经意伪随机函数的种子ki ,i∈{0,1.…n-1}

2.B为Y中每一个元素yi,执行一个对应不经意伪随机函数F(ki·),,得到集合

HB={F(ki,yi)|yi∈Y}

3. A为X中的每一个元素x,执行每一个不经意伪随机函数,得到集合

H={F(ki,x)| xX}

4.A将集合HA发送给B,B求交集HAHB,再将交集映射回Y,即可得到X与Y的交集

这种方法简单来讲,就是B将每一个Y中的每一个元素,都与A的X中的每一个元素,通过不经意伪随机函数进行隐私比较,进而得到X与Y的交集。

这种方法虽然直观,但是开销很大,因为集合HA的大小是  O(n2) ,当集合大小n增长时,传输量增长很快。

那么,我们有没有办法将集合大小限制在O(n)呢?答案是可以的。这需要使用到哈希表的思想。这里,我们使用布谷鸟哈希(Cuckoo hashing)来解决这个问题。

我们首先简单介绍一下布谷鸟哈希。假设我们想要使用布谷鸟哈希, 将n条数据放入b 个桶中, 则我们首先选择3 个哈希函数h1h2h3{01}*[b], 以及b 个空的桶B[1...b] 。要放入一条数据x。首先查看3 个桶B [h1(x)] ,B [h2(x)],B [h3(x)]是否有空的,如果有空的,则将放入空桶。如果没有空桶,则从这三个桶中随机选择一个桶B[hix],i{12,3},踢出原来在这个桶中的元素,并将x放进这个桶中, 然后再继续尝试插入被踢出的元素。递归地执行这一过程, 直到元素被放入一个空桶中。如果经过一定轮次后, 仍然找不到空桶放入元素,那么就将被踢出的元素放到一个特殊的桶中,这个桶被称为stash。

现在回到隐私集合求交的构建中,让我们看看如何在隐私集合求交中使用布谷鸟哈希。首先,A、B双方共同选择三个哈希函数h1h2h3.然后,B将其持有的n个元素Y,使用布谷鸟哈希,放入1.2n个桶与一个储藏桶stash中,储藏桶的大小为s。对B来说,现在每个桶中最多只有一个元素,并且储藏桶的中,最多有s个元素。B构造假数据将这些桶和stash填满。

然后,A生成1.2n+s个随机种子ki ,i∈{0,1.…1.2n+s},用作1.2n+s个不经意伪随机函数的随机种子。B作为接收方,为其桶中的每一个元素y,计算不经意伪随机函数。如果y被放在i号桶中,则计算F(ki,y),如果被放在stash中则计算F(k1.2n+i,y).

另一边,A作为发送方,可以任意地计算伪随机函数F(ki,·) ,那么,A可以为其输入X计算以下两个集合:

H=Fkhi(x),x∣x∈X,i∈{1,2,3}S=Fk1.2n+j,x∣x∈X,j∈{1,2,…,s}

A将集合H和集合S中的元素打乱,并将这两个集合发送给B。对于B来说,如果一个元素y被放到stash中,则B可以在集合S中查找y对应的不经意伪随机函数输出;否则,就在集合H中查找。查找到所有伪随机函数的输出后,他们所对应的元素就在X与Y的交集中。

PSI(隐私集合求交集)的几类基础思想相关推荐

  1. 云辅助隐私集合求交(Server-Aided PSI)协议介绍

    背景 隐私集合求交(Private Set Intersection,PSI)是安全多方计算的一个特定问题,允许参与方输入私有集合,共同计算私有集合交集且不泄露除交集以外的任何信息. 隐私集合求交基数 ...

  2. 隐私集合求交(PSI)协议研究综述

    摘要 隐私集合求交(PSI)是安全多方计算(MPC)中的一种密码学技术,它允许参与计算的双方,在不获取对方额外信息(除交集外的其它信息)的基础上,计算出双方数据的交集.隐私集合求交在数据共享,广告转化 ...

  3. 多方隐私集合求交高效算法解读

    前言 之前我们介绍过两方的「隐私集合求交算法」,可以应用到计算广告的实际效果,寻找联系人,联邦学习的特征对齐等场景,例如:在新的APP上找到共同的微信好友.开会时找到所有参会者共同的空闲时间等,但是这 ...

  4. java 交集_Java大集合求交集的方法比较

    两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了J ...

  5. JAVA——两个List集合求交集、并集和差集(去重)模板

    关注微信公众号:CodingTechWork,一起学习进步. 引言   经常遇到一些集合类之间的过滤数据.求合集之类的问题,在此以List为例,毕竟在数据库中取数据后,我们使用比较多的是List集合进 ...

  6. 大数据集合求交集_Java8 实现ArrayList求交集并集差集

    本文借助Java8的Stream API完成ArrayList集合运算:求交集.并集和差集! public class CollectionUtil {/*** 判断为空*/public static ...

  7. 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?

    犹记得老师敲着黑板,强调"集合"的特性:无序.不重复,没想到多年后在咱们编程中派上了用场. 集合 # 数据分析中,经常需要把字符串.列表中的数据去重,怎么办呢?用"集合& ...

  8. 【分享】Java集合求交集、并集、差集

    面试场景: 之前遇到一个长得很有趣的面试官问两个集合怎么求他们的交集.并集.茶集,回答之后觉得非常有意思,在这里记录一下: 概念说明 一.交集 交集:两个集合的公共(相交)部分,如下图: 代码案例: ...

  9. 基于RSA盲签名的隐私集合求交PSI算法

    记录一种PSI算法. 在<Practical Private Set Intersection Protocols with Linear Computational and Bandwidth ...

  10. 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)

    题干: Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the Germ ...

最新文章

  1. prozilla Linux下的下载利器
  2. 腾讯员工中66%是研发,用C++最多,去年新写12.9亿行代码
  3. 【整理】RPA选择器针对SAP系统的设置
  4. java线程三种方法,Java基础_线程的使用及创建线程的三种方法
  5. ISA Server 2006 部署步骤
  6. 静态路由心法口诀:路由表少什么网络加什么网络
  7. python wmi 重启网卡_python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法...
  8. 新辰:传统行业进军互联网 怎样颠覆网络获得新生?
  9. Redfish 的版本怎么看
  10. 《动手学深度学习》学习总结
  11. Bluetooth HCI介绍
  12. 大学生计算机PHP实训报告,大学生计算机实训心得体会
  13. 十五、2021-11-16Hadoop集群问题记录
  14. 转贴: 辞职日记----记录31岁的程序员跳槽心态
  15. ANSI编码和UTF-8的区别
  16. 如何使用Python发送库存更新
  17. unity 性能优化之遮挡剔除(Occlusion Culling) 官方版
  18. No Brainer 超级水
  19. 深度摄像头ORBBEC Dabai Pro调试
  20. 【小程序】微信小程序报错47001 - data format error hint

热门文章

  1. 开关量模块——一对多无线传输
  2. linux rpm是啥意思,rpm是什么意思?
  3. ActiveMQ反序列化漏洞CVE-2015-5254复现
  4. 初学爬虫,简单爬取必应壁纸
  5. 计算机上装的word怎么卸载,如何彻底删除电脑上的office软件
  6. 实施工程师面试技巧 –立哥经验
  7. Spark Streaming官网重点整理
  8. Mysql之DDL(数据定义语言)
  9. linux硬盘坏了无法查看分区,Linux 磁盘坏道检测和修复 查看硬盘坏道代码
  10. 计算机应用基础都学什么,计算机应用基础学习计划