一、PIR定义
Private Information Retrieval(PIR)
匿踪查询技术,又称为隐私信息检索(Private Information Retrieval, PIR),是一种在保护用户隐私的前提下进行信息检索的隐私计算技术。匿踪查询通过加密、混淆等技术手段,保障查询方能够隐匿被查询对象的关键词或客户ID信息,使得数据服务方提供匹配的查询结果但无法获知具体对应哪个查询对象。
二、PIR分类
匿踪查询可以按照不同的维度进行分类,业界主要按技术实现、服务器数量和查询类型三种方式分类。
(一)按技术实现分类
1.不经意传输(Oblivious Transfer, OT):OT是匿踪查询应用最广泛的实现模式。其允许发送方将多个消息中的一个或多个发送给接收方,而接收方只能得知其选择的那部分消息,同时发送方则不知道接收方选择了哪些消息。不经意传输有多种不同的实现,经典OT为1-out-of-2不经意传输协议,即接收方从2个消息中选择获取其一,之后拓展出不同的变种,包括1-out-of-N不经意传输协议和k-out-of-N不经意传输协议等。
2.同态加密(Fully Homomorphic Encryption, FHE):目前业界也有基于同态加密技术实现匿踪查询的方案。在这类方案下,数据库被加密存储在服务器。用户向服务器提交同态加密的查询索引,生成不可关联到原始索引的加密查询。服务器依据加密索引在加密数据库中进行运算后,返回对应索引的数据项的密文,由用户自行解密结果。
(二)按服务器数量分类
**1.单服务器方案(Single-Server PIR):**所有的查询操作都通过一个服务器进行。用户向这个单一的服务器发送查询请求,服务器处理请求并返回结果。相较于多服务器方案,单服务器方案在实际应用中更为普遍,因为它避免了多服务器之间可能出现的合谋问题,且在部署和维护上相对简单。
2.**多服务器方案(Multi-Server PIR):**涉及使用多个服务器来处理用户的查询请求。这种方案的核心目的是通过分散信息处理和存储,增强用户查询的隐私保护,可减少单一服务器泄露用户隐私信息的风险。
(三)按查询类型分类
**1.基于索引的隐私查询方案(Index PIR):**用户基于数据的位置索引进行查询,例如查询服务端第k个数据。该方案通常在效率上较高,因为它不需要处理复杂的文本匹配问题,但不适用于数据变化频繁的场景。
2.基于关键词的隐私查询方案(Keyword PIR):服务端的数据是(key, value)类型的数据,这种方案允许用户根据关键词key进行查询,而不暴露查询的具体内容。该方案因包含查询关键词信息,因此技术复杂性更高,但使用更灵活.
三、PIR技术简介
A Trivial Solution
隐语课程中提到一个简单的方式是直接基于半同态(PHE)加密进行隐私信息检索,PHE是一种允许对密文执行特定操作的加密技术,半同态一般只支持加法或乘法的其中一种类型,运算次数是无限的,式子如下:
E ( m 1 ) ⋅ E ( m 2 ) = E ( m 1 + m 2 ) E(m_1)⋅E(m_2)=E(m_1+m_2) E(m1)⋅E(m2)=E(m1+m2)
这样,在PIR场景中,PHE就能允许服务器在不解密的情况下直接处理用户的查询请求并返回用户处理结果。
按照技术实现上来说,PIR技术分为三类:
1、基于OT的PIR
基于OT的PIR实现过程有5个重要步骤:
- 服务端有 n n n条数据,则产生 n n n个RSA公私钥对,并将 n n n个私钥保留, n n n个公钥发送给用户端。
- 用户随机产生一个大整数key(key为第5步中的解密密钥),已知用户要检索第 t t t条数据,则用户用收到的第 t t t个RSA公钥加密大整数key,将加密结果 s s s发送给服务端。
- 服务端用保留的 n n n个RSA私钥,依次尝试解密 s s s,获得 n n n个解密结果,依次为 k e y 1 , k e y 2 , ... , k e y t , ... , k e y n {key_1,key_2,...,key_t,...,key_n} key1,key2,...,keyt,...,keyn。
- 服务端利用对称加密算法(此处为AES算法),利用 k e y 1 k e y n key_1~key_n key1 keyn,加密对应的消息 m 1 m n m_1~m_n m1 mn,将产生的密文消息 M 1 M n M_1~M_n M1 Mn发送给用户。
- 用户利用第2步中的 k e y key key,对第 t t t条密文 M t M_t Mt进行对称解密,则得到想要检索的第 t t t条原始明文消息 m t m_t mt。
分析:
优点:1、基于n选1的OT协议,安全性较高,在 n n n和 k e y key key足够复杂的情况下,服务器想得知用户查询的t是比较困难的;2、流程比较简单,方法容易实现。
缺点:1、计算复杂度高,服务器需要对每个数据项执行一次加密或解密,计算开销较大;2、服务端需要传输整个加密数据库 M ′ M' M′,通信开销较大。
2、基于HE的PIR
基于同态的PIR还是以Paillier半同态为例,其他有限同态加密和全同态加密只是加法、乘法操作次数的限制的区别。强调3个paillier算法特点:(1)可以实现两个密文加法计算;(2)可以实现一个密文与一个明文相乘;(3)由于加密时用到随机数,所以相同的明文、相同的密钥,可以产生很多个不同的密文,这些不同的密文解密后都能得到相同的原始明文。基于paillier同态加密的PIR实现过程有4个重要步骤:
- 用户端产生同态加密公钥 p k p_k pk和私钥 s k s_k sk。
- 已知服务端有 n n n条数据,用户要检索第 t t t条数据,则产生一个 n n n维密文向量 v e c t o r = v 1 , ... , v n vector={v_1,...,v_n} vector=v1,...,vn,其中第 t t t项是公钥 p k p_k pk加密数字1后的密文: v t = E ( 1 , P k ) v_t=E(1,P_k) vt=E(1,Pk),其他项是公钥 p k p_k pk加密数字0后的密文: v i = E ( 0 , p k ) v_i=E(0,p_k) vi=E(0,pk)。将 v e c t o r vector vector和公钥 p k p_k pk发送给服务端,paillier算法第3个特点保证了 v e c t o r vector vector中的 n n n条密文都不重复,保证服务端无法猜出哪一条是数字1的密文。
- 服务端将 v e c t o r vector vector和 n n n条明文数据集做向量内积运算,得到密文结果 e n r e s u l t en_{result} enresult,将 e n r e s u l t en_{result} enresult发送给用户端。同态加密的密文计算结果解密后与明文计算结果相等,相当于 e n r e s u l t = E ( m 1 ∗ 0 + ... + m t − 1 ∗ 0 + m t ∗ 1 + m t + 1 ∗ 0 + ... + m n ∗ 0 , p k ) = E ( m t , p k ) en_{result}=E(m_1*0 + ... + m_{t-1}*0 + m_t*1 + m_{t+1}*0+ ... + m_n*0, p_k) = E(m_t, p_k) enresult=E(m1∗0+...+mt−1∗0+mt∗1+mt+1∗0+...+mn∗0,pk)=E(mt,pk)。
- 用户端利用私钥 s k s_k sk对 e n r e s u l t en_{result} enresult进行解密,得到想要检索的第 t t t条原始明文消息 m t m_t mt。
这个方法在计算开销和通信成本上都比较高,服务器需要对整个数据库的所有条目执行加密内积操作,计算负担较高,查询向量和加密结果的密文长度远大于明文,通信效率低。
此外,扩展性较差,当数据库规模较大时,服务器计算和用户解密的效率下降显著。
3、基于keyword的PIR
实际上,在大多数的查询场景中,查询方往往不知道自己要查询的数据的索引号,而大多根据关键词进行查询,此类方案又称keyword PIR,可以利用paillier同态加密和拉格朗日插值多项式实现。
keyword PIR实现过程有5个重要步骤:
- 服务端有明文数据集 ( x 1 , m 1 ) , ... , ( x n , m n ) {(x_1,m_1),...,(x_n,m_n)} (x1,m1),...,(xn,mn),对此明文数据集进行拉格朗日多项式插值,插值结果即为最高次幂为 n − 1 n-1 n−1的多项式 g ( x ) g(x) g(x);对于图中的多项式 f ( x ) f(x) f(x), f ( x ) = ( x − x 1 ) ∗ ( x − x 2 ) ∗ ... ∗ ( x − x n ) f(x) = (x-x_1)*(x-x_2)*...*(x-x_n) f(x)=(x−x1)∗(x−x2)∗...∗(x−xn),展开后即为图中的 f ( x ) f(x) f(x)。数据集中任意一个点 ( x i , m i (x_i,m_i (xi,mi),满足 f ( x i ) = 0 , g ( x i ) = m i f(x_i)=0,g(x_i)=m_i f(xi)=0,g(xi)=mi。
- 用户生成paillier同态加密公钥 p k p_k pk和私钥 s k s_k sk。
- 对于待查关键字 x t x_t xt,用户利用 p k p_k pk分别加密 x t x_t xt的1次方到 x t x_t xt的 n n n次方,组成密文向量 v e c t o r vector vector,发送给服务端。
- 服务端利用密文向量 v e c t o r vector vector,和 f ( x ) f(x) f(x)、 g ( x ) g(x) g(x)的系数,分别计算同态密文 E ( f ( x t ) ) E(f(x_t)) E(f(xt))、 E ( g ( x t ) ) E(g(x_t)) E(g(xt)),将计算结果发送给用户。
- 用户利用私钥 s k s_k sk对两条密文进行解密,如果 f ( x t ) = 0 f(x_t)=0 f(xt)=0,则 g ( x t ) g(x_t) g(xt)即为检索结果;否则检索结果为空。
这种方法同样有计算开销和通信开销的问题,多项式次方运算和同态加密计算对服务端的计算能力有较高要求。在查询向量和密文结果时,传输量也较大。