草庐IT

隐私计算技术解读 | 一文读懂SealPIR-基于同态的隐私信息检索协议

secretflow 2023-03-28 原文

隐私信息检索(Private information retrieval PIR)也称为隐匿查询或匿踪查询,在医疗、股票、金融、社交等领域中都有大量应用场景。近年来PIR技术研究逐渐丰富,行业对应用PIR实现隐私保护的呼声也随之高涨。

[SealPIR][1]是微软开源的PIR实现,实现了2018年发表在IEEE S&P的论文[ACLS18][2]中的PIR方案。论文题目《PIR with Compressed Queries and Amortized Query Processing》已经包含了两个主要的贡献点:
  • 对查询进行了压缩,通信量降低了274倍

  • 通过概率批量编码(probabilistic batch codes PBCs)可以同时执行多个查询,分摊查询处理的开销。

在近年的PIR协议研究中,特别是基于HE的PIR协议有很多进展,且大多数都是和SealPIR进行对比,因此理解SealPIR的原理也就有助于理解和跟踪he-based PIR近年来的发展。

本文将为小伙伴们介绍基于同态的隐私信息检索协议-SealPIR,欢迎大家在本文留言讨论。

1.PIR定义及分类

1.1 PIR定义

隐私信息检索(Private information retrieval PIR)是对信息检索(information retrieval IR)的一种扩展,最早在[CKGS95][3]中提出,用于保护用户查询信息,防止数据持有方得到用户的检索条件。

PIR协议目标可以定义为:Alice有共N行的数据库D,每一行的数据大小为L。Bob希望查询获得其中指定位置的某一行,但是不想告诉Alice自己查询的是哪一行。

隐私信息检索协议(PIR)需要满足正确性和安全性两方面的要求:

  • 正确性:用户得到要查询的数据

  • 安全性:服务端 无法知道 用户查询的是哪条数据

1.2 PIR分类

1.2.1 服务器数量分类

按照服务器数量分类可分为多服务器PIR和单服务器PIR。
  • 多服务器PIR(MultiServer-PIR)

多服务器PIR一般基于信息论安全(Information-theoretic security)的密码技术,例如:基于函数密码分享(Function Secret Sharing)[BGI16][4]方案,也称为:IT-PIR。

多服务器PIR协议大体流程如下:

  1. 客户端生成查询条件的分量,发送给不同的服务器;
  2. 服务器收到查询条件的分量后进行相应的计算,返回给客户端;
  3. 客户端接收到所有服务器的响应后,将服务器查询响应看做秘密共享的分量进行合成,得到查询结果。

为了保护查询信息的安全,多服务器PIR方案中要求服务器之间是不能合谋的,增加了系统实现和部署的难度。多服务器PIR方案中计算量相对较小,但通信量一般很大,大体规模是?? (1)
  • 单服务器PIR(SingleServer-PIR)

单服务器PIR一般基于公钥密码方案,特别是同态性质的公钥密码方案,安全性基于计算复杂理论,也称为CPIR。

基于同态的单服务器PIR方案,大体流程如下:

  1. 客户端生成加密的查询向量,发送给服务端;
  2. 服务端接收到查询向量后,在本地执行同态运算,将结果返回给客户端;
  3. 客户端收到响应后,解密得到查询结果。
单服务器PIR方案一般通信量较少,但计算量较大,且容易部署。

1.2.2 按照检索条件分类

  • Index PIR/Dense PIR

服务端有n个元素的数据库?={?1,?2,…,??},用户查询第?个元素,通过执行PIR协议,用户得到??,服务端不知道用户查询?的信息。由于用户的查询条件在一个连续的集合[1…?],Index PIR也称为Dense-PIR。

 

  • Keyword PIR/Sparse PIR

服务端的数据是(key,value)对构成的n个元素的数据库,用户选择自己要查询的key,通过执行PIR协议,用户得到key对应的value。这里查询条件key不能覆盖一个连续集合,例如:手机号或身份证,也称为Sparse PIR。

1.3 PIR性能指标

PIR的性能指标主要包括计算量和通信量。

  • 计算量:计算量一般指的是服务端的计算量。

  • 通信量:通信量可细分为查询请求的通信量和响应的通信量。

Trivial PIR中服务端没有计算量,将数据全部发给客户端,客户端在本地查询,通信量跟数据库中数据量n相关。因此PIR的通信量要求小于数据库的容量。对比IT-PIR和CPIR的计算量和通信量可以看到,IT-PIR在计算量较少,但通信量较大;CPIR计算量较大,但通信量较小。

除了计算量和通信量两个指标外,有些论文里还引入了成本(monetary)作为指标,成本(monetary)指标实际上是对计算量和通信量平衡得到的指标,更适用于实际业务需求。

2.基础知识

目前Single-PIR最好的协议大多基于近似同态算法(Somewhat homomorphic encryption SHE)设计的,SealPIR中用到的是[BFV12][5]算法。

2.1 BFV方案

[BFV12]将[Brakerski12][6]中的同态算法从LWE迁移到RLWE,RLWE因为有特殊的结构比LWE性能更好,例如,RLWE选择特定参数时,乘法可以使用NTT(Number Theoretic Transform)。BFV算法的参数包括:
  • 多项式次数: ?
  • 明文模: ?,素数
  • 密文模: ?,若干素数的乘积
明文空间是??=??[?]/(??+1),即:?0+?1?+…+??-2??-2+??-1??-1,??∈??密文由两个多项式(?0,?1)构成,?0,?1∈??=??[?]/(??+1)。密文扩张因子(Ciphertext expansion factor),是指SHE加密后得到密文相对明文的增大的比例,对于BFV算法,密文扩张因子?=2???(?)/???(?)。对于128bit安全,同态加密标准中给出了推荐参数。考虑上面的密文扩展因子,明文模?取相对较大时,能获得较小的密文扩张;但进行密文同态计算时,明文模?太大时,会导致噪声增长太快,明文模?也不能取得太大。SealPIR中BFV参数中N和q选择举例如下表:
多项式次数 明文模 密文模
2048  

54bit

4096

38bit

109bit 2*36+37

8192

17bit

218bit 243+344

SealPIR中用到的同态运算:

  • 密文加法:

    明文?1(?),?2(?)对应的密文是?1和?2,?1+?2是?1(?)+?2(?)的密文。

  • 明文乘密文:

    明文?1(?)对应的密文是?1,?2(?)·?1是?1(?)·?2(?)的密文。

  • 替换:

    明文?(?)对应的密文是?,对于奇数?,???(?,?)是?(??)的密文。

    例如,?(?)=7+?2+2?3,???(?,3)得到?(?3)=7+{?3}2+2{?3}3=7+?6+2?9的密文。

SHE的同态运算会引起噪声的增长,当噪声超过一定限制时,无法解密得到明文,所以要适当选择SHE算法的参数,及控制同态运算的噪声增长。

2.2 HE-based PIR

HE-based PIR基本原理如下图所示:

假设服务端数据量为?,基本流程如下

  1. 客户端生成BFV算法的私钥和公钥(??,??);
  2. 客户端生成查询?维0-1向量(0,...,0,1,0,...,0),其中查询index ?的位置位1,其它位置为0;
  3. 客户端使用公钥加密查询向量的每个分量,得到(?(0),...,?(0),?(1),?(0),...,?(0)),发送给服务端;
  4. 服务端接收到密态查询向量后,和本地数据构成的?维向量(?1,?2,...,??),进行点乘,得到?(0·?1+...+0·??-1+??+0·??+1+...+0·??),发送给客户端;
  5. 客户端对查询响应密文解密,得到待查询的数据??

HE-based PIR协议可以抽象为四个子算法,即(Setup,Query,Answer,Extract),如下图所示:

  • SETUP: 服务端 将数据库中的数据转换为HE明文
  • QUERY: 客户端根据查询index,生成密态查询向量
  • ANSWER: 服务端计算明文向量和密文向量的内积
  • EXTRACT: 客户端使用私钥解密查询响应密文,得到查询数据

3.SealPIR协议

HE-based PIR基本原理中的协议,存在的问题是
  • 查询请求的计算量和通信量都大,需要生成和发送?个密文;

  • 服务端每个数据表示为一个HE明文,需要计算n为向量的内积,容易导致噪声太大,无法解密
SealPIR论文给出了解决上面的问题的办法:

3.1 将多个数据pack到一个HE明文

查询的db_index需要转换为plaintext_index

假设数据库中数据长度为288字节(SealPIR论文中给出的长度),BFV参数选择:多项式次数8192,明文模16bit,举例说明一下pack的效果:

  • 数据库中每条数据,需要HE 明文多项式中个系数来表示????(288*8/16)=144。
  • HE 一个明文多项式可以包含?????(8192/144)=56调数据库数据。
  • 对数据库的查询db_idx,需要转换为明文的查询plain_index=?????/56。
  • 用户得到查询相应密文,通过私钥进行解密,得到HE明文,将HE明文对应的系数进行组合,得到真正查询的数据。

3.2 将查询向量压缩到一个密文

显著减少通信量,服务端增加一个额外的Expand操作得到查询密文向量。

查询向量(0,...,0,1,0,...,0)压缩到一个HE明文多项式为例,查询向量中的每个分量对应为HE明文多项式中的系数。

?0+?1?+...+??-2??-2+??-1??-1=??????_?????,其中:??=0,?≠?????_????? , ??=1,?=?????_?????。

对查询明文进行加密,得到?(?0+?1?+...+??-2??-2+??-1??-1)=?(??????_?????)。

服务端接收到查询密文后,执行Expand算法,得到查询密文向量:(?(0),...,?(0),?(1),?(0),...,?(0))。

还是以上面packing的参数举例,每个HE明文可以pack 56个数据库数据,客户端查询时,将db_index转换为plain_index,即对HE明文数据库进行查询,最多可以查询8192个HE明文,转换成数据库数据,最多可以查询8192*56=458752条数据,不能满足实际业务中的需求。

为了满足实际将查询向量压缩到多个HE明文来表示查询向量,对于百万数据来讲,需要????(1000000/8192)=123个HE明文,对应123个HE密文,才能表示百万数据的查询向量。为了进一步压缩查询密文的数量,可以使用下面的多维表示方法。

Expand算法的详细描述和证明可以参考[ACLS18][2]论文中的内容。

3.3 将数据库一维向量转换为多维向量

二维查询时将数据库数据表示为√?*√?的矩阵,减少查询向量

以上面packing的参数举例,将数据库表示为2维数据时,通过两个查询密文可以查询的数据量是8192*8192*56≈37亿,已经能满足绝大多数的数据库查询任务。数据库数据量为?,通过packing后得到HE明文数量为?′,?是密文扩张因子,二维查询流程如下:

服务端:

  • 将HE明文表示为√?′*√?′的矩阵?,其中√?′<8192。
  • ??是密文查询列向量,??=?·??,其中??是√?′ * 1的密文列向量。
  • 将??中每个密文拆分为?份明文多项式,得到√?′ * ?矩阵???
  • ??是密文查询行向量,????·??,? * 1得到的密文向量。

客户端:

  • 客户端收到?个密文向量,使用私钥??解密,将其组合成密文???(?[?,?]),对使用私钥??解密???(?[?,?])得到真正的查询HE明文?[?,?],对HE明文?[?,?]中对应的系数进行组合,得到真正查询的数据。

服务端为了避免进行密文乘以密文的同态运算,第3步中将密文拆解成?个明文进行操作,最后服务端发给客户端的查询响应是?个密文,在多项式次数8096时,?≈26,因此,服务端发给客户端的查询响应消息太大,这也是SealPIR主要的问题,后续的文章,主要目标是减少查询响应消息,在后面的性能对比中可以看到。

3.4 通过一次进行多个查询降低整体性能开销

SealPIR论文中还给出了通过PBC(probabilistic batch code)将数据库中的内容分成若干batch,同时执行k个查询时,分别对不同的batch进行查询,降低整体的性能开销。论文给出了基于CuckooHash的PBC构造方案。

CuckooHash的hash数为3,bin数量为1.5?,k为同时查询的数量。

服务端 预处理:

  • 对DB中n个index,分别计算cuckooHash的3个Hash,得到3个bin_index,将(db_index, data)插入到3个bin_index中。

客户端 预处理:

  • 对DB中n个index,分别计算cuckooHash的3个Hash,得到3个bin_index,将(db_index)插入到3个bin_index中。

  • 将k个查询,通过cuckooHash,插入到?=1.5?个bin中,对空的bin进行随机填充。

  • 对每个bin执行PIR,共计b个PIR,每个PIR的index,是客户端实际查询的data_idx,在bin中的索引。

从上图中可以看到,客户端生成的是CuckooHashTable和SimpleHashTable两张表,服务端生成的SimpleHashTable。客户端和服务端SimpleHashTable的差别在于,服务端SimpleHashTable有实际待查询的数据,服务端SimpleHashTable只是模拟了服务端插入过程,bin中有db_index。

3.5 SealPIR的性能

SealPIR论文Figure里给出single_query和multi-query的性能数据,多项式次数是2048,明文模式20bit,密文模式60bit,数据长度288字节,数据量220

从上面可以看到,对于百万数据(220)单个查询的时间是3.3秒左右,多个查询(256)性能可以降到0.1秒左右。

4.其它改进协议

这里介绍一下21年的两篇PIR方面的文章:
  • 发表在USENIX21年的[ALP+21][7]

  • 发表在CCS21年的OnionPIR:[MCR21][8]

[ALP+21]题目是《Communication–Computation Trade-offs in PIR》是计算量和通信量平衡的PIR方案,该方案显著降低了查询响应的通信量,从成本(monetary)的角度看比SealPIR降低了35%。

OnionPIR利用了somewhat homomorphic encryption(SHE)最新的进展,将两种lattice-based SHE 方案(BFV 和 RGSW)组合在一起,降低了查询响应的大小和计算量。还设计了基于状态(stateful)的PIR。

从上面的数据看到,虽然相应的改进协议对查询响应大小都有较大改进,但整体运行时间方面和SealPIR差别不大,由于引入了更复杂的算法,实现成本也会变得更高,综合来看SealPIR在实际应用中还是相对较好的选择。

参考文献

[1][SealPIR] SealPIR: A computational PIR library that achieves low communication
costs and high performance, 2020. https://github.com/microsoft/SealPIR.[2][ACLS18] S. Angel, H. Chen, K. Laine and S. Setty,"PIR with Compressed Queries and Amortized Query Processing,"2018 IEEE Symposium on Security and Privacy (SP), 2018, pp. 962-979, doi: 10.1109/SP.2018.00062.

[3][CKGS95] B. Chor, O. Goldreich, E. Kushilevitz, and M. Sudan"Private information retrieval", in Proceedings of IEEE 36th Annual Foundations of Computer Science, pp. 41-50, Oct 1995.

[4][BGI16] Elette Boyle, Niv Gilboa, and Yuval Ishai.Function secret sharing: Improvements and extensions. In CCS, 2016.

[5][BFV12] Junfeng Fan and Frederik Vercauteren. 2012.Somewhat Practical Fully Homomorphic Encryption.IACR Cryptol. ePrint Arch. 2012 (2012), 144.

[6][Brakerski12] Zvika Brakerski.Fully Homomorphic Encryption without Modulus Switching from Clas-sical GapSVP. IACR Cryptology ePrint Archive, 2012:78, 2012.

[7][ALP+21] Asra Ali, Tancrède Lepoint, Sarvar Patel, Mariana Raykova, Phillipp Schoppmann, Karn Seth, and Kevin Yeo.
Communication-computation trade-o s in PIR. In USENIX Security, 2021.

[8][MCR21] M. Mughees, Hao Chen, Ling RenOnionPIR: Response Efficient Single-Server PIR, CCS'21.

[9][CGN98] Benny Chor, Niv Gilboa, and Moni Naor.

Private information retrieval by keywords.
IACR Cryptology ePrint Archive, 1998:3, 1998.

[10][CHLR18] Hao Chen, Zhicong Huang, Kim Laine, and Peter Rindal.
Labeled PSI from fully homomorphic encryption with malicious security.
In ACM Conference on Computer and Communications Security, pages 1223–1237. ACM, 2018.P.S.文中素材来自公开发表论文,如有不妥,将立即删除

有关隐私计算技术解读 | 一文读懂SealPIR-基于同态的隐私信息检索协议的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  10. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

随机推荐