暗号勉強会

あまりコードが出てこない話

Two-Sided Malicious Security for Private Intersection-Sum with Cardinality(CRYPTO2020)を読んだ

どういう論文か

Private Intersection-Sum with Cardinalityに関する研究である。

f:id:ATen:20200912003537p:plain
プロトコル同士の関連性

Private Intersection-Sum with Cardinality(以下PI-SCA)

共通集合の濃度と同時に、共通集合に属する要素に関連づけられた値の和を算出するPSIのバリアントである。例えば、集合A={a,b,c}と集合B={b,c,d}であればA\cup B={b,c}である。ここでa1に関連づけられていることをa:1と書くことにすると、


a:4\\
b:2\\
c:3\\
d:1

のように対応していればそのIntersection-Sumは2+3=5である。このIntersection-Sumはpaillier暗号のような加法準同型性を持つ暗号で実現できる。

関連技術

Σプロトコル

3-move honest-verifier zero-knowledge プロトコルである。Proverがコミットして、Verifierがチャレンジして、Proverがレスポンスを返す。この流れを3-moveという。つまり以下の流れになる

  1. ProverがVerifierにコミットメントtを送る
  2. VerifierがProverにランダムなチャレンジcを送る
  3. VerifierがProverにレスポンスsをおくる

OPRF(Oblivious Psuedo-Randomness Function)

OPRFとはP _ 1が鍵kを持っており、P _ 2が入力xを持っているとき擬似ランダム関数Hを評価するプロトコルのことである。数式で表すと以下のようになる。


OPRF:(k,x) \mapsto (\perp,H(k,x))

つまり擬似ランダム関数をxの情報を漏らさずに評価し、その出力はP _ 2のみが得られる。

PSI-CA(Private Set Intersection CArdinality)

PSI-CAとはPSIのバリアントで共通集合の要素の情報を漏らさず、その濃度だけを出力するプロトコルのこと。

共有鍵(key share)

共有鍵とは秘密鍵を秘密分散したシェアのこと。例えばskを共有鍵にするとsk=sk _ 1+sk _ 2のように秘密分散し、sk _ 1P _ 1が、sk _ 2P _ 2が持つ。

新規性

  • 以前はPI-SCAのMalicious Securityなモデルでは、受信者と送信者のうちで片方向、例えば受信者のみが出力を得るような方法しか存在しなかった。

  • この研究でTwo-Sided Malicious Security、つまり両方向出力をしつつもをMalicious Securityを保証するプロトコルを提案する。これにより両方が出力得たいようなシナリオに対応することができる。

  • PI-SCAで初めてMalicious Securityと同時に線形の通信量と計算量を達成している。

手法

まずこのPI-SCAプロトコルが何をやろうとしているのかの概要図を紹介する。(なお、コミットメントや証明などはまだよくわかっていないため省略)

f:id:ATen:20200912004444p:plain
プロトコル概要

まず、両方向出力にするためには、まず受信者が得た出力が正確なものであることを証明しなければならない。そのため、プロトコルを役割を入れ替えて並行実行する手法をとる。(1,2の並行実行)

手法の中心となるのはDOPRF(Distrubuted Oblivious Psuedo-Randomness Function)である。これは共有鍵を用いてOPRFをすることを可能にするプロトコルであり、並行実行されたOPRFの出力を並び替えることができる(shuffled)。

Semi-honest SecurityなPI-SCAの構成方法

  1. DOPRFを利用してPSIを構成する。
  2. shuffled DOPRFプロトコルを構成し、PSI-CAに拡張する。
  3. 関連づけられた値をre-randomizable(つまり確率暗号)な加法準同型暗号を使ってPI-SCAを構成する。

ここでPSI-CAにDOPRFでなくてshuffled DOPRFを使うのは、ミックスネットのように暗号文と平文の対応をわからなくすることが目的である。対応関係がわからなくなれば平文そのものの情報が漏れることがなくその濃度だけを得られる。

Note 関連づけられた値をre-radomizeする必要があるのはビットパターンを平文を変えることなく変更する目的がある。

Malicious SecurityなDOPRFの構成

まずはDOPRFをSemi-honest Securityで実現する。

  1. Semi-honest SecurityなPRFをq-DH仮定のもとで成立させる。

  2. PRFの鍵を共有鍵にすることで、DOPRFプロトコルを構成することが可能である

先行研究で利用されていたDH仮定ベースのDOPRFでは困難であるとされるため、q-DH仮定で定義しなおしている。 次にMalicious SecurityなDOPRF実現する。 そのために

  • 暗号化(準同型)のCorrectness

  • Consistency(二つの値の内部で使われている値aが一致していること)

をCamenish-Shoup暗号を使いΣプロトコルによってゼロ知識証明する。これによりMalicious Securityを達成する。

Malicious SecurityなPI-SCAの構成

これらのプロトコルは全て出力を双方向に得ることを目標としていることに注意されたい。

Malicious SecurityなDOPRF→PSI

Malicious SecurityなPSIを構成する。

問題 PSIプロトコルで使用するDOPRFで出力を得た受信者が出力を送り返すとともに暗号文とPRF値のCorectnessを証明する必要がある。

手法 この証明はΣプロトコルによって実現できる。

DOPRF→shuffled DOPRF

Malicious Securityな PSI-CAを構成するためにDOPRFをshuffled DOPRFへ拡張する。

問題 shuffled DOPRFは送り返す前に出力をシャッフルできるが、このシャッフルのCorrectnessを証明する必要がある。

手法  平文と暗号文の集合が与えられた時、平文がある暗号文を並び替えたものの復号に対応することが効率的にゼロ知識証明できるプロトコルを使う。[BG12]

PSI→PSI-CA

Malicious Securityな PSI-CAを構成する。

問題 Malicious Securityにするには二つのPSI-CAを役割を逆にして並行に実行しなければならない。この時、各プロトコルの共有鍵の一貫性( Consistency)を証明する必要がある。

手法 各パーティは最初に共有鍵をコミットしてから一貫性の証明を行う。この証明にはΣプロトコルを利用する。

PSI-CA→PI-SCA

Malicious Securityな PI-SCAを構成する。

問題 PRFとそれに関連づけられた値vに対してシャッフルを行うとき、vをre-randomizeしつつシャッフルするが、そのvがPRFに対するシャッフルと対応しているか証明する必要がある。また得られた暗号文を共有鍵を用いてhalf-decryptできるが、この復号のCorrectnessを証明する必要がある。

手法 前者の証明は[BG12]で実現できる。後者はΣプロトコルを使う必要がある。

指数領域への拡張 

ここまでの議論では多項式サイズの入力でしかプロトコル成立しなかったが、緩めた選択的安全性を定義しPI-SCAが多項式サイズのみならず指数サイズの入力でも安全であることが示せる。

バッチ処理

今回のプロトコルは効率化のためにバッチ処理を提案する。今回のプロトコルでは重要な構成要素である以下の3つをバッチ処理している。

  1. Pedersen コミットメント
  2. CS暗号
  3. Σプロトコル

これらのテクニックにより通信量を低減することができている。独立した関心事なのではないかと思われる。

まとめ

双方向通信やhalf-decryptで双方向で出力を得る仕組みがとても面白いと思った。コミットメントや安全性証明の理解度が浅いため、読みながら理解を深めたい。

参考文献

Two-Sided Malicious Security for Private Intersection-Sum with Cardinality

Efficient Zero-Knowledge Argument for Correctness of a Shuffle Stephanie(BG12)

PSIとPSUについて調べた

PSIとPSU、そしてactiveな敵に対して安全なプロトコルについて簡単に調べたのでメモを残しておきます。以下の論文はgoogle scholarで出ます。

Extending Oblivious Transfers Efficiently(2003)

Y Ishai, J Kilian, K Nissim ,E Petrankの研究。

概要 この研究では1回のOTが安全なら複数回のOTが安全であることを証明しています。

より形式的にはk ^ cOTをk OTに帰着します。kが安全なら、それをブラックボックス的に用いたk ^ cも安全であるという事実を示しています。

まず、一方向性関数が存在すれば、疑似ランダム関数が存在するということが知られています。しかし、一方向性関数からOTへの帰着は困難です。 しかし、Beaverの定理によれば一方向性関数と小さなOTが存在すれば、大きなOTが存在すること(拡張の存在)が分かりました。

この研究でやられたことは主に

  • 一方向性関数から疑似ランダム関数を構成し、ランダムオラクルモデルにおけるOTを効率的に拡張するプロトコルを提案。
  • Correlational robustnessという性質を定義した。疑似ランダム性のような性質で、疑似ランダム関数族を得るのに使える。

です。

Efficient Private Matching and Set Intersection(2004)

M J. Freedman,K Nissim, B PinkasnによるPSIの概念や他の応用方法(PSI-CAやマルチパーティ型PSI)が提案された研究です。

Private Set IntersectionまたはPrivate Set Unionとはサーバーとクライアントの持つ各々の集合について共通集合または和集合を計算し、その結果をクライアントが得る。サーバーは何も得られないというプロトコルです。データベース上の計算において集合演算は幅広く活用されています。もともとはTTPを用いた方法や安全性のない平文でのやりとりが行われていましたが、PSIはそれを解決しています。

この論文でPSIは

  • Oblivious Polynomial Evaluation (OPE,1999)

  • paillier暗号などの加法準同型性を持つ暗号

を用いて与えられました。

Privacy Preserving Set Operations(2005)

L Kissner , D Song の研究。

和集合、共通集合、element reduction(要調査)に対するマルチパーティ計算プロトコルを提案しました。PPT-bounded adversaryモデルにおいても、passiveとactiveに対する安全性が保証されます。ここで提案されたプロトコルは、のちにMPSIやMPSUと呼ばれています。

Keyword Search and Oblivious Pseudorandom Functions(2005)

M J. Freedman, Y Ishai, B Pinkas, O Reingoldの研究。OPRFとはOPEの鍵付き疑似ランダム関数版のことです。

  • 送信者は鍵kを入力し、受信者はxを入力する。

  • 受信者は f _ k(x)を得られる。送信者の鍵kの情報も受信者の入力xの値も漏れない。

OTやOPE同様にPSIに利用されます。

Honest-Verifier Private Disjointness Testing without Random Oracles (2006)

Susan Hohenberger Stephen A. Weisの研究。

PSI-CAを初めて正式に定義しました。 PSI-CAとは共通集合や部分集合の要素集合ではなく、その大きさ(つまり濃度)しか学習しないプロトコルです。つまり、サーバーが集合S、クライアントが集合Cを入力したとき、|S \cap C|を出力します。 実装は困難であり、PSIやPSUでは情報量が多すぎるような場合に利用するPSIのより発展的な研究です。計算量が[tex:O(n2)]です。

Efficient Oblivious Pseudorandom Function with Applications to Adaptive OT and Secure Computation of Set Intersection(2009)

Stanisław Jarecki and Xiaomin Liuの研究です。プロトコルにOPRFを用いて、通信ラウンド数が一定かつコミット型という特徴を持ちます。

Linear-Complexity Private Set Intersection Protocols Secure in Malicious Model(2010)

E D Cristofaro, J Kim, G Tsudikの研究。ここで初めてAPSI(Authorized Private Set Intersection)が定義されました。DDH仮定のもと、ランダムオラクルモデルで安全性が証明されます。CRSモデルを使わず、計算複雑性と通信複雑度が線形である初めての研究です。

ディジタル署名での認証とPSIの合わせ技で、PPIT(Privacy Policy based Information Transfer)と関連している。PPITとはクライアントが取得権限を持っている情報しか得られないプロトコルです。APSIは、共通集合のうちユーザーが権限を持っている情報しか得られません。

Semi-homomorphic Encryption and Multiparty Computation(2011)

R Bendlin, I Damg˚ard, C Orlandi,S Zakariasの研究です。BDOZとも呼ばれています。加法準同型性を活用して、効率的にactiveな敵に対して安全なマルチパーティ計算プロトコルを提案しました。 このプロトコルプリプロセスの考え方はSPDZに活用されています。

Fast and Private Computation of Cardinality of Set Intersection and Union(2012)

E D Cristofaro,P Gasti,G Tsudikの研究。初めて線形時間で動作するPSI-CAとPSU-CAのプロトコルを実現しました。

Phasing: Private set intersection using permutation-based hashing(2015)

M Zohner,G Segev,T Schneider,B Pinkasの研究。 Permutation based-hashingを活用し、この2015年時点で最速のPSIを実現しました。

MASCOT: Faster Malicious Arithmetic Secure Computation with Oblivious Transfer (2016)

M Keller, E Orsiniの研究。activeな敵に対して安全かつ高速なマルチパーティ計算プロトコルです。オンラインフェーズはSPDZのものと全く同じですが、プリプロセスにおけるトリプルの生成が高速化されています。

この研究より前にFredriskenは、SPDZのプリプロセスにおけるトリプルの生成を二元体上で高速化しました。MASCOTでは任意の大きな有限体において、OTを使用したプリプロセスの実行を可能にしました。トリプルの生成には2つのk-bitの積を計算するgilboaの提案したプロトコルを利用します。

まとめ

認識に間違いがありましたら、コメント等で教えてください!何卒よろしくお願いします!

参考

Privacy Preserving Set Operations

Fast and Private Computation of Cardinality of Set Intersection and Union

Extending Oblivious Transfers Efficiently

Efficient Private Matching and Set Intersection

Faster Private Set Intersection Based on OT Extension

Practical Private Set Intersection Protocols with Linear Complexity

Honest-Verifier Private Disjointness Testing without Random Oracles

Phasing: Private Set Intersection using Permutation-based Hashing

MASCOT: Faster Malicious Arithmetic Secure Computation with Oblivious Transfer

Keyword Search and Oblivious Pseudorandom Functions

Efficient Oblivious Pseudorandom Function with Applications to Adaptive OT and Secure Computation of Set Intersection

Semi-homomorphic Encryption and Multiparty Computation

なんとなく分かってもらうためのSPDZ解説(プリプロセスフェーズ編)

SPDZはsomewhat準同型暗号(以下SHE)を使うことで高い効率性と安全性を実現したマルチパーティ計算プロトコルです。

  • SHEによる効率的なプリプロセスフェーズの実現。

  • semi-honest secureよりも高い、active secureの効率的な実装。

  • active secureなので、n個のパーティのうちn-1がcorruptされていてもUC安全性が保障される。

のような性質を持っています。これについて解説します。



はじめに

ここから登場する記号は太字の場合はすべて\mathbf{v} \in (\mathbb{F _ {p ^ k}}) ^ sである有限体上のs次元ベクトル\mathbf{v}です。 そうでなければv \in \mathbb{F _ {p ^ k}} である有限体の要素vです。

SHEとは加算と乗算に対して準同型性を持つが、計算回数が制限されたものです。SHEのなかでもBVというスキームを活用します。BVでは暗号文のまま十分な数と加算と1回の乗算を行うことが出来ます。暗号文での乗算が1回を超すと、正しく復号できなくなることに注意してください。

SPDZではSHEの準同型性を生かし、平文を暗号化し、暗号文の状態でブロードキャストや計算を行います。この時、

  • 暗号文なので平文の情報は漏れない。

  • SHEの準同型性によって暗号文のまま計算ができる。

となります。こうして、プリプロセスフェーズで必要な情報を各パーティが使用可能な状態にしておくことで、オンラインフェーズでの計算量を減少させます。

加算と乗算

オンラインフェーズでも述べますが、加算と乗算の方法について説明します。 秘密分散方式として、加法的秘密分散を使っています。mm=m _ 1+\dots+m _ nを満たすようなm _ iに分割します。このことをm=\Sigma _ i m _ iと書き、各m _ iのことをシェアということにします。

例えばm=10として、(m _ 1,m _ 2,m_ 3,m _ 4)=(1,5,2,3)とすると、

m=\Sigma _ i m _ i=1+5+2+3=10

  が明らかです。更にそのまま加算を行うこともできます。P _ 1m5を足したい場合は、m _ 15を足します。実際、

m=\Sigma _ i m _ i=(1+5)+5+2+3=15

  なので加算できています。

乗算の場合はMultiplication Triplesを使います。Multiplication Triplesについては以下のサイトが参考になります。

acompany.tech

ここではMultiplication Triplesのことをトリプルと呼ぶことにします。

MACでの認証

さて、SPDZには二つの値表現が登場します。SPDZではシェアをパーティの持つ秘密鍵やグローバル鍵で認証してあげることで、不正を検出します。この認証に使う認証子をMAC(Message Authentication Code)と呼ぶことにします。

\langle \mathbf{m} \rangleMACで認証されたシェアです。この値は単一の値を表現しているわけではなく、以下のような状態を表します。

f:id:ATen:20200712130212p:plain
<m>の表す状態

Privateは各パーティP _ iが個人で所持している値です。Publicはすべてのパーティが参照できる値です。

  • \deltaMACの条件を維持するために利用します。詳しい役割についてはオンラインフェーズで述べます。

  • \ \mathbf{m _ 1} ,\mathbf{m _ 2},\dots,\mathbf{m _ n}は計算は各パーティP _ iの所持するシェアです。

  • \gamma ( \mathbf{m} ) _ iはその計算における不正を検証するためのMACです。

なお、このMAC\alphaがないとチェックできないので計算が全て終わってからでないと誰かが不正したことを検出できません。

[ \mathbf{m} ]秘密鍵\beta _ iで認証された値です。この値も単一の値を表現しているわけではなく、以下のような状態を表します。論文や図では〚〛を使用していますが、texで出す方法が分からないので以降は[]で代用しています。

f:id:ATen:20200712130704p:plain
[m]の状態

  • \ \mathbf{m _ 1} ,\mathbf{m _ 2},\dots,\mathbf{m _ n}は計算は各パーティP _ iの所持するシェアです。

  • (\gamma ( \mathbf{m} ) ^ i _ 1,\dots,\gamma ( \mathbf{m} ) ^ i _ n) _ {i=1,\dots,n}はその計算における不正を検証するためのMACです。

この状態では、ブロードキャストしあってシェアを集めることで\beta _ iに認証された\alphaを復元できます。例えば、下の図の赤く囲われた部分をブロードキャストしあって集めることで\beta _ 1に認証された\alphaを復元できます

f:id:ATen:20200712130208p:plain
[m]の表す状態2

\beta _ 1を持っているP _ 1なら値の正しさを検証できます。P _ 1以外の P_ i についても同様です。

\langle \mathbf{m} \rangleとの違いは\alphaなしに\mathbf{m}を手にいられることです。そのため、オンラインフェーズで\alphaを公開するより前に値が必要な時に利用されています。

この表現はMACの認証に使用するグローバル鍵\alphaの公開を遅らせるために存在しています。各パーティP _ i\alphaがなければMACを確認することができないませんが、\alphaがあると偽造できてしまいます。偽装を防ぐために各パーティの秘密鍵\beta _ iで認証させて、\alphaの公開を遅らせます。

サブプロトコル

プリプロセスフェーズでは同じような処理を繰り返し行う部分があるため、それを一般化したものを定義します。PBracket(\mathbf{m} _ 1,\dots,\mathbf{m} _ n,e _ \mathbf{m})のようになっていますが、\mathbf{m} _ 1,\dots,\mathbf{m} _ nは各パーティP _ iのローカルに保持する値であることに注意してください。

平文のゼロ知識証明

任意の平文に対する正しい暗号文を共有するために以下の処理を行います。これをPoPK(\mathbf{m _ i})としましょう。

  1. 各パーティP _ iはメッセージ空間から\mathbf{m _ i}\in (\mathbb{F _ {p ^ k}}) ^ sを選ぶ。各パーティの生成した平文の和は\mathbf{m}=\Sigma _ i \mathbf{m _ i}となる。

  2. 各パーティP _ ie _ {\mathbf{m _ i}} \leftarrow Enc _ {pk}(\mathbf{m _ i})のように暗号化してブロードキャストする。

  3. 各パーティP _ iは暗号文e _ {\mathbf{m _ i}}に対応する平文\mathbf{m _ i}を知っていることを証明する。

  4. 各パーティP _ ie _ {\mathbf{m }}\leftarrow e _ {\mathbf{m _ 1}}\boxplus \dots \boxplus e _ {\mathbf{m _ n}}を計算する。

暗号文e _ {\mathbf{m _ i}}に対応する平文\mathbf{m _ i}を知っていることを証明する。

この処理によりe _ {\mathbf{m _ i}}を正しく共有し、e _ {\mathbf{m }}を入手できます。

PAngle

PAngleは任意の平文に対するシェアを生成するために以下の処理を行います。これをPAngle(\mathbf{m} _ 1,\dots,\mathbf{m} _ n,e _ \mathbf{m})としましょう。


PAngle(\mathbf{m} _ 1,\dots,\mathbf{m} _ n,e _ \mathbf{m})=\langle \mathbf{m} \rangle

暗号文e _ {\mathbf{m}}と、平文\mathbf{m}のシェアを入力に\langle \mathbf{m} \rangleを生成する。各パーティP _iはグローバル鍵\alphaの暗号文e _ {\alpha}e _ {\mathbf{m}}の積を計算し、e _ {\mathbf{m} \cdot \alpha}を計算します。e _ {\mathbf{m} \cdot \alpha}\alphaで認証したMACの暗号文であり、これをReshareすればMACを共有できます。暗号文での乗算回数は1回です。

PBracket

PBracketは任意の平文に対するシェアを生成するために以下の処理を行います。これをPAngle(\mathbf{m} _ 1,\dots,\mathbf{m} _ n,e _ \mathbf{m})としましょう。


PBracket(\mathbf{m} _ 1,\dots,\mathbf{m} _ n,e _ \mathbf{m})=[ \mathbf{m} ]

  暗号文e _ {\mathbf{m}}と、平文\mathbf{m}のシェアを入力に [\mathbf{m} ]を生成します。各パーティP _i秘密鍵\beta _ iの暗号文e _ {\beta _ i}e _ {\mathbf{m}}の積を計算し、e _ {\gamma _ i}を計算します。e _ {\gamma _ i}\beta _ iで認証したMACの暗号文であり、これをReshareすればMACを共有できます。暗号文での乗算回数は1回です。

Reshare

Reshareは暗号文からシェアを生成するプロトコルです。


Reshare(e _ \mathbf{m},enc)=\langle \mathbf{m} \rangle\ and\   e' _ \mathbf{m}

  暗号文e _ {\mathbf{m}}に対応する平文\mathbf{m}のシェアを秘密分散します。第二引数にNewCiphertextのコマンドを入力されると、平文\mathbf{m}を暗号化しているが暗号文e _ {\mathbf{m}}=e' _ {\mathbf{m}}のような暗号文e' _ {\mathbf{m}}も同時に生成します。暗号状態での乗算回数は0回です。

Reshareは乗算を1回も行わないので、PAnglePBracketと組み合わせても乗算回数が1回を超えることがありません。

プリプロセス(オフライン)フェーズ

サブプロトコルを活用して平文の情報を一切明かすことなく、プロトコルの初期化やトリプルとペアの共有を行うことができます

具体的にはオンラインフェーズで利用する


\langle \mathbf{a} \rangle,\langle \mathbf{b} \rangle,\langle \mathbf{c} \rangle,\langle \mathbf{r} \rangle,\langle \mathbf{f} \rangle,\langle \mathbf{g} \rangle,\langle \mathbf{h} \rangle
[\mathbf{r}],[Diag(\alpha)],[\mathbf{t}],[\mathbf{e}]

を生成します。Diag(\alpha)とは\alphas個を並べた(\alpha,\dots,\alpha)を表します。\alphas次元ベクトルでないので、s次元に拡張しています。

プリプロセスは初期化、ペアの生成、トリプルの生成の3段階に分けることが出来ます。

初期化

まずトリプルやペアの生成のために、鍵を共有します。具体的には各パーティP _ i[Diag(\alpha)]と\beta _ iを持っている状態にします。

  1. 暗号化のためにプロトコルは公開鍵pkをセットする。

  2. 各パーティP _ iはメッセージ空間から\beta _ i\in \mathbb{F _ {p ^ k}}を選ぶ。

  3. \mathbf{m _ i}:=Diag(\alpha _ i)とし、PoPK(Diag(\alpha _ i))を行う。各パーティP _ ie _ {\alpha _ i}\alpha _ iを所持した状態になる。(ここでだけeの添え字はDiag(\alpha _ i)とならない)

  4. e _ {\alpha _ i}Diag(\alpha _ i)を使い、PBracket(Diag(\alpha _ 1),\dots,Diag(\alpha _ n),e _ \alpha)を行う。プロトコル[ Diag(\alpha) ]を手に入れる。

トリプル

Multiplication Tripleを共有することを考えます。オンラインフェーズで一回の乗算ごとに2セットのトリプル

\langle \mathbf{a} \rangle,\langle \mathbf{b} \rangle,\langle \mathbf{c} \rangle\\
\langle \mathbf{f} \rangle,\langle \mathbf{g} \rangle,\langle \mathbf{h} \rangle

を消費します。消費するだけ生成しておく必要があります。\langle \mathbf{f} \rangle,\langle \mathbf{g} \rangle,\langle \mathbf{h} \rangleの必要性についてはオンラインフェーズで述べます。

トリプル\langle \mathbf{a} \rangle,\langle \mathbf{b} \rangle,\langle \mathbf{c } \rangle\mathbf{c}=\mathbf{ab}を満たし、\langle \mathbf{f} \rangle,\langle \mathbf{g} \rangle,\langle \mathbf{h} \rangleも同様に\mathbf{h}=\mathbf{fg}を満たします。

  1. \mathbf{m _ i}:=\mathbf{a _ i}とし、PoPK(\mathbf{a _ i})を行う。各パーティP _ ie _ {\mathbf{a _ i}}\mathbf{a _ i}を所持した状態になる。

  2. e _ {\mathbf{a _ i}}\mathbf{a _ i}を使い、PAngle(\mathbf{a} _ 1,\dots,\mathbf{a} _ n,e _ \mathbf{a})を行う。\langle \mathbf{a} \rangleを手に入れる。

  3. ここまでの処理を\mathbf{m _ i}:=\mathbf{b _ i}に対しても行う。(実際には\mathbf{a}と平行に行っている)

  4. e _ \mathbf{c } = e _ \mathbf{a} \boxtimes e _ \mathbf{b}を計算する。

  5. e _ \mathbf{c}を入力にReshare(e _ \mathbf{m},NewCiphertext)を呼び出す。

  6. e _ {\mathbf{c }}\mathbf{c _ i}を使い、PAngle(\mathbf{c} _ 1,\dots,\mathbf{c} _ n,e _ \mathbf{c})を行う。\langle \mathbf{c} \rangleを手に入れる。

5ReshareNewCiphertextとしているのはe _ \mathbf{c} 4の時点で1回乗算された暗号文となっているためです。 そのまま6PAngleを使うとe _ \mathbf{c}の乗算回数が2回になってしまいます。よって、e' _ {\mathbf{c}}に変換して乗算回数をリセットする必要があります。

ペア

ペアというのは以下の乱数の組です。オンラインフェーズで乱数として活用します。


\langle \mathbf{r} \rangle,[\mathbf{r}]
  1. \mathbf{m _ i}:=\mathbf{r _ i}とし、PoPK(r _i)を行う。各パーティP _ ie _ {\mathbf{r _ i}}\mathbf{r _ i}を所持した状態になる。

  2. e _ {\mathbf{r _ i}}\mathbf{r _ i}を使い、PAngle(\mathbf{r} _ 1,\dots,\mathbf{r} _ n,e _ \mathbf{r})を行う。プロトコル\langle \mathbf{r} \rangleを手に入れる。

  3. e _ {\mathbf{r _ i}}\mathbf{r _ i}を使い、PBracket(\mathbf{r} _ 1,\dots,\mathbf{r} _ n,e _ \mathbf{r})を行う。プロトコル[ \mathbf{r} ]を手に入れる。

このプロトコル2を飛ばすことで、後にオンラインフェーズで


[\mathbf{t}],[\mathbf{e}]

と呼ばれる乱数を生成することもできます。

まとめ

この記事ではSPDZのプリプロセスフェーズについて解説しました。平文を明かすことなくオンラインフェーズの計算の準備をすることができます。このプリプロセスフェーズを前提とすれば、効率的にオンラインフェーズを行うことができます。

オンラインフェーズについては別の記事で解説します。言ってることがおかしい部分などがありましたら、コメントお願いします。

参考文献

Ivan Damg˚ard, Valerio Pastro, Nigel Smart, and Sarah Zakarias Multiparty Computation from Somewhat Homomorphic Encryption 2012

C.Gentry Fully Homomorphic Encryption Using Ideal Lattices 2009

Zvika Brakerski1 and Vinod Vaikuntanathan ,Fully Homomorphic Encryption from Ring-LWE and Security for Key Dependent Messages

秘密分散ベースのMPCプロトコルSPDZ - Develop with pleasure!