GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation 的官方实现(作者:Davide Carnemolla、Dario Catalano、Mario Di Raimondo — 卡塔尼亚大学)。论文: Cryptology ePrint Archive, Paper 2026/2499。
GhostFaceMPC 使用 GhostFaceNetV1(宽度 1.3、步长 1、ArcFace 头,在 MS1MV3 上训练)在三个服务器之间进行人脸识别,采用 MP-SPDZ 中的复制秘密共享。
replicated-ring-party)和带中止的恶意安全(ps-rep-ring-party)。本仓库包含复现论文实验所需的全部代码。
@misc{cryptoeprint:2026/2499,
author = {Davide Carnemolla and Dario Catalano and Mario Di Raimondo},
title = {{GhostFaceMPC}: Privacy-Preserving Face Recognition with Multi-Party Computation},
howpublished = {Cryptology {ePrint} Archive, Paper 2026/2499},
year = {2026},
url = {https://eprint.iacr.org/2026/2499}
}
| 路径 | 说明 |
|---|---|
src/ghostmpc/ | Python 包与 ghostmpc 命令行 |
src/ghostmpc/codegen/ | 从模型清单编译为 MP-SPDZ 程序的编译器 |
src/ghostmpc/eval/ | 明文环预言机(与 MPC 程序逐位一致)与精度评估 |
src/ghostmpc/benchmark/ | 三方基准测试框架与模拟网络 |
src/ghostmpc/training/ | 基于环忠实前向传播的量化感知训练 |
third_party/patches/ | 本工作为 MP-SPDZ 添加的虚拟机指令 |
baselines/ | 基线:TensorFlow 明文、朴素 MP-SPDZ、EzPC/Porthos |
run_experiments.sh | 运行论文中所有实验的单一脚本 |
scripts/ | 环境配置、无根网络模拟、表格收集 |
tests/ | 单元测试(pytest) |
机器。 x86-64 上的 Linux。论文使用了一台 32 核虚拟机(Intel Xeon Gold 6238R),每方运行 8 个线程。三台服务器均运行在同一台主机上。
Python。 Python ≥ 3.10(已在 3.11 上测试)。
MP-SPDZ 构建依赖 (上游列表):
sudo apt-get install automake build-essential clang cmake git libboost-dev \
libboost-filesystem-dev libboost-iostreams-dev libboost-thread-dev \
libgmp-dev libntl-dev libsodium-dev libssl-dev libtool python3 python3-venv
LAN/WAN 仿真。 需要 iproute2(ip、tc)、iputils-ping、
unshare(util-linux)以及非特权用户命名空间。该脚本无需
root 权限。在 Debian/Ubuntu 上:sudo sysctl kernel.unprivileged_userns_clone=1。
仅 Porthos 基线。
libboost-system-devopam install ocamlbuild menhir ocamlfind stdintgit clone --recursive https://github.com/crypto-unict/ghostfacempc.git
cd ghostfacempc
scripts/setup.sh
scripts/setup.sh 完成四件事:
.venv 并安装该包。这会拉取 tensorflow-cpu、
Pillow、onnx、onnxruntime 和 onnxsim。third_party/MP-SPDZ 中准备 MP-SPDZ:
third_party/patches/;CONFIG.mine 中设置 MY_CFLAGS += -DRING_SIZE=32);replicated-ring-party.x 和 ps-rep-ring-party.x;模型文件会放入 artifacts/:
| 文件 | 内容 |
|---|---|
GhostFaceNet_W1.3_S1_ArcFace.h5 | 浮点教师模型,来自 GhostFaceNets 发布版 |
model/ | 量化后的 ring32/f6/f_w9 模型及其准确率报告 |
model-ring64-f16-b0/ | 导出 Porthos 基线所用的 ring64 清单 |
legacy-scalar-236/ | 朴素 MP-SPDZ 基线的 ring64/f20 清单 |
这些包是本仓库的发布资产,每个归档文件都会
对照其 SHA-256 进行校验。ghostmpc fetch-bundles --bundle qat-start 还会
下载 QAT 起始所用的清单(见 §5)。
准确率实验和明文基线读取五个 InsightFace
评估集:LFW、AgeDB-30、CALFW、CPLFW 和 CFP-FP。使用
InsightFace 数据集库
的 MS1MV3 训练数据中分发的 .bin 文件,
并按如下方式放置:
datasets/benchmarks/{lfw,agedb_30,calfw,cplfw,cfp_fp}.bin
scripts/setup.sh 会根据我们使用的 SHA-256 摘要对它们进行校验。MPC 基准测试不需要这些数据集:它们的通信不依赖于输入值,因此它们会对合成输入进行秘密共享。
./run_experiments.sh --quick verification # smoke test, about one hour
./run_experiments.sh all # every table of the paper
./run_experiments.sh tables # print the tables measured so far
结果输出到 results/(每次运行生成一个 report.json 和一个 summary.csv),tables 会按论文的布局写出 results/tables.md。各目标可以单独运行,且顺序不限。若某次运行的报告已存在,则该次运行会被跳过。
| 目标 | 论文 | 在我们机器上的运行时间(约) |
|---|---|---|
accuracy | 对比表,准确率列 | 每个数据集每核 3 小时;用 WORKERS 拆分 |
verification | 人脸验证基准:HbC 和 M,Co-Host / LAN / Fast-WAN / WAN | 约 6 小时 |
identification | 人脸识别基准:1:128 闭集,相同网格 | 约 6 小时 |
plaintext | 对比表,TensorFlow 行 | 1 分钟 |
naive | 对比表,MP-SPDZ(naive)行 | 约 1 小时(含编译) |
porthos | 对比表,EzPC(Porthos)行 | 约 5 分钟构建 + 约 1.5 小时 |
baselines | 三个基线 | |
ablation | 消融表:逐项启用优化,从 naive 基线到 GhostFaceMPC(HbC,co-host) | 约 4 小时 |
环境变量:
| 变量 | 含义 | 默认值 |
|---|---|---|
THREADS | 每方线程数 | 8 |
NETWORKS | 要测量的网络 | co-host lan fast-wan wan |
WORKERS | 准确率 oracle 的进程数 | CPU 数量 |
POOLS、WARMUPS、TRIALS | 覆盖池设计 | 论文中的设计 |
RESULTS | 输出目录 | results |
--quick 运行一个池,包含一次预热和一次测量请求,并在每个数据集的前 600 对数据上计算准确率。
池设计,与论文一致:
带宽 是三个服务器发送的总量。轮数 是 MP-SPDZ 的轮数(对 Porthos 而言,是运行时串行深度)。实际耗时 是测量请求的中位数。
在线和离线 阶段分别报告,从不求和。
网络(lan、fast-wan、wan)用 tc netem 模拟,每一方位于自己的网络命名空间中:
| 网络 | RTT | 带宽 |
|---|---|---|
| LAN | 0.1 ms | 1 Gbit/s |
| Fast-WAN | 10 ms | 1 Gbit/s |
| WAN | 100 ms | 100 Mbit/s |
scripts/netsim/ghostmpc-netsim <profile> -- <command> 可在这些网络上运行任意命令。
验证 是一个嵌入加上与 1,024 行秘密共享数据库中某一行的 1:1 评分。识别 将探针与全部 128 行进行排序,并返回 rank-1 索引的份额。
字节数和轮数是编译后程序的确定性属性。本仓库生成的程序与论文中测量的程序逐字节相同(tests/test_emitted_program.py),因此使用论文的池设计时,带宽和轮数可以精确复现。
客户端复制的输入。 客户端(对于数据库而言,还有经销商)将每个值拆分为 x = x_0 + x_1 + x_2,并将配对 (x_i, x_{i-1}) 交给服务器 i,存放在 Persistence/Transactions-P<i>.data 中,程序通过 sint.read_from_file 加载该文件:服务器之间不交换任何内容即可摄取输入。恶意配置:验证输出。 输入无需检查:在诚实客户端的情况下,两个诚实服务器共同持有全部三个分量,因此篡改其副本的损坏服务器只会在其发送的内容上产生偏差,ps-rep-ring 会捕获这一点(乘积的牺牲后检查、哈希公开值)。声称的身份从 Persistence/Transactions-clear-P<i>.data 读取。在答案离开之前,程序强制执行牺牲后检查,每个服务器将其份额对追加到 Persistence/,ghostmpc open-result --last N 会逐分量检查;这是 ps-rep-ring-party 的默认行为(tests/test_emitted_program.py 固定了默认程序)。客户端侧是 ghostmpc share-gallery <dir>,随后是 ghostmpc share-image face.png <dir> --append [--identity <row>]。池设计进入程序(它固定了每个请求提前生成多少预处理),因此 --quick 运行会略有偏差:在半诚实配置中偏差几百个离线字节,在恶意配置中偏差约 2% 的在线字节。实际耗时取决于主机。
单个请求的在线阶段:
| 请求 | 安全性 | 在线轮数 | 在线带宽 |
|---|---|---|---|
| 验证 | HbC | 1,433 | 312.35 MB |
| 验证 | M | 1,391 | 883.27 MB |
| 识别 | HbC | 1,496 | 312.35 MB |
| 识别 | M | 1,454 | 888.54 MB |
单个请求的离线阶段:
| 安全性 | 离线轮数 | 离线带宽 |
|---|---|---|
| HbC | 14 | 168.76 MB |
| M | 380 | 5.50 GB |
单个验证请求的实际耗时,以秒为单位(论文):
| 安全性 | 同主机 | 局域网 | 快速广域网 | 广域网 |
|---|---|---|---|---|
| HbC | 2.43 | 3.82 | 10.76 | 87.93 |
| M | 5.53 | 8.14 | 16.72 | 124.68 |
准确率,以百分比表示:
| 模型 | LFW | AgeDB-30 | CALFW | CPLFW | CFP-FP |
|---|---|---|---|---|---|
| 浮点教师模型 | 99.72 | 97.80 | 95.80 | 91.92 | 96.39 |
| GhostFaceMPC (ring32) | 99.68 | 97.67 | 95.85 | 91.60 | 96.37 |
量化准确率在环预言机(ghostmpc evaluate-accuracy)上计算。该预言机逐整数复现三个服务器计算的嵌入。它是确定性的,因此与 artifacts/model/gates/ 中附带的报告完全一致。浮点教师模型在 TensorFlow 中运行,其数值在不同构建和 CPU 之间略有差异,因此其行可能变动一两个点(例如在 LFW 上为 99.70 而非 99.72)。
基线(单个验证请求的在线阶段,同主机):
| 基线 | 轮数 | 实际耗时 | 带宽 |
|---|---|---|---|
| TensorFlow(明文) | -- | 0.16 s | -- |
| MP-SPDZ 朴素实现 (ring64) | 42,784 | 44.45 s | 1.05 GB |
| EzPC/Porthos (ring64) | 2,152 | 259 s | 17.97 GB |