
Implementazione di riferimento per il riconoscimento facciale che preserva la privacy tramite replicated secret sharing in MP-SPDZ, con inferenza quantizzata di GhostFaceNet, benchmark e strumenti QAT.
Implementazione ufficiale di GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation (Davide Carnemolla, Dario Catalano, Mario Di Raimondo — Università di Catania). Paper: Cryptology ePrint Archive, Paper 2026/2499.
GhostFaceMPC esegue il riconoscimento facciale con GhostFaceNetV1 (width 1.3, stride 1, testa ArcFace, addestrato su MS1MV3) tra tre server con replicated secret sharing in MP-SPDZ.
replicated-ring-party) e
malevolo con abort (ps-rep-ring-party).Questo repository contiene esattamente il codice necessario per riprodurre gli esperimenti del paper.
@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}
}
| Percorso | Di cosa si tratta |
|---|---|
src/ghostmpc/ | Pacchetto Python e riga di comando ghostmpc |
src/ghostmpc/codegen/ | compilatore dal manifest del modello a un programma MP-SPDZ |
src/ghostmpc/eval/ | oracolo in chiaro sull'anello (bit-exact con il programma MPC) e valutazione dell'accuratezza |
src/ghostmpc/benchmark/ | harness di benchmark a tre parti e reti emulate |
src/ghostmpc/training/ | addestramento consapevole della quantizzazione sul passaggio in avanti fedele all'anello |
third_party/patches/ | le istruzioni della macchina virtuale che questo lavoro aggiunge a MP-SPDZ |
baselines/ | le baseline: TensorFlow in chiaro, MP-SPDZ naive, EzPC/Porthos |
run_experiments.sh | un unico script che esegue ogni esperimento del paper |
scripts/ | setup, emulazione di rete rootless, raccolta delle tabelle |
tests/ | test unitari (pytest) |
Macchina. Linux su x86-64. Il paper ha utilizzato una VM a 32 core (Intel Xeon Gold 6238R) ed esegue 8 thread per parte. Tutti e tre i server girano su un unico host.
Python. Python ≥ 3.10 (testato con 3.11).
Dipendenze di build di MP-SPDZ (elenco upstream):
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
Emulazione LAN/WAN. Richiede iproute2 (ip, tc), iputils-ping,
unshare (util-linux) e user namespace non privilegiati. Lo script non richiede
root. Su Debian/Ubuntu: sudo sysctl kernel.unprivileged_userns_clone=1.
Solo baseline 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 fa quattro cose:
.venv e installa il pacchetto. Questo scarica tensorflow-cpu,
Pillow, onnx, onnxruntime e onnxsim.third_party/MP-SPDZ:
third_party/patches/;MY_CFLAGS += -DRING_SIZE=32 in CONFIG.mine);replicated-ring-party.x e ps-rep-ring-party.x;I file del modello finiscono in artifacts/:
| File | Contenuto |
|---|---|
GhostFaceNet_W1.3_S1_ArcFace.h5 | teacher float, dalla release di GhostFaceNets |
model/ | il modello quantizzato ring32/f6/f_w9, con i relativi report di accuratezza |
model-ring64-f16-b0/ | manifest ring64 da cui viene esportata la baseline Porthos |
legacy-scalar-236/ | manifest ring64/f20 della baseline naive MP-SPDZ |
I bundle sono asset di release di questo repository, e ogni archivio viene
verificato rispetto al suo SHA-256. ghostmpc fetch-bundles --bundle qat-start scarica
anche il manifest da cui parte il QAT (vedi §5).
L'esperimento di accuratezza e la baseline in chiaro leggono cinque set di
valutazione InsightFace: LFW, AgeDB-30, CALFW, CPLFW e CFP-FP. Usa i file .bin
distribuiti con i dati di training MS1MV3 dello
zoo di dataset InsightFace
e posizionali come:
datasets/benchmarks/{lfw,agedb_30,calfw,cplfw,cfp_fp}.bin
scripts/setup.sh li verifica rispetto ai digest SHA-256 che abbiamo utilizzato. I benchmark MPC non necessitano dei dataset: la loro comunicazione non dipende dai valori di input, quindi condividono in modo segreto input sintetici.
./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
I risultati vanno in results/ (un report.json e un summary.csv per esecuzione), e
tables scrive results/tables.md con il layout del paper. I target possono essere
eseguiti separatamente e in qualsiasi ordine. Un'esecuzione il cui report esiste già viene saltata.
| Target | Paper | Tempo di esecuzione sulla nostra macchina (approssimativo) |
|---|---|---|
accuracy | tabella di confronto, colonne di accuratezza | 3 h per dataset per core; suddiviso con WORKERS |
verification | Face Verification Benchmarks: HbC e M, Co-Host / LAN / Fast-WAN / WAN | ~6 h |
identification | Face Identification Benchmarks: 1:128 closed set, stessa griglia | ~6 h |
plaintext | tabella di confronto, riga TensorFlow | 1 min |
naive | tabella di confronto, riga MP-SPDZ (naive) | ~1 h inclusa la compilazione |
porthos | tabella di confronto, riga EzPC (Porthos) | ~5 min di build + ~1.5 h |
baselines | le tre baseline | |
ablation | tabella di ablazione: le ottimizzazioni una alla volta, dalla baseline naive a GhostFaceMPC (HbC, co-host) | ~4 h |
Variabili d'ambiente:
| Variabile | Significato | Predefinito |
|---|---|---|
THREADS | thread per party | 8 |
NETWORKS | reti da misurare | co-host lan fast-wan wan |
WORKERS | processi per l'oracolo di accuratezza | numero di CPU |
POOLS, WARMUPS, TRIALS | sovrascrivono il design dei pool | quello del paper |
RESULTS | directory di output | results |