MPC関連技術 秘密計算

【技術】比較演算プロトコル(Nishide プロトコル)について

はじめに

この記事では、MPCによる秘密計算の代表的な比較演算プロトコルを紹介します。原論文は以下のリンクから閲覧できます。また以下の論文で提案されている手法をこの記事ではNishideプロトコルと呼ぶことにします。

https://www.iacr.org/archive/pkc2007/44500343/44500343.pdf

秘密計算において、秘密情報 $a, b$ の大小関係を、$a,b$ を明らかにせず求めたい場面は多く存在します。

$a<b$ であるか、$a=b$ であるか、公開されている定数 $c_1, c_2$ に対して$c_1 < a<c_2$ であるかどうかのチェックは、データを分析する上でよく用いられます。一般に、これらの演算は比較・等価の演算と呼ばれ、秘密計算では特別に専用のプロトコルを用意する必要があります。

Nishideプロトコルは、そのような専用プロトコルの一つであり、多くの論文で引用されています。このプロトコルにより、$a<b, \ a=b, \ c_1<a<c_2$ の比較・等価演算をMPCで実行できます。

記法の説明

本記事で出てくる記法を説明します。

  • $P_1, \cdots, P_n$ はプロトコルに参加している主体を表します(今後はパーティと呼びます)。各パーティは互いにセキュアなチャネルで結ばれているとします。
  • $\mathbb{Z}_p$ は素体を表します( $p$ は奇素数)。また、$l$ を $p$ のビット長とします。
  • $a\in \mathbb{Z}_p$ と書いた場合、$a \in \{ 0, 1, \cdots, p-1 \}$を意味します。
  • 秘密情報$a$ のシャミア秘密分散法によるシェアを$[a]_p$ と表します。
  • $C\in\{0, 1 \}$を真偽値とします。$C$ が真ならば $C=1$ と表し、$C$ が偽ならば $C=0$ とします。
    • 例えば秘密情報 $a,b$ に対して、$a<b$ が真である場合、$(a<b)=1$ とし、反対に $a < b$ が偽である場合、$(a<b)=0$ とします。
  • 真偽値のシェアを$[C]_p$と表します。例えば、$(a<b)\in\{0,1\}$ のシェアは、$[a<b]_p$ と表記します。
  • 秘密情報$a$ が二進展開により、$a=\sum_{i=0}^{l-1}2^ia_i$ と書けるとします($a_i\in\{0,1 \}$)。このとき、シェアの組 $\{ [a_{l-1}]_p, \cdots, [a_0]_p \}$ をビットシェア(bitwise sharing)と呼び、$[a]_B$と表記します。

Nishideプロトコルの内容

Nishideプロトコルは、比較演算プロトコル本体と、そのプロトコル内で使用されている7つのサブプロトコルから構成されています。まず、サブプロトコルについて説明し、その後本体のプロトコルについて説明します。

サブプロトコル

比較演算プロトコルを実装するにあたり、以下の7つのサブプロトコルが必要となります。

  • Joint Random Number Sharing (RNS)
  • Joint Random Bit Sharing (RBS)
  • Unbounded Fan-In Or
  • Unbounded Fan-In And
  • Prefix-Or
  • Bitwise Less-Than
  • Joint Random Number Bitwise-Sharing (RBVS)

以下、それぞれのサブプロトコルについて順に説明します。

Joint Random Number Sharing(RNS)

ランダムな値$r \in \mathbb{Z_p}$ のシェア$[r]_p$ を生成するサブプロトコルです。このサブプロトコルはよく使われるため、以後RNSと略記します。

プロトコル

  1. 各$P_i \ (1 \leq i \leq n)$ はランダムに $r_i \in \mathbb{Z_p}$ を選択する。
  2. シャミア秘密分散法により、$P_i$ は他のパーティに$[r_i]_p$ をシェアする。
  3. 各パーティは$[r]_p = \sum_{i=1}^n [r_i]_p$ を計算する。

Joint Random Bit Sharing(RBS)

ランダムなビット値$a \in \{ 0, 1 \}$ のシェア$[a]_p$ を生成するサブプロトコルです。このサブプロトコルもよく使われるため、以後RBSと略記します。

プロトコル

  1. 各パーティはRNSにより$[r \in \mathbb{Z_p}]_p$ を取得し、さらに$[r^2]_p$ を計算する。
  2. $[r^2]_p$ から$r^2$ を復号する(以下シェアを復号することをオープンすると書く)。
  3. もし$r^2 = 0$ ならば、1. からやり直す。
  4. $r \neq 0$ ならば、$r' = \sqrt{r^2}$ を計算する($0 < r' <p/2$)
    • $\sqrt{r^2} \in \{ r, p-r \}$ より、小さい方を$r'$ とおく。
  5. $[a]_p = 2^{-1}(r'^{-1}[r]_p + 1)$ を計算する。
    • $r'^{-1}r \in \{ -1, 1 \}$ であるため、$a \in \{ 0, 1 \}$ となる。

Unbounded Fan-In Or

ビットシェア $[a_{l-1}]_p, ..., [a_0]_p$ が与えられたときに($a_i \in \{ 0, 1 \}$)、多入力論理和のシェア$[\lor_{i=0}^{l-1}a_i]_p$ を生成するサブプロトコルです。

プロトコル

  1. $[A]_p = 1 + \sum_{i=0}^{l-1}[a_i]_p$ を計算する($1 \leq A \leq l+1$)。
  2. $f_l(1)=0, \ f_l(2)=f_l(3)= ... = f_l(l+1)=1$ を満たす$l$次多項式$f_l(x)=\alpha_0+\alpha_1x+...+\alpha_lx^l \bmod p$ を定義する。
    • $f_l(x)$ はラグランジュの補間多項式を使用して求める。
    • この時、$f_l(A)=\lor_{i=0}^{l-1}a_i$ である。
      • なぜなら、$A=1$ の時$a_i$ は全て$0$ であり、$A\neq 1$ の時$a_i$ は少なくとも一つは$1$ であるため。
    • $[f_l(A)]_p=\alpha_0+\sum_{i=1}^l\alpha_i[A^i]_p$ である。したがって、 $[A^i]_p$ を計算できれば、$[f_l(A)]_p = [\lor{i=0}^{l-1}a_i]_p$ が生成できる(3~7でこの計算を行う)。
  3. パーティ$P_i$ はRNSにより、 $[b_i \in \mathbb{Z}_p]_p, [b'_i \in \mathbb{Z}_p]_p$ を生成する($1 \leq i \leq l$ )。
  4. パーティ$P_i$ は、$[B_i]_p = [b_i]_p\times[b'_i]_p$ を計算し、$B_i$ をオープンする。
  5. パーティ$P_i$ は、$[b_i^{-1}]_p=B_i^{-1}[b_i']_p$ を計算する。
  6. 各パーティは、以下のように$[c_i]$ を計算し、$c_i$ をオープンする。
    • $[c_1]_p=[A]_p\times[b_1^{-1}]_p,$
    • $\ [c_2]_p=[A]_p \times [b_1]_p \times [b_2^{-1}]_p,$
    • $...,$
    • $[c_{l-1}]_p=[A]_p\times[b_{l-2}]_p \times [b_{l-1}^{-1}]_p,$
    • $[c_l]_p = [A]_p \times [b_{l-1}]_p \times [b_l^{-1}]_p$
    • 各$c_i$ の計算は並列に行えるため高速化可能である。
  7. $[A^i]_p=(\prod_{k=1}^i c_k)[b_i]_p$ を計算する。
  8. $[f_l(A)]_p=\alpha_0+\sum_{i=1}^l\alpha_i[A^i]_p$ を計算する。

Unbounded Fan-In And

ビットシェア $[a_{l-1}]_p, ..., [a_0]_p$が与えられたときに($a_i \in \{ 0, 1 \}$)、多入力論理積$[\land_{i=0}^{l-1}a_i]_p$ を生成するサブプロトコルです。

Unbounded Fan-in Or の 2. において、$f_l(1)=f_l(2) = ... = f_l(l)=0, f_l(l+1)=1$ とし、その他は同じように計算すれば実現できます。

なぜなら、$A=l+1$ の時$a_i$ は全て$1$ であり、$A\neq l+1$ の時$a_i$ は少なくとも一つは$0$ であるためです。

Prefix-Or

ビットシェア$[a_1]_p, ..., [a_l]_p$が与えられたときに($a_i \in \{0,1 \}$)、$b_i=\lor_{j=1}^ia_j$ を満たすPrefix-Or $[b_1]_p, ..., [b_l]_p$ を生成するサブプロトコルです。

注意1: $\lambda = \sqrt{l}$ とし、$a_{i, j}=a_{\lambda(i-1)+j}$ とします($i, j = 1, ..., \lambda$)。

注意2: Prefix-Orのサブプロトコルにおいては、ビットシェアのインデックスの付け方が他とは異なることに注意してください。MSBのインデックスは1、LSBのインデックスは$l$ となります。

プロトコル

  1. 各パーティは、$[x_i]_p=[\lor_{j=1}^\lambda a_{i, j}]_p$ を計算する($i=1, ..., \lambda$)。
  2. 各パーティは、$[y_i]_p=[\lor_{k=1}^i x_k]_p$ を計算する($i=1, ..., \lambda$)。
    • $y_i=1$ iff $\{ a_{i', 1}, ..., a_{i', \lambda} \} \ (i' \leq i)$ に$a_{i', j}=1$ が含まれている。
  3. 各パーティは、$[f_1]_p=[x_1]_p, \ [f_i]_p = [y_i]_p - [y_{i-1}]_p \ \ (i \geq 2)$ を計算する。
    • $f_i=1$ iff $\{ a_{i, 1}, ..., a_{i, \lambda} \}$ が、$a_{i, j}=1$ を含む最初のブロックである。
    • そのような$i$ を$i_0$ とする。
  4. 各パーティは、$\{ [a_{i_0, 1}]_p, [a_{i_0, 2}]_p, ..., [a_{i_0, \lambda}]_p \}$ を計算する($[a_{i_0, j}]_p=\sum_{i=1}^{\lambda}[f_i]_p \times [a_{i, j}]_p$)。
  5. 各パーティは、$\{ [b_{i_0, 1}]_p, [b_{i_0, 2}]_p, ..., [b_{i_0, \lambda}]_p \}$ を計算する($[b_{i_0, j}]=[\lor_{k=1}^j a_{i_0, k}]$)。
  6. 各パーティは$[s_i]_p=[y_i]_p-[f_i]_p$ を計算する。
    • $s_i=1$ iff $i>i_0$
  7. $[b_k]_p=[b_{\lambda(i-1)+j}]_p = [b_{i, j}]_p = [f_i]_p \times [b_{i_0, j}]_p+[s_i]_p$ を計算する。
    • $i < i_0$ の場合、$f_i=s_i = 0$ が成立するため、$b_i = 0$。
    • $i=i_0$ の場合、初めて$a_{i_0, j}=1$ となるところ(そのような$j$ を$j_0$ とする)で、$b_{i_0, j_0}=1$ となる。また$f_i=1, s_i=0$ である。
    • $i>i_0$ の場合、$f_i=0, s_i=1$ より、$b_i=1$。

Bitwise Less-Than

$[a]_B, [b]_B$ が与えられたときに、$[a<_Bb]_p$ を生成するサブプロトコルです。

比較演算子$<_B$ は、左辺と右辺が両方ともビットシェアの場合に利用します。

プロトコル

  1. 各パーティは、$[c_i]_p = [a_i]_p+[b_i]_p-2[a_ib_i]_p \ (0 \leq i \leq l-1)$ を計算する。
  2. Prefix-Orを用いて $[d_i]p=\lor_{j=i}^{l-1}[c_j]_p$ を計算する。
  3. $[e_i]_p=[d_i-d_{i+1}]_p$ を計算する(ただし、$[e_{l-1}]p=[d_{l-1}]_p$)。
    • $a,b$ を上位ビットから比較したときに、$i$番目のビット位置が初めて異なる値の場合、$e_i=1$ となり、それ以外は$e_i=0$ となる。
  4. 最後に、$[a<_Bb]_p = \sum_{i=0}^{l-1}([e_i]_p \times [b_i]_p)$ を計算する。

Joint Random Number Bitwise-Sharing (RBVS)

ランダム値$r \in \mathbb{Z_p}$ のビットシェア$[r_0], [r_1], ..., [r_{l-1}] \ \ (r_i \in \{ 0, 1 \})$ を生成するサブプロトコルです。よく使うサブプロトコルなので、以後RBVSと略記します。

前提として、$p$ のビットシェアを各パーティに配布していることを想定しています。

プロトコル

  1. 各$i=0, ..., l-1$ について、RBSにより $[r_i \in \{ 0, 1 \}]$ を生成。
    • $[r] = \sum_{i=0}^{l-1}(2^i[r_i])$
  2. $[r <_B p]_p$ を生成。
  3. $r<p$ ならば$[r_i] \ (i = 0, ..., l-1)$ を出力。

本体プロトコル

ここからは、本体の比較演算プロトコルについて説明します。

Nishideプロトコルは、以下の4つの比較演算プロトコルを提案しています。

  • $c_1 < a < c_2$
  • $a<p/2$
  • $a < b$
  • $a=b$

なお $a<p/2$ は、$a<b$ の計算を効率化させるために必要なものであり、実質サブプロトコルと考えても問題ありません。

$[c_1 < a < c_2]_p$ の生成

定数$c_1, c_2 \in \mathbb{Z}_p$ において($c_1 < c_2$)、値$a\in\mathbb{Z}_p$ が $c_1 <a<c_2$ であるかチェックするため、シェア$[c_1 < a < c_2]_p$ を生成する手法を紹介します。

アイデア

RNSにより乱数$r\in \mathbb{Z}_p$のシェア$[r]_p$ を生成し、$[c]_p=[a]_p+[r]_p$ を計算し、$c$ をオープンします。

この時、$a \in \{ -(p-c-1), \cdots, -1, 0, 1, \cdots, c-1, c \}$ と表現できます。

$c_1<c<c_2$ が成立するかどうかで場合分けし、比較を行います。

以下は、全てのパターンを列挙しています。

  • $c_1 < c < c_2$ が成立しない場合
    • $c_2 \leq c$ の場合
      • $(c_1 < a < c_2) = 1$ iff $(r_{low} =)c-c_2 < r < c - c_1(=r_{high})$
    • $c \leq c_1$ の場合
      • $(c_1 <a<c_2)=1$ iff $(r_{low} =)c+p-c_2 < r < c+p - c_1(=r_{high})$
  • $c_1 < c < c_2$ が成立する場合
    • $(c_1 < a < c_2) = 0$ iff $(r_{low} =)c-c_1-1 < r < c+p - c_2 + 1(=r_{high})$

プロトコル

  1. 各パーティは$[r\in\mathbb{Z}_p]_B$ を生成し、$[r]_p$ を得る。
  2. 各パーティは$[c]_p=[a]_p+[r]_p$ を計算し、$c$ をオープンする。
  3. $c_1 < c < c_2$ が成立しない場合
    1. $c_2 \leq c$ の場合
      1. $r_{low} =c-c_2, \ \ r_{high}=c-c_1$ とする。
    2. $c \leq c_1$ の場合
      1. $r_{low} =c+p-c_2, \ \ r_{high}=c+p-c_1$ とする。
    3. $[c_1 < a < c_2]_p = [r_{low}<_B r]_p \times [r<_B r_{high}]_p$ を出力する。
  4. $c_1 < c < c_2$ が成立する場合
    1. $r_{low} =c-c_1-1, \ \ r_{high}=c+p-c_2+1$ とする。
    2. $[c_1 < a < c_2]_p = 1-[r_{low}<_B r]_p \times [r<_B r_{high}]_p$ を出力する。

$[a<p/2]_p$ の生成

$a<p/2$ をチェックするためのシェア$[a<p/2]_p$ を生成する手法を紹介します。

このシェアを生成する目的は、以降の比較演算プロトコルで使用するためです。

アイデア

  • $a\in \{ 0, 1, \cdots, (p-1)/2 \}$ のとき
    • $(2a \bmod p)$ は偶数となります。つまり、$(2a \bmod p)_0 = 0$ となります(LSBが0)。
    • したがって、$(2a \bmod p)$ の1ビット目が0 のとき、$a<p/2$ が言えます。
  • $a\in \{ (p+1)/2, \cdots, p-1 \}$ のとき
    • $(2a \bmod p)$ は奇数となります。つまり、$(2a \bmod p)_0 = 1$ となります(LSBが1である)。
    • したがって、$(2a \bmod p)$ の1ビット目が1 のとき、$a \geq p/2$ が言えます。

上記の事実から、$[x]_p$ が与えられた時に$[(x)_0]_p$ を生成するプロトコルを利用することによって、 $[a<p/2]_p$ を生成できます。手法のアイデアを以下に示します。

アイデア

  • 乱数$r$ のシェア$[r\in\mathbb{Z}_p]_p$ に対して、$[c]_p = ([x]_p+[r]_p)\bmod p$ を計算し、$c\in\{0, 1, \cdots, p-1\}$ をオープンします。
  • $c$ の計算の際に、reduction(実際にモジュラ演算を行うことの意。つまり、$(x+r)>p$) が発生しなかった場合、$(x)_0=(c)_0\oplus(r)_0$ が成立します。reductionが発生した場合、$(x)_0=1-\{(c)_0\oplus(r)_0\}$ が成立します。
  • reductionが発生したかどうかは、$(c<r)$ をチェックすることでわかります。
    • $(c<r)=0$ のときは、reductionは発生していない。
    • $(c < r)=1$ のときは、reductionが発生した。

プロトコル

  1. RBVSにより $[r\in\mathbb{Z}_p]_B$ を生成し、$[r]_p$ を得る。
  2. $[c]_p=([2a]_p+[r]_p) \bmod p$ を計算し、$c$ をオープンする。
  3. $[(2a)_0]=[c<_B r]_p \times (1-\{(c)_0 \oplus [(r)_0]_p \})$+$(1-[c <_B r]_p) \times \{ (c)_0 \oplus [(r)_0]_p \}$ を計算する。
    • $(c)_0\oplus[(r)_0]_p$ の計算は
      1. $(c)_0 = 0$ の場合
        • $[(r)_0]_p$ を返す
      2. $(c)_0 = 1$ の場合
        • $1-[(r)_0]_p$ を返す
  4. $[a<p/2]_p = 1 - [(2a)_0]_p$

$[a<b]_p$ の生成

続いて、$a<b$ をチェックするためのシェア$[a<b]_p$ を生成する手法を紹介します。

アイデア

以下の真偽値表は、$w=(a<p/2), x=(b<p/2), y=(a-b\bmod p < p/2)$ という3つの変数を利用して、$z=(a<b)$ の値を計算しているものです。以下の真偽値表を利用すると、

$$z=w\bar{x}\lor\bar{w}\bar{x}\bar{y}\lor wx\bar{y} = w(x+y-2xy)+1-y-x+xy$$

という等式が成り立ちます。

 

プロトコル

  1. $[a < p/2]_p, [b<p/2]_p, [(a-b \bmod p) < p/2]_p$ を生成する。
  2. $w=(a < p/2), x=(b<p/2), y = (a-b \bmod p < p/2), z = (a<b)$ とし、 $[z]=[w\bar{x}\lor\bar{w}\bar{x}\bar{y}\lor wx\bar{y}] = [w(x+y-2xy)+1-y-x+xy]$ を計算する。

$[a=b]_p$ の生成

最後に、$a=b$ をチェックするためのシェア$[a=b]_p$ を生成する手法を紹介します。

アイデア

$[a=b]_p$ を計算するには、$[a-b=0]_p$ を計算すれば良い。

プロトコル

  1. $[r\in \mathbb{Z}_p]$ を生成し、$[r]_p$ を得る。
  2. $[c]_p = [a-b]_p+[r]_p$ を計算し、$c=(a-b)+r\bmod p$ を計算してオープンする。
  3. 以下のように、$[c_i']_p$ を計算する。
    1. $c_i=1$ ならば、$[c_i']=[r_i]_p$
    2. $c_i=0$ ならば、$[c_i']=1-[r_i]_p$
  4. $[a=b]_p = [\land_{i=0}^{l-1}c_i']$
    • $c=r$ ならば(つまり、$a=b$ ならば)、$\land_{i=0}^{l-1}c_i'$ は1 になる。

まとめ

本記事のまとめは以下の通りです。

  • 代表的な比較演算プロトコルであるNishideプロトコルについて説明した。
  • Nishideプロトコルを使用すると、秘密情報$a, b$, 定数$c_1, c_2$ に対して、$[c_1<a<c_2]_p, [a<b]_p, [a=b]_p$ の生成が可能となる。

参考文献

https://www.iacr.org/archive/pkc2007/44500343/44500343.pdf

補足資料

Prefix-OrとBitwise Less Thanの簡単な例を図示します。

メンバー募集

Acompanyでは、秘密計算の社会実装に向けてメンバーを絶賛募集中です!
優秀なメンバーが集まる環境で世の中に新しい価値を作る挑戦を僕らとしませんか?
以下の分野のメンバーを募集中です!

✅ ソフトウェアエンジニア
✅ マーケティング
✅ バックオフィス

興味がある方は、まずは軽くお話しするだけでも大丈夫ですので、ぜひご連絡ください!😎        

詳細はこちら

       

【無料】秘密計算コンソーシアムメンバー募集中!

秘密計算コンソーシアムは秘密計算を中心とした、プライバシーテックに関連する情報発信およびイベント開催を行うコミュニティです!!
個人情報やプライバシーの付随するデータの活用に悩まれている企業・担当者様にとって、法令遵守した安全安心なデータ活用を実現するヒントが得られる場所となっています。
無料ですので、ぜひご気軽にご加入ください!

コミュニティ参加メンバーへの特典

✅ 月1回のイベント「秘密計算.jp」を優先的にご案内
✅ 限定メールマガジンの配信
✅ 「2時間でプライバシー保護データ活用がわかる勉強会」特別割引

詳細・申し込みはこちらから!

-MPC関連技術, 秘密計算
-, , , ,

© 2021 秘密計算の国内最大ブログ | Acompany Co., Ltd. Powered by AFFINGER5