1、SPU实现的PSI介绍
PSI定义:PSI是安全多方计算中一个比较实用的协议,其允许参与方输入各自的隐私集合并联合计算集合交集,除接收方获取交集结果外不泄露额外信息。
PSI分类:
- 根据参与方数量可以分为 两方PSI和多方PSI。
- 根据安全模型可以分为 半诚实PSI和恶意PSI。
- 根据参与方能力大小是否对称分为 平衡PSI和非平衡PSI。
- 根据PSI结果的不同有一些扩展协议:PSI-CA(输出交集大小),PSI-payload(与交集元素相关的负载元素的计算),Circuit-PSI(电路PSI,结果通过以秘密分享的方式存储在参与方手中。)
2、SPU PSI调度架构
隐私PSI对功能进行分层,其协议的具体实现在SPU层,在协议实现过程中需要实用的基础密码算子在YACL层,开发者也可利用底层算子设计自己的PSI协议。SPU往上,隐语对PSI做了一个bucket的封装,主要是为了屏蔽不同协议之间的差距,使用户能够统一调用不同PSI协议。secretflow 是python封装层,通过python语法调用PSI,并指定输入文件的格式。
3.SPU已经实现的PSI介绍
1.ECDH-PSI
- ECDH-PSI通过椭圆曲线乘法运算盲化集合元素,双方通过比较经过两次椭圆曲线点乘法运算后的结果来获得交集。其需要大量的指数运算,随着集合大小的增加,其开销也增大。
- 隐语实现的优势:使用计算效率更快的椭圆曲线如25519曲线、FourQ曲线,增加了对国密SM2的支持。
2.KKRT16
- KKRT16论文的贡献主要有
- 1、通过将kk13中的线性纠错码改为使用伪随机函数实现1-out-of-n (n可以是任意长度)的OT。
- 2、构造实现了批处理密钥相关的OPRF(BaRK-OPRF)。
- 协议拥有很高的计算效率,百万数据集只需要3.8s,成为以后与PSI相关论文的比较基准。
- 缺点:
- 内存占用大
- 通信开销大
- 隐语实现的优势:使用Stash-less 的CuckooHash,使用Eklundh 矩阵转置、使用inter比特转换指令加速的矩阵转置。使用Pipeline AES/ Vector AES 加快数据的AES计算。
3.BC22
- 使用VOLE实现BaRK-OPRF拥有更高的计算效率和通信效率。
- Generalized CuckooHash
- Permutation-Based Hashing
- 隐语实现的优势:隐语在实现的过程中,左端插值多项式,论文中给出不做填充的方案,隐语的实现当n<2^20时都填充,当n>=2^20时不做填充。降低了协议的计算量。缺点就是需要额外的F_2 SubField VOLE,判别最高次x^3系数是否为0。
4.Unbalanced-PSI
EC-OPRF-based
- 隐语实现的Unbalanced-PSI是基于EC-OPRF 实现,与基于ECDH的PSI相比,小集合的一端不需要对大集合进行指数运算,这减少了一定的计算开销。
SHE-based
- 基于HE的非平衡PSI是在微软APSI的基础上得来,与EC-OPRF PSI相比不需要将大集合方的数据传输到小集合一方,缺点就是计算量大,运行时间较长。
5.基于ECDH的三方PSI协议
- 这是隐语自研的三方协议,主要思路就是Alice和Bob先用ECDH的方式计算交集,只是交集结果以shuffle的方式输出给Alice,Alice再与Charlie使用ECDH-PSI计算交集。从上图也可以看出,在求交的过程中会泄露Alice和Bob的交集大小给Alice和Charlie。
6.mini-PSI
- 这是专门为集合大小小于等于(2^9)设计的PSI协议,使用基于ECDH的一轮密钥交换协议实现,其在小集合下拥有最优的通信开销和计算开销。
4.SecretFlow PSI 调度
- SPU PSI使用分桶技术(bucket_psi 入口函数)将千万数据的求交任务分为多个百万数据的桶(默认为7个),分别求交后再合并求交结果。
bucket_psi 调用参数:
message BucketPsiConfig {
//
///
// Basic
///
// The psi type.
PsiType psi_type = 1;
// Specified the receiver rank. Receiver can get psi result.
uint32 receiver_rank = 2;
// Whether to broadcast psi result to all parties.
bool broadcast_result = 3;
// The input parameters of psi.
InputParams input_params = 4;
// The output parameters of psi.
OutputParams output_params = 5;
///
// Advanced
///
// Optional, specified elliptic curve cryptography used in psi when needed.
CurveType curve_type = 6;
// Optional, specified the hash bucket size used in psi.
uint32 bucket_size = 7;
// Optional,the path of offline preprocess file.
string preprocess_path = 8;
// Optional,secret key path of ecdh_oprf, 256bit/32bytes binary file.
string ecdh_secret_key_path = 9;
// Optional,params for dp-psi
DpPsiParams dppsi_params = 10;
}
memory_psi调用参数
message MemoryPsiConfig {
//
///
// Basic
///
// The psi type.
PsiType psi_type = 1;
// Specified the receiver rank. Receiver can get psi result.
uint32 receiver_rank = 2;
// Whether to broadcast psi result to all parties.
bool broadcast_result = 3;
///
// Advanced
///
// Optional, specified elliptic curve cryptography used in psi when needed.
CurveType curve_type = 4;
// Optional,Params for dp-psi
DpPsiParams dppsi_params = 5;
}
5. 隐语PSI开发指南
现有隐语PSI python接口主要是通过secretflow进行调用。secretflow 有集群仿真模式和生产模式两种部署模式。
启动ray集群
初始化secretflow
初始化secretflow 主要是配置各个参与方的ip地址和监听端口。
- 启动spu设备
启动SPU的link和监听端口。
- 执行PSI
reports=spu.psi(
key=select_keys, # 指定求交关键字
input_path=input_path, # 输入文件路径
output_path=output_path, # 输出文件路径
receiver='alice', # 指定接收方
# KKRT_PSI_2PC BC22_PSI_2PC ..
protocol='ECDH_PSI_2PC' # 选择具体的协议
curve_type='CURVE_25519' # 选择椭圆曲线类型
broadcast_result=False, # 是否将交集结果广播给其他参与方
)
6.隐语PSI后续计划
7. 动手实践
使用secretnote动手开发PSI协议。。。。