APSI - 2

上一篇 APSI-1 其实就是对开源库README文件的一个翻译加上自己的一点点理解,因为篇幅过大,导致继续编辑有些卡顿,所以新开一篇继续。
前面介绍了APSI的大致技术、优化方法、以及举例说明了主要流程(unbalanced-PSI)。
下面主要介绍labeled-PSI!

Labeled Mode#

Basic Idea#

label模式和前面讲的没有太大区别,但需要一些额外的解释。receiver除了想要知道其查询项是否在sender的集合中之外,还想知道发送方与这些项关联的数据,即交集数据对应的label。(sender中存储的数据视为key-value)。

换成人话,就是sender中存储的都是key-value型的数据,而receiver中只有key,receiver想通过输入key,得到sender中匹配到的value值。即【带关键词的PIR】。论文和APSI中使用的是{item - lable}表示!

为了理解labled-APSI的工作原理,回顾前面讲到的Basic Idea,在对receiver发过来的加密查询项Q进行计算时,匹配多项式M(x)的输出要么是0的加密(匹配上),要么是非0的加密(没有匹配)。在labled-PSI中,sender会创建另外一个多项式L(x),即插值多项式,具有以下性质:如果(Yi,Vi)表示sender得数据集,则L(Yi)=Vi,收到receiver发送过来的Q,sender计算多项式对((M(Q),L(Q)),并将结果返回给receiver;receiver解密该结果对,观察第一个值是否为0,如果是,则第二个值即是所需的label!

Large Labels#

一个较大的问题,就是所有的密文计算都需要模plain_modulus,但是sender的lable比这个要长的多。对于比较长的item,在Large Items中,首先先讲item通过hash,生成一个大小为(80-128 bit)的hash值【控制item的长度】,然后经过一系列的batch,对其编码。这种方法也适用于解决lable过长的问题。也就是说,lable可以被分解成类似于item的小部分,对于每个部分,我们可以形成一个lable插值多项式,当对所对应的item进行评估时,输出lable的该部分。

这还不是一个令人满意的解决方案,因为我们的item没有固定的大小,而且非常长(最大128位)。lable比item长,lable可以分成多个部分,每一部分的长度为item的长度。对于每个部分,我们可以构造一个单独的标签插值多项式,在加密查询中对它们进行求值,并将每个加密结果返回给receiver。receiver解密结果并连接它们,以恢复匹配项的lable。

Label Encryption#

上述方法存在一个必须解决的严重问题。回想一下我们是如何使用OPRF来防止sender的item部分(或全部)泄漏给receiver的:给出一个itemY,匹配多项式不能直接计算Y,而是计算ItemHash(s,Y),这表示item Y所对应的OPRF值OPRF(s,Y)的前128 bit,这就意味着标签插值多项式L应该满足L(ItemHash(s,Yi))=Vi对于sender的每一个item Yi,然而receiver能够猜出一些ItemHash(s,Yi),就可以查询出其所对应的lable,这是不能接受的,因为receiver是不能知道item Yi

上面的意思在论文中,其实就是将OPRF的值分为两部分,一部分用于计算求交多项式,这里label没有加密,所以不安全。下面讲的是另外一部分用于加密label。
要明白:ItemHash(s,Y)表示OPRFSY的前128bit;插值多项式L(ItemHash(s,Yi))=Vi

为了解决这个问题,sender使用了一个对称加密函数Enc(<input>,<key>,<nonce>)使用来自OPRF(s,Yi)的输出的另外一部分加密labelVi。具体来说,加密密钥为LabelKey(s,Yi)labelViitemYi,是256 bit的输出OPRF(s,Yi)的剩余128bit。因此发送给receiver的label就变成了Enc(Vi,LabelKey(s,Yi),nonce)

LabelKey(s,Yi)表示OPRF(s,Yi)的剩余128bit;

还有一些问题,因为receiver一定是想知道些什么nonce【半诚实的receiver】。第一种选择是选择使用常量或空的nonce(没有随机数)。这种情况下,必须注意,对手可能辨别出两个不同的加密label,其中两个label对应的是同一个item,使用的是相同的OPRF的key:s,这样就有可能得到关于label的相关信息。这种情况会发生,因为APSI支持更新item的label
另一种选择是使用随机生成的长nonce(每次加密都不同)。APSI的实现是随机采样一个nonce,和加密的Vi拼接在一起。具体来说,sender为每一个itemYi随机采样一个nonce,然后计算出插值多项式L(ItemHash(s,Yi))=nonce,然后与加密的Vi拼接:L(ItemHash(s,Yi))=nonce|Enc(Vi,LabelKey(s,Yi),nonce)

nonce 理解为随机数吧

receiver从sender那里得到一些加密的label,没有任何作用,除非他知道对应的item Yi。此外即使receiver通过猜测ItemHash(s,Yi)获得了nonce|Enc(Vi,LabelKey(s,Yi),nonce),在离线攻击中,枚举出所有的item:Yi,他仍然无法获得label,因为LabelKey(s,Yi)是从OPRF(s,Yi)中获得的,而不是Yi

APSI允许sender指定nonce的字节大小,默认的nonce单位16 字节,但是值越小,性能越好!

Partial Item Collisions#

还有一个必须要解决的问题:回顾Pracice,sender构造一个大的hash表,并将其分解成多个锯齿状的bin bundles。在label-PSI中,每一个bin bundles不仅包含item的part,也包含对应的label的part,以及标签插值多项式。标签插值多项式不是为整个label创建的,而是对label的part分别创建,即使将整个item分解为part前会加密。

现在看一下发生了什么:item416-part1 和 item12-part1是相同的,如果其所对应的标签label416-part1 和 label12-part1是不同的,则创建一个插值多项式L是不可能的,因为不能针对一个item而输出两个label416-part1 和 label12-part1。【疑惑,插值多项式是插值的item的位置?】

在将item插入bin bundle之前,先检查一下label是否已经出现在相同的位置,就能解决这个问题。如果已经存在,那么该item就不能插入到该bin bundle,而是新建一个bin bundle,再插入。该问题只在label-PSI下存在,会导致比unlabeled-PSI有更差的打包率(items_inserted / theoretical_max)。


最后附上当时整理的笔记:

  1. APSI方案:https://docs.qq.com/pdf/DWU5BaVBrTkNFQWZk?

  2. APSI代码:https://docs.qq.com/pdf/DWUVBWGNCQUdBSHd1?

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/15959797.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(1382)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu