隐私计算实训营第四期第7节:PIR实战

2301_80297147 2024-12-09 00:29:19

同 PSI 实战一样,本笔记侧重于过程。上一期 PSI 实战已经涉及一部分内容,本笔记侧重于不同部分。

1、创建节点,上传文件

创建节点(分别命名为 guest 和 server)后,向 guest 上传 pir_query.csv,向 server 上传 pir_server_setup.tar, server_secret_key.bin 与 source_data.csv (该文件来源于上节求交数据)。与上一节不同,我们首先要对数据进行预处理:将 pir_server_setup.tar 解压为目录;创建 tmp 文件夹并将 server_secret_key.bin 置入其中。文件预处理代码如下:

# 将上传的 .tar 形式的目录解压
import tarfile
import os
from pathlib import Path

work_path = os.getcwd()

tar_path = f'{work_path}/pir_server_setup.tar'


extract_path = work_path


os.makedirs(extract_path, exist_ok=True)

# 打开 .tar 文件
with tarfile.open(tar_path, 'r') as tar:
    # 解压所有文件到指定目录
    tar.extractall(path=extract_path)
# 将密钥文件移动到 /tmp 目录下
import shutil
import os

work_path = os.getcwd()


os.makedirs(f'{work_path}/tmp', exist_ok = True)

shutil.move(f'{work_path}/server_secret_key.bin', f'{work_path}/tmp')

2、初始化 SecretFlow 与 SPU 。

该部分与 PSI 完全相同,不再讲解

3、预处理数据

调用 spu.pir_setup 对 source_data.csv 进行预处理,预处理结果保存在 pir_server_setup 目录下。运行结果如下:

 注意预处理需要 两端同时进行(见右上角)。从运行结果可以看出,预处理的计算复杂度很高,处理 800,000 行的数据需要耗时数分钟。此外,预处理的空间复杂度也很高,经测试,如果没有将 server_secret_key 置于一个 tmp 目录下,执行时会出现空间超限(MLE)。笔者推测是由于预处理执行时需要存放临时文件导致。

4、进行查询操作

有了前面的铺垫之后,就可以正式进行 PIR 了。

PIR查询执行完成后,我们可以在 guest 的文件列表找到输出结果。

 5、本地验证结果

与 PSI 类似,PIR 的执行结果需要本地验证。下载 pir_result.csv 并打开后,我意外发现里面是一个空表。

 这表明没有查询到任何结果。随后,我复制 pir_query.csv 中所查询的 uid,用文本编辑器的查找替换功能查找了这个 uid 字符串,发现这个 uid 确实没有在源文件中出现。说明本次 PIR 输出结果正确。

事实上, PIR 的日志也反映了这一结果。这使我确信 PIR 运行正确。

至此,PIR 实验进行完毕。

 

...全文
41 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

551

社区成员

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

【最新活动】

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

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