
MP-SPDZ에서 복제 비밀 공유를 사용한 프라이버시 보존 얼굴 인식의 참조 구현으로, 양자화된 GhostFaceNet 추론, 벤치마크 및 QAT 도구를 포함합니다.
GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation(Davide Carnemolla, Dario Catalano, Mario Di Raimondo — University of Catania)의 공식 구현입니다. 논문: Cryptology ePrint Archive, Paper 2026/2499.
GhostFaceMPC는 GhostFaceNetV1(width 1.3, stride 1, ArcFace head, MS1MV3로 학습됨)을 사용하여 세 개의 서버 간에 MP-SPDZ의 복제 비밀 공유(replicated secret sharing) 방식으로 얼굴 인식을 수행합니다.
replicated-ring-party) 및 중단 가능한 악의적(malicious with abort, 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/ | 3자 벤치마크 하네스 및 에뮬레이션 네트워크 |
src/ghostmpc/training/ | 링 충실 순전파에 대한 양자화 인식 학습 |
third_party/patches/ | 본 연구에서 MP-SPDZ에 추가한 가상 머신 명령어 |
baselines/ | 베이스라인: TensorFlow 평문, 순수 MP-SPDZ, EzPC/Porthos |
run_experiments.sh | 논문의 모든 실험을 실행하는 단일 스크립트 |
scripts/ | 설정, 루트리스 네트워크 에뮬레이션, 테이블 수집 |
tests/ | 단위 테스트 (pytest) |
머신. x86-64 기반 Linux. 논문에서는 32코어 VM(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 | float teacher, 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 dataset zoo의
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 | Face Verification Benchmarks: HbC 및 M, Co-Host / LAN / Fast-WAN / WAN | ~6시간 |
identification | Face Identification Benchmarks: 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 | 정확도 오라클용 프로세스 수 | CPU 수 |
POOLS, WARMUPS, TRIALS | 풀 설계 재정의 | 논문의 값 |
RESULTS | 출력 디렉터리 | results |
**--quick**은 워밍업 1회와 측정 요청 1회로 구성된 풀 하나를 실행하며, 정확도는 각 데이터셋의 처음 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로 분할하고 서버 i에게 쌍 (x_i, x_{i-1})을 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 |
한 요청의 오프라인 단계: