GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation(Davide Carnemolla, Dario Catalano, Mario Di Raimondo — カターニア大学)の公式実装。論文: Cryptology ePrint Archive, Paper 2026/2499。
GhostFaceMPC は GhostFaceNetV1(width 1.3、stride 1、ArcFace ヘッド、MS1MV3 で学習済み)を用いた顔認識を、MP-SPDZ における複製秘密分散を用いて 3 台のサーバ間で実行します。
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 コアの VM(Intel Xeon Gold 6238R)を使用し、パーティごとに 8 スレッドで実行した。3 台のサーバはすべて 1 台のホスト上で動作する。
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 stdintを実行git clone --recursive https://github.com/crypto-unict/ghostfacempc.git
cd ghostfacempc
scripts/setup.sh
scripts/setup.sh は次の4つの処理を行います:
.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 の5つの評価セット(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 が1つと summary.csv が1つ)。また、tables は論文のレイアウトで results/tables.md を書き出します。各ターゲットは個別に、任意の順序で実行できます。レポートがすでに存在する実行はスキップされます。
| ターゲット | 論文 | 当方のマシンでの実行時間(概算) |
|---|---|---|
accuracy | 比較表、accuracy 列 | データセットあたりコアあたり3時間。WORKERS で分割 |
verification | Face Verification Benchmarks: HbC と M、Co-Host / LAN / Fast-WAN / WAN | 約6時間 |
identification | Face Identification Benchmarks: 1:128 closed set、同じグリッド | 約6時間 |
plaintext | 比較表、TensorFlow 行 | 1分 |
naive | 比較表、MP-SPDZ(naive)行 | コンパイルを含めて約1時間 |
porthos | 比較表、EzPC(Porthos)行 | ビルド約5分 + 約1.5時間 |
baselines | 3つのベースライン | |
ablation | アブレーション表: 最適化を1つずつ、naive ベースラインから GhostFaceMPC(HbC、co-host)まで | 約4時間 |
環境変数:
| 変数 | 意味 | デフォルト |
|---|---|---|
THREADS | パーティごとのスレッド数 | 8 |
NETWORKS | 計測するネットワーク | co-host lan fast-wan wan |
WORKERS | accuracy オラクル用のプロセス数 | CPU 数 |
POOLS、WARMUPS、TRIALS | プール設計を上書き | 論文のもの |
RESULTS | 出力ディレクトリ | results |
--quick は、1回のウォームアップと1回の計測リクエストからなる1つのプールを実行し、各データセットの最初の600ペアで accuracy を計測します。
プール設計、論文どおり:
帯域幅は3台のサーバが送信した合計です。ラウンド数は 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> は、それらの上で任意のコマンドを実行します。
Verification は、1つの埋め込みと、1,024行の秘密分散データベースの1行に対する 1:1 スコアです。Identification は、プローブを全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 で読み込みます。つまり、サーバ間で入力を取り込むための通信は一切発生しません。悪意あるプロファイル:検証済み出力。 入力にチェックは不要です。正直なクライアントであれば、2台の正直なサーバが3つのコンポーネントすべてを分担して保持するため、自身のコピーを改ざんする不正なサーバは送信内容においてのみ逸脱し、それを 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%です。実時間はホストに依存します。
1リクエストのオンラインフェーズ:
| リクエスト | セキュリティ | オンラインラウンド数 | オンライン帯域幅 |
|---|---|---|---|
| 検証 | HbC | 1,433 | 312.35 MB |
| 検証 | M | 1,391 | 883.27 MB |
| 識別 | HbC | 1,496 | 312.35 MB |
| 識別 | M | 1,454 | 888.54 MB |
1リクエストのオフラインフェーズ: