课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讲:详解隐私计算框架的架构和技术要点
主要介绍隐语的隐私计算架构,并对每个模块进行拆解、分析,以期望不同使用者找到适合自己的模块,快速入手。
136 4
|
7月前
|
分布式计算 算法 调度
课3-详解隐私计算框架的架构和技术要点
隐语架构涵盖产品、算法、计算、资源和硬件五层,旨在实现互联互通和跨域管控。产品层包括SecretPad等,简化用户和集成商体验。算法层涉及PSI/PIR、SCQL和联邦学习,提供隐私保护的数据分析和学习。计算层如RayFed、SPU、HEU等,支持分布式计算和密态处理。资源层的KUSCIA用于跨机构任务编排,硬件层涉及FPGA等加速器。互联互通支持黑盒和白盒模式,确保不同平台协作。跨域管控则强调数据流转控制,保护数据权益。
|
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协议。
577 0
|
7月前
|
API 数据库
课6-匿踪查询和隐语PIR的介绍及开发实践
隐匿查询(PIR)允许用户从服务器检索数据而不暴露查询内容。类型包括单服务器与多服务器方案,以及Index PIR和Keyword PIR。隐语支持SealPIR用于单服务器Index PIR,压缩查询并支持多维和多查询处理。另外,它采用Labeled PSI实现单服务器Keyword PIR,优化了计算和通信效率,基于微软代码并扩展了功能,如OPRF、特定ECC曲线支持和预处理结果保存。隐语提供的PIR相关API包括`spu.pir_setup`和`spu.pir_query`。
课6-匿踪查询和隐语PIR的介绍及开发实践
|
7月前
|
算法 数据库
隐私计算实训营第6讲-------隐语PIR介绍及开发实践丨隐私计算实训营 第1期
隐匿查询(PIR)允许用户在不暴露查询内容的情况下检索服务器数据库。PIR分为单服务器和多服务器方案,以及Index PIR和Keyword PIR两类。隐语目前实现了单服务器的SealPIR(用于Index PIR)和Labeled PSI(用于Keyword PIR)。SealPIR优化点包括:数据打包、查询向量压缩、支持多维和多个查询。未来,隐语PIR的计划包括性能提升、多服务器方案和新算法的探索。
357 3
|
7月前
|
运维 安全
隐语学习笔记
隐语学习笔记
46 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)。
118 0
|
7月前
|
SQL 安全 API
课8-隐语SCQL的开发实践
SCQL 是一种用于安全联合数据分析的工具,开放API供用户集成。通过SCDBClient可体验其功能,支持开发封装产品或集成到业务。使用流程包括部署系统、项目设置和联合分析。SCQL部署涉及环境准备及SCDB和SCQLEngine启动。示例场景是金融机构Alice联合电商平台Bob进行用户画像分析。SCDB中,项目、身份认证、数据表管理和权限信息管理是关键概念。用户需创建数据库、用户、项目,并设置权限和CCL后,发起联合分析查询。SCQL架构包含SPU,支持P2P模式,可用于聚合查询等操作。SecretNote UI界面的部署和使用,用于演示SCQL的业务场景。