一、PIR 技术概述
(一)定义与功能
PIR(Private Information Retrieval,隐匿查询)是一种允许用户在不泄露查询内容的情况下,从服务端数据库中检索数据的技术。具体而言,用户可以查询服务端数据库中的特定数据项,但服务端无法获知用户所查询的数据项的具体内容。

- 单服务器方案(Single Server) :仅需一个服务器即可完成 PIR 操作,具有较高的实用性,但其安全性依赖于服务器的可信程度。
- 多服务器方案(Multi - Server) :通过多个服务器协作来完成 PIR 操作,能够在一定程度上增强数据的安全性和隐私保护程度,但实现起来相对复杂。
(二)按查询类型分类
- Index PIR :用户通过数据项的索引进行查询,服务端根据索引返回对应的数据内容。该方式适用于数据项有序且用户明确知道所需数据位置的场景。
- Keyword PIR :用户利用关键词进行查询,服务端返回与关键词相关的数据。这种方式更加灵活,适用于用户对数据内容有一定模糊性,但可通过关键词描述需求的情况。
(三)隐语目前支持的 PIR 方式
- Single Server Index PIR :SealPIR,适用于基于索引的单服务器隐匿查询场景,能够有效保护用户的查询隐私。
- Single Server Keyword PIR :Labeled PSI,适用于基于关键词的单服务器隐匿查询场景,通过结合 Labeled PSI 技术,实现了在保护用户隐私的前提下进行关键词检索。
二、隐语 PIR 实现架构与调用接口
(一)基础组件与实现位置
- 基础组件层 :包括 ECC(椭圆曲线密码术)、AES(高级加密标准)、HAS(可能是哈希函数相关组件)、OT(Oblivious Transfer,盲传)、OPRF(Oblivious Pseudorandom Function,盲伪随机函数)、PRG(Pseudorandom Generator,伪随机数生成器)等。这些组件为 PIR 技术提供了底层的密码学支持和安全保障。
- PIR 协议实现层 :涵盖了 SealPIR 和 Labeled PSI 等具体协议的实现,通过调用基础组件层的功能,实现了不同类型的 PIR 操作。例如,SealPIR 利用同态加密技术实现 Index PIR,而 Labeled PSI 则结合了多项式技术和同态加密等手段实现 Keyword PIR。
- 隐语 PIR 实现位置 :PIR 相关的实现代码位于
libspu/pir
目录下,包括 seal_pir.h
、seal_pir.cc
、seal_mpir.h
、seal_mpir.cc
等文件,分别对应 SealPIR 的不同功能模块和实现细节。同时,Labeled PSI 的实现代码位于 libspu/psi/core/labeled_psi
目录下,包括 sender.h
、sender.cc
、receiver.h
、receiver.cc
等文件,分别处理服务端和客户端的相关操作。
(二)调用接口
- pir_setup :用于服务端的数据预处理操作,参数包括服务端数据文件路径(
input_path
)、Key 对应的列名(key_columns
)、Label 对应的列名(label_columns
)、服务端 ecc 密钥文件路径(oprf_key_path
)、预处理阶段结果输出路径(setup_path
)、每次查询的 id 数量(num_per_query
)以及 Label 数据拼接后填充到的固定长度大小(label_max_len
)等。该操作是单方任务,可使用 SecretFlow 单机模拟配置或直接调用 SPU 的 Python 接口。
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_query :用于执行 PIR 查询任务,需双方(客户端和服务端)共同参与。客户端配置参数包括查询 id 对应的 csv 文件路径(
input_path
)、Key 对应的列名(key_columns
)、PIR 查询结果输出的文件路径(output_path
);服务端配置参数包括服务端 ecc 密钥文件路径(oprf_key_path
)、预处理阶段结果输出路径(setup_path
)。通过指定查询配置(query_config
)和服务端信息(server
),调用该接口完成 PIR 查询操作。
alice_config = {
'input_path': '/path/A_PIR_ID.csv',
'key_columns': 'id',
'output_path': '/path/sf_pir_out.csv',
}
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,
)
三、Index PIR - SealPIR 详细介绍
(一)BFV 方案介绍
参数说明
- 多项式次数(N) :决定了多项式的最高次数,影响同态加密的操作空间和计算效率。
- 明文模(t) :用于限定明文数据的取值范围,影响数据的表示和运算精度。
- 密文模(q) :用于限定密文数据的取值范围,对加密数据的安全性和计算性能有重要影响。
- Expansion Rate :计算公式为 (2 \times \log(q)/\log(t)),反映了密文在同态操作过程中的膨胀程度,影响数据传输和存储效率。
明文与密文表示
- 明文 :属于环 (R_t = \mathbb{Z}t[x]/(x^N + 1)),表示为多项式形式,如 (a_0 + a_1x + \cdots + a{N-1}x^{N-1})。
- 密文 :由两个明文组成,表示为 ((c_0, c_1) \in R_q \times R_q),通过同态加密算法对明文进行加密得到,能够支持密文加法和明文乘密文等操作。

(二)基于同态密码实现 PIR 的基本原理

- 数据打包 :将多个数据项打包到一个同态加密的明文中,以充分利用同态加密的计算能力,减少通信量和加密操作次数。例如,在多项式次数为 8192、明文模为 17bit 的情况下,可将 56 个原始数据打包到一个多项式中。
- 查询向量压缩 :将查询向量转换为一个密文,显著减少通信量。服务端可通过执行 Expand 算法,从一个查询密文计算出查询密文向量。
- 支持多维查询和多个查询 :通过将数据转换为矩阵形式,减少 Expand 计算量,支持多维查询。利用 cuckoo hash 技术,能够同时进行多个查询,进一步提高查询效率。
(三)SealPIR 主要贡献与实现优势
- 高效的数据打包方式 :通过合理选择多项式次数和明文模,实现了多个数据项在一个同态加密明文中的高效打包,提高了数据传输和处理效率。
- 查询向量压缩与多维查询支持 :有效减少了查询向量的大小和通信量,同时支持多维查询,能够满足复杂查询需求。
- 多个查询的优化处理 :借助 cuckoo hash 技术,实现了多个查询的同时处理,提高了查询的整体效率。
(四)实现位置与外部依赖
- 实现位置 :SealPIR 的相关实现代码位于
libspu/pir/seal_pir.h
、libspu/pir/seal_pir.cc
、libspu/pir/seal_mpir.h
、libspu/pir/seal_mpir.cc
等文件中,分别实现了 SealPIR 的核心功能和多查询处理等扩展功能。 - 外部依赖 :SealPIR 的实现依赖于一些外部库和构建文件,如
bazel/repositories.bzl
、bazel/seal.BUILD
等,这些文件用于定义依赖关系和构建规则,确保项目的顺利编译和运行。
四、Keyword PIR - Labeled PSI 详细介绍
(一)基本原理
- 核心思想 :通过点值表示得到插值多项式系数表示,利用多项式运算实现关键词的匹配和数据检索。具体而言,通过构造特定的多项式,使得当且仅当关键词匹配时,多项式求值结果满足一定条件,从而实现隐匿查询。
- BFV SHE(全同态加密)技术的应用 :结合 BFV 全同态加密方案,支持对加密数据的复杂计算操作,包括 packing 和 SIMD(单指令多数据)技术,提高了数据处理效率和并行计算能力。
- OPRF(盲伪随机函数)的引入 :避免信息泄露,确保用户查询和数据内容的安全性。通过 OPRF 处理,用户和服务器之间能够在不泄露输入信息的情况下进行交互和计算。
(二)优化方法与技术改进
- 窗口(windowing)技术 :通过发送 (r) 的次幂,减少密文乘法操作次数,从而降低计算复杂度和通信量。例如,使用窗口技术可将乘法深度从 2 降低至 1,提高计算效率。
- 分区(partitioning)技术 :将服务器端的每个 bin 划分为若干子集(subset),每个分区对应一个多项式,减少了乘法次数和计算量。
- 使用 extremal postage stamp bases :进一步优化通信量,通过选择合适的整数集合和表示方式,减少数据传输量。
- Paterson - Stockmeyer 算法 :用于减少密文乘法次数,通过将多项式重新排列和组合,降低计算复杂度。
(三)隐语 Label PSI 的主要工作与实现流程
服务端预处理(setup)阶段流程
- 选择参数 :根据具体需求和安全要求,选择合适的加密参数和算法配置。
- PRF 计算 :对 id 数据进行 PRF(伪随机函数)计算,利用前 128bit 数据用于匹配,后 128bit 作为对称算法密钥加密 label。
- 插入 Simple Hash :将 PRF 计算结果的前 128bit 数据插入 Simple Hash 结构,以便后续查询和匹配。
- 划分 bin bundle 和计算多项式 :对 Simple Hash 的每一行分别划分 bin bundle,并计算 matching polynomial(匹配多项式)和 label polynomial(标签多项式)。
- 多项式系统 packing :将插值多项式系统打包到同态算法的明文中,为后续的同态加密和计算做好准备。
客户端和服务端(query)阶段流程
客户端(Receiver) :
- 请求参数 :向服务端发送查询请求,获取相关参数信息。
- 执行 OPRF 协议 :与服务端协作执行 OPRF 协议,对查询关键词进行盲处理,保护查询内容的隐私。
- 计算查询值的同态密文幂集合 :利用同态加密技术,对查询值进行加密处理,并计算其幂集合,用于后续的多项式求值操作。
- 使用同态私钥解密 :对服务端返回的同态密文进行解密,获取计算结果。
- 匹配条件判断与解密 :判断是否满足匹配条件,若满足,则使用 OPRF 的后 128bit 数据解密得到 label,获取查询结果。
服务端(Sender) :
- 响应参数请求 :接收客户端的参数请求,返回相关参数信息。
- 执行 OPRF 协议 :与客户端协作执行 OPRF 协议,对查询关键词进行盲处理。
- 计算并返回查询结果 :根据客户端发送的查询信息,利用预处理阶段生成的多项式和加密数据,计算查询结果并返回给客户端。
参数大类与参数说明
ItemParams :
- felts_per_item :表示每个数据项占用的 felt(有限域元素)数量。
- item_bit_size/plain_modulus_bits :用于计算 item_bit_size,综合考虑 stats_params、log(ns) 和 log(nr) 等因素,影响数据的表示和加密精度。
TableParams :包括 cuckoo 相关参数,如 hash_func_count(哈希函数数量)、table_size(哈希表大小)、max_items_per_bin(每个 bin 的最大数据项数量)等,用于配置哈希表和数据存储结构。
QueryParams :包含 ps_low_degree(用于降低发送密文 (x_i) 个数以及服务端密文乘法次数的优化参数)和 query_powers(查询幂集合)等参数,用于优化查询过程和提高计算效率。
SEALParams :定义了同态加密相关的参数,如 poly_modulus_degree(多项式次数,可选值为 2048、4096、8192)、plain_modulus(_bits)(明文模的位数,可选值为 65535、65535、22 bits)、coeff_modulus_bits(系数模的位数列表,不同多项式次数对应不同的配置)等,直接影响同态加密的安全性和性能。
(四)实现位置与外部依赖
- 实现位置 :隐语 Label PSI 的实现代码位于
libspu/psi/core/labeled_psi/sender.h
、libspu/psi/core/labeled_psi/sender.cc
、libspu/psi/core/labeled_psi/receiver.h
、libspu/psi/core/labeled_psi/receiver.cc
、libspu/psi/core/labeled_psi/sender_db.h
、libspu/psi/core/labeled_psi/sender_db.cc
、libspu/psi/core/labeled_psi/psi_params.h
、libspu/psi/core/labeled_psi/psi_params.cc
等文件中,分别处理服务端和客户端的相关操作,包括数据处理、加密解密、查询交互等功能。 - 外部依赖 :该实现依赖于多个外部库和构建文件,如
bazel/repositories.bzl
、bazel/microsoft_apsi.BUILD
、bazel/microsoft_gsl.BUILD
、bazel/microsoft_kuku.BUILD
、bazel/patches/apsi.patch
等,这些文件用于引入外部依赖库和定义构建规则,确保项目的顺利编译和运行。
五、学习总结
通过对隐语实现 PIR 技术的系统学习,深入了解了 PIR 的基本原理、分类以及多种实现方式,掌握了 SealPIR 和 Labeled PSI 的核心技术细节、优化方法和应用场景。同时,熟悉了隐语 PIR 的调用接口和开发流程,能够基于隐语框架进行 PIR 应用的开发和部署。这些知识为我今后在数据隐私保护领域开展相关工作奠定了坚实的基础,使我能够更好地应对实际项目中的各种挑战,实现数据的安全共享和隐私保护。