隐私计算实训营第5讲-------隐私求交和隐语PSI介绍以及开发实践

简介: 隐私求交(Private Set Intersection, PSI)是利用密码学技术在不暴露数据集以外信息的情况下找到两集合的交集。隐语SPU支持三种PSI算法:ECDH(适合小数据集)、KKRT(基于Cuckoo Hashing和OT Extension,适合大数据集)和BC22PCG(使用伪随机相关生成器)。ECDH基于椭圆曲线 Diffie-Hellman,KKRT利用OT Extension实现高效处理,而BC22PCG通过压缩满足特定相关性的随机数减少通信量。此外,还有基于Oblivious Pseudo-Random Function (OPRF)的PSI协议。

隐私求交(Private Set Intersection)是一种使用密码学方法,获取两份数据内容的交集的算法。PSI过程中不泄露任务交集以外的信息。
image.png
在隐语中,SPU设备支持三种隐私求交算法:
ECDH:半诚实模型, 基于公钥密码学,适用于小数据集。
KKRT:半诚实模型, 基于布谷鸟哈希(Cuckoo Hashing)以及高效不经意传输扩展(OT Extension),适用于大数据集。
BC22PCG:半诚实模型, 基于随机相关函数生成器。
image.png

1. ECDH-PSI (两方)

半诚实模型的DH-PSI协议在 Huberman, Franklin, and Hogg 中提出,但最早可以追溯到Meadows。DH-PSI协议对数据集中的数据进行指数(点乘)运算。
DH-PSI 协议基于判定Diffie-Hellman假设:
选取群 G, 和生成元 g
假设: 对于随机数 a,b,c 不能区分 image.png

可以选择的群包括有限域上的乘法群和椭圆曲线上的加法群。实际应用中,综合性能和安全方面比较,通常选取椭圆曲线群,例如: Curve25519 [Ber06]。

image.png
image.png

KKRT16-PSI

[KKRT16] 是半诚实 OT-based PSI协议,基于 OT Extension, BaRK-OPRF 和 CuckooHash。 [KKRT16] 是第一个在千万规模,长度(128 bits)数据集上,求交时间在1分钟之内的PSI协议.

隐语 SPU PSI 中使用了 [PSZ18] 提到的 3-way stash-less CuckooHash。

image.png

BC22 PCG-PSI

伪随机相关生成器(Pseudorandom Correlation Generator PCG), 是 Boyle等人在一系列论文 [BCG+19b], [BCGI18], [SGRR19], [BCG+19a], [CIK+20] 中引入的一种密码协议。PCG的优势在于可以将满足特定相关条件的随机数,在不影响安全的前提下进行压缩.

Boyle 等人设计了一系列满足特定相关性的高效PCG协议, 例如: vector oblivious linear evaluation (VOLE) 或者batch oblivious linear evaluation (BOLE)。这些基础的密码原语是现代安全多方计算中的核心组件,可以显著降低通信量。基于LPN假设,PCG/VOLE 函数,Receiver 和Sender得到一组满足线性关系的分量,通信量是亚线性的。

基于ecdh-OPRF的PSI协议

image.png

不经意伪随机函数(Oblivious Pseudorandom Function OPRF)是一个两方协议,客户端和服务端通过执行协议计算伪随机函数(Pseudorandom Function PRF)的结果。RFC 草案 [draft-irtf-cfrg-voprf-10] 基于素数阶群,给出了OPRF, VOPRF, and POPRF 的构造方案。
image.png

隐语PSI开发指南

代码:

import os
import sys
import time
import logging
import multiprocess
from absl import app
import spu
import secretflow as sf
#ray start --head --node-ip-address="xxx.xxx.56.xx" --port="25673" --include-dashboard=False --disable-usage-stats
# In case you have a running secretflow runtime already.
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)



tls_config ={
   
   
    "ca_cert": "/home/fate01/code/secretflow-code/certificate/cert/bob_ca.crt",
    "cert": "/home/fate01/code/secretflow-code/certificate/cert/alice_ca.crt",
    "key": "/home/fate01/code/secretflow-code/certificate/cert/alice_ca.key",

}

cluster_config ={
   
   
    'parties': {
   
   
        'alice': {
   
   
            # replace with alice's real address.
            'address': 'xxx.xxx.56.xx:9923',
            'listen_addr': '0.0.0.0:9923'
        },
        'bob': {
   
   
            # replace with bob's real address.
            'address': 'xxx.xxx.56.xx:9924',
            'listen_addr': '0.0.0.0:9924'
        },
    },
    'self_party': 'alice'
}




sf.init(address='xxx.xxx.56.xx',  cluster_config=cluster_config,tls_config=tls_config)

# sf.init(address='xxx.xxx.56.xx:25673',  cluster_config=cluster_config)

alice= sf.PYU('alice')
bob= sf.PYU('bob')
# your code to run.


cluster_def={
   
   
    'nodes': [
        {
   
   
            'party': 'alice',
            'id': 'alice',
            # Please choose an unused port.
            'address': 'xxx.xxx.56.xx:25676',
            'listen_addr': '0.0.0.0:25676'
        },
        {
   
   
            'party': 'bob',
            'id': 'bob',
            # Please choose an unused port.
            'address': xxx.xxx.56.xx:25176',
            'listen_addr': '0.0.0.0:25176'
        },
    ],
    'runtime_config': {
   
   
        'protocol': spu.spu_pb2.CHEETAH,
        'field': spu.spu_pb2.FM32,
        'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
    }
}
link_desc = {
   
   
    'recv_timeout_ms': 36000,
}




start = time.time()

spu = sf.SPU(cluster_def=cluster_def,link_desc=link_desc)



input_path = {
   
   alice: '/home/fate01/code/secretflow-code/database/psi_alice.csv', bob: '1'}
output_path = {
   
   alice: '.data/1_psi.csv', bob: '.data/2_psi.csv'}
spu.psi_csv('id', input_path, output_path, 'alice',protocol='ECDH_PSI_2PC',curve_type="CURVE_FOURQ",bucket_size=1<<30)
#spu.psi_csv('id', input_path, output_path, 'alice',protocol='BC22_PSI_2PC')
logging.info(f"IO times: {time.time() - start}s")
相关文章
|
6月前
|
算法 数据挖掘 调度
隐语实训营-第3讲:详解隐私计算框架的架构和技术要点
主要介绍隐语的隐私计算架构,并对每个模块进行拆解、分析,以期望不同使用者找到适合自己的模块,快速入手。
117 4
|
6月前
|
机器学习/深度学习 算法 数据可视化
# 隐私计算实训营note#3 详解隐私计算框架及技术要点
这一讲的内容是介绍蚂蚁的SecretFlow框架[第3讲:详解隐私计算框架及技术要点](https://www.bilibili.com/video/BV1dJ4m1b7AX/)。
|
数据采集 缓存 安全
隐语小课|非平衡隐私集合求交(Unbalanced PSI)协议介绍
隐语小课|非平衡隐私集合求交(Unbalanced PSI)协议介绍
707 0
|
6月前
|
机器学习/深度学习 算法 安全
隐私计算训练营第三讲-详解隐私计算的架构和技术要点
SecretFlow 是一个隐私保护的统一框架,用于数据分析和机器学习,支持MPC、HE、TEE等隐私计算技术。它提供设备抽象、计算图表示和基于图的ML/DL能力,适应数据水平、垂直和混合分割场景。产品层包括SecretPad(快速体验核心能力)和SecretNote(开发工具)。算法层涉及PSI、PIR、数据分析和联邦学习(水平、垂直、混合)。此外,SecretFlow还有YACL密码库和Kusica任务调度框架,Kusica提供轻量化部署、跨域通信和统一API接口。
219 0
|
6月前
|
监控 安全 数据可视化
第9讲:隐语多方安全计算在安全核对的行业实践丨隐私计算实训营 第1期
行业法规趋势强调数据安全与隐私保护,如《个人信息安全规范》、《数据安全法》和《个人信息保护法》,倡导最小权限原则和数据的有效利用。产品方案致力于在保障安全和隐私的前提下促进数据共享。技术共建中,与隐语合作构建安全自证能力,包括可审查性、可视化监控和可攻防的验证机制,确保数据操作透明且安全。
67 1
|
6月前
|
算法 数据库
隐私计算实训营第6讲-------隐语PIR介绍及开发实践丨隐私计算实训营 第1期
隐匿查询(PIR)允许用户在不暴露查询内容的情况下检索服务器数据库。PIR分为单服务器和多服务器方案,以及Index PIR和Keyword PIR两类。隐语目前实现了单服务器的SealPIR(用于Index PIR)和Labeled PSI(用于Keyword PIR)。SealPIR优化点包括:数据打包、查询向量压缩、支持多维和多个查询。未来,隐语PIR的计划包括性能提升、多服务器方案和新算法的探索。
336 3
|
6月前
|
数据安全/隐私保护
课5-隐私求交和隐语PSI介绍及开发实践
Alice和Bob分别创建了CSV文件`alice_psi_input.csv`和`bob_psi_input.csv`,包含姓名和年龄数据。他们使用SecretFlow库执行隐私保护集合求交(PSI)协议,版本v1和v2,通过ECDH_PSI_2PC或PROTOCOL_ECDH协议,不泄露原始数据。在PSI过程中,双方找出共享的姓名,结果发送给Alice。
|
6月前
|
人工智能 Python
隐私计算实训营 第1期-第4讲 快速上手隐语SecretFlow的安装和部署
文档改进建议:明确Ray, K3S, Kuscia与SecretFlow的关系;结构化部署文档,区分顺序步骤与选择分支;提供从零开始的详细部署教程,补充缺失的前置步骤说明。
|
6月前
|
Linux Docker 容器
隐私计算实训营第4讲-------快速上手隐语SecretFlow的安装和部署
考虑到很多小伙伴可能是初学者之前并没有安装docker 以及docker-compose的经验,本文记录如何在Linux系统上快速的部署docker以及更换国内镜像源。在部署完成以后展示了隐语从源码编译部署以及secretnote的安装,简单快速,非常实用。
226 1
|
6月前
|
机器学习/深度学习 运维 安全
隐私计算实训营 第1期 【第1讲】
隐私计算实训营 第1期 【第1讲】—— 导论 | 数据可信流通 从运维信任到技术信任
142 3