课5-隐私求交和隐语PSI介绍及开发实践

简介: Alice和Bob分别创建了CSV文件`alice_psi_input.csv`和`bob_psi_input.csv`,包含姓名和年龄数据。他们使用SecretFlow库执行隐私保护集合求交(PSI)协议,版本v1和v2,通过ECDH_PSI_2PC或PROTOCOL_ECDH协议,不泄露原始数据。在PSI过程中,双方找出共享的姓名,结果发送给Alice。

csv_data

alice

import pandas as pd

alice_df = pd.DataFrame({
   "name": ["mike", "tony", "john", "kate"],"age": [15,13,20,21]})
alice_df.to_csv(f"./alice_psi_inputt.csv", index=False)

bob

import pandas as pd

bob_df = pd.DataFrame({
   "name": ["alice", "tony", "john", "kitty"],"age": [15,13,20,21]})
bob_df.to_csv(f"./bob_psi_inputt.csv", index=False)

image.png

PSI

https://www.secretflow.org.cn/zh-CN/docs/psi/v0.2.0beta/getting_started
image.png

PSI_v1

alice

import spu
import secretflow as sf

cluster_config ={
   'parties':{
   
                           'alice':{
   
                                   'address': '172.17.0.3:52000',
                                   'listen_addr': '0.0.0:52000'
                                   },
                           'bob':{
   
                                   'address':'172.17.0.4:52000',
                                   'listen_addr': '0.0.0:52000'
                                  }
                            },
                 'self_party':'alice'
                 }

sf.shutdown()
sf.init(address='local',cluster_config=cluster_config)
alice = sf.PYU('alice')
bob = sf.PYU('bob')

cluster_def={
   
           "nodes":[{
   "party": "alice", "address": "172.17.0.3:41805"},
                    {
   "party":"bob", "address": "172.17.0.4:52397"},],
           "runtime_config":{
   
                          "protocol": spu.spu_pb2.SEMI2K,
                          "field": spu.spu_pb2.FM128,
                            }
             }

spu = sf.SPU(cluster_def, link_desc={
   "connect_retry_times": 60, "connect_retry_interval_ms":1000,})

spu.psi_csv(
    key={
   alice:["name"],bob:["name"]},
    input_path={
   alice:f"/root/psi/data/alice_psi_input.csv", bob:f"/root/psi/data/bob_psi_input.csv"},
    output_path={
   alice:f"/root/psi/data/alice_psi_output.csv",bob:f"/root/psi/data/bob_psi_outpuut.csv"},
    receiver="alice",
    broadcast_result=True,
    protocol="ECDH_PSI_2PC",
    curve_type="CURVE_25519")

bob

import spu
import secretflow as sf

cluster_config ={
   'parties':{
   
                           'alice':{
   
                                   'address': '172.17.0.3:52000',
                                   'listen_addr': '0.0.0:52000'
                                   },
                           'bob':{
   
                                   'address':'172.17.0.4:52000',
                                   'listen_addr': '0.0.0:52000'
                                  }
                            },
                 'self_party':'bob'
                 }

sf.shutdown()
sf.init(address='local',cluster_config=cluster_config)
alice = sf.PYU('alice')
bob = sf.PYU('bob')

cluster_def={
   
           "nodes":[{
   "party": "alice", "address": "172.17.0.3:41805"},
                    {
   "party": "bob", "address": "172.17.0.4:52397"}],
           "runtime_config":{
   
                          "protocol": spu.spu_pb2.SEMI2K,
                          "field": spu.spu_pb2.FM128
                          }
            }

spu = sf.SPU(cluster_def, link_desc={
   "connect_retry_times": 60, "connect_retry_interval_ms":1000,})
print(dir(spu))

spu.psi_csv(
    key={
   alice:["name"],bob:["name"]},
    input_path={
   alice:f"/root/psi/data/alice_psi_input.csv", bob:f"/root/psi/data/bob_psi_input.csv"},
    output_path={
   alice:f"/root/psi/data/alice_psi_output.csv",bob:f"/root/psi/data/bob_psi_outpuut.csv"},
    receiver="alice",
    broadcast_result=True,
    protocol="ECDH_PSI_2PC",
    curve_type="CURVE_25519")

PSI_v2

alice

import spu
import secretflow as sf

cluster_config ={
   'parties':{
   
                           'alice':{
   
                                   'address': '172.17.0.3:52000',
                                   'listen_addr': '0.0.0:52000'
                                   },
                           'bob':{
   
                                   'address':'172.17.0.4:52000',
                                   'listen_addr': '0.0.0:52000'
                                  }
                            },
                 'self_party':'alice'
                 }

sf.shutdown()
sf.init(address='local',cluster_config=cluster_config)

cluster_def={
   
           "nodes":[{
   "party": "alice", "address": "172.17.0.3:41805"},
                    {
   "party":"bob", "address": "172.17.0.4:52397"},],
           "runtime_config":{
   
                          "protocol": spu.spu_pb2.SEMI2K,
                          "field": spu.spu_pb2.FM128,
                            }
             }

spu = sf.SPU(cluster_def, link_desc={
   "connect_retry_times": 60, "connect_retry_interval_ms":1000,})

spu.psi_v2(
    keys={
   "alice":["name"],"bob":["name"]},
    input_path={
   "alice":f"/root/psi/data/alice_psi_input.csv", "bob":f"/root/psi/data/bob_psi_input.csv"},
    output_path={
   "alice":f"/root/psi/data/alice_psi_output.csv","bob":f"/root/psi/data/bob_psi_outpuut.csv"},
    receiver="alice",
    broadcast_result=True,
    protocol="PROTOCOL_ECDH",
    ecdh_curve="CURVE_25519")

bob

import spu
import secretflow as sf

cluster_config ={
   'parties':{
   
                           'alice':{
   
                                   'address': '172.17.0.3:52000',
                                   'listen_addr': '0.0.0:52000'
                                   },
                           'bob':{
   
                                   'address':'172.17.0.4:52000',
                                   'listen_addr': '0.0.0:52000'
                                  }
                            },
                 'self_party':'bob'
                 }

sf.shutdown()
sf.init(address='local',cluster_config=cluster_config)

cluster_def={
   
           "nodes":[{
   "party": "alice", "address": "172.17.0.3:41805"},
                    {
   "party": "bob", "address": "172.17.0.4:52397"}],
           "runtime_config":{
   
                          "protocol": spu.spu_pb2.SEMI2K,
                          "field": spu.spu_pb2.FM128
                          }
            }

spu = sf.SPU(cluster_def, link_desc={
   "connect_retry_times": 60, "connect_retry_interval_ms":1000,})

spu.psi_v2(
    keys={
   "alice":["name"],"bob":["name"]},
    input_path={
   "alice":f"/root/psi/data/alice_psi_input.csv", "bob":f"/root/psi/data/bob_psi_input.csv"},
    output_path={
   "alice":f"/root/psi/data/alice_psi_output.csv","bob":f"/root/psi/data/bob_psi_outpuut.csv"},
    receiver="alice",
    broadcast_result=True,
    protocol="PROTOCOL_ECDH",
    ecdh_curve="CURVE_25519")

image.png

相关文章
|
7月前
|
算法 数据挖掘 调度
隐语实训营-第3讲:详解隐私计算框架的架构和技术要点
主要介绍隐语的隐私计算架构,并对每个模块进行拆解、分析,以期望不同使用者找到适合自己的模块,快速入手。
121 4
|
7月前
|
分布式计算 算法 调度
课3-详解隐私计算框架的架构和技术要点
隐语架构涵盖产品、算法、计算、资源和硬件五层,旨在实现互联互通和跨域管控。产品层包括SecretPad等,简化用户和集成商体验。算法层涉及PSI/PIR、SCQL和联邦学习,提供隐私保护的数据分析和学习。计算层如RayFed、SPU、HEU等,支持分布式计算和密态处理。资源层的KUSCIA用于跨机构任务编排,硬件层涉及FPGA等加速器。互联互通支持黑盒和白盒模式,确保不同平台协作。跨域管控则强调数据流转控制,保护数据权益。
|
7月前
|
机器学习/深度学习 算法 安全
隐私计算训练营第三讲-详解隐私计算的架构和技术要点
SecretFlow 是一个隐私保护的统一框架,用于数据分析和机器学习,支持MPC、HE、TEE等隐私计算技术。它提供设备抽象、计算图表示和基于图的ML/DL能力,适应数据水平、垂直和混合分割场景。产品层包括SecretPad(快速体验核心能力)和SecretNote(开发工具)。算法层涉及PSI、PIR、数据分析和联邦学习(水平、垂直、混合)。此外,SecretFlow还有YACL密码库和Kusica任务调度框架,Kusica提供轻量化部署、跨域通信和统一API接口。
226 0
|
7月前
|
算法 安全 大数据
隐私计算实训营第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协议。
529 0
|
7月前
|
算法 数据库
隐私计算实训营第6讲-------隐语PIR介绍及开发实践丨隐私计算实训营 第1期
隐匿查询(PIR)允许用户在不暴露查询内容的情况下检索服务器数据库。PIR分为单服务器和多服务器方案,以及Index PIR和Keyword PIR两类。隐语目前实现了单服务器的SealPIR(用于Index PIR)和Labeled PSI(用于Keyword PIR)。SealPIR优化点包括:数据打包、查询向量压缩、支持多维和多个查询。未来,隐语PIR的计划包括性能提升、多服务器方案和新算法的探索。
345 3
|
7月前
|
运维 安全
隐语学习笔记
隐语学习笔记
41 1
|
7月前
|
运维 安全 数据安全/隐私保护
|
7月前
第8讲:隐语SCQL的开发实践丨隐私计算实训营 第1期
SCQL 提供中心化和P2P两种部署架构。中心化依赖第三方的SCDB,各数据方仅需SCQLEngine;P2P模式无第三方,各数据方需SCQLEngine和SCQLBroker。使用流程包括配置、注册、启动和执行查询。P2P部署实践展示详细步骤。[查看部署教程](https://www.secretflow.org.cn/zh-CN/docs/scql/0.5.0b2/intro/p2p-tutorial)。
109 0
|
7月前
|
Linux
隐私计算实训营 第1期 - 第5讲:隐语PSI介绍及开发实践
在本文档中,介绍了如何在两个虚拟机上安装和配置SecretFlow和SecretNote。首先,环境配置包括一台运行CentOS 7.9的虚拟机(Alice节点)和一台运行Rocky Linux 9.3的虚拟机(Bob节点),均为8核16GB内存。 之后,文档展示了如何在SecretNote中上传数据并创建Notebook执行PSI(Private Set Intersection)任务。过程中需要注意Ray版本兼容性问题,以及最终成功执行后的结果展示。