隐私计算学习第6讲笔记:PIR的原理与实践

叶开233 2024-03-28 16:31:29

01隐语实现PIR总体介绍

隐匿查询(Private Information Retrieval PIR)定义

用户查询服务端数据库中的数据,但服务端不知道用户查询的是哪些数据

隐匿查询(Private Information Retrieval PIR)分类

按服务器数量分类:

  • 单服务器方案(Single Server)
  • 多服务器方案(Multi-Server)

按查询类型分类:

  • index PIR
  • Keyword PIR

隐语目前支持的PIR方式:

  • Single Server index PlR :SealPiR
  • Single Server Keyword PiR: Labeled Psl

隐语PIR的实现位置

隐语PIR调用接口:

pir_setup 数据预处理

参数说明:

  • input _path 服务端数据文件路径,建议绝对路径
  • key_columns Key对应的列名
  • label columns Label对应的列名,多列,用逗号分隔
  • oprf_key_path 服务端ecc密钥文件,32B,二进制文件
  • mum_per_query 每次查询的id数量
  • label_max_len Label数据拼接后填充到固定的长度大小
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 双方执行查询任务

参数说明:

  • 客户端配置
    • input_path 查询id对应的csv文件路径
    • Key_columns Key对应的列名
    • output_path PIR查询结果输出的文件路径
  • 服务端配置
    • oprf_key_path 服务端ecc密钥文件,32B,二进制文件
    • setup_path预处理阶段结果输出路径

 

# 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方案介绍

参数

  • 多项式次数:N
  • 明文模:t
  • 密文模:q
  • Expansion Rate :2 * log(q)/log(t)

 

密文乘法噪声增大,尽量避免使用。

 

基于同态密码实现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:

  • 对DB中n个元素,分别计算cuckooHash的3个Hash,得到3个binindex,插入到3个bin index中

client query:

  • 将k个查询,通过cuckooHash插入到b=1.5k个bin中,对空的bin进行随机填充
  • 执行每个bin执行一个PIR,共计b个PIR。这里的难点是如何将query_index转换为bin index

实现位置:

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的主要工作

  • 以微软的开源代码功能为核心
  • OPRF采用隐语的实现:
    • 支持的ecc曲线包括:FourQ,Secp256k1,SM2
  • Label的自动填充
  • 增加了服务的预处理结果保存功能
  • 可以支持 离线和查询(多次)两个阶段

服务端预处理(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有类似的地方,具体步骤:

  • 建立alice和bob的连接
  • 配置spu的集群
  • 执行pir_query查询

执行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
)

 

...全文
283 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
LynnCheeen 2024-06-03
  • 打赏
  • 举报
回复
大佬你好,请问你这个作业二执行结果是什么呀?

554

社区成员

发帖
与我相关
我的任务
社区描述
隐语开源社区,隐私计算开发者交流和讨论的平台。
密码学可信计算技术安全 企业社区
社区管理员
  • 隐语SecretFlow
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

【最新活动】

3月18日:隐私计算实训营第一期

试试用AI创作助手写篇文章吧