551
社区成员




同 PSI 实战一样,本笔记侧重于过程。上一期 PSI 实战已经涉及一部分内容,本笔记侧重于不同部分。
创建节点(分别命名为 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')
该部分与 PSI 完全相同,不再讲解
调用 spu.pir_setup 对 source_data.csv 进行预处理,预处理结果保存在 pir_server_setup 目录下。运行结果如下:
注意预处理需要 两端同时进行(见右上角)。从运行结果可以看出,预处理的计算复杂度很高,处理 800,000 行的数据需要耗时数分钟。此外,预处理的空间复杂度也很高,经测试,如果没有将 server_secret_key 置于一个 tmp 目录下,执行时会出现空间超限(MLE)。笔者推测是由于预处理执行时需要存放临时文件导致。
有了前面的铺垫之后,就可以正式进行 PIR 了。
PIR查询执行完成后,我们可以在 guest 的文件列表找到输出结果。
与 PSI 类似,PIR 的执行结果需要本地验证。下载 pir_result.csv 并打开后,我意外发现里面是一个空表。
这表明没有查询到任何结果。随后,我复制 pir_query.csv 中所查询的 uid,用文本编辑器的查找替换功能查找了这个 uid 字符串,发现这个 uid 确实没有在源文件中出现。说明本次 PIR 输出结果正确。
事实上, PIR 的日志也反映了这一结果。这使我确信 PIR 运行正确。
至此,PIR 实验进行完毕。