KKRT-PSI
KKRT库:https://github.com/osu-crypto/BaRK-OPRF
文章:Efficient Batched Oblivious PRF with Applications to Private Set Intersection-2016
方案#
解读论文,参考:Efficient Batched Oblivious PRF -Private Set Intersection
关键词:两方PSI、ORFT、OTE
引言#
KKRT-PSI方案使用了OTE(OT扩展)、OPRF、Cuckoo哈希等技术,在大集合场景、局域网(带宽20GB/s)下运行效果最好。
方案构造思路:先设计一个OTE,进而设计一个OPRF,最后设计一个PSI
基础#
1-2 OT#
协议功能:Sender不知道Receiver的选择
协议实现:有基于RSA的、基于DH的、基于ECC的等。
下面介绍的是Naor-Pinkas-OT,Naor和Pinkas通过三次公钥密码学操作实现了半诚实模型下的1-2 OT:
论文:Efficient oblivious transfer protocols-2001
其中
安全性:Sender根据
1-2 OTE#
1-2 OT在实际应用中,每次都需使用一次,效率较低,所以下一步采用“固定数量的OT来实现任意数量的OT”,例如下图只需要使用
Ishai、Kilian、Nissim和Petrank于2003年提出基于矩阵变化实现少量1-2OT和对称密钥构造大量OT实例的不经意传输扩展协议。
论文:Extending Oblivious Transfers Efficiently-2003
本文提出了一种OT扩展协议,即
分析:
注意:
表示列, 表示行
- 输入
- S:
对 ,其中 是一个 bit的字符串 - R:选择比特
- S:
- 输出:
- R:得到
个
- R:得到

- 协议:
- 两方执行
协议,S得到一个矩阵 ,其中 (从列看)- 从行看,
- 从而有:
- 从行看,
- S:对于每对
,计算 ,并发送给R - R:计算
- 两方执行
- 正确性:

1-n OTE#
IKN03方案是用
论文:Improved OT Extension for Transferring Short Secrets-2013
参考:KK13 OTE——Improved OT Extension for Transferring Short Secrets
用
- ⚠️
表示矩阵 的第 行,有 个数据,每个数据为 。 表示输入一个 bit的字符串 ,输出一个 个字符串 ,每个字符串为 ,即可以看作是一个 的比特矩阵。- 从行看,
,即 的行等于 的行和 中的行。
- S和R之间进行
次1-nOT,S获得了矩阵 。- 从列看,若
,则 ;若 ,则 ,所以 。 - 从行看,
。
- 从列看,若
- 证明
- 最后S计算
,共要计算 个,例如 ,则需发送 ,对于R来说,只取 ,其他无用。
- 最后S计算
关于WH编码:
1- OTE#
从KK13方案中,知道
BaRK-OPRF#
- 首先介绍一下OPRF:
发送方和接收者执行两方OPRF协议,发送方无输入,接收方输入元素
- 下面介绍如何将KKRT16-OTE解释为一个OPRF协议:
上面提到需使用伪随机函数,这里伪随机函数的功能相当于KK13中的哈希,即
KKRT167中使用的OPRF由于是Batch、relaxed的,所以叫做BaRK-OPRF。
得到一个OPRF协议后,就可以很容易的构造一个PSI协议。例如下图:
- S与R执行OPRF,R输入隐私集合,输出OPRF值;
- S输出密钥
,可计算任意的OPRF值, 本地计算OPRF值并将其发送给接收方,R通过字符串比较得到交集;
但接收方需要进行
Cuckoo 哈希#
更多参考:https://www.cnblogs.com/pam-sh/p/16155650.html#cuckoo-hash
Cuckoo hashing分为两个存储表,一个为Cuchoo哈希表,一个称为堆存储容器。(本文协议采用的这样的容器,之后的文章有采用无堆存储容器的Cuckoo hashing)。
Cuckoo插入元素
- 计算元素
的三个哈希值,寻找对应索引的位置,若至少有一个位置为空则随机插入空位置。若一个位置也没空,则随机选择一个位置替换该元素,然后对该元素执行上述步骤。 - 若执行
次后,仍然需要替换,则将该元素存储到堆存储器中!
PSI协议#
上述基于一个理想的OPRF构造了一个简单的PSI协议,但效率(计算和通信)较低。
KKRT16-PSI协议遵循了PSZZ15基于KK13-OTE构造PSI的思路,采用Cuckoo hashing算法减少了比较次数。对于128bit的字符串和足够大的集合,求交速度比PSZZ15快3.1~3.6倍,具体说只需3.8s就能求出集合大小为
「PSZZ15」Phasing: Private set intersection using permutation-based hashing-2015
「PSZ14」Faster private set intersection based on OT extension-2014
总结了PSI协议构造的方法:基于哈希的、基于公钥加密的、基于GC的、基于OT的等。改进了「PSZ14」方案:使用置换哈希减少
bin的位长、使用哈希和安全电路计算,降低电路深度和通信消耗、使用改进的OT协议改进计算和内存消耗。
- 以PSSZ15的构造方式构造PSI协议,仅将OPRF协议替换为KKRT16-OTE
- 接收方随机选择3个hash函数,将集合元素通过布谷鸟hash算法映射到布谷鸟表或堆容器中,最后空余的地方采用虚拟元素填充;
- 发送方和接收方执行
次OPRF实例,其中 和 分别代表布谷鸟表和堆容器的长度,并将OPRF值和元素 的对应存储位置联系起来; - 发送方拥有密钥
,本地计算H和S并将每一行打乱再发送给接收方; - 接收方哈希表每一行的比较次数为3次,堆容器中的每个元素需要比较n次但只有s个元素且s为常量,因此只需要比较(3+s)n次;
- 优化后,性能提升10%。
对于在bin中的数据,
这样PRF的值变为了
- 最后方案:
关于
的生成没有具体说,待补充。
论文#
程序#
编译安装#
环境:Centos7.6
## 下载
git clone https://github.com/osu-crypto/BaRK-OPRF.git
## 下载依赖库
cd BaRK-OPRF/thirdparty
bash all_linux.get
## 会发现有些问题,需要将makelist中的'yum -Y'改为'yum -y'
## 编译
cd ..
make
## 会发现mpir安装的有问题,原来是给的下载链接失效了,重新找了一个替换上
## mpir.get文件
wget http://sources.buildroot.net/mpir/mpir-3.0.0.tar.bz2
tar -xjf mpir-3.0.0.tar.bz2
mv mpir-3.0.0 mpir
rm mpir-3.0.0.tar.bz2
cp ./mpir_patch/mpirxx.h ./mpir/
cp ./mpir_patch/mpir.h ./mpir/
cd mpir
./configure
make
## 重新编辑,即可
make
## 测试
./Release/bOPRFmain.exe -t
测试#
单元测试#
# 输入数据集规模为2^{12},进行测试
./Release/bOPRFmain.exe -t
模拟测试#
计算6种情况下的PSI,输入数据规模为(
- 同机器
# Sener
./Release/bOPRFmain.exe -r 0
# Receiver
./Release/bOPRFmain.exe -r 1
- 不同机器
# Sener
./Release/bOPRFmain.exe -r 0 -ip <ipAdrress:portNumber>
# Receiver
./Release/bOPRFmain.exe -r 1 -ip <ipAdrress:portNumber>
解读#
基础#
- int main(int argc, char **argv)
//提示函数,其中argv0指向exe
void usage(const char *argv0)
{
std::cout << "Error! Please use:" << std::endl;
std::cout << "\t 1. For unit test: " << argv0 << " -t" << std::endl;
std::cout << "\t 2. For simulation (2 terminal): " << std::endl;
;
std::cout << "\t\t Sender terminal (localhost): " << argv0 << " -r 0" << std::endl;
std::cout << "\t\t Receiver terminal (localhost): " << argv0 << " -r 1" << std::endl;
std::cout << "\t\t Sender terminal (with ip input): " << argv0 << " -r 0 -ip <ip:port>" << std::endl;
std::cout << "\t\t Receiver terminal (with ip input): " << argv0 << " -r 1 -ip <ip:port>" << std::endl;
}
int main(int argc, char **argv)
{
//有两个参数,第一个为exe,第二个为“-t”,其中第二个参数argv[1][0] == '-',argv[1][1] == 't'
if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 't')
{
BopTest();
}
//有三个参数,第一个为exe,第二个为“-r”,第三个为“0”,另外atoi()能把字符串转换成整型数
else if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 0)
{
BopSender("localhost:1213");
}
//有三个参数,第一个为exe,第二个为“-r”,第三个为“1”
else if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 1)
{
BopRecv("localhost:1213");
}
else if (argc == 5 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 0 && argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == 'p')
{
//获取ip
string ipAddr = argv[4];
BopSender(ipAddr);
}
else if (argc == 5 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 1 && argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == 'p')
{
string ipAddr = argv[4];
BopRecv(ipAddr);
}
else
{
//跳转提示
usage(argv[0]);
}
return 0;
}
int main(int argc, char** argv)主函数中的argc代表的是参数的数量,至少为1(argv[0]即.exe文件的路径)。argv为指针表示的参数,argv[0]表示第一个参数,argv[1]表示第二个参数,以此类推。
预处理#
待补充
应用#
隐语#
参考:隐私集合求交
[KKRT16] 是半诚实 OT-based PSI协议,基于 OT Extension, BaRK-OPRF 和 CuckooHash。 [KKRT16] 是第一个在千万( 224224)规模,长度(128 bits)数据集上,求交时间在1分钟之内的PSI协议.
隐语 SPU PSI 中使用了 [PSZ18] 提到的 3-way stash-less CuckooHash:

作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/17431388.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-05-25 联邦学习安全效率与开源生态讲座
2020-05-25 电脑:磁盘扩容
2020-05-25 考研:资料整理