写点什么

隐语 PSI benchmark 白皮书

  • 2022-11-23
    浙江
  • 本文字数:4075 字

    阅读完需:约 13 分钟

导语: 为了方便大家了解隐语的 Benchmark,本文设计了 10 分钟上手手册,包含了亮点介绍、SecretFlow 集群的易用搭建、Benchmark 脚本、两方和三方的 Benchmark,使相关业务方做调研时方便拿到可度量的性能数据和可复现的路径。

隐语 PSI 亮点

隐私集合求交(Private Set Intersection,PSI)是一类特定的多方安全计算(Multi-Party Computation, MPC)问题,其问题可以简单理解为:Alice 输入集合 X,Bob 输入集合 Y,双方执行 PSI 协议可以得到 Alice 和 Bob 两者的交集,同时不在交集范围内的部分是受保护的,即 Alice 和 Bob 无法学习出交集以外的任何信息。


隐私集合求交(PSI)协议有很多分类方法,按照底层依赖的密码技术分类主要包括:


  • 基于公钥密码的 PSI 方案,包括:基于判定型密钥交换(Decisional Diffie-Hellman,DDH)的 PSI 方案和 RSA 盲签名的 PSI 方案;

  • 基于不经意传输(Oblivious Transfer,OT)的 PSI 方案;

  • 基于通用 MPC 的 PSI 方案,例如基于混淆电路(Garbled Circuit,GC)的 PSI 方案;

  • 基于同态加密(Homomorphic Encryption,HE)的 PSI 方案。


隐私集合求交(PSI)协议按照参与方的数量进行分类,可分为:


  • 两方 PSI:参与方为 2 个;

  • 多方 PSI:参与方>2 个。


隐私集合求交(PSI)协议按照设定安全模型分类,可分为:


  • 半诚实模型的 PSI;

  • 恶意模型的 PSI。


SecretFlow SPU 实现了半诚实模型下的两方和三方 PSI 协议,密钥安全强度是 128bit,统计安全参数是 40bit。

两方 PSI 协议:


  • 基于 DDH 的 PSI(Private Set Intersection)协议


基于 DDH 的 PSI 协议先对简单易于理解和实现,依赖的密码技术已被广泛论证,通信量低,但计算量较大。


隐语实现了基于椭圆曲线(Elliptic Curve)群的 DDH PSI 协议,支持的椭圆曲线类型包括:Curve25519,SM2,Secp256k1。本次 benchmark 选用的曲线是 Curve25519。


  • 基于 OT 扩展的 KKRT16


KKRT16 是第一个千万规模(2^24)求交时间在 1 分钟之内的 PSI 方案,通信量较大;


隐语实现了 KKRT16 协议,并参考了进年来的性能优化和安全改进方案,例如:stash-less CuckooHash,[GKWW20]中 FixedKey AES 作为 correlation-robust 哈希函数。


  • 基于 PCG 的 BC22


BC22 PSI 依赖的 PCG(Pseudorandom Correlation Generator)方案是近年来 mpc 方向的研究热点,相比 KKRT16 计算量和通信两方面都有了很大改进,从成本(monetary cost)角度更能满足实际业务需求。PCG 实现依赖 LPN(Learning Parity with Noise)问题,由于是 2022 年最新的协议,协议的安全性还需要更多密码专家的分析和论文。


隐语 v0.7 中实现了 BC22 PSI 方案,其中的 PCG/VOLE 使用了 emp-zk 中的[WYKW21]实现,欢迎大家审查和进一步改进;

三方 PSI(Private Set Intersection)协议


  • 基于 DDH 的三方 PSI 协议


隐语实现了自研的基于 ECDH 的三方 PSI 协议,注意我们实现的这个协议会泄漏两方交集大小,请自行判断是否满足使用场景的安全性,本次 benchmark 选用的曲线是 Curve25519。

复现方式

一、测试机型环境

  • Python:3.8

  • pip: >= 19.3

  • OS: CentOS 7

  • CPU/Memory: 推荐最低配置是 8C16G

  • 硬盘:500G

二、安装 conda

使用 conda 管理 python 环境,如果机器没有 conda 需要先安装,步骤如下:


# 分别在三台机器的root目录下执行# sudo apt-get install wgetwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 安装bash Miniconda3-latest-Linux-x86_64.sh
# 一直按回车然后输入yesplease answer 'yes' or 'no':>>> yes
# 选择安装路径, 文件名前加点号表示隐藏文件Miniconda3 will now be installed into this location:>>> ~/.miniconda3
# 添加配置信息到 ~/.bashrc文件Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no][no] >>> yes
# 运行配置信息文件或重启电脑source ~/.bashrc
# 测试是否安装成功conda --version
复制代码



三、安装 secretflow

# 分别在三台机器的root目录下执行# 创建干净的python环境conda create -n sf-benchmark python=3.8
# 进入benchmark 环境conda activate sf-benchmark
# 安装secretflowpip install -U secretflow
# 创建一个sf-benchmark目录mkdir sf-benchmarkcd sf-benchmark
复制代码

1.验证安装是否成功

root 目录下输入 python 然后回车


# 依次执行,每执行一条回车一次
>>> import secretflow as sf>>> sf.init(['alice', 'bob', 'carol'], num_cpus=8, log_to_driver=True)>>> dev = sf.PYU('alice')>>> import numpy as np>>> data = dev(np.random.rand)(3, 4)>>> sf.reveal(data)
复制代码


如下图所示就代表环境搭建成功了



四、创建节点并启动集群

1.创建 ray header 节点

创建 ray header 节点,选择一台机器为主机,在主机上执行如下命令,ip 替换为主机的内网 ip,命名为 alice,端口选择一个空闲端口即可注意:192.168.0.1 ip 为 mock 的,请替换为实际的 ip 地址


# alice机器执行
RAY_DISABLE_REMOTE_CODE=true \ray start --head --node-ip-address="192.168.0.1" --port="9394" --resources='{"alice": 8}' --include-dashboard=False
复制代码

2.创建从属节点

创建从属节点,在 bob 机器执行如下命令,ip 依然填 alice 机器的内网 ip,命名为 bob,端口不变


# bob机器执行
RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"bob": 8}'
复制代码


创建从属节点,在 carol 机器执行如下命令,ip 依然填 alice 机器的内网 ip,命名为 carol,端口不变


# carol机器执行
RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"carol": 8}'
复制代码

3.验证节点是否启动

在 python 中测试节点是否启动成功,任意选一台机器输入 python,执行下列代码,参数中 address 为头节点(alice)的地址,拿 alice 机器来验证,每输入一行下列代码回车一次:


#alice机器输入python后再执行
>>> import secretflow as sf>>> sf.init(address='192.168.0.1:9394')>>> alice = sf.PYU('alice')>>> bob = sf.PYU('bob')>>> sf.reveal(alice(lambda x : x)(2))>>> sf.reveal(bob(lambda x : x)(2))
复制代码


如下图就代表节点创建成功了



同时我们也可以通过 ray status 去看节点的状态,前提是先进入 sf 环境(conda activate sf-benchmark)



4.生成数据

把脚本 generate_psi.py:https://github.com/secretflow/spu/blob/main/spu/psi/tools/generate_psi.py传到 alice 机器的 root 目录下


执行如下代码


# 生成三份一千万数据python3 generate_psi.py 10000000
# 生成三份一亿数据python3 generate_psi.py 100000000
复制代码


把生成的 psi_1.csv cp 到 benchmark 目录下,再通过 scp 的命令把 psi_2.csv/psi_3.csv 分别移到 bob 的 benchmark 目录下跟 carol 的 benchark 目录下

5.限制宽带/延迟

#100Mbps 20ms

tc qdisc add dev eth0 root handle 1: tbf rate 100mbit burst 256kb latency 800ms 

tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 20msec limit 8000


  • 清除限制


tc qdisc del dev eth0 root


  • 查看已有配置


tc qdisc show dev eth0

6.Benchmark 脚本

支持的 PSI 协议列表:


  • ECDH_PSI_2PC

  • KKRT_PSI_2PC

  • BC22_PSI_2PC

  • ECDH_PSI_3PC


import sysimport timeimport logging
from absl import appimport spuimport secretflow as sf
# init loglogging.basicConfig(stream=sys.stdout, level=logging.INFO)
# SPU settingscluster_def = {'nodes': [# <<< !!! >>> replace <192.168.0.1:12945> to alice node's local ip & free port {'party': 'alice', 'id': 'local:0', 'address': '192.168.0.1:12945', 'listen_address': '0.0.0.0:12945'},# <<< !!! >>> replace <192.168.0.2:12946> to bob node's local ip & free port {'party': 'bob', 'id': 'local:1', 'address': '192.168.0.2:12946', 'listen_address': '0.0.0.0:12946'},# <<< !!! >>> if you need 3pc test, please add node here, for example, add carol as rank 2# {'party': 'carol', 'id': 'local:2', 'address': '127.0.0.1:12347'}, ],'runtime_config': {'protocol': spu.spu_pb2.SEMI2K,'field': spu.spu_pb2.FM128, },}
def main(_):
# sf init# <<< !!! >>> replace <192.168.0.1:9394> to your ray head sf.init(address='192.168.0.1:9394') alice = sf.PYU('alice') bob = sf.PYU('bob') carol = sf.PYU('carol')
# <<< !!! >>> replace path to real parties local file path. input_path = { alice: '/data/psi_1.csv', bob: '/data/psi_2.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_3.csv', } output_path = { alice: '/data/psi_output.csv', bob: '/data/psi_output.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_output.csv', } select_keys = { alice: ['id'], bob: ['id'],# if run with `ECDH_PSI_3PC`, add carol# carol: ['id'], } spu = sf.SPU(cluster_def)
# prepare data start = time.time()
reports = spu.psi_csv( key=select_keys, input_path=input_path, output_path=output_path, receiver='alice', # if `broadcast_result=False`, only receiver can get output file. protocol='KKRT_PSI_2PC', # psi protocol precheck_input=False, # will cost ext time if set True sort=False, # will cost ext time if set True broadcast_result=False, # will cost ext time if set True ) print(f"psi reports: {reports}") logging.info(f"cost time: {time.time() - start}")
sf.shutdown()
if __name__ == '__main__': app.run(main)
复制代码

五、Benchmark 报告


目前 bechmark 数据中,bc22 psi 的性能还在进一步工程优化, 单测 spu 中 bc22 协议内核的性能对比可以参考github.com/secretflow

关于隐语 SecretFlow

隐语官网:

www.secretflow.org.cn


隐语社区及代码访问:

github.com/secretflow

gitee.com/secretflow


关注微信公众号:隐语的小剧场


发布于: 刚刚阅读数: 2
用户头像

关注微信公众号:隐语的小剧场 2022-08-01 加入

隐语SecretFlow是蚂蚁自主研发的隐私计算开源框架,内置MPC、TEE、同态等多种密态计算虚拟设备供灵活选择。同时我们专注于隐私计算领域任何前沿技术、最新动态、行业资讯,隐语期待您的加入!

评论

发布
暂无评论
隐语 PSI benchmark 白皮书_密码学_隐语SecretFlow_InfoQ写作社区