【技術】MPC技術入門③S emi-honest モデルで安全な代表的プロトコル

  • calendar2021.09.03
  • reload2022.05.11
投稿者:R&D
ホーム » 投稿者カテゴリ » R&D » 【技術】MPC技術入門③S emi-honest モデルで安全な代表的プロトコル

はじめに

この記事は、セキュアマルチパーティ計算(secure multi-party computation:MPC)技術の入門に適した書籍である「A Pragmatic Introduction to Secure Multi-Party Computation [1]」を参考にした、MPC技術解説の3回目の記事となります。今後もMPC技術入門シリーズとして解説していく予定です。

今回は、semi-honest モデルで安全なMPCプロトコルのうち代表的なものを紹介し、その仕組みを簡単に説明していく内容となっています。

コンテンツの構成

本記事では、semi-honest モデルで安全なMPCプロトコルをいくつか紹介します。そのための下準備として、ランダムオラクルやOblivious Transfer と呼ばれる仕組みについて紹介します。続いて、semi-honest モデルで安全な代表的なMPCプロトコルとして、Yao’s Garbled Circuit・GMWプロトコル・BGWプロトコルを紹介します。最後に乗算を効率的に行うための技術であるMultiplication Triples について説明します。

下準備

ここでは、MPCの重要な構成要素であるランダムオラクルとOblivious Transfer について説明します。

ランダムオラクル

ランダムオラクルはハッシュ関数をパブリックな理想化されたランダム関数として扱うというものです。ランダムオラクルモデルの下で、全ての参加者は公開された関数 $H:\{0,1\}^*\rightarrow \{0,1\}^\kappa$ にアクセスできます。
この $H$ は入力 $x\in \{0,1\}^*$ に対し、次のように出力します。

  • 過去に$x$ が入力として与えられていない場合 $r_x \in \{0,1\}^\kappa$ をランダムに選び、ペア$(x,r_x)$ を記憶して、$r_x$ を出力する。
  • 過去に$x$ が入力として与えられている場合 $x$ とランダムな値$r_x$ のペアを記憶している。これを見つけ、$r_x$ を出力する。

ランダムオラクルモデルにおけるハッシュ関数$H$ は理想的な関数であり、具体的な関数とは異なるものです。「ランダムオラクルでは安全ですが、$H$ を具体的な関数で置き換えると必ず安全でなくなる」ような(作為的な)暗号方式が存在することが知られています[2]。

このような問題点があるものの、ランダムオラクルモデルを仮定して設計された多くのプロトコルは標準モデルで設計されたものよりも効率的であり、実用上ランダムオラクルモデルは受け入れられると考えられています[3]。

📎 標準モデルとは「ある暗号方式が ”安全” であるとは、すべての確率的多項式時間チューリング機械に対してもその方式が破れないことと定義する」ようなモデルです[4]。

Oblivious Transfer (OT)

Oblivious Transfer(OT) は安全な計算プロトコルに不可欠な構成要素であり、一部のMPC プロトコルでは、情報を送信する際にOT を用いることがあります。

OT では送信者と受信者が存在します。そして、OTとは「送信者の持つ秘密のうち受信者が(内容を見ずに)選択したものだけを受け取り、送信者は受信者がどの秘密を受け取ったのか知ることができない」というプロトコルです。

中でも、「送信者が2つの秘密を持ち、受信者がそのうち1つを受け取る」という設定は1-out-of-2 OT と呼ばれます。1-out-of-2 OT の定義は次のようになります。

定義. 1-out-of-2 OT

1-out-of-2 OTは次の$\mathcal F^{OT}$を安全に実装した暗号プロトコルである。


1-out-of-2 OT の機能 $\mathcal F^{OT}$

パラメータ:

2人の参加者:送信者を$S$ 、受信者を$R$ とする。$S$ は2つの秘密$x_0,x_1\in \{0,1\}^n$ を持ち、$R$ は選択ビット$b\in \{0,1\}$ を持つ。

機能:

次を順に行う。

  1. $R$ は$\mathcal F^{OT}$ に$b$ を送り、$S$ は$\mathcal F^{OT}$ に$x_0,x_1$ を送る。
  2. $R$ は$x_b$ を受け取り、$S$ は終了記号$\perp$ を受け取る。

また、この自然な拡張として、$k$ 個の送信された情報から1つを取得する、1-out-of-$k$ OT も定義できます。1-out-of-$k$ OTは1-out-of-2 OT から構成できることが知られています。

OT は理論的にはMPCと同等ということが知られています[5]。すなわち、OT が与えられると、追加の仮定無しでMPC を構築でき、逆にMPC で直接OT を構築することができます。

ここからは、OT の実装について説明します。

公開鍵ベースOT

まずは、semi-honest モデルの公開鍵ベースOT です。そのプロトコルは次の通りです。


公開鍵ベースOT

パラメータ:

  1. 二人の参加者:送信者$\mathcal S$ と受信者$\mathcal R$ $\mathcal S$ の入力:秘密情報$x_1,x_2\in \{0,1\}^n$ $\mathcal R$ の入力:セレクタビット$b\in \{0,1\}$

プロトコル:

  1. $\mathcal R$ は、公開鍵と秘密鍵のペア$pk,sk$ を生成し、公開鍵空間からランダムな鍵$pk’$ を取得する。もし$b=0$ なら、$\mathcal R$ はペア$(pk,pk’)$ を$\mathcal S$ に送信し、$b=1$ なら$(pk’,pk)$ を送信する。
  2. $\mathcal S$ は$(pk_0,pk_1)$ を受け取り、$e_0=Enc_{pk_0}(x_0), e_1=Enc_{pk_1}(x_1)$ を$\mathcal R$ に送信する。
  3. $\mathcal R$ は$e_0,e_1$ を受け取り、秘密鍵$sk$ を用いて$e_b$ を復号する。$e_{1-b}$ については、秘密鍵を持っていないため、復号することができない。

このプロトコルの安全性は、対応する秘密鍵を得ることなくランダムな公開鍵を取得できる公開鍵暗号の存在を前提としています。

このプロトコルはsemi-honest モデルにおいて安全です。以下、簡単に説明します。

$\mathcal S$ が得る情報は$\mathcal R$ から受信した2つの公開鍵のみであり、秘密鍵$sk$ を知らずにどちらの鍵が$pk$ なのかを$1/2$ より良い確率で予測することはできません。したがって、ランダムに選んだ2つの公開鍵を送信するだけで、$\mathcal S$ のビューをシミュレートすることができます。

一方、受信者$\mathcal R$ は二つの暗号文を受信して、そのうちの1つを復号するための秘密鍵を持っています。このとき、$\mathcal R$ の入力と出力があれば、$\mathcal R$ のビューを簡単にシミュレートすることができます。シミュレータ$Sim_\mathcal S$ は、公開鍵と秘密鍵のペア$(\alpha, \beta)$ とランダムな公開鍵$(\alpha)$ を生成し、シミュレート下で受信する暗号文を、

(1) 公開鍵$\alpha$ で受信した秘密を暗号化したもの

(2) 公開鍵$\alpha’$ で適当な数(例えば0)を暗号化したもの

と設定します。実際の実行との違いは(2) の暗号文のみであり、暗号化の安全性が保証されているため、適当な数の暗号文を他の数と区別することはできません。したがって、シミュレーションは成立します。

しかし、このプロトコルはmalicious モデルでは安全ではありません。受信者$\mathcal R$ は、2つの公開鍵と秘密鍵のペア$(sk_0,pk_0),(sk_1,pk_1)$ を生成し、$(pk_0,pk_1)$ を$\mathcal S$ に送信することで、2つの暗号文を復号し、$x_1,x_2$ の両方を知ることができます。

また、少数の公開鍵操作で多くのOT を実現する別の方法があります[7][8]。

Oblivious Transfer については、過去にもブログで扱っています。こちらも是非ご覧ください。

MPCプロトコル

ここからは、semi-honestモデルで安全である代表的なプロトコルの仕組みを解説していきます。

Yao’s Garbled Circuit

Yao’s Garbled Circuit は代表的なMPCプロトコルのひとつです。

その特徴としては次の通りです。

  • 2者間でのプロトコル
  • 通信回数が回路によらず一定
  • 組み合わせ論理回路に対して秘密計算を行う

まず、基本的なアイデアを説明し、Garbled Circuit の生成方法について述べます。その後、安全性について軽く触れ、最後にプロトコルの流れを説明します。

アイデア

Yao’s Garbled Circuit は2者間でのプロトコルです。そこで、一人目の参加者を$P_1$ 、二人目の参加者を$P_2$ と書きます。

関数のテーブルによる表現

$P_1$ が$x\in X$ を持っており、$P_2$ が$y\in Y$ を持っているとき、与えられた関数$\mathcal F(x,y)$ を計算することを考えます。

関数$\mathcal F$ について、全ての入力の組$(x,y)$ に対する結果を列挙できるとします。$\mathcal F$ は$|X|$ 行$|Y|$ 列からなるテーブル$T$ で表現することができ、$T_{x,y} = \langle \mathcal F(x,y) \rangle$ とすることができます。すなわち、$T_{x,y}$ を構築することができれば、関数$F$ が表現できたことになります。

テーブルの暗号化

次に、テーブルの各マスを暗号化します。

まず、すべての$x\in X$ に対し鍵$k_x\in \{0,1\}^\kappa$ 、すべての$y\in Y$ に対し鍵$k_y\in \{0,1\}^\kappa$ を対応させます。そして、すべてのマス$T_{x,y}$ を$k_x,k_y$ で暗号化し、$Enk_{k_x,k_y}(T_{x,y})$ とします。

このとき、$k_x,k_y$ を知っていれば、$Enk_{k_x,k_y}(T_{x,y})$ から$T_{x,y}$ を復号することができます。

鍵の送信

$P_1$ はテーブル$T$ を暗号化したのち、$k_x,k_y$ を$P_2$ に送信します。$P_1$ は自身の秘密である$x$ を知っているので、単に$k_x$ を送信します。一方、$P_1$ は$P_2$ の秘密$y$ は知らないので、$k_y$ を1-out-of-$|Y|$ OT で送信します。

復号するマスの決定

ここまでで、$P_2$ は暗号化されたテーブルと$T_{x,y}$ を復号する鍵$k_x,k_y$ を取得しているので、あとは復号すべきマスがわかればよいです。

これには、Beaver ら[9] の「point-and-permute」と呼ばれる手法が有効です。point-and-permute では鍵にポインタを付与します。すなわち、鍵$k_x$ に対応する新しい鍵を$w_x$ としたとき、$w_x = (k_x,p_x)$ です。ただし、$x\in X$ について、$p_x$ は相異なるようにします。鍵$k_y$ に対応する新しい鍵$w_y$ についても同様に生成します。そして、ポインタ$p_x,p_y$ が差す場所に$T_{x,y}$ を配置します。

以上のようにすることで、$P_2$ は復号するべきマスの場所がわかるため、$x$ について知ることなく$\mathcal F(x,y)$ を得ることができます。最後に$P_2$ が$P_1$ にマスを復号して得られた$\mathcal F(x,y)$ を送れば、秘密計算は完了です。

しかし、この方法では、サイズ$|X||Y|$ のテーブルに対して線形に計算時間が増加するため、非効率です。そこで、組み合わせ論理回路の各ゲートの評価をここまでで紹介したアイデアを用いて行うようにします。このとき、関数を表すテーブルのサイズは4となります。

Garbled Circuit の生成

$\mathcal F$ を表現する組み合わせ論理回路$C$ について、

  • $C$ の各ワイヤ$w_i$ に対して$P_1$ はワイヤ上の可能な値($\{0,1\}$)に対応する2つの鍵$k_i^0, k_i^1$ とポインタ$p_i^0,p_i^1$ を割り当てる。これらの組$w_i^0=(k_i^0,p_i^0),w_i^1=(k_i^1,p_i^1)$ を「ワイヤラベル」と呼び、平文のワイヤの値$v \in \{0,1\}$ を「ワイヤ値」と呼ぶ。
  • 実行中、計算の入力に応じて、各ワイヤはあるワイヤ値をとる。このワイヤ値をアクティブ値、ワイヤラベルをアクティブラベルと呼ぶ。

とします。

次に入力ワイヤ$w_i,w_j$、出力ゲート$w_t$ を持つゲート$G$について、$P_1$ は以下の暗号化されたテーブルを構築します。

$$ T_G = \left( \begin{array}{c} Enc_{k_i^0,k_j^0}\left( w_t^{G(0,0)} \right)\\ Enc_{k_i^0,k_j^1}\left( w_t^{G(0,1)} \right)\\ Enc_{k_i^1,k_j^0}\left( w_t^{G(1,0)} \right)\\ Enc_{k_i^1,k_j^1}\left( w_t^{G(1,1)} \right) \end{array} \right) $$

例えば、$G$ がANDゲートであれば、

$$ T_G = \left( \begin{array}{c} Enc_{k_i^0,k_j^0}\left( w_t^{0} \right)\\ Enc_{k_i^0,k_j^1}\left( w_t^{0} \right)\\ Enc_{k_i^1,k_j^0}\left( w_t^{0} \right)\\ Enc_{k_i^1,k_j^1}\left( w_t^{1} \right) \end{array} \right) $$

となります。

テーブルの各マスには、ゲートで計算された出力に対応するアクティブラベルが暗号化されています。つまり、このテーブルを用いることで2つの入力ワイヤのアクティブラベルから出力ワイヤのアクティブラベルを得ることができます。これを繰り返し行うことで、回路$C$ を評価することができます。

$P_1$ は各テーブル(Garbled tables やGarbled gates とよばれる)のエントリを順列とし、$P_2$ へ送ります。さらに$P_1$ は、それぞれの入力値に対応するすべてのワイヤのアクティブラベルを$P_2$ に送ります。$P_1$ が入力を行うワイヤについては、単にワイヤラベルを送信すればよく、$P_2$ の入力に属するワイヤについては、1-out-of-2 OT によって送信が行われます。

$P_2$ は入力鍵とテーブルたちを受け取り、ワイヤの評価を進めます。前述のとおり、$P_2$ は暗号化されたゲートの正しい行を復号できなければなりません。これは、前述のpoint-and-permute によって実現されます。

$P_2$ は回路を評価し、最終的に回路の出力ワイヤのアクティブラベルを得ます。これを$P_1$ に送れば、$P_1$ がこれを復号することができます。なお、$P_2$ が出力を復号できるように$P_1$ が出力の復号テーブルを送ることで、$P_2$ が$P_1$ に出力ワイヤのアクティブラベルを送る通信を回避することができます。

安全性

ここでは、Yao’s GC の安全性について簡単に説明します。

semi-honestなモデルの場合、$P_1$ が不正な参加者であったとしても、そのパーティがプロトコルでメッセージを受信しないため、安全といえます。

$P_2$ が不正な参加者であった場合、セキュリティは、評価者$P_2$ が同じワイヤの両方のラベルを決して見ないという観察に要約されます。これは、明らかに入力ワイヤに当てはまり、帰納的に全ての中間ワイヤに当てはまります(ゲートの各入力ワイヤのラベルが1つしかないため、$P_2$ はゲートの暗号文を1つしか復号化できません)。$P_2$ は、プレーンテキスト値とワイヤラベルの対応を認識していないため、ラベルと値の関連付けが$P_1$ によって明示的に提供される出力ワイヤを除いて、ワイヤのプレーンテキスト値に関する情報はありません。

シミュレータ$\mathcal Sim_{P_2}$ は$P_2$ のビューを次のようにシミュレートします。

  • 各ワイヤについてランダムなアクティブラベルを選択し、各ゲートの3つのアクティブでないワイヤラベルをダミー暗号文とする。
    • 各ゲートについて、2つの入力ワイヤのアクティブラベルのポインタが出力ラベルのアクティブラベルのポインタを指すようにすればよいので、他のワイヤラベルは関係ない。
  • アクティブな出力ワイヤを関数の出力に復号する復号テーブルを生成する。
    • 復号テーブルで、出力ワイヤのアクティブラベルが計算結果となるようにする。

このように、シミュレータを構成できるため、プロトコルは安全といえます。

プロトコルの流れ

次にGarbled Circuit の構築手順を示し、その後プロトコルの手順を示します。

図内の$||$ は連結、$\oplus$ はビットごとのXOR 、$\in_R$ は集合からの無作為抽出を表します。また、テーブルの暗号化に用いる$H$ はランダムオラクルです。


Yao’s garbled circuit におけるGarbled Circuit の生成

パラメータ:

関数$\mathcal F$ を実装する組み合わせ論理回路$C$ 、セキュリティパラメータ$\kappa$

Garbled Circuit の生成:

  1. ワイヤーラベルの生成 $C$ の各ワイヤー$w_i$ について、次のようにランダムにワイヤーラベルを選択する。 $$ w_i^b = (k_i^b \in_R \{0,1\}^\kappa), p_i^b \in_R \{0,1\}) $$ ただし、$p_i^b = 1-p_i^{1-b}$ を満たす。
  2. Garbled Circuit の構築 $C$ の各ゲート$G_i$ に対して、入力ラベルが決定したものから順に次を行う。
    • $G_i$ を関数$g_i:w_c = g_i(w_a,w_b)$ を実現する2入力の論理ゲートとする。 このとき、入力ラベルは $w_a^0 =(k_a^0,p_a^0), w_a^1=(k_a^1,p_a^1), w_b^0 =(k_b^0,p_b^0), w_b^1=(k_b^1,p_b^1)$とし、出力ラベルは $w_c^0 = (k_c^0,p_c^0), w_c^1 = (k_c^1,p_c^1)$ とする。
    • $G_i$ のgarbled table を作成する。$G_i$ の入力値$v_a,v_b\in \{0,1\}$ の$2^2$ 通りの可能な組み合わせのそれぞれについて $$ e_{p_a^{v_a},p_b^{v_b}} =H(k_a^{v_a}||k_b^{v_b}||i)\oplus w_c^{g_i(v_a,v_b)} $$ とする。
  3. 出力の復号テーブル 論理回路の各出力ワイヤ$w_i$ (ゲート$G_j$ の出力ワイヤである)について、そのラベルを$w_i^0=(k_i^0,p_i^0), w_i^1 = (k_i^1,p_i^1)$ とする。これらの出力ワイヤについて、可能なワイヤ値$v\in \{0,1\}$ の両方について出力の復号テーブルを次のように作成する。 $$ e_{p_i^v} = H(k_i^v||”out”||j)\oplus v $$

📎 $(a\oplus b) \oplus a = b$ なので、
$e_{v_a,v_b}\oplus H(k_a^{v_a}||k_b^{v_b}||i)=H(k_a^{v_a}||k_b^{v_b||i})\oplus w_c^{g_i(v_a,v_b)}\oplus H(k_a^{v_a}||k_b^{v_b}||i)=w_c^{g_i(v_a,v_b)}$ $e_{v_a,v_b}\oplus H(k_a^{v_a}||k_b^{v_b}||i)=w_c^{g_i(v_a,v_b)}$ のようにして復号することができます。


Yao’s garbled circuit のプロトコル

パラメータ:

参加者$P_1$ とその入力$x\in \{0,1\}^n$、参加者$P_2$ とその入力$y\in \{0,1\}^n$ 、関数$\mathcal F$ を実装する組み合わせ論理回路$C$

プロトコル:

  1. $P_1$ は図1を実行し、GCを生成する。$P_1$ は得られたGC $\hat{C}$ を出力の復号テーブルを含めて$P_2$ に送信する。
  2. $P_1$ は$P_1$ が入力を与える全てのワイヤのアクティブラベルを$P_2$ に送信する。
  3. $P_2$ が入力を与える各ワイヤ$w_i$ について、$P_1$ が送信者であり$P_2$ が受信者であるようなOT を実行し、次のようになる:
    • $P_1$ はワイヤー値$0,1$ に対応した2つのワイヤーラベルを与える。$P_2$ はそのうち入力に対応するワイヤー値($\in \{0,1\}$) を選択する。
    • OTが完了すると$P_2$ はアクティブラベルを受け取る。
  4. $P_2$ は入力ワイヤのアクティブラベルから順に、$\hat{C}$ をゲートごとに評価する。
    • Garbled Table $T=(e_{0,0},\dots,e_{1,1})$ と(ゲートの)入力のアクティブラベル$w_a =(k_a,p_a),w_b=(k_b,p_b)$に対し、$P_2$ は次のようにして(ゲートの)出力のアクティブラベル$w_c = (k_c,p_c)$ を得ることができる: $$ w_c = H(k_a||k_b||i)\oplus e_{p_a,p_b} $$
  5. $P_2$ は出力の復号テーブルを用いて出力を取得する。
    • 出力の復号テーブル$T=(e_0,e_1)$ と(組み合わせ論理回路の)出力のアクティブラベル$w=(k,p)$ (ただし$G_j$ の出力ワイヤである)に対し、$P_2$ は次のようにして(組み合わせ論理回路の)出力のワイヤ値$v$ を得ることができる: $$ v = H(k||”out”||j)\oplus e_p $$ 最後に、$P_2$ は得られた出力を$P_1$ に送り、両者はそれを出力とする。

Yao’s Garbled Circuit については、過去にもブログで扱っています。こちらも是非ご覧ください。

GMWプロトコル

GMWプロトコルでは、秘密分散法によって分散したデータ(これをshare と呼びます)上で計算を行います。

例えば、Yao’s GC では、ワイヤの値を「$P_1$ がワイヤラベルを持ち、$P_2$ がアクティブラベルを持つ」ことによって、秘密分散していたと捉えることができます。

GMWプロトコル[10][11]ではワイヤ値の秘密分散はより直接的で、参加者はアクティブなワイヤ値の加法的に分散した値を保持します。

GMWプロトコルはYao’s GC とは異なり、3つ以上のパーティに拡張できます(Yao’s GC も工夫することで3つ以上のパーティに拡張でき、それはBMRプロトコルと呼ばれます)。

GMWプロトコルは組み合わせ論理回路と算術回路のいずれでも動作します。

ここでは、2パーティの論理回路バージョンを紹介し、その後、このプロトコルが3パーティ以上に一般化できることを簡単に説明します。

それぞれについて、まず、秘密分散をどのように行うかを説明したのち、各ゲートの評価方法について説明します。

Yao’s GC と同様に、$P_1$ が入力$x$ を持ち、$P_2$ が入力$y$ を持ちます。また、$P_1$ と$P_2$ は関数$\mathcal F(x,y)$ を計算する論理回路$C$ について合意しているとします。

秘密分散

まずは、入力を秘密分散します。

$P_1$ は$x\in \{0,1\}^n$ の各ビット$x_i \in \{0,1\}$ に対し、ランダムなビット$r_i \in_R \{0,1\}$ を生成し、全ての$r_i$ を$P_2$ に送信します。このとき、$x_i$ についての$P_1$ のshare は$x_i\oplus r_i$ であり、$P_2$ のshare は$r_i$ です。$x_i = (x_i\oplus r_i)\oplus r_i$ なので、確かに$x_i$ についてのそれぞれのshare から$x_i$ を復元できます。

$y\in \{0,1\}^n$ の各ビット$y_i\in \{0,1\}$ のshare についても同様に生成します。

ここから、各ゲートの評価を秘密分散したまま進めていきます。

各ゲートの評価

$P_1$ と$P_2$ は回路$C$ をゲートごとに評価します。

ここで、$C$ はNOT・XOR・AND ゲートで構成されるとしても一般性を失いません。したがって、ここではNOT・XOR・AND ゲートをそれぞれどのように評価するのかを考えます。

NOT ゲート

入力を$w_i$ とし、出力を$w_k$ とします。

また、$P_1$ の持つ$w_i$ のshare を$s_i^1$ 、$w_k$ のshare を$s_k^1$ とし、$P_2$ の持つ$w_i$ のshare を$s_i^2$ 、$w_k$ のshare を$s_k^2$ とします。

このとき、NOTゲートの評価は$P_1$ が$s_i^1$ をビット反転すればよいです。

すなわち、$s_k^1 = \neg s_i^1, s_k^2 = s_i^2$ です。

確かに$s_k^1\oplus s_k^2 = (\neg s_i^1)\oplus s_i^2 = \neg w_i$ となり、ワイヤ値を反転できています。

XOR ゲート

ゲートの2つの入力ワイヤを$w_i,w_j$ とし、出力ワイヤを$w_k$ とします。

また、$P_1$ は$w_i,w_j$ のshare $s_i^1, s_j^1$ を持ち、$P_2$ は$w_i,w_j$ のshare $s_i^2,s_j^2$ を持つとします。$P_1$ の持つ$w_k$ のshare は$s_k^1$ 、$P_2$ が持つ$w_k$ のshare を$s_k^2$ とします。

このとき、XORゲートの評価は各参加者が自分の持つ2つのshare のXORを取ればよいです。

すなわち、$s_k^1 = s_i^1\oplus s_j^1, s_k^2 = s_i^2\oplus s_j^2$ とします。

確かに$s_k^1\oplus s_k^2 = (s_i^1\oplus s_j^1)\oplus(s_i^2\oplus s_j^2)=(s_i^1\oplus s_i^2)\oplus (s_j^1\oplus s_j^2) = w_i\oplus w_j$ となり、$w_i,w_j$ のXOR を取れています。

AND ゲート

AND ゲートはローカルな計算で実現できていたNOT やXOR とは異なり、通信をする必要があります。AND ゲートでは1-out-of-4 OT を使用します。

ゲートの2つの入力ワイヤを$w_i,w_j$ とし、出力ワイヤを$w_k$ とします。

また、$P_1$ は$w_i,w_j$ のshare $s_i^1, s_j^1$ を持ち、$P_2$ は$w_i,w_j$ のshare $s_i^2,s_j^2$ を持つとします。$P_1$ の持つ$w_k$ のshare は$s_k^1$ 、$P_2$ が持つ$w_k$ のshare を$s_k^2$ とします。

このとき、AND ゲートの評価は、次のように行われます。

  • $P_1$ は$P_2$ の4つの可能な入力($s_i^2,s_j^2$ の組み合わせ)に対して$P_2$ の持つべき$w_k$ のshare を計算する。
  • 1-out-of-4 OT で$P_1$ は4通りの$w_k$ のshare を送信し、$P_2$ は自分の入力のshare に対応する出力のshare を受け取る。

すなわち、$S(s_i^2,s_j^2) = (s_i^1\oplus s_i^2)\land (s_j^1\oplus s_j^2)$ として、 次のようにします。

  • $P_1$ はランダムなマスクビット$r\in_R \{0,1\}$ を選び、OT のテーブルを次のように用意する。 $$ T_G = \left( \begin{array}{c} r\oplus S(0,0)\\ r\oplus S(0,1)\\ r\oplus S(1,0)\\ r\oplus S(1,1) \end{array} \right) $$
  • 次に、$P_1$ と$P_2$ は$P_1$ が送信者で$P_2$ が受信者であるような1-out-of-4 OT プロトコルを実行する。$P_1$ はテーブルのそれぞれの行をOT の秘密入力とし、$P_2$ は$P_2$ が持っているshare のビットを対応する行を選択するために使用する。
  • $s_k^1 = r, s_k^2 = T_G(s_i^2,s_j^2)=r\oplus S(s_i^2,s_j^2)$ とする。

このようにすると、$s_k^1 \oplus s_k^2 = r\oplus \left(r\oplus S(s_i^2,s_j^2)\right) = S(s_i^2,s_j^2) = (s_i^1\oplus s_i^2)\land (s_j^1\oplus s_j^2) = w_i\land w_j$ となり、確かにAND を取れています。

回路の評価が終了したら、お互いに出力ワイヤのshare を公開することで回路の出力を得ることができます。

3パーティ以上への一般化

ここでは、これを$n$ 人の参加者$P_1,\dots,P_n$ が論理回路$\mathcal F$ を評価するという設定に一般化する方法を簡単に説明します。

秘密分散

2PT のときと同様に、各参加者$P_j$ は各$i\neq j$ について$r_i\in_R \{0,1\}$ を選び、$r_i$ を$P_i$ に送信することで入力を秘密分散します。

そして、参加者$P_1,\dots,P_n$ は$\mathcal F$ をゲートごとに評価していきます。ゲート$G$ の評価は次のように行います。

NOT, XOR ゲート

2PT のときと同様に、ローカルに出力のshare を計算します。すなわち、表記を2PT のときと同じとして、 $$

  • NOTゲート: $$ s_k^1 = \neg s_i^1\\ s_k^a=s_i^a \;(2\leq a\leq n) $$
  • XORゲート: $$ s_k^a=s_i^a\oplus s_j^a\; (1\leq a\leq n) $$

AND ゲート

ANDゲート$c = a\land b$ を考えます。このとき、$i\;(1\leq i\leq n)$ 番目の参加者のshare を$a_i,b_i$ とします。このとき、次が成り立ちます(AND はXOR に対して分配的です)。

$$ c=a\land b = (a_1\oplus \dots\oplus a_n)\land (b_1\oplus \dots \oplus b_n)=\bigoplus_{i,j}(a_i\land b_j) \\=\left(\bigoplus_{i=1}^{n}(a_i\land b_i)\right)\oplus \left(\bigoplus_{i\neq j}(a_i\land b_j) \right) $$

したがって、次のようにして$c$ のshare を求めることができます。

  • 各参加者$P_i$ はローカルに$(a_i\land b_i)$ を計算し、$\bigoplus_{i=1}^n(a_i\land b_i)$ のshare を得る。
  • 全ての参加者のペア$P_i,P_j$ について、2PT のときと同様に、$a_i\land b_j$ のshare を共同で計算する。
  • 最後に各参加者は得たshare のXORをとって、$c$ のshare とする。

すなわち、$i$ 番目の参加者の$c$ のshare を$c_i$ 、$a_i\land b_j$ のshare を$d_{i,j}$ 、$a_j\land b_i$ のshare を$e_{i,j}$ とすると、

$$ c_i = (a_i\land b_i) \oplus \left(\bigoplus_{1\leq j\leq n, j\neq i}(d_{i,j}\oplus e_{i,j})\right) $$

となり、確かに

$$ \bigoplus_{i=1}^n c_i = \bigoplus_{i=1}^n \left((a_i\land b_i)\oplus \left(\bigoplus_{1\leq j \leq n, j\neq i}(d_{i,j}\oplus e_{i,j})\right)\right)\\=\left(\bigoplus_{i=1}^n(a_i\land b_i)\right)\oplus \left(\bigoplus_{i\neq j} (d_{i,j}\oplus e_{j,i})\right)\\=\left(\bigoplus_{i=1}^{n}(a_i\land b_i)\right)\oplus \left(\bigoplus_{i\neq j}(a_i\land b_j) \right)=c $$

となります。

このようにして、XORゲートとANDゲートの評価が行えます。あとは、2PT のときと同様に、回路を評価し、出力ワイヤのshare を共有することで出力を得ることができます。

BGWプロトコル

Ben-Or, Goldwasser, Wigderson によるBGWプロトコル[12]は秘密計算のための最初のマルチパーティプロトコルのひとつとして知られています。また、Chaum, Crepau, Damgard によって、BGWプロトコルとやや類似したプロトコルがBGWと同時に発表されており[13]、この2つのプロトコルは同等のものと考えられることが多いです。

ここでは、具体性を持たせるため、より単純化された$n$ 人の参加者に対するBGWプロトコルを紹介します。

BGWプロトコルを使用すると、「加算・乗算・定数倍」のゲートで構成される体$\mathbb{F}$ 上の算術回路を評価できます。

GMWプロトコルのときと同様に、まず、秘密分散の方法について説明します。その後、各ゲートの評価方法について説明します。

秘密分散

このプロトコルは、Shamir の秘密分散[14]に基づいており、Shamir の秘密分散が特定の操作に対して準同型であることを利用しています。つまり、個々のshare を適切に操作することで、共有された元の値は秘密にしたまま操作することができます。

$v\in \mathbb{F}$ について、参加者達が$v$ のshare を所有しているとき、参加者のshare を$[v]$ と書きます。$[v_a]+[v_b]$ のような演算は参加者$P_i$ が持つ$v_a$ のshare と$v_b$ のshare の演算を表します。

具体的には、次のようにshare を構成します。

  • 秘密情報$v$ を持つ参加者は$p(0) = v$ となるような最大$t$ 次元の多項式$p$ をランダムに選択する。
  • 各参加者$P_i$ は値$p(i)$ をshare として持つ。

ここでは、$t$ を共有の閾値と呼び、このとき$t$ 個のshare を集めても$v$ に関する情報が洩れることはないようになっています(多項式$p$ は一意に定まりません)。

一方、$t+1$ 個のshare $(y_i = p(x_i) (1\leq i\leq t+1))$ を集めると$v$ を復元することができます。$v$ は$p(x) = \sum_{i=0}^ta_ix^i$ の$a_0$ としたときの$a_0$ に等しいです。

ここで、$y_i = \sum_{i=0}^ta_ix^i$ を行列を用いて書くと、

$ \left( \begin{array}{c} 1 & x_1 & x_1^2 & \dots & x_1^t\\ 1 & x_2 & x_2^2 & \dots & x_2^t\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & x_{t+1} & x_{t+1}^2 & \dots & x_{t+1}^t \end{array} \right) \left(\begin{array}{c} a_1\\a_2\\ \vdots\\ a_{t+1} \end{array}\right)
\left( \begin{array}{c} y_1 \\ y_2\\ \vdots \\ y_{t+1} \end{array} \right) $

となります。ヴァンデルモンド行列式から、

$$ \left| \begin{array}{c} 1 & x_1 & x_1^2 & \dots & x_1^t\\ 1 & x_2 & x_2^2 & \dots & x_2^t\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & x_{t+1} & x_{t+1}^2 & \dots & x_{t+1}^t \end{array} \right| = \prod_{1\leq i < j \leq t+1}(x_j-x_i) $$

が成り立つので、$x_i (1\leq i\leq t+1)$ が相異なるとき(かつそのときに限り)この行列は正則です。したがって、逆行列を持ち、$a_1,\dots,a_{t+1}$ は一意に定まります。

また、多項式$p(x)$ はラグランジュ補間と呼ばれる方法で求めることができます。ラグランジュ補間によると、$p(x)$ は次の式で表せます。

$$ \lambda_i(x) = \prod_{1\leq j\leq t+1, j\neq i}\frac{x-x_j}{x_i-x_j}\\ p(x) = \sum_{i=1}^{t+1} \lambda_i(x)\cdot y_i $$

📎 ラグランジュ補間について $\lambda_i(x) = \prod_{1\leq j\leq t+1, j\neq i}\frac{x-x_j}{x_i-x_j}$ について、

$$ \frac{x_j-x_j}{x_i-x_j} = 0\\ \frac{x_i-x_j}{x_i-x_j} = 1 $$

が成り立つことに注意すれば、

$$ \lambda_i(x_j) = 0 \; (1\leq j\leq t+1, j\neq i)\\ \lambda_i(x_i) = 1 $$

となることがわかります。

したがって、$p(x_i) = y_i\;(1\leq i\leq t+1)$ が成り立ちます。

以上より、$t+1$ 個のshare を集めることで、秘密情報が復元できることがわかりました。

このように秘密分散すると、加算・乗算・定数倍について、次のようにして入力のshare から出力のshare を計算することができます。

入力

参加者$P_i$ が入力を与える入力ワイヤ$w$ に対し、$P_i$ はワイヤ$w$ 上の値$v_w$ を明確に知っています。

秘密分散の節で述べたように、

  • $P_i$ は$p(0)=v_w$ となるような最大$t$ 次元の多項式$p$ をランダムに選択する。
  • $P_i$ は各参加者$P_j$ に$p(j)$ を送信する。
  • 各参加者$P_j$ は$p(j)$ を$v_w$ のshare とする。

として、$v_w$ のshare を得ます。

定数倍

入力ワイヤ$\alpha$ で出力ワイヤが$\gamma$ であるような定数$c$ 倍ゲートを考えます。参加者はshare $[v_\alpha]$ を保有しており、ここで$[cv_\alpha]$ のshare を求めることが目的です。

入力のshare が多項式$p_\alpha$ に基づいて与えられているとします。このとき、$P_i$ のshare $[v_\alpha]$ は$p_\alpha(i)$ です。

それぞれの参加者$P_i$ のshare$[v_\gamma]$ を$cp_\alpha(i)$ とすると、結果的に各参加者は$p_\gamma(x) = cp_\alpha(x)$ 上の点を保持していることになります。

このとき、$p_\gamma$ の最大次数はであり、$p_\gamma(0) = cp_\alpha(0)=cv_\alpha$ なので、$cp_\alpha(i)$ は確かに$v_\gamma = cv_\alpha$ のshare となっています。

したがって、$[v_\gamma] = [cv_\alpha] = c[v_\alpha]$ です。

$c[v_\alpha]$ はローカルな計算で求められるので、定数倍ゲートでは参加者間の通信は必要ありません。

加算

加算は定数倍と同様に行えます。

入力ワイヤが$\alpha, \beta$ で出力ワイヤが$\gamma$ であるような加算ゲートを考えます。参加者は$[v_\alpha],[v_\beta]$ のshare をいずれも保有しており、ここで$[v_\alpha+v_\beta]$ のshare を求めることが目的です。

入力のshare がそれぞれ多項式$p_\alpha, p_\beta$ に基づいて与えられているとします。このとき、$P_i$ の$[v_\alpha]$ のshare は$p_\alpha(i)$、$[v_\beta]$ のshare は$p_\beta(i)$ です。

それぞれの参加者$P_i$ が$[v_\gamma]$ のshare を$p_\alpha(i)+p_\beta(i)$ とすると、結果的に各参加者は$p_\gamma (x)=p_\alpha(x)+p_\beta(x)$ 上の点を保持していることになります。

このとき、$p_\gamma$ の最大次数は$t$ であり、$p_\gamma(0) = p_\alpha(0)+p_\beta(0)=v_\alpha + v_\beta$ なので、$p_\alpha(i)+p_\beta(i)$ は確かに$v_\gamma=v_\alpha+v_\beta$ のshare となっています。

したがって、$[v_\gamma] = [v_\alpha+v_\beta] = [v_\alpha]+[v_\beta]$ です。

$[v_\alpha]+[v_\beta]$ はローカルな計算で求められるので、加算ゲートでは参加者間の通信は必要ありません。

乗算

入力ワイヤ$\alpha, \beta$ で出力ワイヤ$\gamma$ であるような乗算ゲートを考えます。参加者は$[v_\alpha],[v_\beta]$ の両方のshare を持ち、積$[v_\alpha\cdot v_\beta]$ のshare を生成することが目的です。

足し算のときと同様に、参加者は$[v_\alpha]$ のshare と$[v_\beta]$ のshare をローカルに乗算することで、各参加者は多項式$q(x)=p_\alpha(x)\cdot p_\beta(x)$ 上の点を保持することができます。しかし、このとき$q(x)$ の次数は最大$2t$ となり、次数$t$ 以下に削減する必要があります(次数が$2t$ となることを許容すると、乗算を行うたびに次数が2倍になっていき、大変なことになります)。

この秘密分散の過剰な次数を修正するために、参加者は次数削減を行います。各参加者$P_i$ は値$q(i)$ を保持しており、$q$ は最大$2t$ の次数を持つ多項式です。このとき、目標は$q(0)$ の秘密分散を閾値$t$ で得ることです。

主な観察点は$q(0)$ が$2t+1$ 個のshare の線形関数として書けることです。すなわち、ラグランジュ補間を考えると、

$$ q(0) = \sum_{i=1}^{2t+1} \lambda_i(0)q(i) $$

です。したがって、次数削減は次のように行われます。

  1. 各参加者$P_i$ は$[q(i)]$ の閾値$t$ のshare を生成し、配布する。このとき、$P_i$ は$r_i (0) = q(i)$ を満たす多項式$r_i$ に基づいてshare を生成する。
  2. 参加者は$[q(0)]=\sum_{i=1}^{2t+1} \lambda_i[q(i)]$ をローカルに計算する。この式は、share に対する加算と定数倍を考えると成り立つことがわかる(詳しくはcallout )。

📎 $[q(0)]=\sum_{i=1}^{2t+1}\lambda_i[q(i)]$ が成り立つことについて

$r_i(x)$ は$t$ 次の多項式であり、$r_i(0) = q(i)$ なので、

$$ r(x) = \sum_{i=1}^{2t+1}\lambda_i(0)r_i(x) $$

とすれば、$r(x)$ は$t$ 次の多項式であり、

$$ r(0) = \sum_{i=1}^{2t+1}\lambda_i(0)r_i(0) = \sum_{i=1}^{2t+1}\lambda_i(0)q(i) = q(0) $$

となります。したがって、$q(0)$ のshare を求める問題は、多項式$r(x)$ に基づいたshare を求める問題に帰着されます。

$\lambda_i(0)$ は定数なので、各$r_i(0)$ のshare があるとき、定数倍と加算によって$r(0)$ のshare は、

$$ [r(0)] =\left[\sum_{i=1}^{2t+1}\lambda_i(0)r_i(0)\right]= \sum_{i=1}^{2t+1}[\lambda_i(0)r_i(0)] = \sum_{i=1}^{2t+1}\lambda_i(0)[r_i(0)] $$

と計算することができます。

したがって、

$$ [q(0)]=\sum_{i=1}^{2t+1} \lambda_i[q(i)] $$

は確かに成り立ちます。

値$[q(i)]$ が閾値$t$ で共有されたので、最終的に共有される$[q(0)]$ も閾値$t$ を持つことになります。

BGWプロトコルの$[q(i)]$ のshare を送信するという部分で通信が必要です。

また、次数$2t$ のときに$q(0)$ を求めるためには$2t+1\leq n$ である必要があります。

このことから、BGWプロトコルは$2t<n$ のとき、$t$ 人の不正な参加者を許容します。

出力

ある出力ワイヤ$\alpha$ に対し、$P_i$ はshare $[v_\alpha]$ を持つことになります。各参加者がこの値を他の全ての参加者に送信することで、全ての参加者が$v_\alpha$ を知ることができます。

BGWプロトコルについては、過去にもブログで扱っています。こちらも是非ご覧ください。

Multiplication Triples

Multiplication Triples は前処理段階で用意しておいた3つの値を使用することで、効率的に乗算を行えるようにするという技術です。

Multiplication triple はshare $[a],[b],[c]$ の3つ組で、$a$ と$b$ は適切な体からランダムに選ばれ、$c = ab$ となります。

前処理段階では、このようなMultiplication triple はランダムな入力に対してBGW乗算サブプロトコルを実行するなど、様々な方法で生成できます[15]。

計算を実行する際には、乗算ゲートごとにひとつのMultiplication triple が消費されます。

ここからは、Multiplication triple を用いて、具体的にどのように乗算を行うかについて説明します。

入力ワイヤ$\alpha,\beta$ を持つ乗算ゲートを考えます。参加者はshare $[v_\alpha],[v_\beta]$ を持っているとします。また、share$[x],[y]$、定数$z$ が与えられたとき、ローカルに$[x+y],[x+z],[zx]$ が計算できるとします。

ここで、Multiplication triple のshare $[a],[b],[c]$ を用いて、次のように$v_\alpha$ と$v_\beta$ の乗算を行います。

  1. ローカルに$[d]=[v_\alpha-a]$ を計算し、$d=v_\alpha -a$ を公開する(全ての参加者が$[d]$ を公開すればよい)。この値は秘密の値$v_\alpha$ に依存するが、ランダム値$a$ によってマスクされているため、$v_\alpha$ に関する情報は洩れない。
  2. 1 と同様に、ローカルに$[e]=[v_\beta-b]$ を計算し、$e = v_\beta – b$ を公開する。
  3. ここで、次の式が成り立つ。 $$ \begin{aligned} v_\alpha v_\beta &= (v_\alpha – a+a)(v_\beta – b + b)\\ &=(d+a)(e+b)\\ &=de+db+ae+ab\\ &=de+db+ae+c \end{aligned} $$ $d$ と$e$ は公開されており、参加者は$[a],[b],[c]$ のshare をそれぞれ保持しているため、ローカルな計算のみで、$[v_\alpha v_\beta]$ を次のように計算することができる。 $$ [v_\alpha v_\beta]=de+d[b]+e[a]+[c] $$

この技術を用いることで、2回の公開操作とローカルな計算のみで乗算を行うことができます。

Multiplication Triples については、過去にもブログで扱っています。こちらも是非ご覧ください。

まとめ

  • Semi-honest モデルで安全なプロトコルとして代表的なものに、Yao’s Garbled Circuit ・GMWプロトコル・BGWプロトコルがある。
  • 乗算を高速化する手法として、Multiplication Triples がある。

参考文献

[1]

David Evans, Vladimir Kolesnikov, and Mike Rosulek. 2018. “A Pragmatic Introduction to Secure Multi-Party Computation”.

[2]

Canetti, R., O. Goldreich, and S. Halevi. 1998. “The Random Oracle Methodology, Revisited (Preliminary Version)”. In: 30th Annual ACM Symposium on Theory of Computing. ACM Press. 209–218.

[3]

Mihir Bellare and Phillip Rogaway. 1993. “Random oracles are practical: a paradigm for designing efficient protocols”. CCS ’93: Proceedings of the 1st ACM conference on Computer and communications security. 62-73.

[4]

岡本 龍明. 2014. 「フォーラム 応用数理の遊歩道(76)暗号における数理モデル」.

https://www.jstage.jst.go.jp/article/bjsiam/24/1/24_KJ00009297026/_pdf

[5]

Kilian, J. 1988. “Founding Cryptography on Oblivious Transfer”. In: 20th Annual ACM Symposium on Theory of Computing. ACM Press. 20–31.

[7]

Beaver, D. 1996. “Correlated Pseudorandomness and the Complexity of Private Computations”. In: 28th Annual ACM Symposium on Theory of Computing. ACM Press. 479–488.

[8]

Ishai, Y., J. Kilian, K. Nissim, and E. Petrank. 2003. “Extending Oblivious Transfers Efficiently”. In: Advances in Cryptology – CRYPTO 2003. Ed. by D. Boneh. Vol. 2729. Lecture Notes in Computer Science. Springer, Heidelberg. 145–161.

[9]

Beaver, D., S. Micali, and P. Rogaway. 1990. “The Round Complexity of Secure Protocols (Extended Abstract)”. In: 22nd Annual ACM Symposium on Theory of Computing. ACM Press. 503–513.

[10]

Goldreich, O., S. Micali, and A. Wigderson. 1987. “How to Play any Mental Game or A Completeness Theorem for Protocols with Honest Majority”. In: 19th Annual ACM Symposium on Theory of Computing. Ed. by A. Aho. ACM Press. 218–229.

[11]

Goldreich, O. 2004. Foundations of Cryptography: Volume 2. Cambridge University Press.

[12]

Ben-Or, M., S. Goldwasser, and A. Wigderson. 1988. “Completeness Theorems for Non-Cryptographic Fault-Tolerant Distributed Computation (Extended Abstract)”. In: 20th Annual ACM Symposium on Theory of Computing. ACM Press. 1–10.

[13]

Chaum, D., C. Crépeau, and I. Damgård. 1988. “Multiparty Unconditionally Secure Protocols (Extended Abstract)”. In: 20th Annual ACM Symposium on Theory of Computing. ACM Press. 11–19.

[14]

Shamir, A. 1979. “How to share a secret”. Communications of the ACM. 22(11): 612–613.

[15]

大原一真. 2019. 「秘密分散法を用いた秘密計算」.

https://www.jstage.jst.go.jp/article/isciesci/63/2/63_71/_pdf

セミナー・イベント情報

パーソナルデータ活用における課題とは?AutoPrivacy Assessmentアドバイザーの世古弁護士が徹底解説!

開催日時: 2022年9月7日(水)13:00〜14:00
セミナー概要 DX(デジタル変革)が加速する中、パーソナルデータ活用のニーズが高まっています。一方で、パーソナルデータ活用を推進していく上では、法律やレピュテーションなど多様な課題と向き合って…