学习&转载文章:【隐私计算笔谈】MPC系列专题(十):安全多方计算下的集合运算
集合可以通俗地描述为确定的一堆东西。如有一个集合\(𝐴\),一个元素\(𝑐\)要么属于集合\(𝐴\),记做\(𝑐\in 𝐴\);要么不属于集合\(𝐴\),记做\(𝑐∉𝐴\),元素\(𝑐\)不能既属于集合\(𝐴\)又不属于\(𝐴\)。
集合的并集是对两个集合中的所有元素进行合并,并集运算的符号为\(∪\);集合的交集是取这两个集合中的公共元素,交集运算的符号为\(∩\)。
假设有两个集合\(𝐴={1,2,3,4} , 𝐵={1,4,7,9}\)。集合\(𝐴\)和\(𝐵\)中的公共元素为\(1,4\)。若集合\(𝐴\)和集合\(𝐵\)进行并集运算,则结果为\(𝐶=𝐴∪𝐵 = {1,2,3,4,7,9}\);
若集合\(𝐴\)和集合\(𝐵\)进行交集运算,则结果为\(𝐶={1,4}\)。
安全多方计算的目标是在不泄露各个参与者隐私信息的前提下完成目标函数的计算。隐私保护集合交运算(Private Set Intersection,PSI)可以看成是以参与者各自的隐私信息为集合,目标函数所实现的功能为集合交的安全多方计算。
隐私保护集合交的应用有通讯录匹配,如现在很多手机应用可以通过手机通讯录查找同样使用这个软件的好友,如聊天软件、具有社交属性的游戏等,用户肯定不希望自己的通讯录中的所有联系人都被软件所得知,软件则掌握有所有注册用户的手机号。
因此可以通过隐私保护集合交,计算软件注册用户手机号集合和用户自己的通讯录的交集,来寻找到同样使用该软件的好友,又不会泄露各自所掌握的手机号信息。
本次要介绍的隐私保护集合交协议是Pinkas-Schneider-Segev-Zohner (PSSZ)【Phasing: Private Set Intersection using Permutation-based Hashing-2015】 ,其基于不经意伪随机数函数OPRF(Oblivious Pseudo-random Function)来构造PSI。
首先介绍一下布谷鸟哈希(Cuckoo Hashing):
布谷鸟哈希需要\(𝑏\)个普通箱子和\(1\)个贮存区,以及\(𝑛\)个元素,将这\(𝑏\)个空箱用\(𝐵(1),…,𝐵(𝑏)\)表示。还需要三个哈希函数,记为\(ℎ1(𝑥),ℎ2(𝑥),ℎ3(𝑥)\),这三个哈希函数是将一个比特串映射到\(1,2,…,𝑏\)之间。
首先对这\(𝑏\)个空箱进行初始化,之后使用哈希函数\(ℎ1(𝑥),ℎ2(𝑥),ℎ3(𝑥)\)计算元素\(𝑥\)的哈希值,检查\(𝐵(ℎ1(𝑥)),𝐵(ℎ2(𝑥)),𝐵(ℎ3(𝑥))\)这三个箱子是否是空箱子, 如果这三个箱子中至少有一个箱子是空箱子,就把\(𝑥\)放到这个空箱子中。
如果这三个箱子都已经有元素放入了,就随机选择\(𝐵(ℎ1(𝑥)),𝐵(ℎ2(𝑥)),𝐵(ℎ3(𝑥))\)这三个箱子中的一个\(𝐵(ℎ𝑖(𝑥)),𝑖∈{1,2,3}\),用\(𝑥\)替换箱子\(𝐵(ℎ𝑖(𝑥))\)里面原来装的元素\(𝑥′\)。
接着计算\(𝑥′\)的哈希值并检查箱子\(𝐵(ℎ1(𝑥′)),𝐵(ℎ2(𝑥′)), 𝐵(ℎ3(𝑥′))\)中是否都有空箱子,有一个空箱子则把\(𝑥\)放入其中,否则在\(𝐵(ℎ1(𝑥′)),𝐵(ℎ2(𝑥′)), 𝐵(ℎ3(𝑥′))\)中随机选择一个替换其中的元素,如此开始迭代。需要预先设定一个最大迭代次数\(𝑘\),如果迭代次数超过了\(𝑘\)就把最后被替换出来的元素放入到贮存区,贮存区最多可放入\(𝑠\)个元素,箱子最多可放入1个元素。
下面使用布谷鸟哈希进行PSI
两个参与者Alice的输入集合为\(𝑋\),Bob的输入集合为\(𝑌\),集合\(𝑋\)和集合\(𝑌\)中都只有\(𝑛\)个元素。两人首先为布谷鸟哈希选择三个哈希函数\(ℎ1(𝑥),ℎ2(𝑥),ℎ3(𝑥)\)。设置的箱子数量为\(1.2𝑛\),贮存区的大小为\(𝑠\)。
Bob对其的集合\(𝑌\)中的每个元素执行布谷鸟哈希。执行完毕之后,Bob的每个箱子中最多只有一个元素,这是箱子的大小限制的,贮存区最多有\(𝑠\)个元素。由于箱子的数量为\(1.2𝑛\),集合𝑌中只有\(n\)个元素,因此此时必定有箱子是空的。
之后Bob产生随机元素,用随机元素填满所有的箱子和贮存区,使得每个箱子里都有一个元素,贮存区中有\(𝑠\)个元素。
OPRF的介绍
不经意伪随机数函数OPRF可以通过\(𝑘𝑖\)将输入映射成一个伪随机数,任意给一个随机数\(𝑟1\)和一个由输入映射成的伪随机数\(𝑟2\),攻击者无法区分出输入映射成的是\(𝑟1\)还是\(𝑟2\)。所需要使用的OPRF函数双方已经事先商议好了。
Bob在用随机元素填满所有的箱子和贮存区后,和Alice间进行\(1.2𝑛+𝑠\)次的OPRF。用\(𝑦𝑖\)表示Bob第\(𝑖\)个箱子中的元素,用\(𝑦1.2𝑛+𝑗\)表示贮存区中的第\(𝑗\)个元素。
因此在\(1.2𝑛+𝑠\)次的OPRF结束后,Bob会掌握\(𝐹(𝑘𝑖,𝑦𝑖), 𝑖∈[1,1.2𝑛+𝑠]\)。
Alice则可以根据任意的\(𝑖\)计算:
\(𝐻={𝐹(𝑘ℎz(𝑥𝑖),𝑥𝑖)|𝑥𝑖∈𝑋,𝑧∈{1,2,3}},𝑆={𝐹(𝑘1.2𝑛+𝑗,𝑥1.2𝑛+𝑗)|𝑥1.2𝑛+𝑗∈𝑋,𝑗∈ {1,…,𝑠}}\)
并打乱𝐻和𝑆中的数据顺序。Alice将\(𝐻\)和\(𝑆\)发送给Bob,Bob将\(𝐻\)和\(𝑆\)中的值与他自己在箱子和贮存区中的\(𝐹(𝑘𝑖,𝑦𝑖), 𝑖∈[1,1.2𝑛+𝑠]\)进行对比,如果Bob的\(𝑦𝑖\)对应的OPRF值\(𝐹(𝑘𝑖,𝑦𝑖)\)在\(𝐻\)或者\(𝑆\)中,那么就说明元素\(𝑦𝑖\)属于Alice和Bob的集合交集。
Alice的集合\(𝑋\)中的每个元素\(𝑥𝑖\)都被\(𝐹(𝑘ℎz(𝑥𝑖),𝑥𝑖)\)映射成了一个伪随机数,若Bob的集合\(𝑌\)中有和Alice集合相同的元素,假设\(𝑦*m*=𝑥𝑛\),那么有\(𝐹(𝑘ℎz(𝑥𝑖),𝑦𝑖)= 𝐹(𝑘ℎz(𝑥𝑖),𝑥𝑖)\),因此Bob能够通过Alice发来的\(𝐻\)和\(𝑆\),在其中找到二者集合的交集元素,而无法知道Alice掌握的集合本身。
总结一下:就是双方将各自数据藏在了OPRF中,对比OPRF值进而求出交集。