课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

相关文章
|
4月前
|
算法 数据挖掘 调度
隐语实训营-第3讲:详解隐私计算框架的架构和技术要点
主要介绍隐语的隐私计算架构,并对每个模块进行拆解、分析,以期望不同使用者找到适合自己的模块,快速入手。
102 4
|
4月前
|
分布式计算 算法 调度
课3-详解隐私计算框架的架构和技术要点
隐语架构涵盖产品、算法、计算、资源和硬件五层,旨在实现互联互通和跨域管控。产品层包括SecretPad等,简化用户和集成商体验。算法层涉及PSI/PIR、SCQL和联邦学习,提供隐私保护的数据分析和学习。计算层如RayFed、SPU、HEU等,支持分布式计算和密态处理。资源层的KUSCIA用于跨机构任务编排,硬件层涉及FPGA等加速器。互联互通支持黑盒和白盒模式,确保不同平台协作。跨域管控则强调数据流转控制,保护数据权益。
|
4月前
|
算法 安全 大数据
隐私计算实训营第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协议。
422 0
|
2月前
|
运维 安全 数据安全/隐私保护
隐语(SecretFlow)联邦学习实训营第一期笔记
**摘要:** 本文探讨了数据可信流通的概念,强调了数据来源确认、使用范围界定、流程追溯和风险防范的重要性。数据流通分为内循环(安全域内)和外循环(跨域),其中外循环面临黑客攻击、内部泄露和数据滥用等风险。为建立技术信任,提出了身份验证、利益对齐、能力预期和行为审计四点要求,涉及隐私计算、可信计算等技术。隐语作为隐私计算框架,提供服务以支持数据安全流通,通过开源降低接入门槛,并具备统一架构、原生应用、开放拓展、高性能和多轮安全验证等优势。开源隐语助力解决数据权属和信任问题,促进数据要素的安全流通。
|
4月前
|
算法 数据库
隐私计算实训营第6讲-------隐语PIR介绍及开发实践丨隐私计算实训营 第1期
隐匿查询(PIR)允许用户在不暴露查询内容的情况下检索服务器数据库。PIR分为单服务器和多服务器方案,以及Index PIR和Keyword PIR两类。隐语目前实现了单服务器的SealPIR(用于Index PIR)和Labeled PSI(用于Keyword PIR)。SealPIR优化点包括:数据打包、查询向量压缩、支持多维和多个查询。未来,隐语PIR的计划包括性能提升、多服务器方案和新算法的探索。
300 3
|
4月前
|
运维 安全 数据安全/隐私保护
|
4月前
第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)。
80 0
|
4月前
|
Linux
隐私计算实训营 第1期 - 第5讲:隐语PSI介绍及开发实践
在本文档中,介绍了如何在两个虚拟机上安装和配置SecretFlow和SecretNote。首先,环境配置包括一台运行CentOS 7.9的虚拟机(Alice节点)和一台运行Rocky Linux 9.3的虚拟机(Bob节点),均为8核16GB内存。 之后,文档展示了如何在SecretNote中上传数据并创建Notebook执行PSI(Private Set Intersection)任务。过程中需要注意Ray版本兼容性问题,以及最终成功执行后的结果展示。
|
4月前
|
调度