554
社区成员




01隐语实现PIR总体介绍
隐匿查询(Private Information Retrieval PIR)定义
用户查询服务端数据库中的数据,但服务端不知道用户查询的是哪些数据
隐匿查询(Private Information Retrieval PIR)分类
按服务器数量分类:
按查询类型分类:
隐语目前支持的PIR方式:
隐语PIR的实现位置
隐语PIR调用接口:
pir_setup 数据预处理
参数说明:
reports= spu.pir_setup(
server='bob'
input_path='/path/B_PIR_DATA.CSV',
key_columns='id',
label_columns=['register date','age'],
oprf_key_path='/path/oprf key.bin',
setup_path='/path/setup_path',
num_per_query=1,
label_max_len=18,
)
提示:pir_setup 单方任务:可以使用的secretflow单机模拟配置,或者直接调用spu的python接口
pir_query 双方执行查询任务
参数说明:
# client
alice_config ={
'input_path': '/path/A_PIR_ID.CSV',
'key_columns': id',
'output_path': '/path/sf_pir_out.csv'
}
# server
bob_config ={
'oprf_key_path': '/path/oprf_key.bin',
'setup_path':'/path/setup_path',
}
query_config = {
alice: alice_config,
bob: bob_config,
}
reports = spu.pir_query(
server='bob',
config=query_config,
)
02 Index PIR-SealPIR介绍
BFV方案介绍
参数
密文乘法噪声增大,尽量避免使用。
基于同态密码实现index PIR的基本原理
方案的问题:请求的结果太大
SealPIR主要贡献:
多个数据pack到一个HE plaintext
多项式次数:8192
明文模:17bit
DB数据长度:288B
Ceil(288*8/16)=144
Floor(8192/144)=56
每个多项式可以pack 56个原始数据
备注:实现Symmetric PIR时,不使用packing
多维查询:
支持多个查询(Multi/Batch Query)
SealPIR 中给出了通过cuckooHash进行多个查询的算法,可以提高查询效率。cuckooHash选取3个hash,bin的个数为1.5k,具体算法,如下:
server setup:
client query:
实现位置:
libspu/pir/seal_pir.h
libspu/pir/seal_pir.cc
libspu/pir/seal_mpir.h
libspu/pir/seal_mpir.cc
外部库依赖
bazel/repositories.bzl
bazel/ seal.BUILD
单元测试
libspu/pir/seal_pir test.cc
libspu/pir/seal_mpir _test.cc
03 Keyword PlR- Labeled PSl介绍
基本原理,核心思想:点值表示得到插值多项式系数表示
减少乘法次数和计算量
隐语labelPsl的主要工作
服务端预处理(setup)阶段-流程
1.选择参数
2.对id数据进行prf计算,前128bit根据截取用于匹配后128bit作为对称算法密钥加密label
3.根据prf前128bit将数据插入Simple Hash
4.对Simple Hash每一行分别划分bin bundle,并计算matching polynomial和label polynomia
5.将插值多项式系统packing到同态算法明文
客户端和服务端(query)阶段-流程
1.请求参数
2.执行oprf协议
3.计算查询值的同态密文幂集合
4.使用同态私钥解密服务端返回的同态密文
5.满足匹配条件时,使用oprf的后128bit解密得到label
隐语label PSI的主要参数
04 隐语PIR后续计划
05 作业练习
本次作业是实践PIR_QUERY
作业中已经准备了oprf_key(server_secret_key.bin),pir_query.csv(客户端查询输入),已经setup目录。
具体编写代码流程和psi有类似的地方,具体步骤:
执行pir_query的时候,需要用pyu定义alice和bob,具体代码如下。
from pathlib import Path
print(sf.__version__)
alice=sf.PYU('alice')
bob=sf.PYU('bob')
cliconfig={
# client config
bob: {
'input_path': f"{str(Path.home())}/pir_query.csv",
'key_columns': 'uid',
'output_path': f"{str(Path.home())}/bob_pir_out.csv",
},
# server config
alice: {
'oprf_key_path': "/tmp/server_secret_key.bin",
'setup_path': f"{str(Path.home())}/pir_server_setup",
},
}
spu.pir_query(
server='alice',config=cliconfig
)