【文献】
FURUKAWA, J. et al,High-Throughput Secure Three-Party Computation for Malicious Adversaries and an Honest Majority,2017年12月13日,pp.1-35,[online],[令和3年1月15日検索],インターネット<URL:https://eprint.iacr.org/2016/944>
(58)【調査した分野】(Int.Cl.,DB名)
メモリを有し、所定の関数のマルチパーティ計算が正しく実行されていることを確認するための回路確認プロセス(circuit validation process)を実行するプロセッサを含み、
前記回路確認プロセスは、
複数の確認済みの乗算三つ組(multiplication triple)を用意しておき、要求されると、少なくとも1つの乗算三つ組を第2の処理に供給する第1の処理と、
前記第1の処理で生成され、ランダムに選択された乗算三つ組を消費する前記第2の処理と、
を含み、
前記第1の処理では、前記生成された乗算三つ組のシャッフルを、1つの列内でのシャッフルと、列のシャッフルと、のうち少なくとも一つにて行い、
前記第1の処理において、各パーティの前記プロセッサは、
生成した複数の乗算三つ組のうち所定個の乗算三つ組について検証を行い、残りを複数のベクトルに分割し、
前記複数のベクトルの各々を等しいサイズの複数の部分配列に分割し、
各部分配列に含まれる前記乗算三つ組の順序を共同でランダムに並び替え、さらに、前記複数の部分配列の順序を共同で並び替え、
過半数のパーティの前記プロセッサにおいて、前記部分配列に含まれる最初の所定個の乗算三つ組を開き乗算が成り立つか検証する、ことを特徴とするマルチパーティ計算装置。
メモリを有し、所定の関数のマルチパーティ計算が正しく実行されていることを確認するための回路確認プロセス(circuit validation process)を実行するプロセッサを含み、
前記回路確認プロセスは、
複数の確認済みの乗算三つ組を用意し、要求されると、少なくとも1つの乗算三つ組(multiplication triple)を第2の処理に供給する第1の処理と、
前記第1の処理で生成され、ランダムに選択された乗算三つ組(multiplication triple)を消費する前記第2の処理と、
を含み、
前記第1の処理において、各パーティの前記プロセッサは、
複数個(N個)の乗算三つ組で第1及び第2のバッファを満たし、
前記第1及び第2のバッファを所定サイズの複数の部分配列に分割し、
前記第1のバッファからランダムに選択された前記部分配列の乗算三つ組に基づき、乗算の計算が正しく実行されたことの検証を行い、
前記第1のバッファの前記部分配列はランダムに選択され検証に用いられた後、前記第2のバッファから補充される、ことを特徴とするマルチパーティ計算装置。
前記第2の処理は、前記関数に相当する回路のゲートの三つ組(triple)が生成された後、前記第1のバッファに格納された前記乗算三つ組をランダムに選択する、ことを特徴とする請求項8又は9に記載のマルチパーティ計算装置。
【発明を実施するための形態】
【0016】
例示的な実施形態を図面を参照して説明する。以下、本発明の実施形態の基本について概説する。秘密計算(MPC)のプロトコルは、攻撃者に対する閾値の要件を持つ。例えば、パーティの数がnで、攻撃者によって汚染されたパーティの数をtとした場合、MPCプロトコルは、t < n = 3、または、t < n = 2を必要とする。nを、MPCプロトコルに参加するパーティの数とし、P(1)、..、P(n)を、これらn個のパーティそれぞれを表すとする。
【0017】
Rを、加算と乗算とが定義されている環(ring)とする。環は、2^nを法とする環(^は2のべき乗の演算子)または任意の有限体でもよい。3^(-1)が存在する任意の有限体と環では、すべてが成り立つ。
【0018】
SecretShare()を、Rの要素が与えられると、シェア(share)と呼ばれるx(1),...,x(n)を出力する(t、n)-秘密分散方式の関数とする。
【0019】
これらのシェアは、以下を満たす。
(i)n個のシェアのうち、任意のt個のシェアの組が入力されると、xを出力する関数Reconstruct()が存在し、
(ii)任意のt-1個のシェアの組からは、xの任意の部分を復元することが、計算上実行不可能である。
【0020】
i(= 1、...、n)の各々について、P(i)がx(i)を持つ場合、xは秘密分散(secretly shared)されていると言う。これを[x]と表す。すなわち、値xがP(1)〜P(n)などの複数のパーティ間において秘密分散されていることを示すために、[x]という表記を用いる。
【0021】
<(2,3)-秘密分散方式>
以下に(2,3)−秘密分散の例を説明する。要素v mod 2 ^ nを分散するため、ディーラーは、次の条件の下、3つのランダムな要素r(1)、r(2)、r(3)を選ぶ。
r(1)+ r(2)+ r(3) = 0
【0022】
P(1)のシェアは、x(1)=(r(1), t(1))になり(ただし、t(1)= r(3)-v)、
P(2)のシェアは、x(2)=(r(2), t(2))になり(ただし、t(2)= r(1)-v)、
P(3)のシェアは、x(3)=(r(3), t(3))になる(ただし、t(3)= r(2)-v)。
単一のパーティのシェアは秘密(secret)vについて何も明らかにしないことは明白である。
【0023】
関数Reconstruct()に関して、例えば、x(1)=(r(1), t(1))およびx(2)=(r(2), t(2))が与えられた場合、1つのパーティ(例えばP(1))は、v = r(1)-t(2)= r(1)-(r(1)-v)を計算することができる。
【0024】
同様に、P(2)は、x(2)とx(3)の組からvを計算できる(すなわち、v = r(2)-(r(2)-v)。そしてP(3)は、x(3)およびx(1)の組からvを計算できる(すなわち、v = r(3)-(r(3)-v)。上記秘密分散方式に従って値vの3つのうち2つの分散を[v]で表記する 。なお、秘密vは、1つのビットでもよく、r(1)、r(2)、r(3)は、
の条件の下、
となる3つのランダムビットになり、ここで、円に「+」はビット毎の排他的論理和を示す。この場合、
(非特許文献4を参照)。
【0025】
vを復元するのに必要なデータのすべてが、パーティのシェアとして分散されており、すべてのデータがこれらのパーティのいずれかに収集され、各パーティが、Reconstruct()を用いてvを復元できる場合、パーティの組が[v]を開く(open)と言い、サブプロシージャ:「open([v])」は以下のように定義できる。
秘密値vのシェアが{(r(1), t(i))}(i = 1、...、3)で表記される場合、各パーティP(i)は、t(i)をP(i + 1)に送信し、P(4)はP(1)に送信し、各P(i)は、v = r(i)-t(i-1)(すなわち、
)を出力する(ただし、t(0)はt(3))。
【0026】
[x]と[y]が与えられるとき、n個のパーティP(1),...,P(n)は、MPCによって、互い通信せずに、セミオネストな秘匿性(semi-honest secrecy)で、[z] = [x + y] を計算可能とされる。この手順は、[z] = [x] + [y]で表される。
【0027】
以下、MPCの加算の例を説明する。xとyが(2,3)-秘密分散方式によって秘密分散されているとする。より具体的には、
P(1)のxのシェアは、(x(11), x(12))であり(ただし、x(12)=x(31)-x)、
P(2)のxのシェアは、(x(21), x(22))であり(ただし、x(22)=x(11)-x)、
P(3)のxのシェアは、(x(31), x(32))である(ただし、x(
32)=x(21)-x)。
【0028】
P(1)のyのシェアは、(y(11), y(12))であり(ただし、y(12)=y(31)-y)、
P(2)のyのシェアは、(y(21), y(22))であり(ただし、y(22)=y(11)-y)、
P(3)のyのシェアは、(y(31), y(32))である(ただし、y(32)=x(21)-y)。
【0029】
すると、
P(1)のx + yのシェアは、(x(11)+y(11), x(12)+y(12))、
P(2)のx + yのシェアは、(x(21)+y(21), x(22)+y(22))、
P(3)のx + yのシェアは、(x(31)+y(31), x(32)+y(32))
となる。
【0030】
x + yは、(x(11)+y(11), x(12)+y(12))と、(x(21)+y(21), x(22)+y(22))の組から以下のとおり復元できる。
x+y = x(11)+y(11) - (x(22)+y(22))
= x(11)+y(11) - ( x(11)-x + y(11)-y)
【0031】
[x]とyが与えられ、yが各パーティに知られているとき、n個のパーティP(1)、...、P(n)は、MPCによって、互い通信せずにセミオネストな秘匿性で、[z]=[x+y]を計算可能とされる。この手順は、[z]=[x]+y または[z]=y+[x]で表される。
【0032】
以下、MPC加算の例を説明する。xが上記(2,3)-秘密分散方式によって秘密に分散され、yが各パーティに知られているとする。より具体的には、
P(1)のxのシェアは、(x(11), x(12))であり(ただし、x(12)=x(31)-x)、
P(2)のxのシェアは、(x(21), x(22))であり(ただし、x(22)=x(11)-x)、
P(3)のxのシェアは、(x(31), x(32))である(ただし、x(
32)=x(21)-x)。
【0033】
すると、
P(1)のx + yのシェアは、(x(11), x(12)-y)、
P(2)のx + yのシェアは、(x(21), x(22)-y)、
P(3)のx + yのシェアは、(x(31), x(32)-y)となる。
x + yは、(x(11), x(12)-y)、及び(x(21),x(22)-y)の組から以下のとおり復元できる。
x+y = x(11) - (x(22) - y) = x(11) - ((x(11) - x) - y)
【0034】
[x]とyが与えられ、yが各パーティに知られているとき、P(1)、...、P(n)は、MPCによって、互い通信せずに、セミオネストな秘匿性で、[z]=[xy] を計算可能とされる。この手順は、[z]=[x]y または[z]=y[x]で表される。
【0035】
以下、このMPCの乗算の例を説明する。
xが上記(2,3)-秘密分散方式によって秘密に分散され、yが各パーティに知られているとする。より具体的には、
P(1)のxのシェアは(x(11), x(12))であり(x(12)=x(31)/x)、
P(2)のxのシェアは(x(21), x(22))であり(x(22)=x(11)/x)、
P(3)のxのシェアは(x(31), x(32))である(x(
32)=x(21)/x)。
【0036】
すると、
P(1)のxyのシェアは、(x(11)y, x(12))、
P(2)のxyのシェアは、(x(21)y, x(22))、
P(3)のxyのシェアは、(x(31)y, x(32))である。
xyは、(x(11)y, x(12))、及び(x(21)y, x(22))の組から以下のとおり復元できる。
xy = (x(11)y)/x(22) = (x(11)y)/(x(11)/x)
【0037】
[x]と[y]が与えられるとき、P(1)、...、P(n)それぞれは、MPCを用い、若干の通信により、semi-honestな秘匿性で、[z] = [xy]を計算可能とされる。この手順は、[z]=[x]*[y]で表される。
【0038】
以下、MPCの乗算の例を説明する。xとyが上記(2,3)-秘密分散方式によって秘密分散されているとする。
より具体的には、
P(1)のxのシェアは、(x(11), x(12))であり、
P(2)のxのシェアは、(x(21), x(22))であり、
P(3)のxのシェアは、(x(31), x(32))であり、
P(1)のyのシェアは、(y(11), y(12))であり、
P(2)のyのシェアは、(y(21), y(22))であり、
P(3)のyのシェアは、(y(31), y(32))である。
【0039】
ランダムに選択され、r(1)+ r(2)+ r(3)= 0を満たす、r(1)、r(2)、r(3)の組が存在するとする。また、P(1)がr(1)を持ち、P(2)がr(2)を持ち、P(3)はr(3)を持つものとする。
P(1)は、t(1) = (-x(11)y(11) + x(12)y(12) + r(1))/3 を計算し、t(1)をP(2)に送信する。
P(2)は、t(2) = (-x(21)y(21) + x(22)y(22) + r(2))/3 を計算し、t(2)をP(3)に送信する。
P(3)は、t(3) = (-x(31)y(31) + x(32)y(32) + r(3))/3 を計算し、t(3)をP(1)に送信する。
【0040】
P(1)のxyのシェアは、(z1 = t(3)-t(1), c1=-2t(3)-t(1))であり、
P(2)のxyのシェアは、(z2 = t(1)-t(2), c2=-2t(1)-t(2))であり、
P(3)のxyのシェアは、(z3 = t(2)-t(3), c3=-2t(2)-t(3))である。
【0041】
x(12)y(12) = (x(31) - x)(y(31) - y) = x(31)y(31) - x(31)y - y(31)x + xy
x(22)y(22) = (x(11) - x)(y(11) - y) = x(11)y(11) - x(11)y - y(11)x + xy
x(32)y(32) = (x(21) - x)(y(21) - y) = x(21)y(21) - x(21)y - y(21)x + xy
従って、
3(t(1)+t(2)+t(3)) = -x(11)y(11) + x(12)y(12) + r(1)
- x(21)y(21) + x(22)y(22) + r(2)
-x(31)y(31) + x(32)y(32) + r(3)
= x(12)y(12)+x(22)y(22)+x(32)y(32)-x(11)y(11)-x(21)y(21)-x(31)y(31)
= 3xy-x(y(11)+y(21)+y(31))-y(x(11)+x(21)+x(31))
= 3xy
【0042】
n個のパーティP(1)からP(n)が、それぞれ、Rのランダムな要素を、互いに通信せず他の誰にも開示せずに、必要なだけシェア(共有)できるものとする。
【0043】
以下、3つのパーティ間で共有されるランダム要素の例を説明する。複数の乱数種(random seeds)S(1)、S(2)、及びS(3)が既に以下のように共有されているものとする。
P(1)は、S(3)とS(1)とを持ち、
P(2)は、S(1)とS(2)とを持ち、
P(3)は、S(2)とS(3)とを持つ。
【0044】
HashR()をRの要素を出力する暗号学的ハッシュ関数とする。
P(1)は、i番目のランダム要素r(1i)のシェアを、HashR(S(3),i)-HashR(S(1),i)として生成する。
P(2)は、i番目のランダム要素r(2i)のシェアを、HashR(S(1),i)-HashR(S(2),i)として生成する。
P(3)は、i番目のランダム要素r(3i)のシェアを、HashR(S(2),i)-HashR(S(3),i)として生成する。
【0045】
図2は、本発明の実施形態による動作を例示するフローチャートである。
図2は、例示的な実施形態による(2,3)秘密分散方式に基づいて秘密を分散する各パーティによって実行される回路検証(circuit validation)の動作を示す。
【0046】
図2を参照すると、各パーティによるステップS1(第1のプロセス)は、複数の検証された乗算三つ組(multiplication triple:乗算トリプル)を用意し、要求されると少なくとも1つの乗算三つ組をステップS2に供給する。
【0047】
各パーティによるステップS2(第2のプロセス)において、ステップS1で生成され、ランダムに選択された乗算三つ組を消費する。
【0048】
各パーティによるステップS1(第1のプロセス)において、生成された乗算三つ組のシャッフルを行い、1つの列の三つ組(triple)が三つ組単位でシャッフルされる列におけるシャッフル(並べ替え)か、列が列単位でシャッフルされる列のシャッフルかの少なくとも1つのシャッフルが行われる。
【0049】
あるいは、各パーティによるステップS1(第1のプロセス)は、要求されると全体の中からランダムに選択された乗算三つ組を提供する第1のバッファを使用または含んでもよく、第1のバッファは第2のバッファから、順次、補充される。
【0050】
図3は、1つの実施形態による1つのパーティの構成の一例を示す図である。パーティ(nパーティ、n=3)は同じ構成を有するので、1つのパーティの構成が
図3に示されている。
図3を参照すると、パーティ100は、
図3に不図示のメモリを有するプロセッサと通信インタフェースを含み、乗算三つ組生成プロセス102、回路計算プロセス104、および回路検証(circuit validation)プロセス106を実行する。
【0051】
乗算三つ組生成プロセス102は、検証されたN個の乗算三つ組を生成する。
【0052】
ゲートの入力配線(input wire)へのシェアを与えられたパーティの回路計算プロセス104は、ゲートの入力配線についての関数fを計算する。ゲートの出力配線(output wire)における結果は、パーティのシェアとして定義されてもよい。
【0053】
回路検証プロセス106は、秘密計算が正しく実行されたことを検証する。
【0054】
例示的な実施形態について、図面を参照してより詳細に説明する。
【0055】
<三つ組の検証(Triple Verification)>
以下、乗算三つ組の検証について説明する。この検証方法に関して、例えば非特許文献5が参照できる。
【0056】
B組(タプル)の乗算三つ組、([a(1)]、[b(1)]、[c(1)])、...、([a(B)]、[b(B)]、[c(B)])が与えられる。ただし、[a(i)]、[b(i)]、[c(i)](i = 1、...、B)は、a(i)、b(i)、c(i)(i = 1、...、B)が、それぞれ、パーティ間で秘密分散されていることを表す。各i番目の乗算三つ組について、a(i)* b(i)= c(i)が成り立たないとすると、ある程度高い確率で検出される。もし、([a(i)]、[b(i)]、[c(i)])が、[a(i)] * [b(i)] = [c(i)]の関係を満たさないとすると、以下のテストでは、より高い確率で検出できる。
【0057】
このテストの後、a(1)、b(1)、c(1)は、他のシェア、([a(2)]、[b(2)]、[c(2)])、...、([a(B)]、[b(B)]、[c(B)])が開かれない限り、秘密に分散され続ける。
【0058】
i = 2、...、Bについて、各パーティは、[a(i)+ a(1)]及び[b(i)+ b(1)]を、ローカルに計算し、それぞれr(i)およびs(i)として開く。ここで「開く」とは、過半数のパーティの各組がそれらを開くことを意味する。
【0059】
そして、各パーティは、r(i)及びs(i)(i = 2、...、B)について学習したことに基づき、それぞれのシェア
[c'(i)] = r(i)*s(i) - r(i)*[b(i)] - s(i)*[a(i)] + [c(i)]
=([a(i)+a(1)])*([b(i)+b(1)])-([a(i)+a(1)])*[b(i)]-([b(i)+b(1)])*[a(i)]+[c(i)]
=[a(1)]*[b(1)] - [a(i)]*[b(i)] + [c(i)]
を計算し、以下を開いてチェックする。
[c'(i)-c(i)]=[c'(i)]-[c(i)]
【0060】
この等式は、a(i)b(i)= c(i)がすべてのiに対して成り立つか、iに対して成り立たない場合(either for all i or for no i)に成り立つ。したがって、このテストに合格する確率は、やや高い確率の積に近くなる。
【0061】
以下、本実施形態によるプロトコルを説明する。まず最初に、乗算三つ組の秘密生成について、
図4を参照して説明する。
【0062】
<三つ組の生成(Generating Triples)>
パーティの乗算三つ組生成プロセス102によるN個の乗算三つ組の生成動作を、
図4を参照して説明する。
【0063】
<ステップS101>
生成される三つ組の個数Nが入力される。N =(X-C)* Lとなる補助パラメータB、C、X、及びLが入力される。
ただし、Xは、各部分配列のサイズ、
Cは、各部分配列で開かれた三つ組の数、
Bは、バケットの数、
Lは、1つのバケット内の部分配列の数である。
【0064】
<M個のランダム値のシェアリング生成(Generating sharing of M random values)(ステップS102)>
各パーティの乗算三つ組生成プロセス102は、2M個のランダム値のシェアリングを生する。
2M = 2(N + C*L)*(B -1) + 2N= 2(N + C*L)*Bは、パーティが受け取るシェア[([a(i)]、[b(i)])](i = 1、...、M)によって示される。各パーティは、どのパーティも知らないランダムな秘密値vのシェアリングを生成できる。
【0065】
<乗算三つ組の生成 (ステップS103)>
各パーティの乗算三つ組生成プロセス102は、セミオネストな乗算プロトコルを実行し、[c(i)] = [a(i)]*[b(i)]を計算する。D = [([ai]; [bi]; [ci])] (i=1,..., M = (N + C*L)*B)となり、[c(i)]は上記プロトコルの結果であり、必ずしも正しいとは限らない。
【0066】
<カット及びバケット(Cut and bucket)(ステップS104)>
各パーティの乗算三つ組生成プロセス102は、いくつかの三つ組(C個の三つ組)を開き、三つ組が正しく生成されているか、最初の検証を行い、残りを複数のバケット(buckets)へランダムに分割する。
【0067】
(a)各パーティの乗算三つ組生成プロセス102は、(N + C*L)*(B - 1) + N個の三つ組を有するDを、D'(1)、...、D'(B)のベクトルに分割し、
図5に示すように、D'(1)がN個の三つ組を含み、各D'(j)(j = 2、...、B)が(N + C * L)個の三つ組を含むようにする。ここで、各パーティは、他のパーティも同じことを行うという前提で、Dの自身のシェアのみを分割する。
【0068】
(b)k = 2〜Bについて、各パーティの乗算三つ組生成プロセス102は、D'(k)を、等しいサイズXのL個の部分配列に分割する(L *(X-C)= N)。
図6に示すように、等しいサイズXのL個の部分配列は、D''(k、1)、...、D ''(k、L)となる。ここでも各パーティは、自身のシェアのみを分割する。
図6では、D''(k、1)、...、D''(k、L)(k=1,...,B)それぞれにおけるC個の三つ組が、開かれるべき三つ組となる。
【0069】
(c)k = 2、...、B、及びj = 1、...、Lについて、各パーティの乗算三つ組生成プロセス102は、D ''(k、j)に含まれる三つ組の順序を共同でランダムに並べ替える。ここで、各パーティは、それぞれのシェアのみをランダムに並べ替える。ただし、すべてのパーティが同意するランダム性を使用することにより、すべての順列が同じになるように調整される。
【0070】
(d)k = 2、...、Bについて、各パーティの乗算三つ組生成プロセス102は、D ''(k、1)、...、D ''(k、L)間のL個の部分配列の順序を共同で並べ替える。
【0071】
(e)k = 2、...、B、及びj = 1、...、Lについて、 過半数のパーティそれぞれの乗算三つ組生成プロセス102は、
図6に示すように、D''(k, j)に含まれる最初のC個の三つ組を開き、a(i)b(i)=c(i)が成り立つか否か検証する(インデックスiは、選択した三つ組のインデックス)。
【0072】
上記のように、各過半数のパーティのうち少なくとも1つのパーティは、a(i)、b(i)、c(i)を復元し、当該パーティは次の方程式を検証できる。a(i)b(i)= c(i)
【0073】
いずれの過半数のパーティの組もこれを拒否しない場合、すべてのパーティはD''(k、j)からこれらを削除する。
【0074】
過半数のパーティの組のいずれかが、検証を拒否した場合、他のパーティに「停止(Abort)」を送信し、プロトコルとして「停止」を出力する。
【0075】
(f)残りの三つ組は、
図7に示すように、それぞれBのサイズの(B個の三つ組を含む)N組の三つ組 E '(1)、...、E'(N)に分割される。
【0076】
<バケットのチェック(Check buckets)(ステップS105)>
ベクトルdの長さをNとする。i= 1、...、Nについて、E '(i)では、B個の三つ組のうち、最初の三つ組 ([a(1)], [b(1)], [c(1)])は、残りのB -1個の三つ組 ([a(j)], [b(j)], [c(j)]) (j=2,...,B)を用いて、上記の三つ組検証方法にて検証される。
図7に示すように、パーティは、長さNのベクトルdのi番目のエントリd(i)に([a(1)], [b(1)], [c(1)])を設定する。
【0077】
<ステップS106>
現時点で、各パーティにおいて、N個の乗算三つ組がベクトルdに用意されている。パーティは、N個の乗算三つ組を出力する。
【0078】
追加のN個の三つ組が必要な場合には、常に、上記のプロトコルを実行して取得できる(ステップS101〜S106)。
【0079】
<回路計算(Circuit Computation)>
図8を参照して、各パーティの回路計算プロセス104の動作を説明する。
【0080】
回路および回路への入力のシェアが入力される(ステップS201)。回路にはゲートと配線が含まれる。各ゲートは、乗算または加算ゲートのいずれかになる。各乗算ゲートと加算ゲートとは、2本の入力配線と1本の出力配線を有する。
【0081】
図9に示すように、入力配線のぞれぞれは、回路への入力またはゲートの出力のいずれかとなることができる。出力配線のそれぞれは、回路の出力、他のゲートへの入力、またはその両方になることができる。入力配線と出力配線はそれぞれ、1つの秘密シェアに関連付けられている。したがって、各ゲートは、秘密のシェア入力(例えば[x]、[y]、...)が与えられると、秘密のシェア出力(例えば [z]、..)を生成する。
【0082】
回路における計算段階の開始時、秘密シェアの組である入力が回路へ与えられ、各値はゲートへの入力となる(ステップS202)。
【0083】
両方の入力配線の秘密シェアが既に生成されている各ゲートにおいて、その出力配線の秘密値は、セミオネストな秘密計算(セミオネストな攻撃者に対する安全なマルチパーティ計算)によって生成することができる(ステップS203)。
【0084】
秘密シェアがその入力配線のために用意されたすべてのゲートに対してステップS203の手順を繰り返すことにより(ステップS204)、回路のすべての出力の秘密値が生成できる(ステップS205)。
【0085】
<回路検証(Circuit Validation)>
各パーティの回路検証(circuit validation)プロセス106の動作を、
図10を参照して説明する。
【0086】
各パーティの回路検証プロセス106は、それぞれN個の三つ組の、2つのバッファベクトルV及びV'を用意する。回路検証プロセス106は、乗算三つ組生成プロセス102によって生成されたN個の三つ組で2つのバッファベクトルV及びV'を満たす(N=(X-C)*L)(ステップS301)。
【0087】
各パーティの回路検証プロセス106は、バッファベクトルV及びV'を満たすのに十分な数の三つ組を生成するのに必要な回数だけ乗算三つ組生成プロセス102を実行する。
【0088】
図11に示すように、各パーティの回路検証プロセス106は、バッファベクトルV及びV'を、それぞれのサイズがX'=X-CであるL個の部分配列V(1)、...、V(L)、及びV'(1)、...、V'(L)にそれぞれ分割する(ステップS302)。
【0089】
回路計算プロセス104による回路計算の結果は、それぞれが秘密分散入力(secrete shared inputs)および秘密分散出力(secrete shared outputs)を含む一連のゲートとして見ることができる。
【0090】
加算ゲートの場合、非対話型プロトコルであるため、ゲートが他のパーティのデータを操作できるという意味で、いずれのパーティも他のパーティに対して効果的に悪意を持つことはできない。
【0091】
乗算ゲートの場合、パーティは効果的に悪意のある動作をすることができる。したがって、一連の乗算ゲートの妥当性のみを検証すれば十分である。ここで、一連の乗算ゲートをQと称する。
【0092】
一連の乗算ゲートの数をM'とし、L'に対して、M'=X'L'+K(ただし、X'=X-C、及び、K < X')。
【0093】
図11に示すように、Qを、順次Q(1)、...、Q(L')、及びQ(L' + 1)に分割し、Q(1)、...、Q(L')はサイズX'であり、Q(L'+1)はサイズKである(ステップS303)。
【0094】
i=1〜L'+1について(ステップS304)、以下のステップS305乃至S308を実行する。
【0095】
<ステップS305>
各パーティの回路検証プロセス106は、バッファベクトルV'から1つの部分配列をランダムに選ぶ。この部分配列をランダムにシャッフルしてもよい。これを部分配列S(i)と称する。
【0096】
<ステップS306〜S307>
j=1〜X'の場合、各パーティの回路検証プロセス106は、S(i)のj番目の組(乗算三つ組)を用いて、Q(i)のj番目の組(回路内のゲートのj番目の三つ組)を検証する。i = L'+ 1の場合、jはX'ではなくKまでである。例えば、([x], [y])がj番目の三つ組への入力配線のシェアであり、[z]がj番目のfQ(i)の出力配線のシェアであるとすると、パーティは、([x], [y], [z])及び([a(j)], [b(j)], [c(j)])に対して三つ組の検証を行い、([x], [y], [z])を検証する。すなわち、関連するゲートの計算が正しく実行されたことを検証する。いずれかのパーティがすべての処理を受け入れない場合、当該パーティは「停止(Abort)」を他のパーティに送信する。
【0097】
<ステップS308>
各パーティの回路検証プロセス106は、V'のS(i)をV(i)に置き換え、VのV(i)を削除する。
【0098】
<ステップS309〜S310>
上記の処理が完了すると、j=L'+2〜M’の全てについて、各パーティの回路検証プロセス106は、V(j)をV(j-L'+1)にリネーム(rename)する。ここで、M'は、V(M' + 1)が空になる。
【0099】
なお、上記の改名ステップ(S309〜S310)では、V(j)が補充されない限り、一部のjに対してV(j)は空になる。
【0100】
上記の処理により、バッファベクトルV内のすべての部分配列(subarray)が削除される。そして、これは、乗算三つ組生成プロセス102により補充できる。バッファベクトルV内の三つ組は、予め設定された大きいサイズのチャンクによってのみ消費され補充される。
【0101】
M/2個の三つ組が、LK+M個の三つ組から選択され、上記のように検証されたものとする。GとTを適切な値として、この検証で正しく生成されていない三つ組を検出しない確率は、1/T個を超える三つ組が正しく生成されない場合、G未満になる。
【0102】
上記の実施形態において、1つの三つ組を検証するためにB-1個の三つ組を用いるため、乗算三つ組生成プロセス102の出力が、(1/T)^B個を超える数の正しく生成されていない三つ組を含む確率はGになる(^はべき乗演算子)。
【0103】
選択されたGが非常に小さい確率なため、システムのユーザはTを増大させることでこれを無視できるとする(これは常に可能である)。ユーザは、正しく生成されていない三つ組の予想数を(このような悪意のある三つ組の生成が検出されない場合)、Bを増大させることによって減らすことができる。
【0104】
バッファベクトルV'に格納されている三つ組は、回路内のゲートの三つ組が生成された後にランダムに選択されるため、悪意のあるパーティは、バッファベクトルV'の三つ組の非常に小さな部分が正しく生成されない場合でも、検出される危険を冒さずに上記ゲートの計算を偽ることはできない。
【0105】
バッファベクトルV'は、その要素(V'(i):ランダムに選ばれシャッフルされる)が検証に用いられた後、常にバッファベクトルVから補充されるため、三つ組が選択される集合のサイズは、同じで十分な大きさのままである。これにより、悪意のあるゲート計算を検出する能力は高く保たれる。さらに、この処理では、消費された三つ組が即座に補充されるため、バッファベクトルV'における消費された三つ組の位置を記憶するためのメモリは必要ない。
【0106】
バッファベクトルV内の乗算三つ組は、予め設定された(大きい)サイズのチャンクによってのみ消費され補充される。消費される三つ組は、バッファベクトルV内でランダムに分散される訳ではなく、最後に消費された三つ組の位置を使用して順番に消費されるため、バッファ管理が簡単になる。
【0107】
シャッフル操作は2つの方法で実行される。その内の1つは、短い列における細かいシャッフルである。列を十分に短くすることにより、キャッシュメモリに置き、高速操作を達成することができる。
【0108】
他の1つの方法は、シャッフルされる単位が上記の列である長い列の粗いシャッフルである。データのみが特定のサイズのチャンク内で移動するため、各三つ組に対する操作コストは小さくなる。
【0109】
上記の2つのシャッフルの組み合わせは、全体として完全なシャッフルにはならないが、本発明の実施形態が関与する秘匿性には十分である。したがって、高速操作で十分に高い秘匿性が得られる。
【0110】
本発明の実施形態により、各パーティは、他のパーティの入力を知ることなく、分散した方法で入力の任意の関数を計算することが可能になる。
【0111】
あるパーティがプロトコルに従わない場合、他のパーティはこれを検知できる。このような計算方法は、マシンのマルウェア又はマシンの操作者がデータを盗もうとする可能性がある、機密データが処理されるサービスに適用できる。
【0112】
上記のパーティは、例えば
図12に示されるようなコンピュータシステム上で実現されてもよい。
図12を参照すると、コンピュータ装置110は、プロセッサ(Central Processing Unit)112と、例えば半導体メモリ(例えばRAM(Random Access Memory)、ROM(Read Only Memory)、EEPROM(Electrically Erasable Programmable ROM))、及び/又はHDD(Hard Disk Drive)、CD(Compact Disc)、DVD(Digital Versatile Disc)のうち少なくとも1つを含む記憶装置などを含むメモリ114と、表示装置116(ディスプレイ)と、通信インタフェース118とを含む。通信インタフェース118(ネットワークインタフェースコントローラ(Network Interface Controller;NIC)など)は、他のパーティと通信するように構成されてもよい。
図2のパーティの処理を実行するプログラムは、メモリ114に記憶されており、プロセッサ112が、メモリからプログラムを読み取り、プログラムを実行して秘密計算を行うパーティを実現する。
【0113】
なお、上記非特許文献1乃至5の各開示を、本書に引用をもって繰り込むものとする。本発明の全開示(請求の範囲を含む)の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせ乃至選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。