(57)【特許請求の範囲】
【請求項１】
複数の秘密計算装置を含む秘密集約関数計算システムであって、
Fは任意の環であり、mは２以上の整数であり、nkは１以上の整数であり、[k0], …, [knk-1]はキー属性k0, …, knk-1∈Fmを秘密分散したシェアであり、
上記秘密計算装置は、
上記シェア[k0], …, [knk-1]を用いて、復元すると上記キー属性k0, …, knk-1をビット分解して結合したビット列b:=b0, …, bm-1となるシェア{b}から、復元すると上記ビット列bを昇順に安定ソートする置換σ0となるシェア{{σ0}}を生成するグループソート生成部と、
上記シェア{b}と上記シェア{{σ0}}とを用いて、復元すると上記ビット列bを上記置換σ0でソートしたソート済みビット列b':=b'0, …, b'm-1となるシェア{b'}を生成するビット列ソート部と、
上記シェア{b'}を用いて、0以上m-2以下の各整数iについて{ei}:={b'i≠b'i+1}を設定し、かつ、{em-1}:={1}を設定して、復元するとフラグe:=e0, …, em-1となるシェア{e}を生成するフラグ生成部と、
上記シェア{e}を用いて、復元すると上記フラグeの否定¬eを昇順に安定ソートする置換σとなるシェア{{σ}}を生成するキー集約ソート生成部と、
を含む秘密集約関数計算システム。
【請求項２】
請求項１に記載の秘密集約関数計算システムであって、
naは１以上の整数であり、[v0], …, [vna-1]はバリュー属性v0, …, vna-1∈Fmを秘密分散したシェアであり、
上記秘密計算装置は、
上記シェア{e}を用いて、0以上m-1以下の各整数iおよび0以上nk-1以下の各整数jについて、{ei}={1}ならば[k"j,i]に[kj,i]を設定し、{ei}≠{1}ならば[k"j,i]に所定の固定値を設定して、復元すると重複排除済みキー属性k"0, …, k"nk-1となるシェア[k"0], …, [k"nk-1]を生成する重複排除部と、
上記シェア[k"0], …, [k"nk-1]と上記シェア{{σ0}}と上記シェア{{σ}}とを用いて、
復元すると上記重複排除済みキー属性k"0, …, k"nk-1を上記置換σ0と上記置換σとで順にソートしたソート済みキー属性k'0, …, k'nk-1となるシェア[k'0], …, [k'nk-1]を生成するキーソート部と、
上記シェア[v0], …, [vna-1]と上記シェア{{σ0}}とを用いて、復元すると上記バリュー属性v0, …, vna-1を上記置換σ0でソートしたソート済みバリュー属性v'0, …, v'na-1となるシェア[v'0], …, [v'na-1]を生成するバリューソート部と、
を含む秘密集約関数計算システム。
【請求項３】
Fは任意の環であり、mは２以上の整数であり、nkは１以上の整数であり、[k0], …, [knk-1]はキー属性k0, …, knk-1∈Fmを秘密分散したシェアであり、
上記シェア[k0], …, [knk-1]を用いて、復元すると上記キー属性k0, …, knk-1をビット分解して結合したビット列b:=b0, …, bm-1となるシェア{b}から、復元すると上記ビット列bを昇順に安定ソートする置換σ0となるシェア{{σ0}}を生成するグループソート生成部と、
上記シェア{b}と上記シェア{{σ0}}とを用いて、復元すると上記ビット列bを上記置換σ0でソートしたソート済みビット列b':=b'0, …, b'm-1となるシェア{b'}を生成するビット列ソート部と、
上記シェア{b'}を用いて、0以上m-2以下の各整数iについて{ei}:={b'i≠b'i+1}を設定し、かつ、{em-1}:={1}を設定して、復元するとフラグe:=e0, …, em-1となるシェア{e}を生成するフラグ生成部と、
上記シェア{e}を用いて、復元すると上記フラグeの否定¬eを昇順に安定ソートする置換σとなるシェア{{σ}}を生成するキー集約ソート生成部と、
を含む秘密計算装置。
【請求項４】
複数の秘密計算装置を含む秘密集約関数計算システムが実行する秘密集約関数計算方法であって、
Fは任意の環であり、mは２以上の整数であり、nkは１以上の整数であり、[k0], …, [knk-1]はキー属性k0, …, knk-1∈Fmを秘密分散したシェアであり、
上記秘密計算装置のグループソート生成部が、上記シェア[k0], …, [knk-1]を用いて、復元すると上記キー属性k0, …, knk-1をビット分解して結合したビット列b:=b0, …, bm-1となるシェア{b}から、復元すると上記ビット列bを昇順に安定ソートする置換σ0となるシェア{{σ0}}を生成し、
上記秘密計算装置のビット列ソート部が、上記シェア{b}と上記シェア{{σ0}}とを用いて、復元すると上記ビット列bを上記置換σ0でソートしたソート済みビット列b':=b'0, …, b'm-1となるシェア{b'}を生成し、
上記秘密計算装置のフラグ生成部が、上記シェア{b'}を用いて、0以上m-2以下の各整数iについて{ei}:={b'i≠b'i+1}を設定し、かつ、{em-1}:={1}を設定して、復元するとフラグe:=e0, …, em-1となるシェア{e}を生成し、
上記秘密計算装置のキー集約ソート生成部が、上記シェア{e}を用いて、復元すると上記フラグeの否定¬eを昇順に安定ソートする置換σとなるシェア{{σ}}を生成する、
秘密集約関数計算方法。
【請求項５】
請求項３に記載の秘密計算装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は秘密計算技術に関し、特に、秘匿性を保ったまま集約関数を計算する技術に関する。
【背景技術】
【０００２】
集約関数は、テーブルにキー属性とバリュー属性があるときに、キー属性の値に基づいてグループ分けした統計値を得る演算である。集約関数は、group-by演算とも呼ばれる。キー属性は、テーブルのレコードをグループ分けするために用いる属性であり、例えば、役職や性別などが挙げられる。バリュー属性は、統計値を計算するために用いる属性であり、例えば、給料や身長などが挙げられる。group-by演算は、例えば、キー属性が性別のときに、男女別の平均身長を求める演算などである。キー属性は複数の属性による複合キーであってもよく、例えば、キー属性が性別と年齢のときに、10代男性の平均身長、20代男性の平均身長、・・・を得るような演算であってもよい。非特許文献１には、group-by演算を秘密計算で行う方法が記載されている。【０００３】
group-by演算は、具体的には、group-byカウント、group-by総和、group-by最大値／最小値、group-by中央値、グループ内の順位などがある。group-byカウントは、クロス集計のことであり、テーブルをキー属性の値に基づいてグループ分けしたときに、各グループのレコード数を集計する演算である。group-by総和は、各グループにおける所望のバリュー属性の総和である。group-by最大値／最小値は、各グループにおける所望のバリュー属性の最大値／最小値である。group-by中央値は、各グループにおける所望のバリュー属性の中央値である。グループ内の順位は、各レコードのバリュー属性の値がグループ内で何番目の値であるかを取得する関数である。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】五十嵐大，千田浩司，濱田浩気，高橋克巳，“軽量検証可能３パーティ秘匿関数計算の効率化及びこれを用いたセキュアなデータベース処理”，２０１１年暗号と情報セキュリティシンポジウム
【発明の概要】
【発明が解決しようとする課題】
【０００５】
group-by演算では計算の過程で中間データを求めることがある。この中間データの中には、異なる種類のgroup-by演算の間で共通に求めるものがある。秘匿性を保ったまま複数のgroup-by演算を同時にまたは連続して計算すると、共通の中間データを求める処理が重複することで、計算量が増大する場合がある。【０００６】
この発明の目的は、上記のような技術的課題に鑑みて、秘匿性を保ったまま複数のgroup-by演算を同時にまたは連続して計算するときに、group-by演算で用いる中間データを効率的に求めることができる技術を提供することである。
【課題を解決するための手段】
【０００７】
上記の課題を解決するために、この発明の一態様の秘密集約関数計算システムは、複数の秘密計算装置を含む秘密集約関数計算システムであって、Fは任意の環であり、mは２以上の整数であり、nkは１以上の整数であり、[k0], …, [knk-1]はキー属性k0, …, knk-1∈Fmを秘密分散したシェアであり、秘密計算装置は、シェア[k0], …, [knk-1]を用いて、復元するとキー属性k0, …, knk-1をビット分解して結合したビット列b:=b0, …, bm-1となるシェア{b}から、復元するとビット列bを昇順に安定ソートする置換σ0となるシェア{{σ0}}を生成するグループソート生成部と、シェア{b}とシェア{{σ0}}とを用いて、復元するとビット列bを置換σ0でソートしたソート済みビット列b':=b'0, …, b'm-1となるシェア{b'}を生成するビット列ソート部と、シェア{b'}を用いて、0以上m-2以下の各整数iについて{ei}:={b'i≠b'i+1}を設定し、かつ、{em-1}:={1}を設定して、復元するとフラグe:=e0, …, em-1となるシェア{e}を生成するフラグ生成部と、シェア{e}を用いて、復元するとフラグeの否定¬eを昇順に安定ソートする置換σとなるシェア{{σ}}を生成するキー集約ソート生成部と、を含む。
【発明の効果】
【０００８】
この発明の秘密集約関数技術によれば、秘匿性を保ったままgroup-by演算で用いる中間データを効率的に求めることができる。その中間データを用いることで、複数のgroup-by演算を同時にまたは連続して計算するときに、全体の計算量を削減することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、秘密集約関数計算システムの機能構成を例示する図である。
【図２】図２は、秘密計算装置の機能構成を例示する図である。
【図３】図３は、秘密集約関数計算方法の処理手続きを例示する図である。
【発明を実施するための形態】
【００１０】
以下、この発明の実施の形態について詳細に説明する。なお、図面中において同じ機能を有する構成部には同じ番号を付し、重複説明を省略する。
【００１１】
[x]∈[F]は、ある値xが任意の環F上の秘密分散等により秘匿されていることを表す。{b}∈{B}は、１ビットのある値bが１ビットを表せる環B上の秘密分散等により秘匿されていることを表す。{{s}}∈{{Sm}}は、m個の要素の置換の集合Smに属するある置換sが秘密分散等により秘匿されていることを表す。以下、秘密分散された値を「シェア」とも呼ぶ。
【００１２】
実施形態中で用いる秘密計算におけるソート（安定ソートを含む）は、例えば、下記参考文献１に記載されたソートを用いることができる。置換sのシェア{{s}}については下記参考文献１に記載されたハイブリッド置換{{π}}を用いればよい。
【００１３】
〔参考文献１〕五十嵐大，濱田浩気，菊池亮，千田浩司，“超高速秘密計算ソートの設計と実装: 秘密計算がスクリプト言語に並ぶ日”，ＣＳＳ２０１７
【００１４】
＜実施形態＞
図１を参照して、実施形態の秘密集約関数計算システム１００の構成例を説明する。秘密集約関数計算システム１００は、N（≧2）台の秘密計算装置１1, …, １Nを含む。本形態では、秘密計算装置１1, …, １Nはそれぞれ通信網２へ接続される。通信網２は、接続される各装置が相互に通信可能なように構成された回線交換方式もしくはパケット交換方式の通信網であり、例えばインターネットやLAN（Local Area Network）、WAN（Wide Area Network）などを用いることができる。なお、各装置は必ずしも通信網２を介してオンラインで通信可能である必要はない。例えば、秘密計算装置１1, …, １Nへ入力する情報を磁気テープやUSBメモリなどの可搬型記録媒体に記憶し、その可搬型記録媒体から秘密計算装置１1, …, １Nへオフラインで入力するように構成してもよい。
【００１５】
図２を参照して、秘密集約関数計算システム１００に含まれる秘密計算装置１n（n=1, …, N）の構成例を説明する。秘密計算装置１nは、例えば、図２に示すように、入力部１０、ビット分解部１１、グループソート生成部１２、ビット列ソート部１３、フラグ生成部１４、キー集約ソート生成部１５、重複排除部１６、キーソート部１７、バリューソート部１８、および出力部１９を含む。この秘密計算装置１n（1≦n≦N）が他の秘密計算装置１n'（n'=1, …, N、ただしn≠n'）と協調しながら後述する各ステップの処理を行うことにより実施形態の秘密集約関数計算方法が実現される。
【００１６】
秘密計算装置１nは、例えば、中央演算処理装置（CPU: Central Processing Unit）、主記憶装置（RAM: Random Access Memory）などを有する公知又は専用のコンピュータに特別なプログラムが読み込まれて構成された特別な装置である。秘密計算装置１nは、例えば、中央演算処理装置の制御のもとで各処理を実行する。秘密計算装置１nに入力されたデータや各処理で得られたデータは、例えば、主記憶装置に格納され、主記憶装置に格納されたデータは必要に応じて中央演算処理装置へ読み出されて他の処理に利用される。秘密計算装置１nの各処理部は、少なくとも一部が集積回路等のハードウェアによって構成されていてもよい。
【００１７】
図３を参照して、実施形態の秘密集約関数計算システム１００が実行する秘密集約関数計算方法の処理手続きを説明する。
【００１８】
ステップＳ１０において、各秘密計算装置１nの入力部１０は、nk個のキー属性k0, …, knk-1∈Fmそれぞれを秘密分散により秘匿したシェア[k0], …, [knk-1]∈[F]mと、na個のバリュー属性v0, …, vna-1∈Fmそれぞれを秘密分散により秘匿したシェア[v0], …, [vna-1]∈[F]mとを入力として受け取る。ただし、nk, naは１以上の整数であり、mは２以上の整数である。以下、[kj]∈[F]m（j=0, …, nk-1）の各要素は、[kj,i]∈[F]（i=0, …, m-1）で参照することもある。また、[vh]∈[F]m（h=0, …, na-1）の各要素は、[vh,i]∈[F]（i=0, …, m-1）で参照することもある。入力部１０は、キー属性k0, …, knk-1のシェア[k0], …, [knk-1]をビット分解部１１と重複排除部１６へ出力する。また、入力部１０は、バリュー属性v0, …, vna-1のシェア[v0], …, [vna-1]をバリューソート部１８へ出力する。
【００１９】
ステップＳ１１において、各秘密計算装置１nのビット分解部１１は、キー属性k0, …, knk-1のシェア[k0], …, [knk-1]をビット分解して結合し、復元するとキー属性k0, …, knk-1のビット表現を結合したビット列b:=b0, …, bm-1∈Bλとなるシェア{b}∈{B}λを得る。ただし、λはビット列bのビット長であり、各bi（i=0, …, m-1）のビット長の総和である。言い替えると、{bi}は、キー属性k0, …, knk-1のシェア[k0], …, [knk-1]それぞれのi番目の要素[k0,i], …, [knk-1,i]のビット表現を結合したビット列である。ビット分解部１１は、ビット列bのシェア{b}をグループソート生成部１２へ出力する。
【００２０】
ステップＳ１２において、各秘密計算装置１nのグループソート生成部１２は、ビット列bのシェア{b}を用いて、復元するとビット列bを昇順で安定ソートするための置換σ0となるシェア{{σ0}}∈{{Sm}}を生成する。安定ソートとは、ソート演算のうち、同じ値の要素が存在した場合に、同じ値の要素同士の順序を保存する演算である。例えば、社員番号順でソートされたテーブルに対して性別で安定ソートすると、各性別の中で社員番号順が保たれているソート結果が得られる。ビット列bはキー属性k0, …, knk-1のビット表現を結合したものであるため、置換σ0はキー属性k0, …, knk-1の値が等しいレコードを連続するように並び替えてグループ分けする操作であるとも言える。グループソート生成部１２は、ビット列bのシェア{b}と置換σ0のシェア{{σ0}}とをビット列ソート部１３へ出力する。また、グループソート生成部１２は、置換σ0のシェア{{σ0}}をキーソート部１７とバリューソート部１８へ出力する。
【００２１】
ステップＳ１３において、各秘密計算装置１nのビット列ソート部１３は、ビット列bのシェア{b}と置換σ0のシェア{{σ0}}とを用いて、復元するとビット列bを置換σ0でソートしたソート済みビット列b':=b'0, …, b'm-1∈Bλとなるシェア{b'}∈{B}λを得る。ビット列ソート部１３は、ソート済みビット列b'のシェア{b'}をフラグ生成部１４へ出力する。
【００２２】
ステップＳ１４において、各秘密計算装置１nのフラグ生成部１４は、ソート済みビット列b'のシェア{b'}を用いて、0以上m-2以下の各整数iについて{ei}:={b'i≠b'i+1}を設定し、かつ、{em-1}:={1}を設定して、復元するとフラグe:=e0, …, em-1∈Bmとなるシェア{e}∈{B}mを生成する。フラグeiはソート済みビット列b'のi番目の要素b'iがi+1番目の要素b'i+1と異なる場合に真が設定されるため、各グループの最後の要素（すなわち、グループ間の境界の直前の要素）を示すフラグとなる。フラグ生成部１４は、フラグeのシェア{e}をキー集約ソート生成部１５と重複排除部１６と出力部１９へ出力する。
【００２３】
ステップＳ１５において、各秘密計算装置１nのキー集約ソート生成部１５は、まず、フラグeのシェア{e}を用いて、復元するとフラグeの否定¬eであるフラグe'となるシェア{e'}∈{B}mを生成する。すなわち、0以上m-1以下の各整数iについて{e'i}:={¬ei}を設定する。次に、キー集約ソート生成部１５は、フラグe'のシェア{e'}を用いて、復元するとフラグe'を昇順に安定ソートするための置換σとなるシェア{{σ}}∈{{Sm}}を生成する。キー集約ソート生成部１５は、置換σのシェア{{σ}}をキーソート部１７と出力部１９へ出力する。
【００２４】
ステップＳ１６において、各秘密計算装置１nの重複排除部１６は、フラグeのシェア{e}とキー属性k0, …, knk-1のシェア[k0], …, [knk-1]とを用いて、[k"j,i]:=[ei?kj,i:null]を設定し、復元すると重複排除済みキー属性k"0, …, k"nk-1となるシェア[k"0], …, [k"nk-1]を生成する。ここで、「?」は条件演算子（または三項演算子）である。すなわち、{ei}が真（例えば、{ei}={1}）のときは[k"j,i]:=[kj,i]を設定し、{ei}が偽（例えば、{ei}={0}）のときは[k"j,i]:=nullを設定する。{ei}={0}のときに設定する値はnullでなくともよく、キー属性k0, …, knk-1が取り得ない値であればどのような値でもよい。フラグeは各グループの最後の要素のみに真が設定されたフラグであるため、重複排除済みキー属性k"0, …, k"nk-1は、各グループの最後の要素に対応する要素のみキー属性の値が設定され、それ以外の要素はキー属性が取り得ない所定の値が設定されたベクトルとなる。重複排除部１６は、重複排除済みキー属性k"0, …, k"nk-1のシェア[k"0], …, [k"nk-1]をキーソート部１７へ出力する。
【００２５】
ステップＳ１７において、各秘密計算装置１nのキーソート部１７は、重複排除済みキー属性k"0, …, k"nk-1のシェア[k"0], …, [k"nk-1]と置換σ0のシェア{{σ0}}と置換σのシェア{{σ}}とを用いて、復元すると重複排除済みキー属性k"0, …, k"nk-1を置換σ0と置換σとで順にソートしたソート済みキー属性k'0, …, k'nk-1となるシェア[k'0], …, [k'nk-1]を生成する。キーソート部１７は、ソート済みキー属性k'0, …, k'nk-1のシェア[k'0], …, [k'nk-1]を出力部１９へ出力する。
【００２６】
ステップＳ１８において、各秘密計算装置１nのバリューソート部１８は、バリュー属性v0, …, vna-1のシェア[v0], …, [vna-1]と置換σ0のシェア{{σ0}}とを用いて、復元するとバリュー属性v0, …, vna-1を置換σ0でソートしたソート済みバリュー属性v'0, …, v'na-1となるシェア[v'0], …, [v'na-1]を生成する。バリューソート部１８は、ソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]を出力部１９へ出力する。
【００２７】
ステップＳ１９において、各秘密計算装置１nの出力部１９は、ソート済みキー属性k'0, …, k'nk-1のシェア[k'0], …, [k'nk-1]、ソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]、フラグeのシェア{e}、および置換σのシェア{{σ}}の少なくとも１つを出力する。出力部１９が出力すべき情報は、後に続いて計算する１つ以上のgroup-by演算で必要とされる中間データを満たすように選択する。
【００２８】
以下、秘密集約関数計算システム１００が出力する中間データを用いて、各種の集約関数を計算する具体的な手順を説明する。
【００２９】
≪group-byカウント≫
group-byカウントは、テーブルをキー属性の値に基づいてグループ分けしたときに、各グループのレコード数を集計する演算である。group-byカウントは、秘密集約関数計算システム１００が出力するフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、gは最大グループ数であり、キー属性が取り得る値の組み合わせの数、すなわち、キー属性が取り得る値の種類の数である。
【００３０】
第一に、フラグeのシェア{e}∈{B}mを任意の環F上の秘密分散によるシェア[e]∈[F]mに変換する。
【００３１】
第二に、フラグeのシェア[e]を用いて、0以上m-1以下の各整数iについて[xi]:=[ei?i+1:m]を設定し、復元するとベクトルx:=x0, …, xm-1∈Fとなるシェア[x]∈[F]mを生成する。ベクトルxは、テーブルをキー属性で安定ソートしたときに同じキー属性の値をもつレコードを同じグループとして、各グループの最後の要素には次の要素の先頭からの位置が設定され、その他の要素にはテーブル全体のレコード数が設定されたベクトルとなる。言い替えると、各グループの最後の要素には、先頭のグループからそのグループまでの各グループのレコード数を積み上げた合計値が設定されることになる。
【００３２】
第三に、ベクトルxのシェア[x]と置換σのシェア{{σ}}とを用いて、復元するとベクトルxを置換σでソートしたソート済みベクトルσ(x)となるシェア[σ(x)]∈[F]mを生成する。以下、[σ(x)]∈[F]mの各要素は、[σ(x)i]∈[F]（i=0, …, m-1）で参照することもある。
【００３３】
最後に、ソート済みベクトルσ(x)のシェア[σ(x)]を用いて、1以上min(g,m)-1以下の各整数iについて[ci]:=[σ(x)i-σ(x)i-1]を設定し、かつ、[c0]:=[σ(x)0]を設定して、復元すると各グループのレコード数を表すベクトルc:=c0, …, cmin(g,m)-1∈Fとなるシェア[c]∈[F]min(g,m)を生成する。ソート済みベクトルσ(x)のi番目の要素σ(x)iは、0番目からi番目までの各グループのレコード数を積み上げた合計値が設定されているため、ベクトルcのi番目の要素ciには、i番目のグループのレコード数が設定されることになる。なお、キー属性は秘匿されているため、min(g,m)はグループ数が取り得る最大値であり、実際のグループ数はmin(g,m)以下の各秘密計算装置１nには知り得ない値（以下、実際のグループ数をg'とする）となる。したがって、min(g,m)個のシェア[ci]の中で実際のグループ数を超えるもの（すなわち、i≧g'）には、復元後に有効な値と識別可能となる無効な値を設定しておく必要がある。本形態では、[ei]が偽のシェア[xi]もしくは[ei]が真のうち最後のシェア[xi]には[xi]=mを設定している。これにより、cg', …, cmin(g,m)-1にはσ(x)i-σ(x)i-1=m-m=0が設定される。レコードが存在するグループのカウント数は１以上であるため、０は有効な値と識別可能となる無効な値として成立している。
【００３４】
≪group-by総和≫
group-by総和は、テーブルをキー属性の値に基づいてグループ分けしたときに、グループごとに所望のバリュー属性の総和を集計する演算である。group-by総和を用いれば、グループごとに乗算の和を求めるgroup-by積和や、グループごとに二乗の和を求めるgroup-by二乗和も計算することができる。group-by積和であれば、各レコードのバリュー属性に乗算を施した結果に対してgroup-by総和を求めればよい。また、group-by二乗和であれば、同様に、各レコードのバリュー属性に二乗を施した結果に対してgroup-by総和を求めればよい。group-by総和は、秘密集約関数計算システム１００が出力するソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]とフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、vはソート済みバリュー属性v'0, …, v'na-1のうちgroup-by総和を求めたい所望のバリュー属性である。
【００３５】
第一に、バリュー属性vのシェア[v]を用いて、[v']:=prefix-sum([v])を計算し、復元するとベクトルv':=v'0, …, v'm-1∈Fとなるシェア[v']∈[F]mを生成する。prefix-sumは、mを入力ベクトルvの長さとして、0以上m-1以下の各整数iについて、出力ベクトルv'のi番目の要素v'iには入力ベクトルvの0番目の要素v0からi番目の要素viまでの値の総和を設定する演算である。
【００３６】
第二に、フラグeのシェア{e}∈{B}mを任意の環F上の秘密分散によるシェア[e]∈[F]mに変換する。
【００３７】
第三に、ベクトルv'のシェア[v']とフラグeのシェア[e]とを用いて、0以上m-1以下の各整数iについて[ti]:=[ei?v'i:v'm-1]を設定し、復元するとベクトルt:=t0, …, tm-1∈Fとなるシェア[t]∈[F]mを生成する。ベクトルtは、テーブルをキー属性で安定ソートしたときに同じキー属性の値をもつレコードを同じグループとして、各グループの最後の要素にはその要素以前のバリュー属性の値の総和が設定され、その他の要素にはテーブル全体のバリュー属性の値の総和が設定されたベクトルとなる。
【００３８】
第四に、ベクトルtのシェア[t]と置換σのシェア{{σ}}とを用いて、復元するとベクトルtを置換σでソートしたソート済みベクトルσ(t)となるシェア[σ(t)]∈[F]mを生成する。以下、[σ(t)]∈[F]mの各要素は、[σ(t)i]∈[F]（i=0, …, m-1）で参照することもある。
【００３９】
最後に、ソート済みベクトルσ(t)のシェア[σ(t)]を用いて、1以上min(g,m)-1以下の各整数iについて[si]:=[σ(t)i-σ(t)i-1]を設定し、かつ、[t0]:=[σ(t)0]を設定して、復元するとグループ毎のバリュー属性vの総和s:=s0, …, smin(g,m)-1∈Fとなるシェア[s]∈[F]min(g,m)を生成する。ソート済みベクトルσ(t)のi番目の要素σ(t)iは、0番目からi番目までの各グループに属するバリュー属性vの値の総和が設定されているため、ベクトルtのi番目の要素tiには、i番目のグループに属するバリュー属性vの値の総和が設定されることになる。
【００４０】
≪group-by最大値≫
group-by最大値は、テーブルをキー属性の値に基づいてグループ分けしたときに、グループごとに所望のバリュー属性の最大値を得る演算である。group-by最大値は、秘密集約関数計算システム１００が出力するソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]とフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、vはソート済みバリュー属性v'0, …, v'na-1のうちgroup-by最大値を求めたい所望のバリュー属性である。
【００４１】
第一に、フラグeのシェア{e}∈{B}mを任意の環F上の秘密分散によるシェア[e]∈[F]mに変換する。
【００４２】
第二に、バリュー属性vのシェア[v]とフラグeのシェア[e]とを用いて、0以上m-1以下の各整数iについて[fi]:=[ei?vi:0]を設定し、復元するとベクトルf:=f0, …, fm-1∈Fとなるシェア[f]∈[F]mを生成する。ベクトルfは、テーブルをキー属性で安定ソートしたときに同じキー属性の値をもつレコードを同じグループとして、各グループの最後の要素fiにはその要素に対応するバリュー属性の値viが設定され、その他の要素には０が設定されたベクトルとなる。すなわち、各グループの最大値と０とを要素としてもつベクトルとなる。
【００４３】
第三に、ベクトルfのシェア[f]と置換σのシェア{{σ}}とを用いて、復元するとベクトルfを置換σでソートしたソート済みベクトルσ(f)となるシェア[σ(f)]∈[F]mを生成する。以下、[σ(f)]∈[F]mの各要素は、[σ(f)i]∈[F]（i=0, …, m-1）で参照することもある。ソート済みベクトルσ(f)は、先頭からグループ数の要素にグループ毎にソートしたときの最後の要素の値（すなわち、各グループの最大値）が設定され、それ以降の要素に０が設定されたベクトルとなる。
【００４４】
最後に、ソート済みベクトルσ(f)のシェア[σ(f)]から、復元すると各グループの最大値を表すベクトルx:=σ(f)0, …, σ(f)min(g,m)-1となるシェア[x]∈[F]min(g,m)を生成する。
【００４５】
≪group-by最小値≫
group-by最小値は、テーブルをキー属性の値に基づいてグループ分けしたときに、グループごとに所望のバリュー属性の最小値を得る演算である。group-by最小値は、秘密集約関数計算システム１００が出力するソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]とフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、vはソート済みバリュー属性v'0, …, v'na-1のうちgroup-by最小値を求めたい所望のバリュー属性である。
【００４６】
第一に、フラグeのシェア{e}を用いて、1以上m-1以下の各整数iについて{e'i}:={ei-1}を設定し、かつ、{e'0}:={1}を設定して、復元するとフラグe':=e'0, …, e'm-1∈Bmとなるシェア{e'}∈{B}mを生成する。フラグe'は各グループの最後の要素を示すフラグeを一つずつ後方へシフトしたフラグであるため、各グループの最初の要素（すなわち、グループ間の境界の直後の要素）を示すフラグとなる。
【００４７】
第二に、フラグe'のシェア{e'}∈{B}mを任意の環F上の秘密分散によるシェア[e']∈[F]mに変換する。
【００４８】
第三に、バリュー属性vのシェア[v]とフラグe'のシェア[e']とを用いて、0以上m-1以下の各整数iについて[f'i]:=[e'i?vi:0]を設定し、復元するとベクトルf':=f'0, …, f'm-1∈Fとなるシェア[f']∈[F]mを生成する。ベクトルf'は、テーブルをキー属性で安定ソートしたときに同じキー属性の値をもつレコードを同じグループとして、各グループの最初の要素f'iにはその要素に対応するバリュー属性の値viが設定され、その他の要素には０が設定されたベクトルとなる。すなわち、各グループの最小値と０とを要素としてもつベクトルとなる。
【００４９】
第四に、ベクトルf'のシェア[f']と置換σのシェア{{σ}}とを用いて、復元するとベクトルf'を置換σでソートしたソート済みベクトルσ(f')となるシェア[σ(f')]∈[F]mを生成する。以下、[σ(f')]∈[F]mの各要素は、[σ(f')i]∈[F]（i=0, …, m-1）で参照することもある。ソート済みベクトルσ(f')は、先頭からグループ数の要素にグループ毎にソートしたときの最初の要素の値（すなわち、各グループの最小値）が設定され、それ以降の要素に０が設定されたベクトルとなる。
【００５０】
最後に、ソート済みベクトルσ(f')のシェア[σ(f')]から、復元すると各グループの最小値を表すベクトルx':=σ(f')0, …, σ(f')min(g,m)-1となるシェア[x']∈[F]min(g,m)を生成する。
【００５１】
≪グループ内の昇順順位≫
グループ内の昇順順位は、テーブルをキー属性の値に基づいてグループ分けしたときに、所望のバリュー属性を昇順でソートしたときにその値がグループ内で何番目の値であるかを得る演算である。グループ内の昇順順位は、秘密集約関数計算システム１００が出力するフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、cはgroup-byカウントの結果（以下、「クロス集計」と呼ぶ）である。クロス集計cは、例えば、上述の≪group-byカウント≫の手順に従って、フラグeのシェア{e}と置換σのシェア{{σ}}とを用いて求めることができる。
【００５２】
第一に、クロス集計cのシェア[c]と置換σのシェア{{σ}}とを用いて、復元するとクロス集計cに置換σを逆適用した逆置換済みクロス集計u:=σ-1(c)となるシェア[u]:=[σ-1(c)]∈[F]mを生成する。クロス集計cは先頭からグループ数までの要素に各グループのレコード数が設定されたベクトルであり、置換σは各グループの最後の要素を先頭から順に並べる置換であるため、クロス集計cに置換σを逆適用した逆置換済みクロス集計uは各グループの最後の要素にそのグループのレコード数が設定されたベクトルとなる。以下、[u]∈[F]mの各要素は、[ui]∈[F]（i=0, …, m-1）で参照することもある。
【００５３】
第二に、逆置換済みクロス集計uのシェア[u]を用いて、[s]:=prefix-sum([u])を計算し、復元するとベクトルs:=s0, …, sm-1∈Fとなるシェア[s]∈[F]mを生成する。prefix-sumは、mを入力ベクトルuの長さとして、0以上m-1以下の各整数iについて、出力ベクトルsのi番目の要素siには入力ベクトルuの0番目の要素u0からi番目の要素uiまでの値の総和を設定する演算である。
【００５４】
最後に、ベクトルsのシェア[s]を用いて、1以上m-1以下の各整数iについて[ai]:=[i-si-1]を設定し、かつ、[a0]:=[0]を設定して、復元するとグループ内での昇順順位a:=a0, …, am-1∈Fとなるシェア[a]∈[F]mを生成する。なお、グループ内での昇順順位は０スタートとなることに注意されたい。１スタートの順位を得たいのであれば、各順位に１を加算すればよい。すなわち、1以上m-1以下の各整数iについて[ai]:=[i-si-1+1]を設定し、かつ、[a0]:=[1]を設定して、昇順順位aを生成すればよい。
【００５５】
≪グループ内の降順順位≫
グループ内の降順順位は、テーブルをキー属性の値に基づいてグループ分けしたときに、所望のバリュー属性を降順でソートしたときにその値がグループ内で何番目の値であるかを得る演算である。グループ内の降順順位は、秘密集約関数計算システム１００が出力するフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、cはgroup-byカウントの結果（以下、「クロス集計」と呼ぶ）である。クロス集計cは、例えば、上述の≪group-byカウント≫の手順に従って、フラグeのシェア{e}と置換σのシェア{{σ}}とを用いて求めることができる。
【００５６】
第一に、クロス集計cのシェア[c]を用いて、0以上m-2以下の各整数iについて[c'i]:=[ci+1]を設定し、かつ、[c'm-1]:=[0]を設定して、復元するとシフト済みクロス集計c':=c'0, …, c'm-1∈Fmとなるシェア[c']∈[F]mを生成する。シフト済みクロス集計c'は各グループのレコード数を表すベクトルであるクロス集計cを一つずつ前方へシフトしたベクトルとなる。
【００５７】
第二に、シフト済みクロス集計c'のシェア[c']と置換σのシェア{{σ}}とを用いて、復元するとシフト済みクロス集計c'に置換σを逆適用した逆置換済みクロス集計u':=σ-1(c')となるシェア[u']:=[σ-1(c')]∈[F]mを生成する。シフト済みクロス集計c'は先頭からグループ数までの要素に各グループのレコード数が設定されたクロス集計cを一つずつ前方へシフトしたベクトルであり、置換σは各グループの最後の要素を先頭から順に並べる置換であるため、シフト済みクロス集計c'に置換σを逆適用した逆置換済みクロス集計u'は各グループの最後の要素に一つ後方のグループのレコード数が設定されたベクトルとなる。以下、[u']∈[F]mの各要素は、[u'i]∈[F]（i=0, …, m-1）で参照することもある。
【００５８】
第三に、逆置換済みクロス集計u'のシェア[u']を用いて、[s']:=postfix-sum([u'])を計算し、復元するとベクトルs':=s'0, …, s'm-1∈Fとなるシェア[s']∈[F]mを生成する。postfix-sumは、mを入力ベクトルu'の長さとして、0以上m-1以下の各整数iについて、出力ベクトルs'のi番目の要素s'iには入力ベクトルu'のi番目の要素u'iからm-1番目の要素u'm-1までの値の総和を設定する演算である。
【００５９】
最後に、ベクトルs'のシェア[s']を用いて、0以上m-1以下の各整数iについて[di]:=[m-i-s'i-1]を設定して、復元するとグループ内での降順順位d:=d0, …, dm-1∈Fとなるシェア[d]∈[F]mを生成する。なお、グループ内での降順順位は０スタートとなることに注意されたい。１スタートの順位を得たいのであれば、各順位に１を加算すればよい。すなわち、0以上m-1以下の各整数iについて[di]:=[m-i-s'i]を設定して、降順順位dを生成すればよい。
【００６０】
≪group-by中央値≫
group-by中央値は、テーブルをキー属性の値に基づいてグループ分けしたときに、グループごとに所望のバリュー属性の中央値を得る演算である。group-by中央値は、秘密集約関数計算システム１００が出力するバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]とフラグeのシェア{e}と置換σのシェア{{σ}}とを用いて、以下のように求めることができる。なお、cはgroup-byカウントの結果（以下、「クロス集計」と呼ぶ）である。クロス集計cは、例えば、上述の≪group-byカウント≫の手順に従って、フラグeのシェア{e}と置換σのシェア{{σ}}とを用いて求めることができる。また、vはソート済みバリュー属性v'0, …, v'na-1のうちgroup-by中央値を求めたい所望のバリュー属性である。
【００６１】
第一に、クロス集計cのシェア[c]と置換σのシェア{{σ}}とを用いて、復元するとグループ内での昇順順位を表すベクトルa:=a0, …, am-1∈Fとなるシェア[a]∈[F]mおよび復元するとグループ内での降順順位を表すベクトルd:=d0, …, dm-1∈Fとなるシェア[d]∈[F]mを生成する。ここで、昇順順位および降順順位は１スタートとする。グループ内での昇順順位は、例えば、上述の≪グループ内の昇順順位≫の手順に従って求めることができる。グループ内での降順順位は、例えば、上述の≪グループ内の降順順位≫の手順に従って求めることができる。
【００６２】
第二に、昇順順位aのシェア[a]と降順順位dのシェア[d]とを用いて、2λ>mを満たすλに対して、[2λ+a-d], [2λ+d-a]を計算し、[2λ+a-d], [2λ+d-a]をλビットにビット分解して、復元するとビット列a-dなるシェア{a-d}∈{Bλ}mと、復元するとビット列d-aとなるシェア{d-a}∈{Bλ}mとを生成する。
【００６３】
第三に、a-dのシェア{a-d}とd-aのシェア{d-a}とから最下位ビットを除いて、復元するとa', d'となるシェア{a'}, {d'}∈{Bλ-1}mを生成する。a'はa-dの最下位ビットを除いたビット列であり、d'はd-aの最下位ビットを除いたビット列である。
【００６４】
第四に、a'のシェア{a'}とd'のシェア{d'}とを用いて、{a"}:={|a'=0|}, {d"}:={|d'=0|}を計算し、復元するとフラグa", d"∈Bmとなるシェア{a"}, {d"}∈{B}mを生成する。なお、|・|は等式・の真偽を返却する記号である。フラグa", d"は、a-d, d-aそれぞれが0以上1以下であるかどうかを表す。さらに、a"はそのレコードが大きい方の中央値であるかどうか、d"はそのレコードが小さい方の中央値であるかどうかを表す。
【００６５】
第五に、フラグa", d"のシェア{a"}, {d"}∈{B}mを任意の環F上の秘密分散によるシェア[a"], [d"]∈[F]mに変換する。
【００６６】
第六に、バリュー属性vのシェア[v]とフラグa", d"のシェア{a"}, {d"}とを用いて、[va]:=[va"], [vd]:=[vd"]を計算し、復元するとベクトルva, vd∈Fmとなるシェア[va], [vd]∈[F]mを生成する。
【００６７】
第七に、フラグa", d"のシェア{a"}, {d"}を用いて、復元するとフラグa", d"の否定¬a", ¬d"となるシェア{¬a"}, {¬d"}∈{B}mを生成する。次に、フラグa", d"の否定¬a", ¬d"のシェア{¬a"}, {¬d"}を用いて、復元するとフラグa", d"の否定¬a", ¬d"をソートする置換σa, σdとなるシェア{{σa}}, {{σd}}∈{{Sm}}を生成する。
【００６８】
最後に、ベクトルva, vdのシェア[va], [vd]と置換σa, σdのシェア{{σa}}, {{σd}}とを用いて、[x]:=[σa(va)+σd(vd)]を計算し、復元すると各グループの中央値を表すベクトルxとなるシェア[x]∈[F]mを生成する。
【００６９】
＜変形例＞
上記の実施形態では、各秘密計算装置１nが、ソート済みキー属性k'0, …, k'nk-1のシェア[k'0], …, [k'nk-1]、ソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]、フラグeのシェア{e}、および置換σのシェア{{σ}}の少なくとも１つを出力するように構成する例を説明したが、後に続いて計算するgroup-by演算の種類によって、備えるべき処理部を選択して構成してもよい。例えば、group-byカウントやgroup-by中央値は、フラグeのシェア{e}および置換σのシェア{{σ}}を必要とするgroup-by演算である。group-by総和やgroup-by最大値／最小値は、ソート済みバリュー属性v'0, …, v'na-1のシェア[v'0], …, [v'na-1]、フラグeのシェア{e}、および置換σのシェア{{σ}}を必要とするgroup-by演算である。グループ内の順位は、フラグeのシェア{e}および置換σのシェア{{σ}}を必要とするgroup-by演算である。すなわち、group-byカウント、group-by中央値、またはグループ内の順位を計算するが、group-by総和やgroup-by最大値／最小値を計算することがない状況であれば、秘密集約関数計算システム１００は、少なくともフラグeのシェア{e}および置換σのシェア{{σ}}が出力できればよい。このとき、各秘密計算装置１nは、例えば、入力部１０、ビット分解部１１、グループソート生成部１２、ビット列ソート部１３、フラグ生成部１４、キー集約ソート生成部１５、および出力部１９を備え、重複排除部１６、キーソート部１７、およびバリューソート部１８は備えないように構成することができる。
【００７０】
以上、この発明の実施の形態について説明したが、具体的な構成は、これらの実施の形態に限られるものではなく、この発明の趣旨を逸脱しない範囲で適宜設計の変更等があっても、この発明に含まれることはいうまでもない。実施の形態において説明した各種の処理は、記載の順に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。
【００７１】
［プログラム、記録媒体］
上記実施形態で説明した各装置における各種の処理機能をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
【００７２】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【００７３】
また、このプログラムの流通は、例えば、そのプログラムを記録したDVD、CD-ROM等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００７４】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記憶装置に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるASP（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【００７５】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【図１】
0006989006.tif 000002
【図２】
0006989006.tif 000003
【図３】
0006989006.tif 000004