(57)【要約】  本発明は、処理量を少なく保ったまま、悪意のある振る舞いに対して秘密を守る秘密計算装置に関するものである。本秘密計算装置は、２つの秘密分散したランダム数と、２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成部と、セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成部と、第２乗算トリプレット列に対応する数の乗算トリプレットを第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証部と、を備える。
2018061391.tif 000002
【特許請求の範囲】
【請求項１】
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成手段と、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成手段と、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証手段と、
を備える秘密計算装置。
【請求項２】
前記第１乗算トリプレット列からランダムに選択された所定数の乗算トリプレットから不正を検証する乗算トリプレット検証手段を、さらに備え、
前記乗算正当性検証手段は、前記乗算トリプレット検証手段により不正が発見されなかった場合に、秘密乗算の正当性を検証する、請求項１に記載の秘密計算装置。
【請求項３】
前記乗算トリプレット検証手段は、前記第１乗算トリプレット列からランダムに第１数の乗算トリプレットをサンプリングして、前記サンプリングされた乗算トリプレットに基づいて不正を検証する第１トリプレット検証手段を有する、請求項２に記載の秘密計算装置。
【請求項４】
前記第１数は、前記第１トリプレット検証手段が不正を検証する精度に対応して設定される、請求項３に記載の秘密計算装置。
【請求項５】
前記乗算トリプレット検証手段は、前記第１トリプレット検証手段により不正が発見されなかった場合に、サンプリングされなかった乗算トリプレットにより少なくとも２列を有するランダムな行列を生成し、前記乗算トリプレットによるランダムな行列に基づいて不正を検証する第２トリプレット検証手段を有する、請求項３または４に記載の秘密計算装置。
【請求項６】
前記行列の列数は、前記第２トリプレット検証手段が不正を検証する精度に対応して設定される、請求項５に記載の秘密計算装置。
【請求項７】
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成ステップと、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成ステップと、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証ステップと、
を含む秘密計算方法。
【請求項８】
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成ステップと、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成ステップと、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証ステップと、
をコンピュータに実行させる秘密計算プログラム。
【請求項９】
複数の秘密計算装置が互いに通信接続されて、前記複数の秘密計算装置に秘密分散された数を協働して秘密計算する秘密計算システムであって、
前記複数の秘密計算装置の少なくとも１つの秘密計算装置が、
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成手段と、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成手段と、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証手段と、
を備える秘密計算システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、秘密計算システム、秘密計算装置、秘密計算方法および秘密計算プログラムに関する。
【背景技術】
【０００２】
上記技術分野において、非特許文献１および非特許文献２には、参加者の悪意ある振る舞いを考慮せずに、秘密分散された値やビットを秘密加算および秘密乗算する技術が開示されている。非特許文献３には、参加者の悪意ある振る舞いを考慮した秘密計算の検証技術が開示されている
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Tal Rabin, Michael Ben-Or: Verifiable Secret Sharing and Multiparty Protocols with Honest Majority (Extended Abstract). STOC 1989: 73-85
【非特許文献２】Oded Goldreich, Ronen Vainish: How to Solve any Protocol Problem - An Efficiency Improvement. CRYPTO 1987: 73-86
【非特許文献３】Yehuda Lindelly, Ben Rivay: Cut-and-Choose Based Two-Party Computation in the Online/Oine and Batch Settings, CRYPTO 2014: 73-86
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、上記非特許文献３に記載の技術では、秘密計算の検証精度を上げるには処理量が大きくなってしまう。したがって、処理量を少なく保ったまま、参加者の悪意のある振る舞いに対して秘密を守ることができなかった。【０００５】
本発明の目的は、上述の課題を解決する技術を提供することにある。
【課題を解決するための手段】
【０００６】
上記目的を達成するため、本発明に係る秘密計算装置は、
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成手段と、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成手段と、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証手段と、
を備える。【０００７】
上記目的を達成するため、本発明に係る秘密計算方法は、
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成ステップと、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成ステップと、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証ステップと、
を含む。【０００８】
上記目的を達成するため、本発明に係る秘密計算プログラムは、
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成ステップと、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成ステップと、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証ステップと、
をコンピュータに実行させる。【０００９】
上記目的を達成するため、本発明に係る秘密計算システムは、
複数の秘密計算装置が互いに通信接続されて、前記複数の秘密計算装置に秘密分散された数を協働して秘密計算する秘密計算システムであって、
前記複数の秘密計算装置の少なくとも１つの秘密計算装置が、
２つの秘密分散したランダム数と、該２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列を生成する第１乗算トリプレット列生成手段と、
セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、該２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列を生成する第２乗算トリプレット列生成手段と、
前記第２乗算トリプレット列に対応する数の乗算トリプレットを前記第１乗算トリプレット列からランダムに選択して乗算トリプレットの組を生成して秘密乗算の正当性を検証する乗算正当性検証手段と、
を備える。
【発明の効果】
【００１０】
本発明によれば、秘密計算において、処理量を少なく保ったまま、参加者の悪意のある振る舞いに対して秘密を守ることができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の第１実施形態に係る秘密計算装置の構成を示すブロック図である。
【図２】本発明の第２実施形態に係る秘密計算装置の機能構成を示すブロック図である。
【図３】本発明の第２実施形態に係る秘密計算装置を含む秘密計算システムの構成を示すブロック図である。
【図４】本発明の第２実施形態に係る乗算トリプレット列生成部の機能構成を示すブロック図である。
【図５】本発明の第２実施形態に係るサンプリング検証部の機能構成を示すブロック図である。
【図６】本発明の第２実施形態に係るバケット検証部の機能構成を示すブロック図である。
【図７】本発明の第２実施形態に係るセミオネスト計算部の機能構成を示すブロック図である。
【図８】本発明の第２実施形態に係る乗算正当性検証部の機能構成を示すブロック図である。
【図９】本発明の第２実施形態に係る秘密計算終了処理部の機能構成を示すブロック図である。
【図１０Ａ】本発明の第２実施形態に係る秘密計算装置のハードウェア構成を示すブロック図である。
【図１０Ｂ】本発明の第２実施形態に係る秘密乗算検証用パラメータの内容を示す図である。
【図１１】本発明の第２実施形態に係る秘密計算装置の処理手順を示すフローチャートである。
【図１２】本発明の第２実施形態に係るセミオネスト計算処理および乗算正当性検証処理の手順を示すフローチャートである。
【図１３】本発明の第３実施形態に係る秘密計算装置の機能構成を示すブロック図である。
【図１４】本発明の第４実施形態に係る秘密計算装置の機能構成を示すブロック図である。
【発明を実施するための形態】
【００１２】
以下に、図面を参照して、本発明の実施の形態について例示的に詳しく説明する。ただし、以下の実施の形態に記載されている構成要素は単なる例示であり、本発明の技術範囲をそれらのみに限定する趣旨のものではない。なお、本明細書において、「秘密計算」とは、複数の秘密計算装置が互いに通信を介しながら計算することで与えられた関数の出力を計算する場合に、これらのいずれの秘密計算装置も十分な数の多装置間で互いに扱うデータを共有しない限り、関数への入力や出力に関する情報を得ることができない計算方法である。また、「秘密加算」は「秘密計算」中の加算を、「秘密乗算」は「秘密計算」中の乗算を示す。
【００１３】
［第１実施形態］
本発明の第１実施形態としての秘密計算装置１００について、図１を用いて説明する。秘密計算装置１００は、秘密分散された値やビットを秘密加算および秘密乗算する装置である。
【００１４】
図１に示すように、秘密計算装置１００は、第１乗算トリプレット列生成部１０１と、第２乗算トリプレット列生成部１０２と、乗算正当性検証部１０３と、を含む。第１乗算トリプレット列生成部１０１は、２つの秘密分散したランダム数と、２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる第１乗算トリプレット列１１１を生成する。第２乗算トリプレット列生成部１０２は、セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、２つの秘密分散した入力数を秘密乗算した乗算結果の分散値と、の組からなる第２乗算トリプレット列１２１を生成する。乗算正当性検証部１０３は、第２乗算トリプレット列１２１に対応する数の乗算トリプレット列を第１乗算トリプレットからランダムに選択して乗算トリプレットの組１３１を生成して秘密乗算の正当性を検証する。
【００１５】
本実施形態によれば、セミオネスト安全な秘密乗算を行なった結果を用いて秘密乗算の正当性を検証するので、秘密計算において、処理量を少なく保ったまま、参加者の悪意のある振る舞いに対して秘密を守ることができる。
【００１６】
［第２実施形態］
次に、本発明の第２実施形態に係る秘密計算装置について説明する。本実施形態においては、第１乗算トリプレット列からランダムに選択された所定数の乗算トリプレットから不正を検証する乗算トリプレット検証部を有し、乗算トリプレット検証部により不正が発見されなかった場合に、秘密乗算の正当性を検証する。この乗算トリプレット検証部は、第１乗算トリプレット列からランダムに第１数の乗算トリプレットをサンプリングして、サンプリングされた乗算トリプレットに基づいて不正を検証するサンプリング検証部を有する。ここで、第１数は、サンプリング検証部が不正を検証する精度に対応して設定される。また、乗算トリプレット検証部は、サンプリング検証部により不正が発見されなかった場合に、サンプリングされなかった乗算トリプレットにより少なくとも２列を有するランダムな行列を生成し、乗算トリプレットによるランダムな行列に基づいて不正を検証するバケット検証部を有する。ここで、行列の列数は、バケット検証部が不正を検証する精度に対応して設定される。
【００１７】
《前提技術の説明》
以下、本実施形態を理解するための前提技術について説明する。まず、非特許文献１〜３の開示技術を説明する。
【００１８】
[非特許文献１]
非特許文献１の方法では、ある体上の値である秘密Sを、この体上の多項式FでF(０)=Sとなるものを使って複数の装置に分散する。装置の数をN、装置の個数がK未満であれば関数の入力や出力に関する情報を得ることができないとする。このような技術を秘密分散という。装置ごとに異なるこの体上の値が割り当てられているとし、装置iに割り当てられている体の値をX[i]とする。秘密Aをこれら複数の装置に分散する時、各i番目の装置にはF(0)=Aなるランダムに選ばれたK-1次多項式Fに関する、F[i]:=F(X[i])を配る。秘密Bに関しても同様にG(0)=BなるK-1次多項式Gに関する、G[i]:=G(X[i])を各i番目の装置に配る。秘密はK個以上の装置が集まればK-1次多項式を解くことが可能で、FやGの係数を求めることができ、F(0)やG(0)を計算することが可能になる。
【００１９】
(A+B)の分散した値を計算するには、各i番目の装置はH[i]=F[i]+G[i]を計算する。この値はFとGのそれぞれ対応する係数を足したものを係数とする多項式Hに、X[i]を代入して得られたものH(X[i])であるので、AやBと同様にA+Bを複数の装置で分散したものとなる。AやBの場合と同様に、K個以上の装置が集まればK-1次多項式を解くことが可能で、Hの係数を求めることができ、H(0)を計算することが可能になる。
【００２０】
K*2≦N+1 の場合は、(A*B)の分散した値を計算するには、各i番目の装置は H[i]=F[i]*G[i]を計算する。この値は2K次多項式H(X)=F(X)*G(X)、X[i]を代入して得られたものH(X[i])であるので、AやBと同様に(A*B)を複数の装置で分散したものとなる。ただし、AやBの場合とは異なりHの次数は２Kとなるので、２K個以上の装置が集まれば２K次多項式を解くことが可能で、Hの係数を求めることができ、H(0)を計算することが可能になる。(A*B)の分散方法はAやBとは分散のされ方が異なる。これを同様に、K-1次多項式を用いた形で分散するには、それぞれi番目の装置がH[i]からK-1次多項式Gを生成して、他のそれぞれj番目の装置にG(X[j])を配ることでなされる。このようにして、加算と乗算からなる全ての関数を計算することができる。
【００２１】
[非特許文献２]
非特許文献２には、装置の数が２つの場合の方法に関する記述がある。この方法では２つの装置がビット、すなわちGF(2)上のある要素bを分散して保持する場合は b+c=b mod 2 となるbとcを、それぞれの装置で分けて保持する。この様な方法を使うとあるビットAとあるビットBを装置１と装置２で分散する場合、A=C+D mod 2, B=E+F mod 2として、装置１はCとEを、装置２はDとFを保持する。この時、AとBの排他的論理和Gは G=A+B mod 2となり、これらの装置１と装置２との分散はそれぞれ、H=C+E mod 2とJ=D+F mod 2 とすることができる。それぞれの装置は他の装置と通信することなく、軽い計算で分散された２つの値の排他的論理和の分散が計算できたことになる。
【００２２】
同様にAとBが分散されて保持しているとき、この２つのビットの論理積 K=A・Bのそれぞれの分散、すなわち L+M=K mod 2なるLとMを、装置１がLを装置２がMを得るように行うには、次のようにする。装置１はLをランダムに生成する。この時、M＝(C+D)・(E+F)=L mod 2 であるので、装置２が持つ値DとFに応じて、装置AがMの値を知らずに装置に、(D,F)=(0,0)ならM=(C+0)・(E+0)+L mod 2 を、(D,F)=(0,1)ならM=(C+0)・(1+E)+L mod 2 を、(D,F)=(1,0)ならM=(1+C)・(E+0)+L mod 2 を、(D,F)=(1,1)ならM=(1+C)・(1+E)+L mod 2 を返す。装置２の入力に依存する値を装置１が装置２に送付する、装置１が装置２の入力を知ることができない方法は装置１と装置２との間の紛失通信(oblivious transfer)と呼ばれる技術で実現されるが、一般に両者に多くの計算と通信を要求する。
【００２３】
[非特許文献３]
非特許文献１および非特許文献２は、各装置が正直に振る舞うことを前提としていた。しかし、非特許文献３には、一定数以上の装置が正直に振る舞えば、その他の装置が悪意を持って振る舞っても（互いに通信する時に正しい値を他者に送らないなど）、安全性が保たれる方法（すなわち、偽の値を送ることで他者の持つ秘密を得ることができない）が記述されている。
【００２４】
非特許文献３においては、例えば、準備された多くの回路を複数の小バケットに割り当てることによって、秘密乗算の正当性を検証する幾つかの方法が記載されている。
【００２５】
（非特許文献の課題）
非特許文献１および非特許文献２は、参加者が正直であることを前提にしているので、参加者の悪意ある振る舞いに対して秘密を守ることができないという問題である。また、非特許文献３は、秘密計算の検証精度を上げるには処理量が大きくなってしまので、参加者の悪意ある振る舞いに対して秘密を守るには処理量が大きいことが問題である。
【００２６】
次に、本実施形態において利用される前提技術について説明する。
【００２７】
［(t,n)秘密分散］
n個の装置P(1), P(2),…,P(n)がある。Rを加算と乗算が定義されるある環とする。関数SecretShare()を、Rの要素が与えられた時、n個のシェアと呼ばれる値を出力する関数とする。
【００２８】
XをRの要素とするとき、(x(1),…,x(n))=SecretShare(x) と記すとする。このとき、(x(1),…,x(n))は、xを(t,n)秘密分散した結果のシェアと呼び、次の性質を満たす。
1.関数Recover()が存在し、n個のシェアから任意のt個を選び、これをRecoverに入力すると、xを得ることができる。
2.(t-1)未満個のシェアからはxを復元することは困難である。
xが(t,n)秘密分散されているとは、i=1,…,nに関して、P(i)がx(i)を保持していることを言う。これを[x]と表す。
【００２９】
ｘの(2,3)秘密分散を例とし、SecretShare（）の入力をxとする。乱数a(1),a(2)をランダムに選び、a(3)=0-a(1)-a(2)とし、(2,3)秘密分散はそれぞれ、x(1)=(a(1),a(3)-x)、x(2)=(a(2),a(1)-x)、x(3)=(a(3),a(2)-x))とする。
【００３０】
［セミオネスト復元］
秘密分散[x]から一部ないしは全ての参加者が関与して、それぞれがxを得る処理を復元と呼ぶ。復元に関与した全ての参加者が正直にこの処理を実行した場合、この参加者全てが正しい復元結果を得られる場合、セミオネスト復元と呼ぶ。
【００３１】
(2,3)秘密分散の例において、全ての参加者が関与した場合のけるセミオネスト復元の例を挙げる。[x]は先の例に従い、x(1)=(a(1),a(3)-x)、x(2)=(a(2),a(1)-x)、x(3)=(a(3),a(2)-x)と秘密分散されているとする。
【００３２】
P(1)はP(2)にa(1)を送る。P(2)はP(3)にa(2)を送る。P(3)はP(1)にa(3)を送る。そして、P(1)はa(3)-(a(3)-x)=xを計算する。P(2)はa(1)-(a(1)-x)=xを計算する。P(3)はa(2)-(a(2)-x)=xを計算する。
【００３３】
［セミオネスト秘密計算］
（秘密加算）
[x],[y]が与えられた時、P(1),…,P(n)は互いに通信することなく、それぞれ自身のシェアを使って計算する事で、[z]=[x+y]を計算することができるとする。全ての参加者が正直にこの計算を実行している限り、どのt未満の数の参加者が自身の知識を共有しても、x,y,zに関する新たな知識を得ることができないものとする。この処理を、[z]=[x]+[y]と表現し、秘密計算の加算と呼ぶ。
【００３４】
例えば、ｘと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))であるとする。
【００３５】
この時、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))と計算できる。例えば、P(3)がP(1)にx(31)+y(31)=a(3)+b(3)を送ると、P(1)はx(31)+y(31)-{x(12)+y(12)}=a(3)+b(3)-{a(3)-x+b(3)-y}=x+y、をセミオネスト復元できる。
【００３６】
また、[x]と全ての装置が知るyが与えられた時、P(1),…,P(n)は互いに通信することなく、それぞれ自身のシェアを使って計算する事で、[z]=[x+y]を計算する事ができるとする。この処理を、[z]=[x]+yあるいは[z]=y+[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)の(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)と計算できる。例えば、P(3)がP(1)にx(31)=a(3)を送ると、P(1)はx(31)-{x(12)-y}=a(3)-{a(3)-x-y}=x+y、をセミオネスト復元できる。
【００３８】
（秘密乗算）
[x]と全ての装置が知るyが与えられた時、P(1),…,P(n)は互いに通信することなく、それぞれ自身のシェアを使って計算することで、[z]=[x・y]を計算する事ができるとする。この処理を、[z]=[x]・yあるいは[z]=y・[x]と表現し、秘密計算の局所的な乗算と呼ぶ。
【００３９】
例えば、各装置がxの自身のシェアにyを乗じれば良く、P(1)の(x*y)のシェアは(x(11)*y,x(12)*y)、P(2)の(x*y)のシェアは(x(21)*y,x(22)*y)、P(3)の(x*y)のシェアは(x(31)*y,x(32)*y)と計算できる。例えば、P(3)がP(1)にx(31)*y=a(3)*yを送ると、P(1)はx(31)*y-{x(12)*y}=a(3)*y-{a(3)-x}*y=x*y、をセミオネスト復元できる。
【００４０】
[x] ,[y] が与えられた時、P(1),…,P(n)は互いに通信することとそれぞれ自身のシェアを使って計算する事で、[z]=[x・y]を計算することができるとする。ここで「・」は乗算を表すとする。全ての参加者が正直にこの計算を実行している限り、どのt未満の数の参加者が自身の知識を共有しても、x,y,zに関する新たな知識を得ることができないものとする。この処理を[z]=[x]*[y]と表現し、セミオネスト安全な秘密計算の乗算と呼ぶ。
【００４１】
例えば、ｘと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))であるとする。
【００４２】
この時、次のようにして、P(1)の(x・y)のシェア、P(2)の(x・y)のシェア、P(3)の(x・y)のシェアが計算できる。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)に送る。
【００４４】
P(1)は(x・y)のシェアを、(t(3)-t(1),-2t(3)-t(1))とする。P(2)は(x・y)のシェアを、(t(1)-t(2),-2t(1)-t(2))とする。P(3)は(x・y)のシェアを、(t(2)-t(3),-2t(2)-t(3))とする。
【００４５】
例えば、P(3)がP(1)にt(2)-t(3)={（-x(21)y(21)+x(22)y(22)-r(2)）/3}-{（-x(31)y(31)+x(32)y(32)-r(3)）/3}を送ると、P(1)は、
t(2)-t(3)-{-2t(3)-t(1)}=t(1)+t(2)+t(3)
={（-x(11)y(11)+x(12)y(12)-r(1)）/3}+{（-x(21)y(21)+x(22)y(22)-r(2)）/3}+{（-x(31)y(31)+x(32)y(32)-r(3)）/3}
={((-a(1)b(1)+(a(1)-x)(b(1)-y)-r(1))/3}+{((-a(2)b(2)+(a(2)-x)(b(2)-y)-r(2))/3}+{((-a(3)b(3)+(a(3)-x)(b(3)-y)-r(3))/3}
={(-b(1)x-a(1)y+x・y-r(1))/3}+{(-b(2)x-a(2)y+x・y-r(2))/3}+{(-b(3)x-a(3)y+x・y-r(3))/3}
=-{(b(1)+b(2)+b(3)}x/3-{a(1)+a(2)+a(3)y/3}+x・y-{r(1)+r(2)+r(3)}
=x・y、をセミオネスト復元できる。
【００４６】
《本実施形態の説明》
上記前提技術を参照しながら、本実施形態の秘密計算装置の構成および動作を詳細に説明する。
【００４７】
《秘密計算装置の機能構成》
図２は、本実施形態に係る秘密計算装置２００の機能構成を示すブロック図である。
【００４８】
秘密計算装置２００は、通信制御部２０１と、乗算トリプレット列生成部２０２と、サンプリング検証部２０３と、バケット検証部２０４と、セミオネスト計算部２０５と、乗算正当性検証部２０６と、秘密計算終了処理部２０７と、を備える。
【００４９】
通信制御部２０１は、他の秘密計算装置、または、秘密分散装置などとのネットワークを介した通信を制御する。乗算トリプレット列生成部２０２は、第１乗算トリプレット列生成部１０１に相当し、２つの秘密分散したランダム数と、２つの秘密分散したランダム数を秘密乗算した乗算結果の分散値と、の組からなる乗算トリプレット列を生成する。サンプリング検証部２０３は、第１トリプレット検証部に相当し、乗算トリプレット列からランダムに所定数の乗算トリプレットをサンプリングして、サンプリングされた乗算トリプレットに基づいて不正を検証する。バケット検証部２０４は、第２トリプレット検証部に相当し、サンプリング検証部２０３により不正が発見されなかった場合に、サンプリングされなかった乗算トリプレットにより少なくとも２列を有するランダムな行列を生成し、乗算トリプレットによるランダムな行列に基づいて不正を検証する。
【００５０】
セミオネスト計算部２０５は、第２乗算トリプレット列生成部１０２に相当し、セミオネスト安全な秘密乗算における各乗算処理における２つの秘密分散した入力数と、２つの秘密分散した入力数を秘密乗算した乗算結果と、の組からなる乗算トリプレット列を生成する。乗算正当性検証部２０６は、セミオネスト計算部２０５が生成した乗算結果の乗算トリプレット列と同数の乗算トリプレットを、バケット検証部２０４が生成した乗算トリプレットの行列からランダムに選択して、乗算トリプレットの組に基づいて乗算結果の正当性を検証する。秘密計算終了処理部２０７は、サンプリング検証部２０３、バケット検証部２０４および乗算正当性検証部２０６のいずれかが秘密計算中の不正を発見したら、秘密計算の終了処理を行なう。
【００５１】
なお、本実施形態においては、乗算正当性検証部２０６は、サンプリング検証部２０３およびバケット検証部２０４において不正を発見しなかった場合に、不正の検証を行ない、バケット検証部２０４は、サンプリング検証部２０３において不正を発見しなかった場合に、不正の検証を行なう。しかしながら、この関係に限定されない。また、本実施形態においては、バケット検証部２０４の生成する乗算トリプレットの行列は、サンプリングされなかった乗算トリプレットから生成するが、これに限定されない。
【００５２】
（秘密計算装置を含むシステム）
図３は、本実施形態に係る秘密計算装置２００を含む秘密計算システム３００の構成を示すブロック図である。
【００５３】
本実施形態の秘密計算システム３００は、複数の秘密計算装置３０１〜３０ｎと、秘密分散装置３１０とが、ネットワーク３２０を介して通信接続され、秘密計算、特に秘密乗算は、複数の秘密計算装置３０１〜３０ｎ間で協働して秘密情報の通信を行ないながら実現される。
【００５４】
（乗算トリプレット列生成）
図４は、本実施形態に係る乗算トリプレット列生成部２０２の機能構成を示すブロック図である。
【００５５】
乗算トリプレット列生成部２０２は、乱数保持部４０１と、乱数のシェア算出部４０２と、秘密分散生成部４０３と、乗算トリプレット生成部４０４と、を有する。乱数保持部４０１は、乱数のシェア算出部４０２で使用する乱数を保持する。乱数のシェア算出部４０２は、乱数保持部４０１が保持する乱数からハッシュ関数を使って、乱数のシェアを算出する。秘密分散生成部４０３は、乱数のシェアを使用して秘密分散を生成する。例えば、（ＬＫ＋Ｍ）個の秘密分散値列a(j)、b(j)（１≦ｊ≦ＬＫ＋Ｍ）４３１、を生成する。乗算トリプレット生成部４０４は、[a(j)・b(j)]=[c(j)]となるc(j)を生成し、乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦ＬＫ＋Ｍ）４４１、を生成する。生成された乗算トリプレット｛a(j)，b(j)，c(j)｝は、サンプリング検証部２０３、バケット検証部２０４、乗算正当性検証部２０６において用いられる。
【００５６】
以下、本実施形態に係る乗算トリプレット列生成の一例を説明する。
【００５７】
ある環Rのランダムな要素ｒの秘密分散[r]を任意の個数作る方法があるとする。
【００５８】
例えば、(2,3)秘密分散の場合には、次のようにする。
【００５９】
P(1)は乱数S(3),S(1)を、P(2)は乱数S(1),S(2)を、P(3)は乱数S(2),S(3)をあらかじめ持つとする。Rの要素を出力するハッシュ関数Hash()を用いて、m番目の乱数の、P(1)のシェアを{Hash(S(3),m)-Hash(S(1),m)}、P(2)のシェアを{Hash(S(1),m)-Hash(S(2),m)}、P(3)のシェアを Hash(S(2),m)-Hash(S(3),m)、と計算すればよい。
【００６０】
次に、L,K,Mをある整数とし、N個の参加者は、ある環のランダムな要素の秘密分散を2(LK+M)個生成する。これらを[a(1)],[b(1)],[a(2)],[b(2)],…,[a(LK+M)],[b(LK+M)] とする。参加者は、全てのj=1,…,LK+M に関してセミオネスト安全な秘密計算の乗算[a(j)]*[b(j)]を実行することにより、[c(j)]=[a(j)・b(j)] を計算する。それぞれのjに関して、[a(j)],[b(j)],[c(j)]を乗算トリプレットと呼ぶ。
【００６１】
（乗算トリプレットのサンプリング検証）
図５は、本実施形態に係るサンプリング検証部２０３の機能構成を示すブロック図である。
【００６２】
サンプリング検証部２０３は、ランダムサンプリング部５０１と、トリプレット検証部５０２と、を有する。ランダムサンプリング部５０１は、乗算トリプレット生成部４０４が生成した乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦ＬＫ＋Ｍ）４４１から、ランダムにＭ個の乗算トリプレットをサンプリングし、乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦Ｍ）５２１を生成する。そして、ランダムサンプリング部５０１は、サンプリングされなかったＬＫ個の乗算トリプレットをバケット検証部２０４に送る。トリプレット検証部５０２は、乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦Ｍ）５２１を用いて、トリプレットに誤りがあるかを判定して、不正のあり／なしを検証する。
【００６３】
以下、本実施形態に係る乗算トリプレットのサンプリング検証の一例を説明する。
【００６４】
LK+M個の乗算トリプレットからM個の乗算トリプレットをランダムに選び、全員あるいは一部の参加者でセミオネスト復元する。各参加者は選ばれたトリプレットに関して、すなわち、選ばれた複数のインデックスｊに関して、a(j),b(j),c(j)を得る。これらのうち１つでもa(j)・b(j)=c(j)を満たさないものを発見した参加者がいた場合、乗算トリプレット生成に不正があったとして、プログラムを終了する。なお、(LK+M)個の乗算トリプレットから、上で選択して復元されたM個を除くLK個の乗算トリプレットを以降で利用する。
【００６５】
ここで、LKとMとをある程度大きくとれば、MがLKに比較してかなり小さくとも、LK個の乗算トリプレット中に、参加者が正直に生成していない乗算トリプレットが一定割合以上あり、かつ、復元処理で不正が発見されない確率は、かなり小さくなり、かなりの不正の検証が可能である。しかし、乗算トリプレットのサンプリング検証では不十分な不正の発見確率をさらに高めるために、次の乗算トリプレットのバケット検証が行なわれる。
【００６６】
（乗算トリプレットのバケット検証）
図６は、本実施形態に係るバケット検証部２０４の機能構成を示すブロック図である。
バケット検証部２０４は、サンプリング検証結果受信部６０１と、非サンプリングトリプレット受信部６０２と、トリプレット行列生成部６０３と、バケット検証処理部６０４と、を有する。サンプリング検証結果受信部６０１は、サンプリング検証部２０３からサンプリング検証の結果を受信する。そして、不正なしを受信した場合に、バケット検証部２０４を起動する。非サンプリングトリプレット受信部６０２は、サンプリング検証部２０３からサンプリングされなかったＬＫ個の乗算サンプリングを受信して、乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦ＬＫ）６２１を保持する。なお、非サンプリングトリプレット受信部６０２において、サンプリングされなかったＬＫ個の乗算サンプリングは、乗算トリプレット列生成部２０２からの全乗算トリプレット列からサンプリングされたＭ個の乗算トリプレットを除くことで求めてもよい。
【００６７】
トリプレット行列生成部６０３は、非サンプリングトリプレット受信部６０２の乗算トリプレット列｛a(j)，b(j)，c(j)｝（１≦ｊ≦ＬＫ）６２１から、ランダムにＬ行Ｋ列の乗算トリプレット行列Tr(p,q)={a(p,q),b(p,q),c(p,q)}（p=1,…,L、q=1,…,K）６３１を生成する。バケット検証処理部６０４は、Ｌ行Ｋ列の乗算トリプレット行列Tr(p,q)（p=1,…,L、q=1,…,K）６３１を用いて、バケット検証を実行する。
【００６８】
以下、本実施形態に係る乗算トリプレットのバケット検証の一例を説明する。
【００６９】
LK個の乗算トリプレットをランダムに並び替えて、Ｌ個の乗算トリプレットの列をＫ列生成する。すなわちp=1,…,L、q=1,…,K に関して、[a(p,q)],[b(p,q)],[c(p,q)]をそれぞれ、1,…,LKから選ばれたjに関する[a(j)],[b(j)],[c(j)]を割り当てる。
【００７０】
全てのp=1,…,Lに関して、以下の［大ループ終了］までの処理を実行する。
全てのq=2,..,Kに関して、以下の［小ループ終了］までの処理を実行する。
・[d(p,q)]=[a(p,1)]+[a(p,q)]および[e(p,q)]=[b(p,1)]+[b(p,q)]を秘密計算し、d(p,q)とe(p,q)とをセミオネスト復元する。
・ｆ番目の参加者が得る復元結果をそれぞれ、d(p,q,f)とe(p,q,f)とする。
・ｆ番目の参加者は、d(p,q)とe(p,q)としてd(p,q,f)とe(p,q,f)をそれぞれ用いて、次の秘密計算を行う。
[c'(p,q)]=[c(p,1)]-d(p,q)・e(p,q)+[a(p,q)]・e(p,q)+[b(p,q)]・d(p,q)-[c(p,q)]
［小ループ終了］
［大ループ終了］
【００７１】
全てのp=1,…,L、q=2,…,Kに関して、d(p,q,f)とe(p,q,f)とがfによって異ならないことを確認する。これは、例えば、次のようにして実施する。
【００７２】
全ての各f番目の参加者とf'番目の参加者の組み合わせに関して、全てのp=1,…,L、q=2,…,Kに関して、d(p,q,f)とd(p,q,f')が等しいことを確認する。
【００７３】
D(p,q,f)を、p=1,…,L、q=2,…,Kに関するd(p,q,f)を全て並べたものとする。各f番目の参加者とf'番目の参加者が両者のみに秘密の鍵Sを共有していて、それぞれ(S,D(p,q,f))のハッシュ値と(S,D(p,q,f'))のハッシュ値とを計算し、交換して同一であることを確認すればよい。
【００７４】
全てのp=1,…,L、q=2,…,Kに関して、[c'(p,q)]が０（ゼロ）の秘密分散であることを確認する。０でないものが含まれることが判明したら、不正が発見されたと判断してプログラムを終了する。
【００７５】
例えば、[c'(p,q)]を全てセミオネスト復元することでも確認することができる。
【００７６】
復元に必要な通信を省略したい場合は、例えば次のようにすることもできる。以下に、(3,2)秘密分散の場合の例を挙げる。
【００７７】
P(1)のx(p,q)のシェアが(x(11pq),x(12pqj))で、P(2)のx(p,q)のシェアが(x(21pq),x(22pq))で、P(3)のx(p,q)のシェアが(x(31pq),x(32pq))とすると、０が秘密分散されているならば、x(11pq)=x(22pq),x(21pq)=x(32pq),x(31pq)=x(12pq)となる。よって、P(1)とP(2)は互いに、p=1,…,L、q=2,…,Kに関してx(11pq)を並べたもののハッシュ値と、x(22pq)を並べたもののハッシュ値とをそれぞれ計算して交換して同一であることを比較すればよい。P(2)とP(3)に関してと、P(3)とP(1)に関しても同様に比較して確認すればよい。
【００７８】
上記の様に、各[c'(p,q)]が０の秘密分散であることを確認されると、[c(p,q)]=[a(p,q)]*[b(p,q)]と[c(1,q)]=[a(1,q)]*[b(1,q)]の両方が正しく計算されているか、あるいは両方とも誤って計算されていることが確認される。いずれも、既にある程度の高い確率で正しく計算されていることが保証されているため、この確認により、両方が正しく計算されていることがより高い確率で確認される。Kが大きければ大きいほどこの確認が繰り返されるため、[c(1,q)]=[a(1,q)]*[b(1,q)]が正しく計算されていることがより高い確率で確認される。この乗算トリプレットのバケット検証を含めなくとも、サンプリング確認により保証された割合で不正が発見されるため、高い確率で不正を発見しなくともよい場合は、この処理を除くことができる。
【００７９】
この様にして、Kを選ぶことで任意の高さの確立で正しいことが保証された乗算トリプレット[a(1,q)],[b(1,q)],[c(1,q)]の列を生成することができた。ここで、列の各要素はq=1,…,Kによる。
【００８０】
（セミオネスト回路計算）
図７は、本実施形態に係るセミオネスト計算部２０５の機能構成を示すブロック図である。
【００８１】
セミオネスト計算部２０５は、セミオネスト計算実行部７０１と、セミオネスト乗算トリプレット生成部７０２と、を有する。セミオネスト計算実行部７０１は、加算と乗算とを順に繋ぎ合わせて所望の秘密計算を実行する。なお、秘密分散された数の秘密計算では、秘密乗算（乗算回路ともいう）のみが複数の秘密計算装置間で情報の交換をするので、正当性を検証する対象は乗算処理のみでよい。セミオネスト計算実行部７０１の、例えば、乗算処理７１１、７１２、７１３、７１４、７１５、…、７１Ｃを正当性検証の対象とする。セミオネスト乗算トリプレット生成部７０２は、例えば、乗算処理７１１〜７１ＣのＣ個のセミオネスト乗算に対応する乗算トリプレット列｛x(w),y(w),z(w)=[X(w)・y(w)]｝７２１を生成する。
【００８２】
以下、本実施形態に係るセミオネスト回路計算の一例を説明する。
【００８３】
乗算と加算から構成される回路が与えられたとする。この回路の入力が秘密分散されているとする。秘密計算の加算と、セミオネスト安全な秘密計算の乗算を、回路の入力から出力に向かって順番に適用することにより、出力結果の秘密分散が生成される。ここで、乗算は通信を必要とし、参加者が不正を働くと、正直に計算した参加者の秘密分散も正しい計算結果とならない可能性がある。
【００８４】
そこで、次のようにして、回路に含まれる全ての乗算が正しく実行されたことを検証する。
【００８５】
（乗算の正当性検証）
図８は、本実施形態に係る乗算正当性検証部２０６の機能構成を示すブロック図である。
【００８６】
乗算正当性検証部２０６は、乗算トリプレット選択部８０１と、乗算正当性検証処理部８０２と、を有する。乗算トリプレット選択部８０１は、バケット検証部２０４で生成されたＬ個の乗算トリプレットを受信し、Ｌ個の乗算トリプレットから乗算処理（乗算回路）の数であるＣ個と同数の乗算トレプレットをランダムに選択する。乗算正当性検証処理部８０２は、セミオネスト計算部２０５からのＣ個の乗算結果から生成された乗算トリプレットと、乗算トリプレット選択部８０１がランダムに選択したＣ個の乱数から生成された乗算トリプレットと、をランダムに組み合わせて、乗算トリプレット組の列｛(x(w),y(w),z(w))、(a(w),b(w),c(w))｝８２１を生成する。そして、乗算正当性検証処理部８０２は、バケット検証処理部６０４と同様の方法で、乗算正当性検証を行なう。
【００８７】
以下、本実施形態に係る乗算の正当性検証の一例を説明する。
【００８８】
回路を構成する乗算の個数をCとし、これらに1からCまでの順番をつける。各乗算には入力が２つあり、出力が１つあるが、w番目の乗算の入力を[x(w)],[y(w)]とし、その出力を[z(w)]とする。いくつかのwに関する[x(w)]と[y(w)]とは回路への入力であり、いくつかのwに関する[z(w)]は回路の出力である。
【００８９】
バケット検証処理で生成されたL個の乗算トリプレットの中からランダムにC個の乗算トリプレットを選び、さらに、これらの順序をランダムに並び替える。ここでは、C個の乗算トリプレットの順序をランダムに入れ替えたが、以下において、各ゲートに対して、L個の乗算トリプレットからランダムに選ばれた乗算トリプレットが割り当てられることのみが重要である。よって、各乗算ゲートを検証するたびに、L個からランダムに乗算トリプレットを１つ選ぶ処理でもよい。この回路自体の計算が終わった後にランダムに乗算トリプレットを選ばずに、あらかじめ決めておいた乗算トリプレットで回路の各ゲートの正当性検証を実施するならば、少ない確率であっても乗算トリプレットを発見されずに不正生成できる。この場合には、この乗算トリプレットで検証されるゲートを選んで不正な計算をすることができる。
【００９０】
この結果、でき上がった乗算トリプレットの列を、w=1,…,C に関する[a(w)],[b(w)],[c(w)] とする。全てのw=1,…,Cに関して、[d(w)]=[a(w)]+[x(w)]および[e(w)]=[b(w)]+[ｙ(w)]を秘密計算し、d(w)とe(w)とをセミオネスト復元する。ｆ番目の参加者が得る復元結果をそれぞれ、d(w,f)とe(w,f)とする。ｆ番目の参加者は、d(w)とe(w)としてd(w,f)とe(w,f)をそれぞれ用いて、次の秘密計算を行う。
【００９１】
[c'(w)]=[c(w)]-d(w)・e(w)+[x(w)]・e(w)+[y(w)]・d(w)-[z(w)]
そして、全てのw=1,…,Cに関して、d(w,f)とe(w,f)とがfによって異ならないことを確認する。これは、例えば次のようにして実施する。
【００９２】
全ての各f番目の参加者とf'番目の参加者の組み合わせに関して、全てのw=1,…,Cに関してd(w,f)とd(w,f')が等しいことを確認する。
【００９３】
D(w,f)を、w=1,…,Cに関するd(w,f)を全て並べたものとする。各f番目の参加者とf'番目の参加者が両者のみに秘密の鍵Sを共有していて、それぞれ(S,D(w,f))のハッシュ値と(S,D(w,f’))のハッシュ値とを計算し、交換して同一であることを確認すればよい。
【００９４】
全てのw=1,…,Cに関して、[c'(w)]が０の秘密分散であることを確認する。例えばこれは、全てのi=1,…,L、j=2,…,Kに関して、[c'(i,j)]が０の秘密分散であることを確認する方法を上述したが、同様に行えばよい。０でないものが含まれることが判明したら、不正が発見されたと判断してプログラムを終了する。
【００９５】
ここで、秘密分散された値が０であるということは、[c(w)]=[a(w)]*[b(w)]と[z(w)]=[x(w)]*[y(w)]の両方が正しく計算されているか、あるいは両方とも誤って計算されていることが確認される。前者は、既にある程度高い確率で正しく計算されていることが保証されているため、この確認により、後者も正しく計算されていることが高い確率で確認される。この様にして、回路の各乗算が正しく秘密計算されたことが確認される。加算では、通信を使わず参加者は他の参加者に偽ったデータを送る機会はなく、不正を働くことはできない。よって、回路全体が正しく秘密計算されたことが検証されている。
【００９６】
（秘密計算終了処理）
図９は、本実施形態に係る秘密計算終了処理部２０７の機能構成を示すブロック図である。
【００９７】
秘密計算終了処理部２０７は、論理和（ＯＲ）９０１と、秘密計算終了指示部９０２と、を有する。論理和（ＯＲ）９０１は、サンプリング検証部２０３、バケット検証部２０４および乗算正当性検証部２０６からの「不正あり」の検証結果を入力し、その論理和を出力する。秘密計算終了指示部９０２は、サンプリング検証部２０３、バケット検証部２０４および乗算正当性検証部２０６のいずれかからの「不正あり」があれば、秘密計算終了の指示信号を、秘密計算装置２００および他の秘密計算装置に報知する。
【００９８】
《秘密計算装置のハードウェア構成》
図１０Ａは、本実施形態に係る秘密計算装置２００のハードウェア構成を示すブロック図である。
【００９９】
図１０Ａで、ＣＰＵ(Central Processing Unit)１０１０は演算制御用のプロセッサであり、プログラムを実行することで図２の機能構成部を実現する。ＣＰＵ１０１０は複数のプロセッサを有し、異なるプログラムやモジュール、タスク、スレッドなどを並行して実行してもよい。ＲＯＭ(Read Only Memory)１０２０は、初期データおよびプログラムなどの固定データおよびプログラムを記憶する。ネットワークインタフェース１０３０は、ネットワークを介して、複数の秘密計算装置あるいは秘密分散装置との通信を制御する。
【０１００】
ＲＡＭ(Random Access Memory)１０４０は、ＣＰＵ１０１０が一時記憶のワークエリアとして使用するランダムアクセスメモリである。ＲＡＭ１０４０には、本実施形態の実現に必要なデータを記憶する領域が確保されている。サンプリングされたトリプレット（Ｍ）１０４１は、サンプリング検証のためのサンプリングされたＭ個の乗算トリプレットである。サンプリング検証結果１０４２は、サンプリング検証による不正あり／不正なしのデータである。トリプレット行列（Ｌ×Ｋ）１０４３は、バケット検証のためのＬ行Ｍ列の乗算トリプレット行列である。バケット検証結果１０４４は、バケット検証による不正あり／不正なしのデータである。セミオネスト乗算のトリプレット（Ｃ）１０４５は、乗算正当性検証のためのＣ個のセミオネスト乗算に基づく乗算トリプレットである。トリプレット行列からのランダム選択トリプレット（Ｃ）１０４６は、トリプレット行列（Ｌ×Ｋ）１０４３からランダム選択されたＣ個の乗算トリプレットである。乗算正当性検証結果１０４７は、乗算正当性検証による不正あり／不正なしのデータである。秘密計算終了フラグ１０４８は、サンプリング検証結果１０４２、バケット検証結果１０４４および乗算正当性検証結果１０４７のいずれかで不正ありとなった場合に、秘密計算を終了するためのフラグである。秘密計算用領域１０４９は、秘密計算装置２００が秘密計算をするために一時使用される領域である。
【０１０１】
ストレージ１０５０は、データベースや各種のパラメータ、あるいは本実施形態の実現に必要な以下のデータまたはプログラムが記憶されている。乱数（乱数分散値）１０５１は、乗算トリプレット列を生成するために使用する乱数である。秘秘密乗算検証用パラメータ１０５９は、本実施形態で実施する秘密乗算検証のために設定される、あるいは、算出されるパラメータである。乗算トリプレット列（ＬＫ＋Ｍ）４４１は、図４を参照して説明した乗算トリプレット列である。
【０１０２】
ストレージ１０５０には、以下のプログラムが格納される。秘密計算制御プログラム１０５２は、秘密計算装置２００による秘密計算を制御するプログラムである。秘密加算モジュール１０５３は、秘密分散数による秘密加算を行なうモジュールである。秘密乗算モジュール１０５４は、秘密分散数による秘密乗算を行なうモジュールである。乗算トリプレット列生成モジュール１０５５は、乱数に基づいて多数の乗算トリプレット列を生成するモジュールである。サンプリング検証モジュール１０５６は、乗算トリプレット列から乗算トリプレットをサンプリングして検証を行なうモジュールである。バケット検証モジュール１０５７は、乗算トリプレット列からサンプリングされなかった乗算トリプレットから乗算トリプレット行列を生成して検証を行なうモジュールである。乗算正当性検証モジュール１０５８は、セミオネスト乗算結果から生成された乗算トリプレットと、同数の乗算トリプレット行列からランダムに選択された乗算トリプレットとから、検証を行なうモジュールである。
【０１０３】
なお、図１０のＲＡＭ１０４０やストレージ１０５０には、秘密計算装置２００が有する汎用の機能や他の実現可能な機能に関連するプログラムやデータは図示されていない。
【０１０４】
（密乗算検証用パラメータ）
図１０Ｂは、本実施形態に係る秘密乗算検証用パラメータ１０５９の内容を示す図である。秘密乗算検証用パラメータ１０５９は、乗算トリプレット生成、サンプリング検証、バケット検証、または、乗算正当性検証のために設定される、あるいは、算出されるパラメータである。なお、秘密乗算検証用パラメータ１０５９は、図１０Ｂに限定されない。
【０１０５】
秘密乗算検証用パラメータ１０５９は、秘密乗算条件１０６１、選択パラメータ１０６２、および、正当性検証結果１０６３を対応付けて格納、あるいは、学習のために蓄積する。秘密計算装置２００は、秘密乗算検証用パラメータ１０５９を用いて、検証速度や検証精度により適切なパラメータを選択する。また、秘密計算装置２００は、秘密乗算検証用パラメータ１０５９への蓄積情報から望ましいパラメータを選択したり、オペレータに通知したりする。
【０１０６】
秘密乗算条件１０６１には、秘密乗算する数値の範囲、ビット幅、使用する秘密乗算用のアルゴリズム、目標とする正当性判定の精度、などが含まれる。また、選択パラメータ１０６２には、乱数から生成するトリプレット数（ＬＫ＋Ｍ）、サンプリング検証におけるサンプリング数（Ｍ）、バケット検証におけるトリプレット行列の行数と列数（Ｌ行Ｋ列）、秘密演算処理での秘密乗算回数（Ｃ）、などが含まれる。また、正当性検証結果１０６３には、通信量を含む検証速度や正当性精度などが含まれる。
【０１０７】
《秘密計算装置の処理手順》
図１１は、本実施形態に係る秘密計算装置２００の処理手順を示すフローチャートである。このフローチャートは、図１０のＣＰＵ１０１０がＲＡＭ１０４０を用いて実行し、図２の機能構成部を実現する。
【０１０８】
秘密計算装置２００は、ステップＳ１１０１において、（ＬＫ＋Ｍ）個の乗算トリプレット列を生成する。秘密計算装置２００は、ステップＳ１１０３において、（ＬＫ＋Ｍ）個の乗算トリプレット列からＭ個の乗算トリプレットをランダムにサンプリングして、秘密乗算の通信時の不正を検証する。秘密計算装置２００は、ステップＳ１１０５において、（ＬＫ＋Ｍ）個の乗算トリプレット列でサンプリングしなかったＬＫ個の乗算トリプレットによりＬ行Ｋ列の乗算トリプレット行列を生成して、秘密乗算の通信時の不正を検証する。
【０１０９】
秘密計算装置２００は、ステップＳ１１０７において、セミオネスト計算を実行して、Ｃ個の乗算処理に対応するＣ個の乗算トリプレットを生成する。秘密計算装置２００は、ステップＳ１１０９において、Ｃ個の乗算トリプレットと同数の乗算トリプレットをＬ行Ｋ列の乗算トリプレット行列からランダムに選択して、秘密乗算結果の通信時の不正を検証する。秘密計算装置２００は、ステップＳ１１１１において、乗算正当性の検証結果を報知する。
【０１１０】
（セミオネスト処理および乗算正当性検証処理）
図１２は、本実施形態に係るセミオネスト計算処理（Ｓ１１０７）および乗算正当性検証処理（Ｓ１１０９）の手順を示すフローチャートである。
【０１１１】
秘密計算装置２００は、ステップＳ１２０１において、セミオネスト秘密計算を実行する。秘密計算装置２００は、ステップＳ１２０３において、セミオネスト秘密計算の中にある秘密乗算処理を抽出する。秘密計算装置２００は、ステップＳ１２０５において、秘密乗算処理の数の乗算トリプレットを生成する。秘密計算装置２００は、ステップＳ１２０７において、バケット検証で生成された乗算トリプレット列（L行）から、ランダムに秘密乗算処理の数と同数の乗算トリプレットを選択する。秘密計算装置２００は、ステップＳ１２０９において、同数の秘密乗算トリプレットと選択乗算トリプレットとの組を生成する。そして、秘密計算装置２００は、ステップ１１０５において、同数の秘密乗算トリプレットと選択乗算トリプレットとの組を用いて、バケット検証を行なう。
【０１１２】
本実施形態によれば、乗算トリプレットに基づくサンプリング検証およびバケット検証と、セミオネスト乗算からの乗算トリプレットに基づく乗算正当性検証と、を併用することによって、秘密計算において、処理量を少なく保ったまま、参加者の悪意のある振る舞いに対してより精度よく秘密を守ることができる。
【０１１３】
詳細には、LK＋M個の乗算トリプレットからM個の乗算トリプレットを復元して検査をした時点で、不正に作られた乗算トリプレットの数が1/T個以下である確率が非常に高い、あるいは、圧倒的であると計算できたとする。
【０１１４】
したがって、LK個の乗算トリプレットに絞られた時点で、不正に作られた乗算トリプレットの数は1/TK個以下である確率が非常に高いあるいは圧倒的であるということができる。
【０１１５】
上の計算で、セミオネスト復元のために通信する回数はKに比例するため通信量を小さくするにはKを小さくしたいが、Kを小さくすると、高い確率で保証できる不正に作られた乗算トリプレットの数の上限が大きくなってしまう。ここで、通信量を小さくするためKを小さめにとり、1/TKの確立でしか不正が見つからないのであれば不正をあえて侵すには1/TKは小さすぎるが、TK個程度の乗算を計算する場合を考える。もし、回路の計算後にL個の乗算トリプレットからC個の乗算トリプレットを順番もランダムに選ぶのでなければ、回路を計算する時点でどの各乗算がどの乗算トリプレットと対照して検査されるかが分かる。上記のようにKが小さいなら、不正に作られた乗算トリプレットは存在することができ、これを使って検査される乗算で不正を働いても発覚しない。一方、前述のようにランダムに選ばれるのであれば、不正に作られた乗算トリプレットで検査する確率は1/TKと小さく、不正を隠し通せる可能性は低くなる。
【０１１６】
C個の乗算トリプレットがランダムに選ばれなくとも、Kを大きくすることで1/TKが十分に小さいあるいは無視できるほど小さければ、問題ない。逆に言うと、ランダムに選ぶようにした効果として、Kを小さくすることができた。すなわち不正を検知可能な秘密計算において、通信量を小さくすることができた。
【０１１７】
［第３実施形態］
次に、本発明の第３実施形態に係る秘密計算装置について説明する。本実施形態に係る秘密計算装置は、上記第２実施形態と比べると、バケット検証なしにサンプリング検証と乗算正当性検証とで検証する点で異なる。その他の構成および動作は、第２実施形態と同様であるため、同じ構成および動作については同じ符号を付してその詳しい説明を省略する。
【０１１８】
《秘密計算装置の機能構成》
図１３は、本実施形態に係る秘密計算装置１３００の機能構成を示すブロック図である。図１３において、図２と同様の機能構成には同じ参照番号を付して、重複する説明は説明を省略する。すなわち、図１３においては、図２の乗算トリプレット検証部２１０からバケット検証部２０４を省いて乗算トリプレット検証部１３１０としたのみで、他の機能構成は同様であるので詳細な説明は省略する。
【０１１９】
本実施形態によれば、バケット検証部を省いたので、第２実施形態と同様の精度および処理量は難しいが、より簡易な構成により十分に参加者の悪意のある振る舞いに対して精度よく秘密を守ることができる。
【０１２０】
［第４実施形態］
次に、本発明の第４実施形態に係る秘密計算装置について説明する。本実施形態に係る秘密計算装置は、上記第２実施形態および第３実施形態と比べると、バケット検証と乗算正当性検証との順番を逆にして検証する点で異なる。その他の構成および動作は、第２実施形態と同様であるため、同じ構成および動作については同じ符号を付してその詳しい説明を省略する。
【０１２１】
《秘密計算装置の機能構成》
図１４は、本実施形態に係る秘密計算装置１４００の機能構成を示すブロック図である。図１４において、図２または図１３と同様の機能構成には同じ参照番号を付して、重複する説明は説明を省略する。すなわち、図１４においては、図２の乗算トリプレット検証部２１０のバケット検証部２０４を移動して、乗算トリプレット検証部１４１０としたのみで、機能構成部は同様であるので詳細な説明は省略する。
【０１２２】
本実施形態によれば、バケット検証と乗算正当性検証との順番を逆にしたが、第２実施形態と同様の精度および処理量が可能であり、参加者の悪意のある振る舞いに対して精度よく秘密を守ることができる。
【０１２３】
［他の実施形態］
以上説明したように、本発明を用いれば複数の装置にデータを分散して各装置にデータを隠ぺいしたまま加算や乗算が可能になり、あわせて任意の関数を計算することが可能になる。また、参加装置が不正を働いたとしても、これを検知することができる。この計算に必要な通信量と計算量は小さい。この様なシステムは、ある装置で秘密のデータを扱ってなんらかのサービスを提供する時に、装置の管理者がデータを盗む出すことを防止できる。なぜなら、複数の装置に異なる管理者を割り当てれば、一人で全ての装置中のデータを見ることのできる管理者がいなくなり、このような管理者を通じたデータの盗み出しを防止することに貢献する。
【０１２４】
また、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。また、それぞれの実施形態に含まれる別々の特徴を如何様に組み合わせたシステムまたは装置も、本発明の範疇に含まれる。
【０１２５】
また、本発明は、複数の機器から構成されるシステムに適用されてもよいし、単体の装置に適用されてもよい。さらに、本発明は、実施形態の機能を実現する秘密計算プログラムが、システムあるいは装置に直接あるいは遠隔から供給される場合にも適用可能である。したがって、本発明の機能をコンピュータで実現するために、コンピュータにインストールされるプログラム、あるいはそのプログラムを格納した媒体、そのプログラムをダウンロードさせるＷＷＷ(World Wide Web)サーバも、本発明の範疇に含まれる。特に、少なくとも、上述した実施形態に含まれる処理ステップをコンピュータに実行させるプログラムを格納した非一時的コンピュータ可読媒体（non-transitory computer readable medium）は本発明の範疇に含まれる。
【０１２６】
この出願は、２０１６年９月３０日に出願された日本国特許出願  特願２０１６−１９３０９４号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【図１】
2018061391.tif 000003
【図２】
2018061391.tif 000004
【図３】
2018061391.tif 000005
【図４】
2018061391.tif 000006
【図５】
2018061391.tif 000007
【図６】
2018061391.tif 000008
【図７】
2018061391.tif 000009
【図８】
2018061391.tif 000010
【図９】
2018061391.tif 000011
【図１０Ａ】
2018061391.tif 000012
【図１０Ｂ】
2018061391.tif 000013
【図１１】
2018061391.tif 000014
【図１２】
2018061391.tif 000015
【図１３】
2018061391.tif 000016
【図１４】
2018061391.tif 000017
【国際調査報告】
2018061391.tif 000018
2018061391.tif 000019
2018061391.tif 000020
2018061391.tif 000021