(57)【特許請求の範囲】
【請求項１】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、[a]をデータaの加法的秘密分散によるシェアとし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
３台以上の秘密計算装置を含む秘密計算システムが実行する、データaのシェア[a]からデータaを秘匿したままデータaのν乗のシェア[aν]を計算する秘密計算方法であって、
上記秘密計算装置のローカル演算部が、他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算し、
上記秘密計算装置の秘密計算部が、他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果[a(t*p^u)]である乗算を計算して、上記シェア[aν]を求める、
秘密計算方法。
【請求項２】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、rを拡大体GF(pk)の元である乱数とし、[a]をデータaの加法的秘密分散によるシェアとし、<a>:=([a], [ra])をデータaのランダム化分散値とし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
３台以上の秘密計算装置を含む秘密計算システムが実行する、データaのランダム化分散値<a>からデータaを秘匿したままデータaのν乗のランダム化分散値<aν>:=([aν], [raν])を計算する秘密計算方法であって、
上記秘密計算装置のローカル演算部が、他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算し、
上記秘密計算装置のランダム化部が、他の秘密計算装置との通信を要する秘密計算により、上記ローカル演算部の計算結果[a(t*p^u)]と上記乱数rのシェア[r]との乗算を計算して、上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>:=([a(t*p^u)], [ra(t*p^u)])を求め、
上記秘密計算装置の秘密計算部が、他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>である乗算を計算して、上記ランダム化分散値<aν>を求める、
秘密計算方法。
【請求項３】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、[a]をデータaの加法的秘密分散によるシェアとし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
３台以上の秘密計算装置を含み、データaのシェア[a]からデータaを秘匿したままデータaのν乗のシェア[aν]を計算する秘密計算システムであって、
上記秘密計算装置は、
他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算するローカル演算部と、
他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果[a(t*p^u)]である乗算を計算して、上記シェア[aν]を求める秘密計算部と、
を含む秘密計算システム。
【請求項４】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、rを拡大体GF(pk)の元である乱数とし、[a]をデータaの加法的秘密分散によるシェアとし、<a>:=([a], [ra])をデータaのランダム化分散値とし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
３台以上の秘密計算装置を含み、データaのランダム化分散値<a>からデータaを秘匿したままデータaのν乗のランダム化分散値<aν>:=([aν], [raν])を計算する秘密計算システムであって、
上記秘密計算装置は、
他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算するローカル演算部と、
他の秘密計算装置との通信を要する秘密計算により、上記ローカル演算部の計算結果[a(t*p^u)]と上記乱数rのシェア[r]との乗算を計算して、上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>:=([a(t*p^u)], [ra(t*p^u)])を求めるランダム化部と、
他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>である乗算を計算して、上記ランダム化分散値<aν>を求める秘密計算部と、
を含む秘密計算システム。
【請求項５】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、[a]をデータaの加法的秘密分散によるシェアとし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
データaのシェア[a]からデータaを秘匿したままデータaのν乗のシェア[aν]を計算する秘密計算システムに含まれる秘密計算装置であって、
他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算するローカル演算部と、
他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果[a(t*p^u)]である乗算を計算して、上記シェア[aν]を求める秘密計算部と、
を含む秘密計算装置。
【請求項６】
GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、rを拡大体GF(pk)の元である乱数とし、[a]をデータaの加法的秘密分散によるシェアとし、<a>:=([a], [ra])をデータaのランダム化分散値とし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、
データaのランダム化分散値<a>からデータaを秘匿したままデータaのν乗のランダム化分散値<aν>:=([aν], [raν])を計算する秘密計算システムに含まれる秘密計算装置であって、
他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算するローカル演算部と、
他の秘密計算装置との通信を要する秘密計算により、上記ローカル演算部の計算結果[a(t*p^u)]と上記乱数rのシェア[r]との乗算を計算して、上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>:=([a(t*p^u)], [ra(t*p^u)])を求めるランダム化部と、
他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数が上記ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>である乗算を計算して、上記ランダム化分散値<aν>を求める秘密計算部と、
を含む秘密計算装置。
【請求項７】
請求項５または６に記載の秘密計算装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、秘密計算技術に関し、特に、データを秘匿したまま、そのべき乗を計算する技術に関する。
【背景技術】
【０００２】
機微なデータを共有して分析するために、データを秘匿したまま分析する秘密計算技術が研究されている。その一種に、データをシェアと呼ばれる複数の断片に分割する秘密分散と呼ばれる手法を用いた秘密計算方法がある。データを秘匿したまま様々な分析を行うために、秘匿したデータの乗算や加算、ソートなどの演算を行うプロトコルが提案されている（例えば、非特許文献１や非特許文献２参照）。【０００３】
データを秘匿したままべき乗を行うことを考える。あるデータaが秘匿されている状態を[a]と書くとすると、べき乗を計算したい場合（例えば、[a]から[a9]を計算したい場合）は、通常バイナリ法などが用いられる。バイナリ法は乗算を繰り返し用いて所望のべき乗を行う手法である。乗算を行う手続きをMultと書くとすると、バイナリ法では、以下のようにして[a9]を計算する。【０００４】
1. [a2]←Mult([a], [a])
2. [a4]←Mult([a2], [a2])
3. [a8]←Mult([a4], [a4])
4. [a9]←Mult([a8], [a])
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】Dai Ikarashi, Ryo Kikuchi, Koki Hamada, and Koji Chida, "Actively private and correct MPC scheme in t<n/2 from passively secure schemes with small overhead", IACR Cryptology ePrint Archive, vol. 2014, p. 304, 2014.
【非特許文献２】Toshinori Araki, Jun Furukawa, Yehuda Lindell, Ariel Nof, and Kazuma Ohara. "High-Throughput Semi-Honest Secure Three-Party Computation with an Honest Majority", ACM CCS 2016.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
バイナリ法でべき乗を行うと、m乗を行うためにO(log m)回の乗算が必要である。秘密計算では乗算に通信が必要となりパフォーマンスのボトルネックとなるため、より少ない乗算の呼び出し回数でべき乗を行えることが望ましい。【０００７】
この発明の目的は、上述のような技術的課題を鑑みて、データを秘匿したまま少ない通信回数でべき乗計算を行うことができる秘密計算技術を提供することである。
【課題を解決するための手段】
【０００８】
上記の課題を解決するために、この発明の第一の態様の秘密計算方法は、GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、[a]をデータaの加法的秘密分散によるシェアとし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、３台以上の秘密計算装置を含む秘密計算システムが実行する、データaのシェア[a]からデータaを秘匿したままデータaのν乗のシェア[aν]を計算する秘密計算方法であって、秘密計算装置のローカル演算部が、他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算し、秘密計算装置の秘密計算部が、他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数がローカル演算部の計算結果[a(t*p^u)]である乗算を計算して、シェア[aν]を求める。【０００９】
この発明の第二の態様の秘密計算方法は、GF(pk)を標数pかつ拡大次数kの拡大体とし、aを拡大体GF(pk)の元であるデータとし、rを拡大体GF(pk)の元である乱数とし、[a]をデータaの加法的秘密分散によるシェアとし、<a>:=([a], [ra])をデータaのランダム化分散値とし、νを２以上の整数とし、u, tをt*pu≦νとなる１以上の整数とし、３台以上の秘密計算装置を含む秘密計算システムが実行する、データaのランダム化分散値<a>からデータaを秘匿したままデータaのν乗のランダム化分散値<aν>:=([aν], [raν])を計算する秘密計算方法であって、秘密計算装置のローカル演算部が、他の秘密計算装置と通信せずに、データaのt乗のシェア[at]のpu乗を計算し、秘密計算装置のランダム化部が、他の秘密計算装置との通信を要する秘密計算により、ローカル演算部の計算結果[a(t*p^u)]と乱数rのシェア[r]との乗算を計算して、ローカル演算部の計算結果のランダム化分散値<a(t*p^u)>:=([a(t*p^u)], [ra(t*p^u)])を求め、秘密計算装置の秘密計算部が、他の秘密計算装置との通信を要する秘密計算により、少なくとも一方の数がローカル演算部の計算結果のランダム化分散値<a(t*p^u)>である乗算を計算して、ランダム化分散値<aν>を求める。
【発明の効果】
【００１０】
この発明によれば、データを秘匿したままべき乗計算を行う際に一部の演算をローカルで行うため、少ない通信回数で高速にべき乗計算を行うことができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、第一実施形態の秘密計算システムの機能構成を例示する図である。
【図２】図２は、第一実施形態の秘密計算装置の機能構成を例示する図である。
【図３】図３は、第一実施形態の秘密計算方法の処理手続きを例示する図である。
【図４】図４は、第二実施形態の秘密計算システムの機能構成を例示する図である。
【図５】図５は、第二実施形態の秘密計算装置の機能構成を例示する図である。
【図６】図６は、第二実施形態の秘密計算方法の処理手続きを例示する図である。
【発明を実施するための形態】
【００１２】
以下、この発明の実施の形態について詳細に説明する。なお、図面中において同じ機能を有する構成部には同じ番号を付し、重複説明を省略する。
【００１３】
＜表記方法＞
上付き添え字はべき乗を表し、上付き添え字における^はべき乗を表す。すなわち、abはaのb乗を表し、ab^cはaのbc乗を表す。
【００１４】
あるデータaを暗号化や秘密分散などにより秘匿化したデータをaの秘匿文と呼び、[a]と表記する。また、aを[a]の平文と呼ぶ。秘匿化が秘密分散である場合、[a]をデータaのシェアまたは分散値と呼ぶこともある。
【００１５】
データaのランダム化分散値を<a>と表記する。ランダム化分散値とは、データaのシェア[a]と、データaと乱数rとの積算値raのシェア[ra]との組である。したがって、データaのランダム化分散値<a>は、<a>:=([a], [ra])と定義できる。ランダム化分散値<a>:=([a], [ra])のうち、[a]を第０成分と呼び、[ra]を第１成分と呼ぶ。ランダム化分散値による改ざん検知対応については、非特許文献１を参照されたい。
【００１６】
データやシェアの属する体をGF(pk)とし、これ以降、演算は全てGF(pk)上で行われるものとする。pは標数と呼び、kは拡大次数と呼ぶ。例えば、a, b∈GF(7)ならば、a+bはaとbを足し合わせてmod 7を取ったものである。a, b∈GF(28)ならば、a+bはaとbをビット表現した際のビット毎の排他的論理和である。
【００１７】
＜加法的秘密分散＞
加法的秘密分散とは、データaを次式のように、複数のシェアai（i=0, 1, …, m-1）の和および差に分割し、分散および復元が加減算のみで構成される秘密分散方法である。
【００１８】
【数１】
0006732959.tif 000002
【００１９】
加法的秘密分散では、いくつかのサーバが集まり、m個のシェアa0, a1, …, am-1すべてが得られれば元のデータaが復元でき、シェアa0, a1, …, am-1のうち一つでも得られないものがあれば元のデータaを復元することができない。
【００２０】
＜複製秘密分散＞
加法的秘密分散として、下記に示すプロトコルShareおよびRecからなる複製秘密分散を用いることができる。なお、Shareプロトコルは平文をシェアに分散するプロトコルであり、Recプロトコルはシェアから平文を復元するプロトコルである。ただし、この発明では加法的秘密分散の性質を有していれば複製秘密分散でなくても用いることができる。
【００２１】
データaのシェア全体を[a]とし、シェア[a]のうちサーバiが持つシェアを[a]iと書くものとする。データaを３台のサーバ0, 1, 2に分散する際には、下記のShareプロトコルに従って、データaをあらかじめa0, a1, a2に分割し、サーバ0, 1, 2にそれぞれ[a]0:=(a0,a1), [a]1:=(a1, a2), [a]2:=(a2, a0)を保存する。データaを復元する際には、下記のRecプロトコルに従って、シェア[a]0, [a]1, [a]2のうち少なくとも２つを集めてa0, a1, a2を取得し、それらを加算してデータaを計算する。
【００２２】
Shareプロトコルは、例えば、以下のようなプロトコルである。
【００２３】
Input: a
Output: ([a]0, [a]1, [a]2)
1. a1, a2←GF(pk)
2. a0:=a-(a1+a2)
3. [a]i:=(ai, ai+1 mod 3) for i∈{0, 1, 2}
4. return ([a]0, [a]1, [a]2)
【００２４】
Recプロトコルは、例えば、以下のようなプロトコルである。
【００２５】
Input: [a]i0, [a]i1 (i0, i1∈{0, 1, 2})
Output: a
1. Obtain a0, a1, a2from [a]i0, [a]i1
2. return a:=a0+a1+a2
【００２６】
＜複製秘密分散の変形＞
複製秘密分散の変形として、以下のような秘密分散も用いることができる。
【００２７】
Shareプロトコルは、例えば、以下のようなプロトコルである。
【００２８】
Input: a
Output: ([a]0, [a]1, [a]2)
1. a1, a2←GF(pk)
2. a0:=-(a1+a2)
3. [a]i:=(ai, ai-1 mod 3- a) for i∈{0, 1, 2}
4. return ([a]0, [a]1, [a]2)
【００２９】
Recプロトコルは、例えば、以下のようなプロトコルである。
【００３０】
Input: [a]i0, [a]i1 (i0, i1∈{0, 1, 2})
Output: a
1. Obtain ai mod 3, ai+1 mod 3, (ai+2 mod 3-a) from [a]i0, [a]i1 for some i ∈{0, 1, 2}
2. return a:=-(a0+a1+a2)
【００３１】
＜演算の定義＞
Multは、加法的秘密分散の乗算を表す。すなわち、３台のサーバ0, 1, 2にそれぞれ加法的秘密分散のシェアが2つずつ([a]0, [b]0), ([a]1, [b]1), ([a]2, [b]2)保存されているとき、互いに通信および計算を行い、最終的にサーバ0, 1, 2がそれぞれ[ab]0, [ab]1, [ab]2を得るプロトコルである。また、このような演算を[ab]←Mult([a], [b])と表記する。Multは、公知の秘密計算による乗算プロトコルを用いることができ、例えば、複製秘密分散に対しては非特許文献１のScheme 11に記載されたプロトコル、複製秘密分散の変形には非特許文献２のプロトコルなどを用いればよい。以下の実施形態では、Multとして非特許文献１のScheme 11を用いることとする。このとき通信ラウンドはMultを呼び出すたびに１回である。
【００３２】
LocalExpは、各サーバが自身の所有するシェアをべき乗する演算を表す。すなわち、サーバ0, 1, 2にそれぞれ[a]0=(a0, a1), [a]1=(a1, a2), [a]2=(a2, a0)が保存されているとき、サーバ0, 1, 2がそれぞれ[au]0=(au0, au1), [au]1=(au1, au2), [au]2=(au2,au0)を計算するプロトコルである。また、このような演算を[au]:=LocalExp([a], u)と書く。LocalExpは、ローカルに保持している値のべき乗を計算するだけであるため、他のサーバとの通信は発生しない。
【００３３】
DoubleMultは、秘匿文の２つの組を入力とし、各秘匿文同士を乗算した結果の秘匿文を得る演算を表す。すなわち、([a], [a'])と([b], [b'])とを入力とし、([ab], [a'b'])を出力するプロトコルである。また、このような演算を([ab], [a'b'])←DoubleMult(([a],[a']), ([b], [b']))と書く。DoubleMultは、任意の公知のプロトコルを用いることができ、例えば、非特許文献１にこのようなプロトコルが記載されている。このとき通信ラウンドはDoubleMultを呼び出すたびに１回である。また、Multを２回行うことで実現することも可能である。すなわち、[ab]←Mult([a], [b]), [a'b']←Mult([a'], [b'])を計算してもよい。このとき２回のMultは並列で実行できるため、通信ラウンドはDoubleMultと同様に１回である。
【００３４】
＜発明の原理＞
この発明では、フロベニウス自己準同型という性質を利用する。これは、任意のu∈Z（ただし、Zは整数の集合）に対し、GF(pu)上で次式の関係が成り立つことである。
【００３５】
【数２】
0006732959.tif 000003
【００３６】
ここでは簡単のため、
【００３７】
【数３】
0006732959.tif 000004
【００３８】
とするが、
【００３９】
【数４】
0006732959.tif 000005
【００４０】
のように符号のプラスマイナスが任意であっても成立する。
【００４１】
この関係を加法的秘密分散の平文とシェアとの関係（a=a0+a1+…+am-1）に適用すると、次式の関係が成り立つ。
【００４２】
【数５】
0006732959.tif 000006
【００４３】
式（１）の左辺は平文aの「標数べきのべき乗」であり、右辺は平文aのシェアa0, a1, …, am-1の「標数べきのべき乗」の和である。ここで、a':=ap^uと定義し、i=0, …, m-1についてa'i:=aip^uと定義すれば、式（１）にて加法的秘密分散の平文とシェアの関係（a'=a'0+a'1+…+a'm-1）が成り立っていることがわかる。すなわち、[a]から[ap^u]を計算するときは、各パーティが自身のシェアをpu乗すればよく、一切の通信を必要としない。
【００４４】
この手法を用いることで、任意の数のべき乗についても高速化が可能である。例えば、GF(28)で[a]から[a96]を計算したい場合、下記のように[a64]=[a2^6]と[a32]=[a2^5]をローカルで計算し、Mult([a64], [a32])を行えば[a96]が得られる。これに必要な通信回数はMult演算の１回である。
【００４５】
1. [a64]:=LocalExp([a], 26)
2. [a32]:=LocalExp([a], 25)
3. [a96]←Mult([a64], [a32])
【００４６】
一方、従来のバイナリ法では、以下のようにMult演算を７回行うため、大幅な高速化になっている。
【００４７】
1. [a2]←Mult([a], [a])
2. [a4]←Mult([a2], [a2])
3. [a8]←Mult([a4], [a4])
4. [a16]←Mult([a8], [a8])
5. [a32]←Mult([a16], [a16])
6. [a64]←Mult([a32], [a32])
7. [a96]←Mult([a64], [a32])
【００４８】
＜改ざん検知対応＞
加法的秘密分散によるシェア[a]から標数べきのべき乗[ap^u]を計算するときは、各パーティが自身のシェアをpu乗すればよいことを確認した。しかしながら、秘密計算において改ざんを行おうとする攻撃者を想定し、非特許文献１に記載された改ざん検知対応の手法を用いた場合、各パーティが持つシェアは、加法的秘密分散のシェア[a]とランダム化シェア[ra]との組であるランダム化分散値<a>:=([a], [ra])となる。また、それとは別に、乱数を加法的秘密分散で分散したシェア[r]も持つことになる。
【００４９】
改ざんを行おうとする攻撃者を想定した際の標数べきのべき乗の入出力は、入力が<a>:=([a], [ra])であり、出力が<ap^u>:=([ap^u], [rap^u])である。上述の標数べきのべき乗を素直にランダム化シェア[ra]に適用してしまうと、第１成分が[rap^u]ではなく[(ra)p^u]=[rp^uap^u]となってしまい、所望の出力が得られない。そのため、ランダム化シェア[ra]には標数べきのべき乗を行わず、[a]に対して標数べきのべき乗を行い、[ap^u]を得た後に[r]を乗じて[rap^u]を求める。すなわち、<a>=([a], [ra])から<ap^u>=([ap^u],[rap^u])を求めるときは、[a]をpu乗して[ap^u]を求めた後に、Mult([ap^u], [r])を行い、[rap^u]を得る。
【００５０】
＜第一実施形態＞
第一実施形態の秘密計算システムは、図１に例示するように、n（≧3）台の秘密計算装置１1, …, １nを含む。秘密計算装置１1, …, １nはそれぞれ通信網３へ接続される。通信網３は、秘密計算装置１1, …, １nがそれぞれと通信可能なように構成された回線交換方式もしくはパケット交換方式の通信網であり、例えばインターネットやLAN（Local Area Network）、WAN（Wide Area Network）などを用いることができる。なお、各装置は必ずしも通信網３を介してオンラインで通信可能である必要はない。例えば、秘密計算装置１i（i∈{1, …, n}）へ入力する情報を磁気テープやUSBメモリなどの可搬型記録媒体に記憶し、その可搬型記録媒体からオフラインで入力するように構成してもよい。
【００５１】
秘密計算装置１は、図２に例示するように、入力部１１、ローカル演算部１２、秘密計算部１４、および出力部１５を含む。この秘密計算装置１が、他の秘密計算装置１と協調して図３に例示する各ステップの処理を行うことにより第一実施形態の秘密計算方法が実現される。
【００５２】
秘密計算装置１は、例えば、中央演算処理装置（CPU: Central Processing Unit）、主記憶装置（RAM: Random Access Memory）などを有する公知又は専用のコンピュータに特別なプログラムが読み込まれて構成された特別な装置である。秘密計算装置１は、例えば、中央演算処理装置の制御のもとで各処理を実行する。秘密計算装置１に入力されたデータや各処理で得られたデータは、例えば、主記憶装置に格納され、主記憶装置に格納されたデータは必要に応じて中央演算処理装置へ読み出されて他の処理に利用される。秘密計算装置１の各処理部は、少なくとも一部が集積回路等のハードウェアによって構成されていてもよい。
【００５３】
以下、図３を参照して、第一実施形態の秘密計算方法の処理手続きを説明する。
【００５４】
ステップＳ１１において、入力部１１へ、演算対象のデータaの加法的秘密分散によるシェア[a]と、データaをべき乗する際の指数ν（≧2）とが入力される。シェア[a]および指数νはローカル演算部１２へ送られる。
【００５５】
ステップＳ１２において、ローカル演算部１２は、他の秘密計算装置と通信を行わずに、データaのt乗の加法的秘密分散のシェア[at]の標数べきのべき乗puを計算し、データatのpu乗の加法的秘密分散によるシェア[at*p^u]を求める。すなわち、[at*p^u]:=LocalExp([at], pu)を計算する。ここで、u, tはt*pu≦νとなる１以上の整数である。ローカル演算部１２は、データaのν乗の加法的秘密分散によるシェア[aν]を求めるために複数回実行されることがあるが、少なくとも１回目の実行時には、t=1となり、データaの加法的秘密分散によるシェア[a]のpu乗を計算する。
【００５６】
ステップＳ１３において、秘密計算部１４は、秘密計算により他の秘密計算装置と協調して、データaのα乗の加法的秘密分散のシェア[aα]とデータaのβ乗の加法的秘密分散のシェア[aβ]との乗算を計算する。すなわち、[aα+β]←Mult([aα], [aβ])を計算する。ここで、α, βはα+β≦νとなる１以上の整数である。[aα]および[aβ]のいずれかは、ローカル演算部１２により求めたデータatのpu乗の加法的秘密分散によるシェア[at*p^u]である。すなわち、α=t*puもしくはβ=t*puである。秘密計算部１４は、データaのν乗の加法的秘密分散によるシェア[aν]を求めるために複数回実行されることがある。
【００５７】
ステップＳ１４において、出力部１５は、ローカル演算部１２または秘密計算部１４の計算結果がデータaのν乗の加法的秘密分散によるシェア[aν]となったら、そのシェア[aν]を出力する。
【００５８】
＜第二実施形態＞
第二実施形態は、秘密計算によるべき乗計算において、改ざん検知を可能とする秘密計算システムである。第二実施形態の秘密計算システムは、図４に例示するように、n（≧3）台の秘密計算装置２1, …, ２nを含む。
【００５９】
秘密計算装置２は、図５に例示するように、入力部１１、ローカル演算部１２、ランダム化部１３、秘密計算部１４、および出力部１５を含む。この秘密計算装置２が、他の秘密計算装置２と協調して図６に例示する各ステップの処理を行うことにより第二実施形態の秘密計算方法が実現される。
【００６０】
以下、図６を参照して、第二実施形態の秘密計算方法の処理手続きを説明する。
【００６１】
ステップＳ２１において、入力部１１へ、演算対象のデータaの加法的秘密分散によるランダム化分散値<a>:=([a], [ra])と、ランダム化分散値<a>を生成する際に用いた乱数rの加法的秘密分散によるシェア[r]と、データaをべき乗する際の指数νとが入力される。ランダム化分散値<a>、シェア[r]、および指数νはローカル演算部１２へ送られる。
【００６２】
ステップＳ２２において、ローカル演算部１２は、他の秘密計算装置と通信を行わずに、データaのt乗の加法的秘密分散のシェア[at]の標数べきのべき乗puを計算し、データatのpu乗の加法的秘密分散によるシェア[at*p^u]を求める。すなわち、[at*p^u]:=LocalExp([at], pu)を計算する。シェア[at*p^u]はランダム化部１３へ送られる。
【００６３】
ステップＳ２３において、ランダム化部１３は、秘密計算により他の秘密計算装置と協調して、ローカル演算部１２の計算結果[a(t*p^u)]と乱数rの加法的秘密分散によるシェア[r]との乗算を計算する。すなわち、[ra(t*p^u)]←Mult([a(t*p^u)], [r])を計算する。これにより、データatのpu乗のランダム化分散値<a(t*p^u)>:=([a(t*p^u)], [ra(t*p^u)])を生成することができる。また、ランダム化部１３は、ローカル演算部１２の計算結果[a(t*p^u)]と他のランダム化分散値<as>:=([as], [ras])の第１成分[ras]との乗算を計算してもよい。すなわち、[ra(t*p^u)+s]←Mult([a(t*p^u)], [ras])を計算してもよい。ここで、sはt*pu+s≦νとなる１以上の整数である。このとき同時に、秘密計算部１４がローカル演算部１２の計算結果[a(t*p^u)+s]と他のランダム化分散値<as>:=([as], [ras])の第０成分[as]との乗算[a(t*p^u)+s]←Mult([a(t*p^u)], [as])を計算することで、データatのpu乗とデータasとの乗算のランダム化分散値<a(t*p^u)+s>:=([a(t*p^u)+s], [ra(t*p^u)+s])を生成することができる。
【００６４】
ステップＳ２４において、秘密計算部１４は、秘密計算により他の秘密計算装置と協調して、データaのα乗の加法的秘密分散のランダム化分散値<aα>:=([aα], [raα])とデータaのβ乗の加法的秘密分散のランダム化分散値<aβ>:=([aβ], [raβ])との乗算を計算する。この乗算には、上記のDoubleMultを用いることができる。すなわち、<aα+β>←DoubleMult(([aα], [aα]), ([aβ], [raβ]))を計算する。また、上記のMultを２回並列で実行してもよい。すなわち、[aα+β]←Mult([aα], [aβ])と、[raα+β]←Mult([aα], [raβ])とを計算し、[aα+β]と[raα+β]とを組み合わせて<aα+β>:=([aα+β], [raα+β])を生成する。<aα>および<aβ>のいずれかは、ランダム化部１３により求めたデータatのpu乗の加法的秘密分散によるランダム化分散値<at*p^u>である。すなわち、α=t*puもしくはβ=t*puである。秘密計算部１４は、データaのν乗の加法的秘密分散によるランダム化分散値<aν>を求めるために複数回実行されることがある。
【００６５】
ステップＳ２５において、出力部１５は、ランダム化部１３または秘密計算部１４の計算結果がデータaのν乗の加法的秘密分散によるランダム化分散値<aν>となったら、そのランダム化分散値<aν>を出力する。
【００６６】
＜具体例＞
以下、上述の実施形態により実現される具体的なプロトコルを示す。以下の具体例は３パーティによる秘密計算を想定しているが、この発明の秘密計算技術は３パーティの秘密計算に限られるものではない。また、以下の具体例では、GF(28)およびGF(33)の例を示すが、標数は2, 3に限られるものではなく、拡大次数は8, 3に限られるものではない。
【００６７】
第一の具体例は、体GF(28)上の秘密計算において、べき乗を行うプロトコルである。ここでは、[a]から[a21]を計算するプロトコルを示す。
【００６８】
Input: [a]
Output: [a21]
1. [a16]:=LocalExp([a], 24)
2. [a4]:=LocalExp([a], 22)
3. [a20]←Mult([a16], [a4])
4. [a21]←Mult([a20], [a1])
5. return [a21]
【００６９】
上記のプロトコルではMultが２回であり、通信ラウンド数は２である。一方、[a21]をバイナリ法で計算した場合、下記のプロトコルのとおり、Multが６回必要であり、通信ラウンド数が大幅に削減できていることがわかる。
【００７０】
Input: [a]
Output: [a21]
1. [a2]←Mult([a], [a])
2. [a4]←Mult([a2], [a2])
3. [a5]←Mult([a4], [a])
4. [a10]←Mult([a5], [a5])
5. [a20]←Mult([a10], [a10])
6. [a21]←Mult([a20], [a])
7. return [a21]
【００７１】
第二の具体例は、体GF(28)上の秘密計算において、逆元を求めるプロトコルである。ここでは、[a]の逆元[a-1]を計算するプロトコルを示す。フェルマーの小定理により、[a-1]=[a254]であるから、逆元を求めることは254乗を計算することと同義である。
【００７２】
Input: [a]
Output: [a-1]=[a254]
1. [a2]:=LocalExp([a], 2)
2. [a3]←Mult([a2], [a])
3. [a12]:=LocalExp([a3], 22)
4. [a15]←Mult([a12], [a3])
5. [a14]←Mult([a12], [a2])
6. [a240]:=LocalExp([a15], 24)
7. [a254]←Mult([a240], [a14])
8. return [a254]
【００７３】
上記のプロトコルでは４行目と５行目を並列で実行できるため、通信ラウンド数は３である。一方、[a-1]をバイナリ法で計算した場合、下記のプロトコルのとおり、Multが13回必要であり、通信ラウンド数が大幅に削減できていることがわかる。
【００７４】
Input: [a]
Output: [a-1]=[a254]
1. [a2]←Mult([a], [a])
2. [a3]←Mult([a2], [a])
3. [a6]←Mult([a3], [a3])
4. [a7]←Mult([a6], [a])
5. [a14]←Mult([a7], [a7])
6. [a15]←Mult([a14], [a])
7. [a30]←Mult([a30], [a30])
8. [a31]←Mult([a30], [a])
9. [a62]←Mult([a32], [a32])
10. [a63]←Mult([a62], [a])
11. [a126]←Mult([a63], [a63])
12. [a127]←Mult([a126], [a])
13. [a254]←Mult([a127], [a127])
14. return [a254]
【００７５】
第三の具体例は、体GF(28)上の秘密計算におけるべき乗プロトコルを改ざん検知に対応したものである。ここでは、<a>=([a], [ra])から<a21>=([a21], [ra21])を計算するプロトコルを示す。下記のプロトコルでは、ランダム化シェアのべき乗を避けるために、ローカル演算の後に乱数の乗算をMultにより行っている。
【００７６】
Input: <a>=([a], [ra]), [r]
Output: <a21>=([a21], [ra21])
1. [a16]:=LocalExp([a], 24)
2. [a4]:=LocalExp([a], 22)
3. [ra4]←Mult([a4], [r])
4. ([a20], [ra20])←DoubleMult(([a16], [a16]), ([a4], [ra4]))
5. ([a21], [ra21])←DoubleMult(([a], [a]), ([a20], [ra20]))
6. return <a21>=([a21], [ra21])
【００７７】
第四の具体例は、体GF(28)上の秘密計算における逆元プロトコルを改ざん検知に対応したものである。ここでは、<a>=([a], [ra])の逆元<a-1>=<a254>=([a254], [ra254])を計算するプロトコルを示す。下記のプロトコルでは、ランダム化シェアのべき乗を避けるために、ローカル演算の後に乱数の乗算をMultにより行っている。
【００７８】
Input: <a>=([a], [ra]), [r]
Output: <a-1>=<a254>=([a254], [ra254])
1. [a2]:=LocalExp([a], 2)
2. [ra2]←Mult([a2], [r])
3. ([a3], [ra3])←DoubleMult(([a], [a]), ([a2], [ra2]))
4. [a12]:=LocalExp([a3], 22)
5. ([a15], [ra15])←DoubleMult(([a12], [a12]), ([a3], [ra3]))
6. ([a14], [ra14])←DoubleMult(([a12], [a12]), ([a2], [ra2]))
7. [a240]:=LocalExp([a15], 24)
8. ([a254], [ra254])←DoubleMult(([a240], [a240]), ([a14], [ra14]))
9. return <a254>=([a254], [ra254])
【００７９】
第五の具体例は、体GF(33)上の秘密計算において、べき乗を行うプロトコルである。ここでは、[a]から[a10]を計算するプロトコルを示す。
【００８０】
Input: [a]
Output: [a10]
1. [a9]:=LocalExp([a], 32)
2. [a10]←Mult([a9], [a])
3. return [a10]
【００８１】
上記のプロトコルではMultが１回であり、通信ラウンド数は１である。一方、[a10]をバイナリ法で計算した場合、下記のプロトコルのとおり、Multが４回必要であり、通信ラウンド数が大幅に削減できていることがわかる。
【００８２】
Input: [a]
Output: [a10]
1. [a2]←Mult([a], [a])
2. [a4]←Mult([a2], [a2])
3. [a5]←Mult([a4], [a])
4. [a10]←Mult([a5], [a5])
5. return [a10]
【００８３】
第六の具体例は、体GF(33)上の秘密計算において、逆元を求めるプロトコルである。ここでは、[a]の逆元[a-1]を計算するプロトコルを示す。フェルマーの小定理により、[a-1]=[a25]であるから、逆元を求めることは25乗を計算することと同義である。
【００８４】
Input: [a]
Output: [a-1]=[a25]
1. [a9]:=LocalExp([a], 32)
2. [a3]:=LocalExp([a], 3)
2. [a12]←Mult([a9], [a3])
4. [a24]←Mult([a12], [a12])
5. [a25]←Mult([a24], [a])
8. return [a25]
【００８５】
上記のプロトコルではMultが３回であり、並列で行うこともできないため、通信ラウンド数は３である。一方、[a-1]をバイナリ法で計算した場合、下記のプロトコルのとおり、Multが６回必要であり、通信ラウンド数が大幅に削減できていることがわかる。
【００８６】
Input: [a]
Output: [a-1]=[a25]
1. [a2]←Mult([a], [a])
2. [a3]←Mult([a2], [a])
3. [a6]←Mult([a3], [a3])
4. [a12]←Mult([a6], [a6])
5. [a24]←Mult([a12], [a12])
6. [a25]←Mult([a24], [a])
7. return [a25]
【００８７】
第七の具体例は、体GF(33)上の秘密計算におけるべき乗プロトコルを改ざん検知に対応したものである。ここでは、<a>=([a], [ra])から<a10>=([a10], [ra10])を計算するプロトコルを示す。下記のプロトコルでは、ランダム化シェアのべき乗を避けるために、ローカル演算の後に乱数の乗算をMultにより行っている。
【００８８】
Input: <a>=([a], [ra]), [r]
Output: <a10>=([a10], [ra10])
1. [a9]:=LocalExp([a], 32)
2. ([a10], [ra10])←DoubleMult(([a9], [a9]), ([a], [ra]))
3. return <a10>=([a10], [ra10])
【００８９】
第八の具体例は、体GF(33)上の秘密計算における逆元プロトコルを改ざん検知に対応したものである。ここでは、<a>=([a], [ra])の逆元<a-1>=<a25>=([a25], [ra25])を計算するプロトコルを示す。下記のプロトコルでは、ランダム化シェアのべき乗を避けるために、ローカル演算の後に乱数の乗算をMultにより行っている。
【００９０】
Input: <a>=([a], [ra]), [r]
Output: <a-1>=<a25>=([a25], [ra25])
1. [a9]:=LocalExp([a], 32)
2. [a3]:=LocalExp([a], 3)
3. [ra3]←Mult([a3], [r])
4. ([a12], [ra12])←DoubleMult(([a9], [a9]), ([a3], [ra3]))
5. ([a24], [ra24])←DoubleMult(([a12], [a12]), ([a12], [ra12]))
6. ([a25], [ra25])←DoubleMult(([a24], [a24]), ([a], [ra]))
7. return <a25>=([a25], [ra25])
【００９１】
この発明の秘密計算技術は、拡大体上の以下の関係式を利用して、標数べきのべき乗をローカルで実行することで、べき乗計算全体の通信回数を削減したことにより、データを秘匿したまま高速にべき乗を計算することが可能となる。また、この技術を応用することで、べき乗を用いる逆元計算も高速に行うことが可能となる。
【００９２】
【数６】
0006732959.tif 000007
【００９３】
以上、この発明の実施の形態について説明したが、具体的な構成は、これらの実施の形態に限られるものではなく、この発明の趣旨を逸脱しない範囲で適宜設計の変更等があっても、この発明に含まれることはいうまでもない。実施の形態において説明した各種の処理は、記載の順に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。
【００９４】
［プログラム、記録媒体］
上記実施形態で説明した各装置における各種の処理機能をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
【００９５】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【００９６】
また、このプログラムの流通は、例えば、そのプログラムを記録したDVD、CD-ROM等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００９７】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記録媒体に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるASP（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【００９８】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【図１】
0006732959.tif 000008
【図２】
0006732959.tif 000009
【図３】
0006732959.tif 000010
【図４】
0006732959.tif 000011
【図５】
0006732959.tif 000012
【図６】
0006732959.tif 000013