【文献】
五十嵐 大 ほか,軽量検証可能3パーティ秘匿関数計算の効率化及びこれを用いたセキュアなデータベース処理,2011年 暗号と情報セキュリティシンポジウム,日本,2011 年暗号と情報セキュリティシンポジウム実行委員,2011年 1月25日,2C3−6,pp.1−8
【文献】
安田 雅哉 ほか,イデアル格子準同型暗号を用いた秘匿内積計算,2013年 暗号と情報セキュリティシンポジウム,日本,2013 年 暗号と情報セキュリティシンポジウム実行委員,2013年 1月22日,2A3−2,pp.1−3
【文献】
安田 雅哉 ほか,イデアル格子準同型暗号を用いた秘匿内積の実装,2013年 暗号と情報セキュリティシンポジウム SCIS2013,日本,2013 年 暗号と情報セキュリティシンポジウム実行委員,2013年 1月22日,1A2−1,pp.1−2
【文献】
Michael J. Freedman, et al.,Efficient Private Matching and Set Intersection,LNCS, Advances in Cryptology - EUROCRYPT 2004,Springer,2004年,Vol.3027,pp.1-19
【文献】
Nigel P. Smart, et al.,Fully Homomorphic Encryption with Relatively Small Key and Ciphertext Sizes,LNCS, Public Key Cryptography - PKC 2010,Springer,2010年,Vol.6056,pp.420-443
【文献】
Valeria Nikolaenko, et al.,Privacy-Preserving Ridge Regression on Hundreds of Millions of Records,2013 IEEE Symposium on Security and Privacy,米国,IEEE,2013年 5月19日,pp.334-348
【文献】
Thore Graepel, et al.,ML Confidential: Machine Learning on Encrypted Data,Cryptology ePrint Archive: Report 2012/323,[オンライン],2012年12月26日,Version: 20121226:211456,[検索日 平成29年 9月 6日]、インターネット,URL,<https://eprint.iacr.org/2012/323.pdf>
(58)【調査した分野】(Int.Cl.,DB名)
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、上記準同型暗号方式による秘匿関数計算にも問題がある。準同型暗号方式では基本的な演算の準同型性を保証するため一般的な暗号で利用できる平文の値域よりも限定された狭い値域しか扱うことができない。また、いつくかのブロックはやはりGarbled Circuitによって実現せざるを得ず、各ゲートに対応する真理値表を作成しなければならない。よって、大規模な入力を複雑な関数に適用する場合には汎用Garbled Circuitと同じ欠点をもつ
。
【0009】
医療を扱っている機関P1とP2が
図2に示すような「
住民番号表」を用意する。この表は機関P1とP2が住民基本台帳等に従って、国民1人1人に一意の番号を付したものである。機関P1とP2はこの番号表を使って、それぞれが担当したことのある受診者の番号の位置には‘1’をそうでない番号の位置には‘0’を記載した「受診者リスト」(
図3:「リストX」、「リストY」)を作成する。
【0010】
次に、機関P1は加法準同型な公開鍵暗号方式での公開鍵
PKeyP1、秘密鍵SKeyP1を決定し、公開鍵PKeyP1を機関P2に対して公開する。さらに、自分のリスト「リストX」の内容をインデックス順に個別に自分の公開鍵PKeyP1により暗号化する。これにより暗号文リストAXを作成する。その後、機関P1は暗号文リストAXを機関P2に送信する。
【0011】
機関P1より暗号文リストAXを受信した機関P2は自身のリストYで値が‘1’となっている位置に対応する暗号文リストAXの位置に格納されている暗号文を全て抜き出し、それらの暗号文を暗号的に加算し、新しい暗号文Bを作成する。さらに機関P
2はランダムに選択した値をRとし、Rを機関P1の公開鍵PKeyP1で暗号化し、暗号文Bと暗号的に加算し暗号文BRを作成する。ここで暗号文BRの平文が表す値は、機関P1のリストXと機関P2のリストYの両方のリストで該当位置に格納されている値が‘1’である配列位置の数、つまり、共通受診者の数NIに乱数Rを加算した値である。機関P2は暗号文BRを機関P1に送信する。暗号文BRを受信した機関P1は自身の秘密鍵SKeyP1で暗号文BRを復号し、値Cを得る。
【0012】
最後に、機関P1,機関P2はそれぞれ値Cと値Rを秘密入力、値kを共通入力として、C-R≧kという関係が成り立つかどうかを判定する秘匿計算回路に与え、C-R≧kなら値‘1’をそうでないなら値‘0’の出力を得る。
【0013】
上記手続きでは、機関P2は受診したリストが暗号化されていることより、リストの内容を知ることはできない。また、暗号文BRを受信した機関P1も乱数Rという撹乱情報が加算されているため、機関P2に関する情報(例えば、共通受診者数NI等の情報)を推測することができない。
【0014】
理解を深めるため、
図29を参照して数値を具体的に追ってみる。まず、機関P1はリスト
Xに格納されている‘0’か‘1’を
、1つの平文を様々な暗号文に変換可能である確率的暗号方式のElGamal暗号を用いて暗号化する。具体的には、平文Mを暗号文の2項組(2
M(KeyP1)
r, g
r)の形式に暗号化する。ここで、公開鍵
PKeyP1と秘密鍵SkeyP1の関係は
PKeyP1≡g
SkeyP1(mod p)であり、pは素数、gは原始元である。以降では暗号鍵および暗号文作成において行うpを法とする計算についての記載を省略する。このような方式で作成した暗号文リストA
Xを受信した機関P2は自己
のリスト
Yで‘1’の内容をもつ配列位置に対応する暗号文リストA
X
の暗号文を抜き出し、それらの第一項どうし、第二項どうしを乗算する。これにより(2
M1+M2+...+Mly
r1+r2+…+rl、g
r1+r2+…+rl)という暗号文Bを作成する。さらに、乱数Rを(2
Ry
rp2,g
rp2)によって暗号化し、暗号文Bと暗号文(2
Ry
rp2, g
rp2)と第1項どうし、第2項どうしを乗算することで、暗号文BR=(2
M1+M2 +…+Ml+Ry
r1+r2+...+rl+rp2, g
r1+r2+...+rl+rp2)を作成する。この暗号文BRを機関P2は機関P1に送信し、機関P1は暗号文の第2項に秘密鍵SkeyP1を指数乗することよりExpC=2
(M1+M2+...+Ml+R)y
r1+r2+…+rl+rp2/(g
r1+r2+...+rl+rp2)
SkeyP1を計算し、C=log
2ExpC=M1+M2+…+Ml+Rを得る
。機関P1は値Cを得るだけであり、値Cがどのような成分の加算によって構成されたか、機関P2の1の数等の機関P2に関する情報を知ることはできない。
【0015】
しかしながら、この方法にも問題がある。住民基本台帳に記載されているような全ての国民を対象とする場合、数千万単位の配列位置に対応する値を個別に暗号化することは多大な計算時間を要する。また、加法準同型暗号方式では指数部で暗号文を表現しなければならないため、表現できる値域としては、0から暗号鍵のビット長程度の範囲しか扱うことができない。また、公開鍵暗号方式では機関P2の情報は乱数Rで守られるだけであり、機関P1の暗号化がプロトコルどおりでない場合、情報が漏れる可能性がある。
【0016】
本発明はこれらの問題を鑑みてなされたものであり、大規模な入力で複雑な関数を扱う場合であっても、Garbled Circuitに依らず、複数のビットからなるビット列に対する秘匿論理演算を基本要素として秘匿計算を行う汎用秘匿関数計算システム、デ-タ処理装置、汎用秘匿関数計算方法、汎用秘匿関数計算プログラム、および、該汎用秘匿関数計算プログラムを記録した記録媒体を提供することを目的とする。
【課題を解決するための手段】
【0017】
上記目的と達成するために、本発明の第1の観点に係る秘匿関数計算システムは、
関数評価処理かビット列撹乱処理の一方を担当する2以上のデータ処理装置で構成される秘匿関数計算システムであって、
前記ビット列撹乱処理を担当する前記データ処理装置は
、
撹乱データの一部である
第1の撹乱部分データを他のデータ処理装置に送信し、前記
第1の撹乱部分データ
と加算対象秘密デー
タを組み合わせて撹乱後加算対象秘密データを作成し、
段数変数に設定された段数での主暗号鍵で
前記撹乱データの一部である第2の撹乱部分データを暗号化し
て暗号化撹
乱データを作成し、
該暗号化撹
乱データ
を他のデータ処理装置に送信し
、二重暗号化撹乱後加算対象
秘密データを前記他のデータ処理装置から受信し、前記二重暗号化撹乱後加算対象
秘密データを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記
撹乱後加算対象秘密データを暗号化したまま加算し
た結果を暗号化撹乱加算結果とし、前記暗号化撹乱加算結果を他のデータ処理装置へ送信する秘匿加算撹乱(加算)手段と、
最終交換データとなる撹乱データを、自らの最終交換データとして設定する最終交換データ設定(加算)手段と、
を有し、
前記関数評価処理を担当するデータ処理装置は、
他のデータ処理装置より前記
第1の撹乱部分データと
前記暗号化撹乱
データを受信し、受信した前記
第1の撹乱部分データ
と加算対象
秘密データを組み合わせて加算対象データ変形を作成し、
該加算対象データ変形と前記暗号化撹乱
データを組み合わせて二重暗号化撹乱後加算対象
秘密データを作成し
、前記二重暗号化撹乱後加算対象
秘密データを他のデータ処理装置に送信し、他のデータ処理装置より、前記暗号化撹乱加算結果を受信し、前記暗号化撹乱
加算結果を前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現
を加算結果ビット配列とする秘匿加算撹乱(結果取得)手段と、
前記加算結果ビット配
列より、加算前の2つのビット列をあいまいに推測し
てあいまい推測ビット列1とあいまい推測ビット列2を導
出する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて適用すべき可換性論理演算を前記あいまい推測ビッ
ト列1の配列位置のビットと前記あいまい推測ビッ
ト列2の配列位置のビットに適用した演算結果を導出し、前記演算結果を論理演算結果ビット配列の前記配列位置に設定し、
該論理演算結果ビット配
列を出力秘密データとして記憶する論理演算適用手段と、
前記出力秘密データを、最終交換データとして設定する最終交換データ設定(結果取得)手段と、
を有し、
前記
加算前ビット列あいまい推測手段は
、2つの数である加算前入力1
としての前記二重暗号化撹乱後加算対象秘密データを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と加算前入力2
としての前記撹乱後加算対象秘密データの加算結果の二進数表現が加算結果ビット配列に設定されているとき、あいまい推測後に前記あいまい推測ビット列1に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列2に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力1の二進数表現のビット列の前記ビット位置のビットと前記加算前入力2の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列1と前記あいまい推測ビット列2を生成
し、
前記データ処理装置はそれぞれ、
段数変数に初期値を初期化後、前記秘匿加算撹乱(結果取得)手段又は前記秘匿加算撹乱(結果取得)手段及び前記論理演算適用手段が、その段数での処理を行う度に、前記段数変数の値が指定段数に等しくなるまで前記段数変数の値を1だけ増加させる段数管理手段と、
該他のデータ処理装置の最終交換データを受信し、受信した値を受信最終交換データとし、前記自らの最終交換データと前記受信最終交換データとに基づいて、最終結果を算出する最終結果算出手段と、を有する、
ことを特徴とする
【0018】
前記ビット列撹乱処理を担当する前記データ処理装置
では
、
前記秘匿加算撹乱(結果取得)手段は、
前記段数変数の値の段数で
の主暗号鍵
、秘密データ
の名前、撹乱データ
の名前を記憶手段からそれぞれ読み出し
、読み出した暗号鍵
と、読み出した前記秘密データ名
に対応する秘密データ
と、読み出し
た撹乱データ名
に対応する撹乱データ
とを用いて、その段数での処理を行い、
前記最終交換データ設定(加算)手段は、
前記段数変数の値の段数での撹乱データの名前をもつ前記撹乱データを、自らの前記最終交換データとして設定し、
前記関数評価処理を担当するデータ処理装置
では
、
前記秘匿加算撹乱(結果取得)手段は、
前記段数変数の値の段数で
の暗号鍵
、秘密データの名前であ
る加算対象秘密データ名をもつ秘密データ
を用いて処理を行い、
前記論理演算適用手段は、
前記段数変数の値が前記初期値から前記指定段数までの各段において、各配列位置で前記あいまい推測ビット配列1と前記あいまい推測ビット配列2の前記配列位置の2つのビットに適用する可換性論理演算の種類を列形式で記している指定論理演算型配列の各配列位
置で指定されている型の可換性論理演算を
行い、得られた前記論理演算結果ビット配列
を、前記各段における加算対象秘密データ名をつけて記憶す
る、
ことを特徴としてもよい。
【0019】
前記秘匿加算撹乱(加算)手段は、
前記段数変数の値の段数で定められた繰り返し数分、その繰り返し回に対応する正順と逆順の加算対象秘密データと、暗号鍵と、撹乱データとを用いて処理を繰り返し行い、その都度、前記正順と逆順の暗号化撹乱加算結果を他のデータ処理装置
に送信
し、
前記秘匿加算撹乱(結果取得)手段は、
前記段数変数の値の段数で定められた繰り返し数分、その繰り返し回に対応する暗号鍵、正順と逆順との加算対象秘密データを用いて、処理を繰り返し行い、その都度、前記加算結果(正順)ビット配列と前記加算結果(逆順)ビット配列の二進数表現を求め、
前記加算前ビット列あいまい推測手段は、
前記加算結果(正順)ビット配列
と前記加算結果(逆順)ビット配
列より、加算前の2つのビット列をあいまいに推測し、あいまい推測ビット列
1とあいまい推測ビット列
2を導出し
、
前記あいまい推測ビット列
1と前記あいまいビット列
2は、
2つの数である加算前入力1と加算前入力2の加算結果の二進数表現が加算結果(正順)ビット配
列に設定され、加算前入力1、加算前入力2それぞれを二進数表現の最上位ビット位置から最下位ビット位置までのビットの並びを逆順序にしたときのビットの並びをそれぞれ加算前逆順ビット列1と加算前逆順ビット列2とし、前記加算前逆順ビット列1と前記加算前逆順ビット列2の加算結果の二進数表現が加算結果(逆順)ビット配
列に設定されたとき、あいまい推測後に前記あいまい推測ビット配
列1に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット配
列2に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力1の二進数表現のビット列の前記ビット位置のビットと前記加算前入力2の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいという性質を満たす、
ことを特徴としてもよい。
【0020】
前記撹乱データは、
撹乱のために加算対象秘密データを切断して作成する切断ブロック数と、切断する配列位置を前記切断ブロック数並べたブロック切断点順列と、切断後にブロックを転置するために各ブロックに乗算したいブロックシフト係数順列と、前記ブロックシフト係数順列により挿入した空白ブロックの内容を指定する撹乱挿入加算値を含み、
前記秘匿加算撹乱(加算)手段は、
前記切断ブロック
数と前記ブロック切断点順
列を前記第1の撹乱部分データとして他のデータ処理装置へ送信し、前記加算対象秘密デー
タを前記ブロック切断点順
列に従って、前記切断ブロック
数のブロックに切断して切断ブロック列を作成し、
該切断ブロック列と前記ブロックシフト係数順
列との内積を計算し
て切断ブロックシフト後秘密データ
を作成し、前記切断ブロックシフト後秘密データと前記撹乱挿入加算
値を加算し
て撹乱後加算対象秘密データを作成し
、スカラー定数変数に前記撹乱後加算対象秘密データを設定し、前記ブロックシフト係数順
列の要素で1以下の値の要素がある場合に
は最も小さい値の要素を探し
て最小値要素とし、
該最小値要素の値
をスカラー除数変数に設定し、1以下の値の要素がない場合に
はスカラー除数変数に1を設定し、前記ブロックシフト係数順
列の各要素の値に前記スカラー除数変
数の逆数を乗じることで計算できる順列
を内積対象ベクト
ルに設定し
、ベクトルサイ
ズに前記切断ブロッ
クの値を設定するブロックシフト係数設定小部分手段と、
前記内積対象ベクト
ルの各ベクトル位置で
、副暗号鍵ベクト
ルの前記ベクトル位置の要素を暗号化し
て暗号化内積対象ベクトルを作成し
、他のデータ処理装置に
該暗号化内積対象ベクト
ルを送信し、他のデータ処理装置より
、二重暗号化内積対象乗算結果ベクトルを受信し、前記二重暗号化内積対象乗算結果ベクトルの各ベクトル位置で、前記副暗号鍵ベクト
ルの前記ベクトル位置に設定されている暗号鍵、もしくは前記暗号鍵に対応する復号鍵により前記二重暗号化内積対象乗算結果ベクトルの前記ベクトル位置の要素を復号し
て暗号化内積対象乗算結果ベクトルを作成し、前記暗号化内積対象乗算結果ベクトルの全要素を加算し
て暗号化内積結果を作成し、前記暗号化内積結果を前記スカラー除数で除算した結果を前記暗号化秘匿ベクトル内積結
果に設定し、前記暗号化秘匿ベクトル内積結
果に設定されている暗号値を他のデータ処理装置へ送信する秘匿ベクトル内積計算(加算)小部分手段と、
を備え、
前記秘匿加算撹乱(結果取得)手段は、
他のデータ処理装置より前記他のデータ処理装置の前記切断ブロック
数と前記ブロック切断点順
列を受信し
、前記加算対象秘密デー
タを前記ブロック切断点順
列に従って、前記切断ブロック
数のブロックに分割し、前記ブロックをベクトル表現として並べ
て内積対象ベクト
ルを作成する切断ブロック作成小部分手段と、
他のデータ処理装置より他のデータ処理装置の前記暗号化内積対象ベクト
ルを受信し、前記内積対象ベクト
ルの各ベクトル位置において、前記ベクトル位置の前記暗号化内積対象ベクト
ルの要素と、前記内積対象ベクト
ルの前記ベクトル位置の要素を乗算した結果
を、前記主暗号
鍵で暗号化し
て前記ベクトル位置の要素とすることで二重暗号化内積対象乗算結果ベクトルを作成し、前記二重暗号化内積対象乗算結果ベクトルを前記他のデータ処理装置へ送信し、
該データ処理装置より
該他のデータ処理装置の前記暗号化秘匿ベクトル内積結
果に設定されている暗号値を受信し
て、前記暗号化秘匿ベクトル内積
結果に設定
し、前記暗号化秘匿ベクトル内積結
果に設定されている暗号値を前記主暗号
鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し
て得られた結果をベクトル内積結果とし
、結果秘密データ
名をもつ秘密データとして前記ベクトル内積結果を記憶する秘匿ベクトル内積(結果取得)小部分手段
と、
を備える、
ことを特徴としてもよい。
【0021】
前記ベクトル内積結果は
、前記関数
評価処理を担当するデータ処理装置がもつ前記内積対
象ベクト
ルと、前記データ列撹乱処理を担当するデータ処理装置がもつ前記内積対
象ベクトルの内積結果に
、前記データ列撹乱処理を担当する前記データ処理装置がもつ前記スカラー除数変数に設定されている値を除算した結果に前記データ処理装置がもつ前記スカラー定数変数に設定されている値を加算した結果と等しい、
ことを特徴としてもよい。
【0022】
2以上の前記データ処理装置がアクセス可能なデータ記憶装置、をさらに有し、
2以上の前記データ処理装置は、それぞれ、
自己の保有する各変数に設定されたデータを前記データ記憶装置に保存し、
他のデータ処理装置が保存したデータを前記データ記憶装置から取得してもよい。
【0023】
3以上の前記データ処理装置で構成される前記秘匿関数計算システムであって、
前記
撹乱後加算対象秘密データは、2以上の他のデータ処理装置の前記主暗号鍵で順次暗号化されることによって生成されてもよい。
【0024】
上記目的を達成するため、本発明の第2の観点にかかるデータ処理装置は、
他のデータ処理装置と連携してデータを処理するデータ処理装置であって、
関数評価処理かビット列撹乱処理の
一方を担当し、
前記ビット列撹乱処理を担当する
場合に、
撹乱データの一部である
第1の撹乱部分データ
を他のデータ処理装置に送信し、前記
第1の撹乱部分データ
と加算対象秘密デー
タを組み合わせて撹乱後加算対象秘密データを作成し、
段数変数に設定された段数での主暗号鍵で
前記撹乱データの一部である第2の撹乱
部分データを暗号化し
て暗号化撹乱
データを作成し
、該暗号化撹
乱デー
タを他のデータ処理装置に送信し
、二重暗号化撹乱後加算対象データを前記他のデータ処理装置から受信
し、前記二重暗号化撹乱後加算対象
秘密デー
タを前
記主暗号
鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記
撹乱後加算対象秘密データを暗号化したまま加算し
た結果を暗号化撹乱加算結果
とし、前記暗号化撹乱加算結
果を他のデータ処理装置へ送信する秘匿加算撹乱(加算)手段と、
最終交換データとなる撹乱データを、自らの最終交換データとして設定する最終交換データ設定(加算)手段と、
を有し、
前記関数評価処理を担当する
場合に、
他のデータ処理装置より前記
第1の撹乱部分データと
前記暗号化撹乱データを受信し、受信した前記
第1の撹乱部分データ
と加算対象秘密データを組み合わせて加算対象データ変形を作成し、
該加算対象データ変形と前記暗号化撹乱
データを
組み合わせて二重暗号化撹乱後加算対象データを作成し
、前記二重暗号化撹乱後加算対象デー
タを他のデータ処理装置に送信し、他のデータ処理装置より
、前記暗号化撹乱加算結
果を受信し、前記暗号化撹乱加算結
果を前記主暗号
鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し
て撹乱加算結果を作成し、
該撹乱加算結果の二進数表現
を加算結果ビット配
列とする秘匿加算撹乱(結果取得)手段と、
前記加算結果ビット配
列より、加算前の2つのビット列をあいまいに推測し
てあいまい推測ビット列1とあいまい推測ビット列2を導
出する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数に
て適用すべき可換性論理演算を前記あいまい推測ビット列1の配列位置のビットと前記あいまい推測ビット列2の配列位置のビットに適用した演算結果を導出し、前記演算結果を論理演算結果ビット配
列の前記配列位置に設定し、
該論理演算結果ビット配
列を出力秘密データとし
て記憶する論理演算適用手段と、
前記出力秘密データを、最終交換データとして設定する最終交換データ設定(結果取得)手段と、
を有し、
前記
加算前ビット列あいまい推測手段は
、2つの数である加算前入力1
としての前記二重暗号化撹乱後加算対象秘密データを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と加算前入力2
としての前記撹乱後加算対象秘密データの加算結果の二進数表現が加算結果
ビット配列に設定されているとき、あいまい推測後に前記あいまい推測ビット
列1に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット
列2に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力1の二進数表現のビット列の前記ビット位置のビットと前記加算前入力2の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列1と前記あいまい推測ビット列2を
生成し、
段数変数に初期値を初期化後、前記秘匿加算撹乱(結果取得)手段又は前記秘匿加算撹乱(結果取得)手段及び前記論理演算適用手段が、その段数での処理を行う度に、前記段数変数の値が指定段数に等しくなるまで前記段数変数の値を1だけ増加させる段数管理手段と、
該他のデータ処理装置の最終交換データを受信し、受信した値を受信最終交換データとし、前記自らの最終交換データと前記受信最終交換データとに基づいて、最終結果を算出する最終結果算出手段と、を有する、
ことを特徴とする。
【0025】
上記目的を達成するため、本発明の第3の観点にかかる秘匿関数計算方法は、
関数評価処理かビット列撹乱処理の一方を担当する2以上のデータ処理装置を用いて行う秘匿関数計算方法であって、
前記ビット列撹乱処理を担当する前記データ処理装置
が、
撹乱データの一部である
第1の撹乱部分データ
を他のデータ処理装置に送信し、前記
第1の撹乱部分データ
と加算対象秘密デー
タを組み合わせて撹乱後加算対象秘密データを作成し、
段数変数に設定された段数での主暗号鍵で
前記撹乱データの一部である第2の撹乱部分データを暗号化し
て暗号化撹乱
データを作成し
、該暗号化撹
乱デー
タを他のデータ処理装置に送信し
、二重暗号化撹乱後加算対象デー
タを前記他のデータ処理装置から受信し
、前記二重暗号化撹乱後加算対象
秘密デー
タを前記主暗号
鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記
撹乱後加算対象秘密データを暗号化したまま加算し
た結果を暗号化撹乱加算結果
とし、前記暗号化撹乱加算結
果を他のデータ処理装置へ送信する秘匿加算撹乱(加算)ステップと、
最終交換データとなる撹乱データを、自らの最終交換データとして設定する最終交換データ設定(加算)ステップと、
を含み、
前記関数評価処理を担当するデータ処理装置
が、
他のデータ処理装置より
前記第1の撹乱部分データ
と前記暗号化撹乱
データを受信し、受信した前記
第1の撹乱部分データ
と加算対象
秘密データを組み合わせて加算対象データ変形を作成し、
該加算対象データ変形と前記暗号化撹乱
データを
組み合わせて二重暗号化撹乱後加算対象データを作成し
、前記二重暗号化撹乱後加算対象デー
タを他のデータ処理装置に送信し、他のデータ処理装置より
、前記暗号化撹乱加算結
果を受信し
、前記暗号化撹乱加算結
果を前記主暗号鍵
、もしくは、前記暗号鍵に対応する復号鍵により復号し
て撹乱加算結果を作成し、
該撹乱加算結果の二進数表現
を加算結果ビット配列
とする秘匿加算撹乱(結果取得)ステップと、
前記加算結果ビット配
列より、加算前の2つのビット列をあいまいに推測し
てあいまい推測ビット列1とあいまい推測ビット列2を導
出する加算前ビット列あいまい推測ステップと、
前記段数変数の値の段数にて
適用すべき可換性論理演算を前記あいまい推測ビット
列1の配列位置のビットと前記あいまい推測ビット
列2の配列位置のビットに適用した演算結果を導出し、前記演算結果
を論理演算結果ビット配
列の前記配列位置に設定し
、該論理演算結果ビット配
列を出力秘密データとし
て記憶する論理演算適用ステップと、
前記出力秘密データを、最終交換データとして設定する最終交換データ設定(結果取得)ステップと、
を含み、
前記
加算前ビット列あいまい推測ステップ
では
、2つの数である加算前入力1
としての前記二重暗号化撹乱後加算対象秘密データを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と加算前入力2
としての前記撹乱後加算対象秘密データの加算結果の二進数表現が加算結果ビット配列に設定されているとき、あいまい推測後に前記あいまい推測ビット列1に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列2に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力1の二進数表現のビット列の前記ビット位置のビットと前記加算前入力2の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列1と前記あいまい推測ビット列2を
生成し、
前記データ処理装置それぞれが、
段数変数に初期値を初期化後、前記秘匿加算撹乱(結果取得)ステップ又は前記秘匿加算撹乱(結果取得)ステップ及び前記論理演算適用ステップにおいて、その段数での処理を行う度に、前記段数変数の値が指定段数に等しくなるまで前記段数変数の値を1だけ増加させる段数管理ステップと、
該他のデータ処理装置の最終交換データを受信し、受信した値を受信最終交換データとし、前記自らの最終交換データと前記受信最終交換データとに基づいて、最終結果を算出する最終結果算出ステップと、を含む
ことを特徴とする。
【0026】
上記目的を達成するため、本発明の第4の観点にかかる秘匿関数計算プログラムは、
他のコンピュータと連携してデータを処理するコンピュータにより実行される秘匿関数計算プログラムであって、
前記ビット列撹乱処理を担当する
コンピュータを、
撹乱データの一部である
第1の撹乱部分デー
タを他のデータ処理装置に送信し、前記
第1の撹乱部分データ
と加算対象秘密デー
タを組み合わせて撹乱後加算対象秘密データを作成し、
段数変数に設定された段数での主暗号鍵で
前記撹乱データの一部である第2の撹乱部分データを暗号化し
て暗号化撹乱
データを作成し
、該暗号化撹
乱デー
タを他のデータ処理装置に送信し
、二重暗号化撹乱後加算対象データを前記他のデータ処理装置から受信し
、前記二重暗号化撹乱後加算対象
秘密データ
を前記主暗号鍵
、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記
撹乱後加算対象秘密データを暗号化したまま加算し
た結果を暗号化撹乱加算結果
とし、前記暗号化撹乱加算結
果を他のデータ処理装置へ送信する秘匿加算撹乱(加算)
手段、及び
最終交換データとなる撹乱データを、自らの最終交換データとして設定する最終交換データ設定(加算)手段、
として機能させ、
前記関数評価処理を担当する
コンピュータを、
他のデータ処理装置よ
り前記
第1の撹乱部分データ
と前記暗号化撹
乱データを受信し、受信した前記
第1の撹乱部分データ
と加算対象
秘密データを組み合わせて加算対象データ変形を作成し、
該加算対象データ変形と前記
暗号化撹乱データを
組み合わせて二重暗号化撹乱後加算対象データを作成し
、前記二重暗号化撹乱後加算対象デー
タを他のデータ処理装置に送信し、他のデータ処理装置より
、前記暗号化撹乱加算結
果を受信し
、前記暗号化撹乱加算結
果を前記主暗号
鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し
て撹乱加算結果を作成し、前記撹乱加算結果の二進数表現
を加算結果ビット配
列とする秘匿加算撹乱(結果取得)
手段、
前記加算結果ビット配
列より、加算前の2つのビット列をあいまいに推測し
てあいまい推測ビット列1とあいまい推測ビット列2を導
出する加算前ビット列あいまい推測
手段と、
前記段数変数の値の段数にて
適用すべき可換性論理演算を前記あいまい推測ビット列1の配列位置のビットと前記あいまい推測ビット列2の配列位置のビットに適用した演算結果を導出し、前記演算結果を論理演算結果ビット配
列の前記配列位置に設定し、
該論理演算結果ビット配
列を出力秘密データとし
て記憶する論理演算適用
手段、及び
前記出力秘密データを、最終交換データとして設定する最終交換データ設定(結果取得)手段、
として機能させ、
前記
加算前ビット列あいまい推測手段は
、2つの数である加算前入力1
としての前記二重暗号化撹乱後加算対象秘密データを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と加算前入力2
としての前記撹乱後加算対象秘密データの加算結果の二進数表現が加算結果
ビット配
列に設定されているとき、あいまい推測後に前記あいまい推測ビット
列1に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット
列2に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力1の二進数表現のビット列の前記ビット位置のビットと前記加算前入力2の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列1と前記あいまい推測ビット列2を
生成し、
前記コンピュータをそれぞれ、
段数変数に初期値を初期化後、前記秘匿加算撹乱(結果取得)手段又は前記秘匿加算撹乱(結果取得)手段及び前記論理演算適用手段が、その段数での処理を行う度に、前記段数変数の値が指定段数に等しくなるまで前記段数変数の値を1だけ増加させる段数管理手段、及び
該他のデータ処理装置の最終交換データを受信し、受信した値を受信最終交換データとし、前記自らの最終交換データと前記受信最終交換データとに基づいて、最終結果を算出する最終結果算出手段、として機能させる、
ことを特徴とする。
【0027】
上記目的を達成するため、本発明の第5の観点にかかる記録媒体は、
秘匿関数計算プログラムが記録されていることを特徴とする。
【発明の効果】
【0028】
本発明によれば、複数のビットからなるビット列に対し論理演算を組み合わせることで実現できる秘匿関数計算をビット列を単位とした暗号化により無関係な情報を他に知られることなく、高速に実行することができる。
【発明を実施するための形態】
【0030】
(実施の形態1)
本実地の形態の秘匿関数計算システム1は、機関P1もしくは機関P2のもつ入力に対して互いの入力を相手に知られることなく、関数を適用したときの解のみを互いに知るための秘匿関数計算システムである。以下、秘匿関数計算システム1について図面を参照しながら説明する。まず、
図1を参照して秘匿関数計算システム1の構成について説明する。
【0031】
秘匿関数計算システム1は
図1に示すように、機関P1と機関P2それぞれに設置された2
台のデータ処理装置1000と、それらを接続する通信線2000とで構成される。2台のデータ処理装置1000は通信線2000を通じて互いにデータを送受信することで連携して1つの処理を実行する。
【0032】
デ-タ処理装置1000は例えばPC、サ-バやメインフレ-ムなどで構成され、実験デ-タ等の非公開情報を格納している。デ-タ処理装置1000は
図1に示すように、制御部1100、通信部1200、記憶部13、操作部1400、インタフェ-ス部1500から構成される。
【0033】
制御部1100はなどで構成され、デ-タ処理装置1000の各部を制御する。また、制御部1100は操作部1400から「関数計算開始」を受信すると、後述の「関数計算処理」を実行する。また、制御部1100は操作部1400から「ビット列撹乱開始」を受信すると、後述の「ビット列撹乱処理」を実行する。「関数計算処理」は2台のデ-タ処理装置1000のうち1台で、他方のデ-タ処理装置1000で「ビット列撹乱処理」が実行される。
【0034】
通信部1200はLANコネクタや送受信処理用のプロセッサなどから構成され、通信線2000と通じて外部の装置(例えばパ-ソナルコンピュ-タ)との通信を行う。
【0035】
記憶部1300はハ-ドディスクやRAM (Random Access Memory) などの記憶装置から構成され、デ-タ処理装置1000の動作に必要なデ-タ(例えば「秘密デ-タ」、「撹乱デ-タ」や「暗号鍵」、「復号鍵」)などを記憶する。
【0036】
ここで、「秘密デ-タ」とは「担当住民リスト」などの非公開な情報のことをいう。また、「担当住民リスト」とは、各医療機関で各住民を担当したことがあるかないかを示すリストである。また、処理の実行途中に得られた非公開な情報も「秘密デ-タ」として記録される。また、「撹乱デ-タ」とは「ビット列撹乱処理」を実行するときに秘密デ-タを撹乱するときに用いる情報(詳細は後述する)のことをいう。
【0037】
また、「暗号鍵」とはデ-タの暗号化に使用するための鍵となる数値であり、それぞれの機関において任意に選択される。本実施の形態では記憶部1300に2種類の暗号鍵が保存される。1つは「主暗号鍵」であり、もう1つは「副暗号鍵」である。「主暗号鍵」は後述する暗号文列である二重暗号化内積対象乗算結果ベクトル、暗号文である暗号化内積結果を作成するための暗号鍵である。「副暗号鍵」は暗号文列である二重暗号化内積対象乗算結果ベクトルを生成する過程で一時的に使用される暗号鍵である。「副暗号鍵」は複数個用意される(詳細は後述する)。
【0038】
さらに、「復号鍵」とは暗号化された暗号文を復号し、暗号
化前のデータに復元するために使用する鍵となる数値であり、対応する暗号鍵と対をなして記憶される。
【0039】
操作部1400はデ-タ処理装置1000の外面上に構成されている各種ボタンなどによって構成される。ユ-ザにより所定のボタンが押されると、制御部1100に対し「関数計算開始通知」または、「ビット列撹乱開始通知」を送信する。関数計算開始通知は、関数計算処理を開始するためのトリガとなるデ-タである。
【0040】
インタフェ-ス部1500は例えばUSB(Universal Serial Bus)コネクタやビデオ出力端子などから構成され、外部の装置(例えばPCやモニタなど)へ処理結果を送信する。
【0041】
以上、秘匿関数計算システム1の構成について説明したが、次に、制御部1100が備える機能について、
図4,
図5、
図6の機能ブロック図、及び、
図7、
図8、
図9の処理概略図を参照しながら説明する。
【0042】
制御部1100は複数の機関で入力を秘匿したままで関数値を計算するため、「関数評価処理」か「ビット列撹乱処理」のどちらかを実行する。関数評価処理は操作部1400からの「関数評価開始通知」により開始される。また、ビット列撹乱処理は操作部1400からの「ビット列撹乱開始通知」により開始される。以下に説明する各機能は関数評価処理、および、ビット列撹乱処理を実現するための機能である。はじめに「関数評価処理」を実現するための機能について説明する。
【0043】
段数初期化部1110は秘匿関数計算に必要な論理演算適用の段数を達成したかを後に判定するために論理演算適用段数を記憶する変数Rankを初期化する。
【0044】
秘匿加算撹乱(結果取得)部1120は他の機関のデ-タ処理装置の秘匿加算撹乱(加算)部1180と連携して、自己の担当住民ビット列「リストX」と相手機関の担当住民ビット列「リストY」を撹乱し、追加ビットを挿入した後に加算した結果を記録した加算結果を加算結果ビット列変数に設定する。
【0045】
加算前ビット列あいまい推測部1130は、秘匿加算撹乱(結果取得)部で加算結果ビット列変数に設定した加算結果より、加算前の2つのビット列をあいまいに復元し、結果をあいまい推測結果ビット配列変数1、あいまい推測結果ビット配列変数2に設定する。
【0046】
論理演算適用部1140は加算前ビット列あいまい推測部1130で求めた加算前あいまい推測ビット列1変数と加算前あいまい
推測ビット列2変数に設定されている2つのビット列に対して、ビットごとに論理和、論理積、排他的論理和などの可換性二項論理演算を適用し、得られた論理演算結果を記憶部1300に格納する。
【0047】
段数判定部1150は秘匿関数計算に必要な段数の論理演算を適用したかを判定する。段数変数Rankの値が必要な段数と等しくなければ、Rankの値を1だけ増加させ制御を秘匿加算撹乱(結果取得)部1120か秘匿加算撹乱(加算)部1180に移す。
【0048】
最終交換デ-タ作成部1160は記憶部1300に格納されている論理演算結果と最終交換デ-タを作成するために論理演算結果に適用する最終交換デ-タ作成プログラムを読み出し、論理演算結果を最終交換デ-タ作成プログラムに記載された関数に入力して与えたときの出力を最終交換デ-タとする。
【0049】
最終結果算出部1170では作成した最終交換デ-タを他のデ-タ処理装置に送信し、また、他のデ-タ処理装置より最終交換デ-タを受信し、それら2つの最終交換デ-タに対して、記憶部1300より読み出した最終結果算出関数を適用し、計算結果を算出し、インタフェ-ス部1500を介し外部へ計算結果を出力する。
【0050】
以上、制御部1100の機能について説明したが、制御部1100の中の「関数評価処理」の部分処理である「秘匿加算撹乱(結果取得)処理」と実行する秘匿加算撹乱(結果取得)部1120と「秘匿関数計算処理」の部分処理である「秘匿加算撹乱(加算)処理」を実行する秘匿加算撹乱(加算)部1180の機能について以下に説明する。まず、秘匿加算撹乱(結果取得)部1120の機能について説明する。
【0051】
秘匿加算撹乱(結果取得)部1120は
図5に示すよう繰り返し回数初期化部1121、変数設定(結果取得)部1122、切断ブロック作成部1123、秘匿ベクトル内積計算(結果取得)部1124、繰り返し回数判定部1125をもつ。
【0052】
制御部1100より「秘匿加算撹乱(結果取得)開始通知」を受け取った秘匿加算撹乱(結果取得)部1120の繰り返し回数初期部1121は繰り返し変数loopの値を初期化し、段数変数の値での繰り返し回数上限を記憶部1300より読み出し、指定繰り返し回数変数loop-finalに設定する。
【0053】
変数設定(結果取得)部1122は記憶部1300より段数変数の段数、繰り返し変数loopの変数で用いる加算対象秘密デ-タ名、主暗号鍵を読み出し、さらに記憶部1300より加算対象秘密デ-タ名をもつ秘密デ-タを読み出し、加算対象秘密デ-タ変数Xと主暗号鍵変数keyBに設定する。
【0054】
切断ブロック作成部1123は「ビット列撹乱処理」を担当している他の機関のデ-タ処理装置より切断ブロック数とブロック切断点順列という撹乱デ-タの一部を受信し、受信した切断ブロック数Nと切断点順列r=(r1、r2、…、rN-1)に従って、加算対象秘密デ-タ変数Xの内容をN個のブロックに分割する。
【0055】
秘匿内積計算(結果取得)部1124は切断ブロック作成部1123にて作成したN個のブロック列(X1,X2,…,XN)と「ビット列撹乱処理」を担当している他の機関のデ-タ処理装置の撹乱デ-タが一部であるN個のシフト系列の列(Y1,Y2,…, YN)をベクトル次数n(=N)の2つのベクトルとみなし、内積を取った後に撹乱デ-タの一部である撹乱乗数という値を加算した値をブロック列X=(X1、X2、…,XN)の情報を相手に知られることなく計算する。計算の途中において主暗号鍵keyBで暗号化された暗号文である暗号化秘匿ベクトル内積結果を他の機関より受信し、主暗号鍵keyB、または主暗号鍵に対応する復号鍵で暗号化秘匿ベクトル内積結果を復号し、得られた結果をベクトル内積結果変数New-XYに設定する。
【0056】
以上、秘匿加算撹乱(結果取得)部1120の機能について説明したが、次に、秘匿加算撹乱(加算)部1180の機能について説明する。
【0057】
秘匿加算撹乱(加算)部1180は
図6に示すよう繰り返し回数初期化部1181、変数設定(加算)部1182、ブロックシフト係数作成部1183、秘匿ベクトル内積計算(加算)部1184、繰り返し回数判定部1185をもつ。
【0058】
繰り返し回数初期化部1181は関数評価処理を担当するデ-タ処理装置1000の秘匿加算撹乱(結果取得)部1120の繰り返し回数初期化部1121と同じ機能をもつ。
【0059】
変数設定(加算)部1182は段数変数Rankの値と繰り返し回数変数loopの値で用いるデ-タ名、主暗号鍵を記憶部1300から読み出し、読み出したデ-タ名をもつデ-タを加算対象秘密デ-タ変数Yと撹乱デ-タ変数Mix-dataに設定し、読み出した主暗号鍵を主暗号鍵変数KeyAに設定する。
【0060】
ブロックシフト係数設定部1183は撹乱デ-タ変数Mix-dataの一部を通信部1200を通じて送信し、加算対象秘密デ-タ変数Yの内容を撹乱デ-タ変数Mix-dataの内容に応じて撹乱し、スカラ-定数変数Lに設定し、撹乱デ-タ変数Mix-dataの一部をブロックシフト係数順列変数Sに設定し、それら順列の全ての要素を整数化できる倍数kを求めブロックシフト係数順列Sの各要素に倍数kを乗じることで内積対象ベクトル変数Y=(Y1,Y2、…,YN)にベクトルを設定し、倍数kをスカラ-除数変数Kに設定する。
【0061】
秘匿ベクトル内積計算(加算)部1184は、内積対象ベクトル変数Yと他の機関のもつ内政対象ベクトル変数Xの内積にスカラ-除数変数Kの値を除算し、かつ、スカラ-定数変数Lの値を加算した値を計算するため、相手機関のもつデ-タ処理装置1000の秘匿ベクトル内積計算(結果取得)部1124と協調し、主暗号鍵keyAで暗号化した内積対象ベクトルを作成し、通信部1200を介して相手機関に送信し、相手機関より暗号化内積対象ベクトルと内積対象ベクトルXとの各ベクトル位置でベクトル要素どうしを乗算し、得られた結果を相手機関の所有する主暗号鍵で暗号化することで作成された二重暗号化内積対象乗算結果ベクトルを受信し、二重暗号化内積対象乗算結果ベクトルの各要素を主暗号鍵keyA、またはkeyAに対応する復号鍵で復号した後、得られた結果を加算することで暗号化秘匿ベクトル内積結果を作成し、暗号化秘匿ベクトル内積結果を他の機関のデ-タ処理装置1000へ送信する。
【0062】
また、繰り返し回数判定部1185は関数評価処理を担当するデ-タ処理装置1000の繰り返し回数判定部1125と同じ機能を有する。
【0063】
制御部1100の機能について説明したが、次にデ-タ処理装置1000で実行される「関数評価処理」と「ビット列撹乱処理」について説明する。機関P1に設置された1台のデ-タ処理装置1000は「関数評価処理」を、機関P2に設置された1台のデ-タ処理装置1000は「ビット列撹乱処理」を互いに協力しながら実行することで秘匿したい入力情報を相手機関に知られることなく関数適用後の解のみを互いに知る。
【0065】
制御部1100は操作部1400から「関数評価開始通知」または「ビット列撹乱開始通知」を受信すると
図9に示す「関数評価処理」または「ビット列撹乱処理」を開始する。この「関数評価処理」は大きく7つのステップで構成される。また、「ビット列撹乱処理」は大きく5つのステップで構成される。以下、
図7、
図8の処理概略図を参照しながら「関数評価処理」、「ビット列撹乱処理」の概要について説明する。なお以下に説明する各ステップの内容は「関数評価処理」に関しては、機関P1のデ-タ処理装置1000で、「ビット列撹乱処理」に関しては、機関P2のデ-タ処理装置1000でそれぞれ実行される。まず、機関P1で実行される「関数評価処理」について説明する。
【0066】
最初にステップS100の段数初期化処理について説明する。制御部1100は段数変数Rankを初期化する。ここではRank=1とする。
【0067】
次に、ステップS200の秘匿加算撹乱(結果取得)処理について説明する。制御部1100は自己の「住民リストX」を記憶部1300より読み出し加算対象秘密デ-タ変数Xに設定し、相手機関の「住民リストY」を2つの整数ビット列と見なしたとき、ビット位置をそろえた上で撹乱させ、さらに、同じビット位置に追加ビットを挿入し作成された2つのビット列の加算結果の暗号文である暗号化撹乱加算結果を取得し、自己の主暗号鍵keyBもしくはkeyBに対応する復号鍵で復号することにより得られた結果を加算結果ビット配列変数Result-ordに設定する。
【0068】
ここで1つ疑問が生じる。暗号化撹乱加算結果を得るためには相手機関の「住民リストY」と自己の「住民リストX」に対してビット位置の撹乱、追加ビットの挿入などを相手機関が実行する必要があるなら、その際に、自身の「住民リストX」が相手機関に知られてしまうのではないかという疑問である。しかしながら、本実施の形態では暗号化したまま、ビット位置の移動、挿入ビットの挿入、加算などを有限体で四則演算を行うことができるという暗号の性質を利用した新しい暗号プロトコルにより、自身のリストを相手に知られることなく、撹乱加算ビット列の暗号文を取得することが可能となっている。その具体的方法は後で詳しく述べる。
【0069】
次にステップS400の加算前ビット列あいまい推測処理について説明する。制御部1100は秘匿加算撹乱処理の適用後、撹乱加算ビット列を得る。この撹乱加算ビット列Result-ordから加算前の2つのビット列をあいまいに復元し、復元した結果を推測結果ビット配列変数1Con-Original1と推測結果ビット配列変数2Con-Original2に設定する。ここでも、加算結果zを得る加算前の2つの入力の組合せ(x、y)、つまり、z=x+yを満たすx、yの組み合わせはビット列の値域の大きさに等しい数ほど存在することより、どのようにx、yを復元するのかという疑問が生じる。しかしながら、本実施の形態では、逆順ビット列という加算前のビット列の最上位ビットから最下位ビットに並んでいたビット列を最下位ビットから最上位ビットに並び替えたビット列についての撹乱加算ビット列Result-revも利用することで、元のビット列x、yをビットごとの正確な可換性二項論理演算適用結果を得ることができる程度に復元する。その具体的な方法は後で詳しく述べる。
【0070】
次にステップS500の論理演算処理について説明する。制御部1100はあいまい推測したCon-Original1、Con-Original2に格納された2つのビット列に対して、各ビット位置で論理和、論理積、排他的論理和、等価等の可換性二項論理演算を適用し、結果ビット列を論理演算ビット列変数Arith-Resultに設定し、論理演算結果ビット列変数Arith-Resltの内容を段数Rankの演算結果として記憶部1300に記録する。
【0071】
次にステップS600の反復回数判定処理について説明する。制御部1100は段数変数Rankの値と記憶部1300に格納されている指定段数Rank-finalの値を比較し、Rank=Rank-finalならステップS700へ進む。そうでなければ、段数変数Rankの値に1を加算し、制御をステップS200へ戻す。
【0072】
さらに、ステップS700の最終交換デ-タ作成処理について説明する。制御部1100は記憶部1300に記録された最終交換デ-タ作成手続きとその入力として指定されている秘密デ-タFinal-Secretを読み出し、最終交換デ-タ作成手続きを読み出した秘密デ-タに適用することで結果を算出し、得られた結果を最終交換デ-タ変数Ex-dataに設定する。
【0073】
最後に、ステップS800の最終結果取得処理では、ビット列撹乱処理担当の相手機関と最終交換デ-タ変数Ex-dataに設定されている値を通信部1200を介して交換し、記憶部1300に記録されている最終結果算出手続きに最終交換デ-タ変数Ex-Dataに設定されている値と受信した相手機関の最終交換デ-タの値を入力として最終結果算出手続きを実行し、計算結果を得る。
【0074】
以上、関数評価処理について説明したが、次に、他方のデ-タ処理装置1000で実行される「ビット列撹乱処理」について説明する。機関P2に設置された1台のデ-タ処理装置1000が機関P1のデ-タ処理装置1000上で実行される「関数評価処理」と協力して「ビット列撹乱処理」を実行することによって、秘匿関数計算を行うことができる。
【0075】
制御部1100は操作部1400から「ビット列撹乱開始通知」を受信すると
図10に示す「ビット列撹乱処理」を開始する。この「ビット列撹乱処理」は大きく5つのステップで構成される。以下、
図10のフロ-チャ-トを参照しながら「ビット列撹乱処理」について説明する。
【0076】
最初にステップS100の段数初期化処理は「関数評価処理」を担当するデ-タ処理装置で実行される段数初期化処理と同様に段数変数Rankを初期化する。
【0077】
次にステップS200の秘匿加算撹乱(加算)処理について説明する。制御部1100は自己の「担当住民リスト」をビット列表現した担当住民ビット列Yと相手機関のもつ担当住民ビット列Xを複数のビットに対してビットごとに同じように機関P2が定めるビット位置に移動、また、同じ位置にそれぞれ機関P2が定めるビット列を挿入した後、でき上がった2つのビット列の加算結果と等しい値を機関P1の暗号鍵で暗号化した暗号化撹乱加算結果を生成し、機関P1に送信する。
【0078】
ここでも疑問が生じる。暗号文である暗号化撹乱加算結果を生成するためには、どのような位置に各ビットを移動させたが、自己の住民リストビット列、挿入ビット列などの情報を相手機関に知らせ相手機関の主暗号鍵で暗号化してもらう必要があり、それらの情報を組み合わせることで相手機関が自己の住民リストビット列Yに関する情報を得ることができるのではないかという疑問である。しかしながら、本実施の形態では有限体で四則演算を行うことができるという暗号の性質を利用し暗号化したまま加算と乗算を組み合わせて実施する新しい暗号プロトコルを実行することにより、自身の住民リストYの情報、撹乱のために実行したビット操作情報を相手機関に知られることなく、暗号化撹乱結果を生成することが可能となる。その具体的方法は後で詳しく述べる。
【0079】
次に、ステップS600の反復回数判定処理について説明する。制御部1100は、関数評価処理での反復回数判定処理と同様に、現在の反復回数と記憶部1300に記録されている指定反復回数とを比較し、現在の反復回数と指定反復回数が同じならステップS700へ制御を移動し、そうでなければ、ステップS2000へ制御を移動する。
【0080】
最後に、ステップS600の段数判定処理、ステップS700の最終交換デ-タ作成処理、ステップS800の最終結果算出処理について説明する。これらの処理は、関数評価処理を担当するデ-タ処理装置1000で実行される段数判定処理、最終交換デ-タ作成処理、最終結果算出処理とほぼ同じである。ただ最終交換デ-タ作成処理のみ最終交換デ-タ作成手続きの入力として、記憶部1300に格納されている撹乱デ-タを秘密デ-タとして利用することができる点のみ異なる。
【0081】
以上、関数評価処理、ビット列撹乱処理について説明したが、次に関数評価処理、ビット撹乱処理について詳細に説明する。最初に、関数評価処理のステップS100と撹乱ビット列取得処理のステップS100の「段数初期化処理」について説明する。次に、関数評価処理のステップS200の「秘匿加算撹乱(結果取得)処理」とビット列撹乱処理ステップS200の「秘匿加算撹乱(加算)処理」について詳細に説明した後、関数評価処理のステップS400の「加算前ビット列あいまい推測処理」、ステップS500の「論理演算適用処理」について詳細に説明した後、関数評価処理とビット列撹乱処理のステップS600の「段数判定処理」、ステップS700の「最終交換デ-タ作成処理」、ステップS800の「最終結果算出処理」について説明する。
【0082】
最初に、ステップS100の「段数初期化処理」について説明する。ステップS100は
図11の「段数初期化処理」のフロ-チャ-トを参照して「段数初期化処理」について説明する。なお、段数初期化処理は段数初期化部1110で実行される。
【0083】
段数初期化部1110は段数初期化値と段数初期値と指定段数を記憶部1300から読み出し、段数変数初期値を段数変数Rankに指定段数を指定段数変数Rank-finalに設定する。以上の段数初期化処理が完了すると、関数評価処理を担当しているデ-タ処理装置1000の制御部1100は
図9のフロ-に戻り、ステップS200の秘匿加算撹乱(結果取得)処理を開始する。秘匿加算撹乱(結果取得)処理は秘匿加算撹乱(結果取得)部1120で実行される。また、ビット列撹乱処理を担当しているデ-タ処理装置1000の制御部1100は
図10のフロ-に戻り、ステップS200の秘匿加算撹乱(加算)処理を開始する。秘匿加算撹乱(加算)処理は秘匿加算撹乱(加算)部1180で実行される。なお、
図10での関数評価処理でのステップS200とビット列撹乱処理でのステップS200は
図12の「秘匿加算撹乱(結果取得)処理」と「秘匿加算撹乱(加算)処理」にそれぞれ対応している。以下、
図12のフロ-チャ-トを参照して「秘匿加算撹乱(結果取得)処理」と「秘匿加算撹乱(加算)処理」について説明する。
【0084】
秘匿加算撹乱(結果取得)部1120および秘匿加算撹乱(加算)部1180はステップS210で現在の段数Rankでの繰り返し回数の初期値を記憶部1300より読み出し、繰り返し変数loopの値を初期化する。繰り返し回数初期化処理を実行する。
【0085】
次に、秘匿加算撹乱(結果取得)部1120はステップS220で現在のRankと現在の繰り返しloopでの加算対象となる秘密デ-タを記憶部1300より読み出し加算対象秘密デ-タ変数Xに設定する。変数設定(結果取得)処理を実行する。
【0086】
一方、秘匿加算撹乱(加算)部1180はステップS220で現在の段数Rankと現在の繰り返し回数loopでの加算対象となる秘密デ-タ、および、撹乱デ-タを記憶部1300より読み出し、加算対象秘密デ-タ変数Yと撹乱デ-タ変数Mix-dataに設定する変数設定(加算)処理を実行する。
【0087】
次に秘匿加算撹乱(結果取得)部1120はステップS230で加算対象秘密デ-タ変数Xの内容を相手機関より送信される切断ブロック数Nとブロック切断点順列r=(r1、r2、…,rN-1)に従ってN個のブロックに切断し、結果をN次の内積対象ベクトル変数X=(X1、X2、…,XN)に設定する切断ブロック作成処理を実行する。
【0088】
一方、秘匿加算撹乱(加算)部1180はステップS230で、撹乱デ-タ変数Mix-dataのデ-タより、切断ブロック数、切断点順列、ブロックシフト係数順列、撹乱挿入値を読み出し、それぞれを切断ブロック変数N、ブロック切断点順列変数r=(r1、r2、…,rN-1)、ブロックシフト係数順列変数S=(s1、s2、…、sN)、撹乱挿入加算値変数Vに設定し、切断ブロック変数Nとブロック変数順列rを相手機関に送信する。さらに、自己の加算対象秘密デ-タ変数Yの内容をブロックシフト係数順列rに従って、N個のブロックに切断した後、撹乱挿入加算値変数Vの値を加算した結果をスカラ-定数変数Lに設定し、ブロックシフト係数順列の各要素を整数化できる乗数を求め、その乗数をブロックシフト係数の各要素に乗算し得られた結果を内積対象ベクトル変数Y=(y1、y2、…,yN)に設定し、
スカラ-除数変数Kに乗数とベクトル次数変数nにNの値を設定するブロックシフト係数設定処理を実行する。
【0089】
次に秘匿加算撹乱(結果取得)部1120はステップS300で内積対象ベクトル変数Xに設定されているn次のベクトルの内積結果に相手機関のスカラ-乗数変数Kに設定されている値を除算し、その後、相手機関のスカラ-除数変数Kに設定されている値を除算し、その後、相手機関のスカラ-定数変数Lに設定されている値を加算した結果を自己のもつ主暗鍵keyBで暗号化したときに得られる暗号文を暗号化内積結果Fとして取得し、自己のもつ主暗号鍵keyBもしくはkeyBに対応する復号鍵で復号し、ベクトル内積結果変数New-XYに設定する秘匿ベクトル内積計算(結果取得)処理を実行する。
【0090】
一方、秘匿加算撹乱(加算)部1180はステップS300で相手機関がもつ内積対象ベクトル変数Xに設定されているn次のベクトルと自己のもつ内積対象ベクトル変数Yに設定されているn次のベクトルの内積結果Σ
1≦i≦nxiyiに自己のもつスカラ-除数変数kに設定されている値を除算し、その後、自己のもつスカラ-定数変数Lに設定されている値を加算した結果(1/K)・Σ
1≦i≦nxiyi+Lを相手機関のもつ主暗号鍵keyBで暗号化したときに得られる暗号文を作成し暗号化内積結果変数Fに設定し、Fの内容を相手機関に送信する秘匿ベクトル内積計算(加算)処理を実行する。
【0091】
ここで、複数のビット列に対して、暗号化したまま四則演算を実行するため暗号化に利用できる鍵が制限され、互いの情報が漏洩してしまう可能性があるのではないかという疑問が生じる。しかしながら、本実施の形態では、複数の演算を一度に暗号に利用し、複数の鍵を使用する新しい暗号プロトコルにより、各ブロックの情報を相手に知られることなく、撹乱切断ビット列の暗号文を作成することができる。
【0092】
最後に、秘匿加算撹乱(結果取得)部1120はステップS350で繰り返し回数変数Loopの値が指定繰り返し回数変数loop-finalの値と等しいかどうかを判定し、等しければ繰り返しで得られた内積結果のうちの一部を加算結果ビット配列変数Result-ordに設定し、制御を制御部1100に戻し、loop≠loop-Finalの場合には繰り返し回数変数loopの値に1を加算し、制御をステップS200に戻し、繰り返し回数判定(結果取得)処理を実行する。
【0093】
一方、秘匿加算撹乱(加算)部1180はステップS350で繰り返し回数変数loopの値が指定繰り返し回数変数loopの値が指定繰り返し回数変数loop-finalの値と等しいかどうかを判定し、等しければ制御を制御部1100へ戻し、等しくなければ、制御をステップS200へ戻す繰り返し回数判定(加算)処理を実行する。
【0094】
以上、関数評価処理、ビット列撹乱処理について詳細に説明したが、さらに詳細に関数評価処理、ビット列撹乱処理について説明する。関数評価処理およびビット列撹乱処理のS100は
図13の「段数初期化処理」に対応している。以下、
図13のフロ-チャ-トを参照して「段数初期化処理」について説明する。なお、段数初期化処理は段数初期化部1110で実行される。
【0095】
段数初期化部1110は段数初期値と指定段数を記憶部1300から読み出す(ステップS101)。
【0096】
次に、段数初期化部1110は段数初期値を段数変数Rankに、指定段数を指定段数変数Rank-finalに設定する(ステップS102)。段数変数の初期化が終了すると制御部1100は
図10のフロ-に戻りS200の秘匿加算撹乱(結果取得)処理または秘匿加算撹乱(加算)処理のどちらかを開始する。秘匿加算撹乱(結果取得)処理は秘匿加算撹乱(結果取得)部1120で秘匿加算撹乱(加算)処理は秘匿加算撹乱(加算)部1180で実行される。以下、
図12のフロ-チャ-トを参照して「秘匿加算撹乱(結果取得)処理」と「秘匿加算撹乱(加算)処理」について説明する。
【0097】
秘匿加算撹乱(結果取得)部1120および秘匿加算撹乱(加算)部1180はステップS210の「繰り返し回数初期化処理」を実行する。繰り返し回数初期化処理S210は
図13の「繰り返し初期化処理」に対応している以下、
図13のフロ-チャ-トを参照して「繰り返し初期化処理」について説明する。なお、繰り返し初期化処理は秘匿加算撹乱(結果取得)部1120の場合は繰り返し回数初期化部1121が、秘匿加算撹乱(加算)部1180の場合は繰り返し回数初期化部1181が実行する。
【0098】
秘匿加算撹乱(結果取得)部1120の繰り返し初期化部1121および秘匿加算撹乱(加算)部1180の繰り返し初期化部1181は段数Rankでの繰り返し回数初期値、指定繰り返し回数を記憶部1300から読み出す(ステップS211)。
【0099】
繰り返し回数初期化が終了したら、制御は秘匿加算撹乱(結果取得)部1120または秘匿加算撹乱(加算)部1180に戻される。秘匿加算撹乱(結果取得)部1120および秘匿加算撹乱(加算)部1180は
図11のフロ-に戻り、ステップS220の変数設定(結果取得)処理、変数設定(加算)処理をそれぞれ実行する。
【0100】
ステップS220はそれぞれ
図14の変数設定(結果取得)処理および変数設定(加算)処理に対応している。以下、
図14のフロ-チャ-トを参照して変数設定(結果取得)処理、変数設定(加算)処理を説明する。
【0101】
変数設定(結果取得)部1122は段数Rank、繰り返し回数Loopで用いるデ-タの名前である加算対象秘密デ-タ名target-data-name,主記憶鍵keyBを記憶部1300から読み出す(ステップS221).
【0102】
次に変数設定(結果取得)部1122は加算対象秘密デ-タ名target-data-nameをもつデ-タを記憶部1300から読み出し、加算対象秘密デ-タ変数Xに設定する(ステップS222)。
【0103】
最後に変数設定(結果取得)部1122は主暗号鍵変数keyBに読み出した暗号鍵keyを設定する(ステップS223)。以上により、変数設定(結果取得)処理を完了する。
【0104】
変数設定(加算)部1182は段数Rank、繰り返し回数loopで用いるデ-タの名前である加算対象秘密デ-タ名target-data-name、撹乱デ-タ名mix-data-name、主暗号鍵keyを記憶部1300から読み出す(ステップS221)。
【0105】
次に変数設定(加算)部1182は、加算対象秘密デ-タ名target-data-nameをもつデ-タと撹乱デ-タ名mix-data-nameをもつデ-タを記憶部1300から読み出し、加算対象秘密デ-タ変数Yと撹乱デ-タ変数mix-data、それぞれに設定する(ステップS231)。
【0106】
最後に変数設定(加算)部1182は、主暗号鍵変数keyAに読み出した暗号鍵keyを設定する(ステップS213)。以上により変数設定(加算)処理が完了する。
【0107】
変数設定(結果取得)処理が完了したら秘匿加算撹乱(結果取得)部1120は
図12のフロ-に戻り、ステップS230の「切断ブロック作成処理」を実行する。ステップS230の
図15の切断ブロック作成処理に対応する。以下では
図15のフロ-チャ-トを用い「切断ブロック作成処理」を説明する。切断ブロック作成処理は切断ブロック作成部1123で実行する。
【0108】
同様に変数設定(加算)処理が完了したら秘匿加算撹乱(加算)部1180は
図12のフロ-に戻り、ステップS230の「ブロックシフト係数設定処理」を実行する。ステップS230は
図15の「ブロックシフト係数設定処理」に対応する。以下では
図15のフロ-チャ-トを用いブロックシフト係数設定処理を説明する。ブロックシフト係数設定処理はブロックシフト係数設定部1183が実行する。
【0109】
ブロックシフト係数設定部1183は撹乱デ-タ変数Mix-dataに設定されている撹乱デ-タより切断ブロック数、切断点順列、ブロックシフト係数順列、撹乱挿入加算値を読み出し、切断ブロック変数N、ブロック切断点順列変数r=(r1,r2,...,rN-1)、ブロックシフト係数順列変数S=(s1,s2,...,sN)、撹乱挿入加算値変数Vにそれぞれ設定する(ステップS231)。
【0110】
次に、ブロックシフト係数設定部1183は切断ブロック変数Nとブロック切断点順列変数rの内容を通信部1400を介して相手機関に送信する(ステップS232)。
【0111】
次に、ブロックシフト係数設定部1183はブロック切断点順列変数rの内容に従って、加算対象秘密デ-タ変数Yの内容をN個のブロックに切断し、切断ブロック列を作成する(ステップS233)。
【0112】
ブロックシフト係数設定部1183は切断ブロック列とブロックシフト係数順列Sの内積を計算し、切断ブロックシフト後秘密デ-タを作成する(ステップS234)。
【0113】
その後、切断ブロックシフト後秘密デ-タと撹乱挿入加算値変数Vの値を加算し、撹乱後加算対象秘密デ-タを作成しスカラ-定数変数Lに設定する(ステップS235)。
【0114】
次に切断ブロック変数Nの値をベクトル次数変数nに設定し(ステップS236)、さらにブロックシフト係数順列の要素のどれかが整数でない場合、全ての要素を整数化できる乗数を求め、スカラ-除数変数Kに設定する(ステップS237)。
【0115】
最後にブロックシフト係数設定部1183はブロックシフト係数順列Sの各係数にスカラ-除数を乗じることで得られる順列を内積対象ベクトル変数Y=(y1,y2,...,yn)に設定する(ステップS238)。以上により、ブロックシフト係数設定処理は完了する。
【0116】
次に切断ブロック作成処理について説明する。まず、切断ブロック作成部1123は、切断ブロック数とブロック切断点順列を相手機関より受信する(ステップS233)。
【0117】
さらに、切断ブロック作成部1123は受信した切断ブロック数とブロック切断点順列を切断ブロック変数Nとブロック切断点順列変数r=(r1,r2,...,rN-1)に設定する(ステップS235)。
【0118】
次にブロック切断点順列変数rの内容に従って、加算対象秘密デ-タ変数Xの内容をN個のブロックに切断し、切断ブロック列を作成し(ステップS236)、作成した切断ブロック列を内積対象ベクトル変数X=(x1,x2,...,xN)に設定する(ステップS237)。
【0119】
最後に、切断ブロック作成部1123は切断ブロック数変数Nの値をベクトル次数変数nに設定する(ステップS238)。以上により切断ブロック作成処理は完了する。
【0120】
ここで、ビット列切断位置をそのまま送信することにより、後にビット列をあいまいに復元したときに、相手機関がビット列切断位置情報を利用して、自己のビット列を予測できてしまうのではないかという疑問が生じる。しかしながら、本実施の形態では撹乱ビット列の挿入、および、撹乱後のビット列に対し、新しいプロトコルにより、ビット列撹乱処理を複数回適用することが可能となり、送信された切断位置が元のビット列ではその位置であるかという情報を推測不能にする。その具体的方法は後で詳しく述べる。
【0121】
切断ブロック作成処理が完了したら、秘匿加算撹乱(結果取得)部1120は
図12のフロ-に戻り、S300の秘匿ベクトル内積結果(結果取得)処理を開始する。S300は
図16の秘匿ベクトル内積結果(結果取得)処理に対応する。以下では
図16のフロ-チャ-トを用い秘匿ベクトル内積計算(結果取得)処理を説明する。秘匿ベクトル内積結果(結果取得)処理は秘匿ベクトル内積計算(結果取得)部1124が実行する。
【0122】
また、ブロックシフト係数作成処理が完了したら、秘匿加算撹乱(加算)部1180は
図12のフロ-に戻り、S300の秘匿ベクトル内積計算(加算)処理を開始する。S300は
図16の秘匿ベクトル内積計算(加算)処理に対応する。以下では
図16のフロ-チャ-トを用いて秘匿ベクトル内積計算(加算)処理を説明する。秘匿ベクトル内積計算(加算)処理は秘匿ベクトル内積計算(加算)部1184が実行する。
【0123】
秘匿ベクトル内積計算(加算)部1184はまず、ベクトル次数nと同じ個数の0以外の乱数の列で要素の総和がスカラ-定数変数Lの値とスカラ-除数変数Kの値を乗算した結果と等しくなるような列を作成し、定数ベクトルL=(L1,L2,...,Ln)に設定する(ステップS301)。ここでΣ
1≦i≦nLi=L・Kを満たす。
【0124】
次に、n個の副暗号鍵を記憶部1300より読み出し副暗号鍵ベクトル(keyA1,keyA2,...,keyAn)を作成し、各ベクトル位置i(1≦i≦n)において、副暗号鍵ベクトル(keyA1,keyA2,...,keyAn)のベクトル位置iの副暗号鍵keyAiを用いて、内積対象ベクトル変数のベクトル位置iの要素yiを暗号化し、暗号化内積対象ベクトルC1=(C11,C12,...,C1n)を作成する(ステップS302)。
【0125】
同様に秘匿ベクトル内積計算(加算)部1184は、各ベクトル位置i(1≦i≦n)において、副暗号鍵ベクトルのベクトル位置iの副暗号鍵keyAiを用いて、定数ベクトルLのベクトル位置iの副暗号鍵keyAiを用いて、定数ベクトルLのベクトル位置iの要素Liを暗号化し、暗号化定数ベクトルC2=(C21,C22,...,C2n)を作成する(ステップS303)。
【0126】
次に秘匿ベクトル内積計算(加算)部1184は、暗号化内積対象ベクトルC1=(C11,C12,...,C1n)と暗号化定数ベクトルC2=(C21,C22,...,C2n)を相手機関に送信し、ステップS311へ進む(ステップS304)。
【0127】
秘匿ベクトル内積計算(結果取得)部1124は始めに、相手機関より次数nの暗号化内積対象ベクトルと暗号化定数ベクトルが送信されるのをまつ(ステップS305:No)。相手機関から暗号化内積対象ベクトルと暗号化定数ベクトルが送信されたら、ステップS306へ進む(ステップS306:Yes)。
【0128】
次に秘匿ベクトル内積計算(結果取得)部1124は受信した暗号化内積対象ベクトルと暗号化定数ベクトルを暗号化対象ベクトル変数C1と暗号化定数ベクトル変数C2に設定し(ステップS306)、各ベクトル位置(1≦i≦n)において、内積対象ベクトル変数X=(X1,X2,...,Xn)のベクトル位置iの要素Xiに暗号化内積対象ベクトル変数のベクトル位置iの要素Ciを乗じた結果をベクトル位置iの要素とする乗算結果ベクトルを計算する(ステップS307)。
【0129】
さらに、秘匿ベクトル内積計算(結果取得)部1124は、各ベクトル位置i(1≦i≦n)において、乗算結果ベクトルのベクトル位置iの要素Cixiと暗号化定数ベクトル変数のベクトル位置iの要素C2iを加算した結果をベクトル位置iの要素とする乗算加算結果ベクトルを計算する(ステップS308)。
【0130】
次に、主暗号鍵keyBにて各乗算加算結果ベクトルの要素を暗号化し二重暗号化内積対象乗算結果ベクトルD=(D1,D2,...,Dn)に設定する(ステップS309)。
【0131】
そして、秘匿ベクトル内積計算(結果取得)部1124は次数nの二重暗号化内積対象乗算結果ベクトルDを相手機関に送信し、ステップS316へ進む(ステップS310)。
【0132】
秘匿ベクトル内積計算(加算)部1184は二重暗号内積対象乗算結果ベクトルが相手機関より送信されるのをまつ(ステップS311:No)。二重暗号化内積対象乗算結果ベクトルが送信されたならステップS312へ進む(ステップS311:Yes)。
【0133】
次に、秘匿ベクトル内積計算(加算)部1184は二重暗号化内積対象乗算結果ベクトルを二重暗号化内積乗算結果ベクトル変数D=(D1,D2,...,Dn)に設定する(ステップS312)。
【0134】
さらに各ベクトル位置i(1≦i≦n)において、副暗号鍵ベクトル(keyA1,keyA2,...,keyAn)のベクトル位置iの副暗号鍵ベクトルkeyAiもしくはkeyAiに対応する復号鍵を用いて二重暗号化内積対象乗算結果ベクトルのベクトル位置iの要素Diを復号し、暗号化内積対象乗算結果ベクトルE=(E1,E2,...,En)を作成する(ステップS313)。
【0135】
次に暗号化内積対象乗算結果ベクトルE=(E1,E2,...,En)の全要素を加算し、結果を暗号化内積結果変数Fに設定し(ステップS314)、暗号化内積結果変数Fに設定し(ステップS314)、暗号化内積結果変数Fの暗号文を相手機関に送信する(ステップS315)。以上により、秘匿ベクトル内積計算(加算)処理は完了する。
【0136】
秘匿ベクトル内積計算(結果取得)部1124は相手機関より暗号化内積結果が送信されるのをまつ(ステップS316:No)。暗号化内積結果が送信されたらステップS317へ進む(ステップS316:Yes)。
【0137】
次に暗号化秘匿ベクトル内積結果変数Fの内容を主暗号鍵keyBもしくはkeyBに対応する復号鍵にて復号しベクトル内積結果変数New-XYに設定する(ステップS317)。
【0138】
最後に、秘匿ベクトル内積計算(結果取得)部1124はベクトル内積結果変数New-XYを結果秘密デ-タ名変数の内容の名前をもつ秘密デ-タとして記憶部1300に記憶する(ステップS318)。以上により、秘匿ベクトル内積計算(結果取得)処理は完了する。
【0139】
秘匿ベクトル内積計算(結果取得)処理を完了した秘匿加算撹乱(結果取得)部1120は
図12のフロ-に戻りステップS350の繰り返し回数判定(結果取得)処理を実行する。繰り返し判定(結果取得)処理は
図17のフロ-チャ-トで示される処理である。以下では
図17のフロ-チャ-トを用い、繰り返し判定(結果取得)処理を説明する。繰り返し判定(結果取得)処理は繰り返し判定(結果取得)部1125で実行される。
【0140】
秘匿ベクトル内積計算(加算)処理を完了した秘匿加算撹乱(加算)部1180は
図12のフロ-に戻りステップS350の繰り返し判定(加算)処理を実行する。繰り返し判定(加算)処理は
図17のフロ-チャ-トで示される処理である。以下では、
図17のフロ-チャ-トを用い、繰り返し判定(加算)処理を説明する。繰り返し判定(加算)処理は繰り返し判定(加算)部1185で実行される。
【0141】
繰り返し回数判定(結果取得)部1125は現在の繰り返し回数変数loopと指定繰り返し回数変数loop-finalの値が一致するかを判定し、一致しなければステップS351へ進む(ステップS351:No)。一致するならば、ステップS353へ進む(ステップS351:Yes)。
【0142】
判定が一致した場合、繰り返し回数判定(結果取得)部1125は、繰り返し回数変数loopの値に1を加算し、戻り値Noとともに、制御を秘匿加算撹乱(加算)部1120へ返す(ステップS352)。
【0143】
判定が一致しなかった場合、繰り返し回数判定(結果取得)部1125は、段数Rankの値の段で加算結果(正順)ビット配列変数と加算結果(逆順)ビット配列変数に設定すべき秘密デ-タの名前を記憶部1300より読み出し、それぞれ加算結果(正順)秘密デ-タ名と加算結果(逆順)秘密デ-タ名とする(ステップS353)。
【0144】
次に、繰り返し回数判定(結果取得)部1125は加算結果(正順)秘密デ-タ名をもつ秘密デ-タと加算結果(逆順)秘密デ-タ名をもつ秘密デ-タを記憶部1300より読み出し、それぞれを加算結果(正順)ビット配列変数Result-ordと加算結果(逆順)ビット配列変数Result-revに設定し、戻り値Yesとともに制御を秘匿加算撹乱(加算)部1120へ返す(ステップS354)。
【0145】
繰り返し回数判定(加算)部1185は繰り返し回数変数loopが指定繰り返し回数loop-finalと一致するかどうかを判定し、一致すれば戻り値Yesとともに制御を秘匿加算撹乱(加算)部1180へ返す(ステップS351:Yes)。一致しなければ、ステップS352へ進む(ステップS351:No)。
【0146】
一致しなかった場合、現在の繰り返し回数変数loopの値に1を加算し、戻り値Noとともに制御を秘匿加算撹乱(加算)部1180へ返す(ステップs352)。
【0147】
繰り返し回数判定(結果取得)部1125より戻り値を受け取った秘匿加算撹乱(結果取得)部1120は
図Gのフロ-に戻り、その戻り値がNoだった場合にはステップS220へ進む(ステップS350:No)。戻り値がYesだった場合は制御を制御部1100へ戻す(ステップS350:Yes)。
【0148】
同様に繰り返し回数判定(加算)部1185より戻り値を受け取った秘匿加算撹乱(加算)部1180は
図12のフロ-に戻り戻り値がNoだった場合には、ステップS220へ進み、秘匿加算撹乱処理を続ける(ステップS350:No)。戻り値がYesだった場合は、制御を制御部1100へ戻す(ステップS350:Yes)。
【0149】
以上により秘匿加算撹乱(結果取得)処理と秘匿加算撹乱(加算)処理の詳細について説明した。機関P1のデ-タ処理装置1000で秘匿加算撹乱(結果取得)処理と機関P2のデ-タ処理装置1000で秘匿加算撹乱(加算)処理が協調して実行されることにより、機関P2の秘匿加算撹乱(加算)部1180は相手機関に知られることなくビット列を撹乱した上で互いのビット列を加算することができる。一方、機関P1の秘匿加算撹乱(結果取得)部1120では自己のビット列を相手に知らせることなく、相手機関のビット列と加算した結果に等しい撹乱加算ビット列を得ることができる。秘匿加算撹乱(結果取得)処理を完了した制御部1100は
図10のフロ-に戻り、S400の加算前ビット列あいまい推測処理を実行する。ビット列あいまい推測処理は
図18のフロ-チャ-トに示される。以下では
図18のフロ-チャ-トを用い説明する。ビット列あいまい推測処理はビット列あいまい推測部1130が実行する。
【0150】
ビット列あいまい推測部1130は加算結果(正順)ビット配列変数Result-ordに設定されている正順結果ビット列と加算結果(逆順)ビット配列変数Result-revに設定されている逆順結果ビット列より加算前の撹乱ビット列X’,Y’を推測する。つまり、X’+Y’の結果としてResult-ordを得た元々のX’とY’を推測する(ステップS401)。
【0151】
ここでも、加算結果がResult-ordとなる2つのビット列の組は加算前のビット列の長さをM’とすると2のM’ 乗の個ほど存在するし、この中からX’、Y’を選ぶことは不可能ではないかという疑問が生じる。しかしながら、本実施形態では加算結果Result-ordを得た処理と同様な処理を適用して、X’を逆順にしたビット列X’’と、Y’を逆順にしたビット列Y’’(つまり、X’’[i]=X’[M’-i-1], Y’’[i]=Y’[M’-i-1], 0≦i<M’)の加算結果Result rev(=X’’+Y’’)を秘匿撹乱加算(結果取得)処理と秘匿撹乱加算(加算)処理を適用して計算し、機関P1は逆順結果ビット列Result-revを取得することで、X’、Y’の推測の範囲を格段に狭めることを可能とする。さらに推測を論理演算が正確に計算できる程度、つまり、2つの値の組み合わせだけを明確にし、どちらがX’側であるかは不明とする程度にとどめることによって、正確なビット情報を秘匿する。
【0152】
加算前ビット列あいまい推測部1130は撹乱加算ビット列Result-ordの1番目のビットをキャリ-ビットC-ord[0]を’0’とし、撹乱加算ビット列Result-revのM’+1番目のキャリ-ビットC-rev[M’]を撹乱加算結果ビット列Reslt-revのM’+1番目のビットResult-rev[M’]とし、変数iに0を設定した上でResult-ord[i], Result-rev[M-i], C-ord[i], C-rev[M-i]より、Con-Original1[i], Con-Original[i]をあいまいに推測し、次のビットのキャリ-C-ord[i+1], C-rev[M-i-1]を正確に推測するために記憶部1300に記録している
図23の加算前ビット列あいまい推測表を用いる。
【0153】
図23の加算前ビット列あいまい推測表は
図24に示す2つの表(a),(b)を組み合わせることで作成できる。表(a)ではResult-ord[i], C-ord[i]の組合せより、X’’[i],Y’’[i]の順不同の組合せの候補を2つ以下に絞ることが可能であることがわかる。表(b)でもResult-rev[M’-i], C-ord[M’-i]の組合せより、X’’[i],Y’’[i]の順不同の組合せの候補を2つ以下に絞ることが可能だとわかる。さらに、表(a)と表(b)を組み合わせることにより、加算前の2つビットX’’[i]とY’’[i]の値の組合せを一意に絞り込むことができ,X’’の推測ビット列をC-Original1とY’’の推測ビット列をC-Original2と表現することで
図23の加算前ビット列あいまい推測表を作成することができる。
図23の表で示すように、C-Original1[i]とC-Original2[i]を一意に絞り込むことができることより、キャリ-ビットC-ord[i+1],C-rev[M’-i-1]も一意に決定することが可能となる。
【0154】
加算前ビット列あいまい推測部1130は次にビット位置iを1だけ増加させ、表より求めたC-ord[i+1]、C-rev[M’-i-1]とResult-ord[i+1],Result-rev[M’-i-1]を新たな入力として、加算前ビット列あいまい推測表よりC-Original1[i+1]とC-Original2[i+1]の値の組合せ、キャリ-ビットC-ord[i+2]、C-rev[M’-i-2]の値の算出を続ける。最終的に、i=M’となったときに、全てのビットの組合せを算出でき、制御を制御部1100に戻す。
図23の加算前ビット列あいまい推測表を用いた加算前ビット列あいまい推測の概要を
図25に示す。
図25ではResult-ord[i]=1、Result-rev[M’-i]=0、C-ord[i]=1、C-ord[M’-i]=0である場合に、加算前ビット列あいまい推測表より、C-Original1[i]とC-Original2[i]の値の組合せ(0,0)、キャリ-ビットC-ord[i+1]=0、C-rev[M’-i-1]=0を推測可能となる。推測したキャリ-ビットC-ord[i+1]=0、C-rev[M’-i-1]=0とResult-ord[i+1],Result-rev[M’-i-1]の値より、以降のビットの推測を続ける。
【0155】
次に、ビット列あいまい推測部1130は推測された2つのビット列をあいまい推測結果ビット配列1変数Con-Original1とあいまい推測結果ビット配列2変数Con-Original2に設定する(ステップS402)。以上により、ビット列あいまい推測処理は完了する。
【0156】
ビット列あいまい推測処理を完了した制御部1100は
図10のフロ-に戻りステップS500の論理演算適用処理へ進む。論理演算適用処理は
図19のフロ-チャ-トに従う処理である。以上では、
図19のフロ-チャ-トを用いて論理演算適用処理を説明する。論理演算適用処理は、論理演算適用部1140で実行される。
【0157】
論理演算適用部1140は段数変数Rankの段数での指定論理演算型列と格納デ-タ名を記憶部1300より読み出し、指定論理演算型配列変数logic-Arithと格納デ-タ名変数File-Nameにそれぞれを設定する(ステップS501)。
【0158】
次に論理演算適用部1140は指定論理演算型配列Logic-Arithの配列位置変数iを配列先頭とし、指定論理演算型配列Logic-Arithの配列位置変数jを配列先頭とする(ステップS502)。
【0159】
次に指定論理演算型配列Logic-Arithの配列位置iにおいて、指定論理演算型配列の内容Logic-Arithの配列位置iにおいて、指定論理演算型配列の内容Logic-Arith[i]である可換性論理演算を読み出しOperationとする(ステップS503)。
【0160】
あいまい推測ビット配列1変数Con-Original1の各配列位置jに対して、Con-Original1の配列位置jの内容Con-Original1[j]とあいまい推測ビット配列2変数Con-Original2の配列位置jの内容Con-Original2[j]を読み出し、ビットAとビットBとする。ビットAとビットBに対してOperationの型の可換性論理演算を適用し、得られた結果を論理演算結果ビット配列変数Arith-Resultの配列位置jの要素Arith-Result[j]として指定する(ステップS504)。
【0161】
さらに、論理演算適用部1140は論理演算結果ビット配列変数Arith-Resultの内容を格納デ-タ変数File-nameの名前をもつ秘密デ-タとして記憶部1300に記憶する(ステップS505)。
【0162】
その後、配列位置iが指定論理演算型配列位置の最後か判定し、最後なら制御を制御部1100へ戻す(ステップS506:Yes)。最後でないならば、ステップS507へ進む(ステップS506:No)。
【0163】
最後でない場合、配列位置変数iの位置を1つ後にずらすように更新し、格納デ-タ名変数File-Nameも更新し、ステップS503へ戻る(ステップS507)。
【0164】
論理演算適用処理を完了した制御部1100は
図10のフロ-に戻り、ステップS600の段数変数処理を実行する。段数判定処理は
図20のフロ-チャ-トに従う処理である。以下、
図20を用いて段数判定処理を説明する。段数判定処理は段数判定部1150で実行される。
【0165】
秘匿加算撹乱(加算)処理を完了した制御部1100は
図10のフロ-に戻り、ステップS600の段数判定処理を実行する。段数判定処理は
図20のフロ-チャ-トに従う処理であり、関数評価処理を実行する制御部1100が実行する段数判定処理と同じである。段数判定処理は段数判定部1150で実行される。
【0166】
段数判定部1150は段数変数Rankの値が指定段数Rank-finalに等しいかどうかを判定し、等しければ戻り値Yesとともに制御を制御部1100に戻す(ステップS601:Yes)。等しくなければ、ステップS602に進む(ステップS601:No)。等しくない場合、段数変数Rankの値を1だけ加算し、戻り値Noとともに制御を制御部1100に戻す(ステップS602)。
【0167】
段数判定処理を完了した制御部1100は
図10のフロ-に戻り、段数判定処理の戻り値がYesならステップS700へ進む(ステップS600:Yes)。戻り値がNoならステップS200へ制御を戻し、関数評価処理を実行している制御部1100は秘匿加算撹乱(結果取得)処理を、ビット列撹乱処理を実行している制御部1100は秘匿加算撹乱(加算)処理を開始する(ステップS600:No)。
【0168】
段数判定処理の戻り値がYesであった場合、制御部1100はステップS700の最終交換デ-タ作成処理を開始する。最終交換デ-タ作成処理は
図21のフロ-チャ-トで示される処理である。以下では
図21を用いて最終交換デ-タ作成処理を説明する。最終交換デ-タ作成処理は最終交換デ-タ作成部1160で実行される。
【0169】
最終交換デ-タ作成部1160は出力秘密デ-タ名と最終交換デ-タ作成手続きを記憶部1300から読み出す(ステップS701)。次に出力秘密デ-タ変数Final-Secretに設定する(ステップS702)。
【0170】
最後に、出力秘密デ-タFinal-Secretに最終交換デ-タ作成手続きを適用し、得られた結果を最終交換デ-タ変数Ex-dataに設定する(ステップS703)。以上で最終交換デ-タ作成処理は完了する。
【0171】
最終交換デ-タ作成処理を完了した制御部1100は
図10のフロ-に戻りステップS800に進む。ステップS800の
図22のフロ-チャ-トの最終結果算出処理に対応している。以下では
図22を用いて最終結果算出処理を説明する。最終結果算出処理は最終結果算出部1170で実行される。
【0172】
最終結果算出部1170は最終結果算出手続きを記憶部1300より読み出し(ステップS801)、最終交換デ-タ変数Ex-dataの値を相手機関に送信する(ステップS802)。
【0173】
次に、相手機関より最終交換デ-タが送信されるのをまつ(ステップS803:No)。最終交換デ-タが送信されたらステップS804に進む(ステップS803:Yes)。受信したデ-タを受信最終交換デ-タ変数Rec-dataに設定する(ステップS805)。
【0174】
最後に最終結果算出部1170は最終交換デ-タ変数Ex-dataの値と受信最終交換デ-タ変数Rec-dataの値に対して最終結果算出手続きを適用し、計算結果Final-Resultを算出し、計算結果Final-Resultを戻り値として制御を制御部1100に戻す(ステップS805)。
【0175】
最終結果算出処理を完了した制御部1100は
図10のフロ-に戻りインタフェ-ス部1500を介し、受け取った戻り値Final-Resultを外部に出力し終了する。
【0176】
以上により、「関数評価処理」および「ビット列撹乱処理」の詳細について説明したが、「関数評価処理」、「ビット列撹乱処理」についてさらに
図7、
図8、
図9の処理概略図を用いて詳しく説明する。2つの処理によって、どのように機関P1は自分の秘匿情報を守り、一方、機関P2がブロック置換などの撹乱に使う係数等の情報を使い撹乱加算結果を生成するのかについて詳細に説明する。
【0177】
秘匿加算撹乱(結果取得)処理と並行に機関P2の秘匿加算撹乱(加算)部1180にて実行される切断ブロックシフト係数処理では、まず、ビット列を切断し、複数ブロックを機関P1に作成してもらうため、記憶部に記録されている現在の繰り返し回数loop、現在の段数Rankでの撹乱デ-タより切断ブロック数N、切断点順列r=(r1,r2,…,rN-1)を読み出し、切断点数Nと切断点順列rを機関P1に送信する(
図7(a))。
【0178】
機関P2より、切断点数Nと切断点順列r=(r1,r2,…,rN-1)を受信した機関P1の切断ブロック作成部1123は切断ブロックを間接的に表現するため、N-1個の値Ai (1≦i≦N) をAi←X[M-1,…,ri]×2^(ri-1)+X[ri-1,…,0]に従って計算する。その後、制御を秘匿加算撹乱(結果取得)部1120に戻す(
図7(b))。
【0179】
機関P2のブロックシフト係数作成部では切断ブロック数Nと切断点列rを機関P1に送信した後、繰り返loopでの加算対象変数Xへの追加ビット列W, 加算対象変数Yへの追加ビット列Zを撹乱デ-タより読み出し、設定する。また、各切断ブロックの左シフト回数順列S=(s1,s2,…,sN-1,sN+1)、追加ビット列に対する切断点順列、左シフト回数順列も撹乱デ-タより読み出す。そして、切断点順列r、左シフト回数順列S、追加ビット列に対する切断点順列、左シフト回数順列に従って、加算対象変数Y、Xへの追加ビット列W、Yへの追加ビット列Zを変形し、それぞれY’、W’、Z’とする(
図7(c))。
【0180】
次にブロックシフト係数作成部1183では変数New-YにY’+W’+Z’の値を代入する。また、以下の条件を満たす定数Cmin=-min{si-ri-1+1|1≦i≦N}を計算し、各i(1≦i≦N)に対して係数Liを計算する。i=1のときはL1=(2^(S1+1)-2^(s2-(r1-1))×2^Cmin、2≦i≦NのときはLi=(2^(si-r(i-1)+1)-2^(s(i+1)-ri+1)×2^Cmin, i=NのときはLN=(2^sN-1-(rN-2)-2^s1)×2^Cminとする。これらの値を計算した後、ブロックシフト係数作成部は制御を秘匿加算撹乱(加算)部1180へ戻す(
図7(d))。
【0181】
機関P1の秘匿加算撹乱(結果取得)部1120と機関P2の秘匿加算撹乱(加算)部1180は互いに協調し、秘匿べクトル内積計算を実行することにより、機関P1のもつN次元のベクトル(A1,A2,…,AN-1,X)と機関P2のもつN次元ベクトル(L1,L2,…,L
N)、スカラ-除数2
Cmin, スカラ-定数New-Yとして、New-XY=2
-Cmin(Σ
1≦i≦N-1LiAi+L
NX)+New-Yを計算する。そのため、秘匿加算撹乱(結果取得)部1120は秘匿ベクトル内積計算の入力ベクトル次元nにNを、入力ベクトル (X1,…,Xn)に(A1,…,AN-1,X)を代入し、秘匿加算撹乱(加算)部は秘匿ベクトル内積計算の入力ベクトル次元nにNを、入力ベクトル(Y1,…,Yn)に(L1,L2,…,LN)、入力スカラ-除数Kに2
Cmin, 入力スカラ-定数LにNew-Yを代入する。その後、機関P1の秘匿加算撹乱(結果取得)部1120は秘匿ベクトル内積(結果取得)部1124に制御を移し、秘匿ベクトル内積計算(結果取得)処理を実行する。また、機関P2の秘匿加算撹乱(加算)部は制御を秘匿ベクトル内積計算(加算)部1184に移し、秘匿ベクトル内積計算(加算)処理を実行する(
図8(e))。
【0182】
機関P2の秘匿ベクトル内積計算(加算)部は、まず、スカラ-定数LをΣLi=K×Lを満たすn個の整数の組み合わせに分解する。ここで、各Li≠0(1≦i≦n)とする。次に、各i(1≦i≦n)に対して、副暗号鍵keyAiを決定し、二項組の暗号文(C1i,C2i)をYiの副暗号鍵keyAiでの暗号化結果、Liの副暗号鍵keyAiでの暗号化結果とする。ここで用いる暗号化方式gは暗号化したままでの四則演算が可能であり、かつ、可換性をもつものとする。つまり、ある平文Mがある暗号鍵keyCで暗号化された後、その暗号文をさらにある鍵keyDで暗号化した場合に得られる暗号文は、平文Mを鍵keyDで暗号化した後に鍵keyCで暗号化したときに得られる暗号文と同一である。特に、暗号化したままの四則演算に関しては、加算、減算の場合、同じ暗号鍵keyCで平文M1、M2を暗号化した二つの暗号文に演算をほどこすことにより平文(M1+M2)を暗号鍵keyCで暗号化した暗号文と等しい暗号文を作成可能であるものとし、M1の暗号文より(-M1)の暗号文を作成可能であるものとする。さらに、暗号文に対する演算により平文に対する乗算、除算が可能なこととする。以降では、暗号文CがC=g
keyC(M)を満たすとき、g
keyC(k×M)なる暗号文を算出する関数をMulti(k,C)とする。また、暗号文C,定数kを入力としてg
keyC(k
-1×M)なる暗号文を算出する関数をDiv(C,k)とする。また、同じ暗号鍵keyCで暗号化された2つの平文M1、M2に対する暗号文C1、C2より平文(M1+M2)の暗号文g
keyC(M1+M2)を算出する関数をADD(C1,C2)とする。暗号文C1i=g
keyAi(Yi), C2i=g
keyAi(Li×k)とすると機関P2の秘匿ベクトル内積計算(加算)部1184は作成したn個の暗号文2項組を機関P1に2つのn次ベクトル(C11,C12,...,C1n),(C21,C22,...,C2n)として送信する(
図8(e))。
【0183】
機関P1より2つの暗号文列を受信した機関P2の秘匿ベクトル内積計算(結果取得)部1124は、各i(1≦i≦n)に対して暗号鍵KeyBiと乱数αiを選定する。次に、各i(1≦i≦n)に対して、以下の条件を満たす暗号文の2項組 (D1i,D2i)を計算する。ここで、i=1のとき、D11=gKeyB1(Xi×C1i+(αn+α1+1)×C2i)=g
KeyB1(ADD(Multi(Xi,C1i),Multi(αn+α1+1、C2i)))、D21=g
keyB1(-α1)、2≦i≦nのとき、D1i=gkeyBi(ADD(Multi(Xi×C1i),Multi(αi-1+αi+1,C2i)),D2i=gkeyBi(-αi)とする。計算によって得られたn個の暗号文の2項組(D11,D21)、機関P1の秘匿ベクトル内積計算(結果取得)部1124は作成したn個の暗号文2項組を機関P2に2つのn次ベクトル(D11,D12,...,D1n),(D21,D22,...,D2n)として送信する(
図8(f))。
【0184】
機関P1よりn個の暗号文2項組を受信した機関P2の秘匿ベクトル内積計算(加算)部は各i(1≦i≦n-1)に対し暗号文D1iを鍵KeyAiで復号した値と暗号文D2iに(Li+L
i+1)という値をさらに主暗号鍵keyAで暗号化した値Ei=g
keyA(ADD(g
KeyAi-1(D1i),Multi(L
i+L
i+1,D2i)))を計算する。計算によって得られたn-1個の暗号文の列E1,E2,…,E
n-1を機関P1に送信し、機関P1より暗号文が送信されるまでまつ(
図8(g))。
【0185】
機関P2よりn-1個の暗号文の列を受信した機関P1の秘匿ベクトル内積計算(結果取得)部は各i(1≦i≦n-1)に対して暗号文Eiを副暗号鍵keyBiで復号し、得られたn-1個の暗号文を加算した後、この値をさらに副暗号鍵keyBnで暗号化することにより暗号文D=g
keyBn(SUM
1≦i≦n-1(g
keyBi-1(Ei))を計算する。ここでSUM関数はADD関数を連続して適用し総和を求める場合にむけ拡張した関数である。得られた暗号文Dを機関P2に送信し、機関P2より暗号文が送信されるまでまつ(
図8(h))。
【0186】
機関P1より暗号文Dを受信した機関P2の秘匿ベクトル内積計算(加算)部1184は暗号文Dを主暗号鍵keyAで復号した値と、以前に受信していたn番目の暗号文2項組(D1n,D2n)のD1nを鍵keyAnで復号した値とD2nの値Ln+L1という値の和を求めた後、定数Kで除算することにより求めた値E, E=DIV(ADD(g
keyA-1(D),ADD(g
keyAn-1(D1n),Multi(D2n,(Ln+L1))))を計算する。計算した暗号値Eを機関P1に送信し、秘匿ベクトル内積計算(加算)部1184は制御を秘匿加算撹乱(加算)部1180に戻し、秘匿ベクトル内積計算(加算)処理を終了する(
図8(i))。
【0187】
機関P2より暗号文Eを受信した機関P1の秘匿ベクトル内積計算(結果取得)部1124は暗号文Eを自信の暗号鍵keyBnで復号し、最終結果New-XY=g
keyBn-1(E)=(1/K)Σ
1≦i≦nXiYi+Lを得る。最終結果を得た秘匿ベクトル内積計算(結果取得)部1124は秘匿ベクトル内積計算(結果取得)処理を終了し、制御を秘匿加算撹乱(結果取得)部1120へ戻す(
図8(j))。
【0188】
以上により、機関P1の秘匿ベクトル内積計算(結果取得)部1124と機関P2の秘匿ベクトル内積計算(加算)部1184が協調して処理を実行することにより、機関P1の秘密入力であるn次元ベクトル(X1,X2,…,Xn)と機関P2の秘密入力であるn次元ベクトル(Y1,Y2,…,Yn)、スカラ-除数K, スカラ-定数Lに関する値(1/K)Σ1≦i≦nXiYi+Lを機関P1が最終的にNew-XYとして得ることができることを処理概略図である
図7,8で確認した。その後、
図9に示すよう複数の繰り返しにより加算結果(正順)ビット列と加算結果(逆順)ビット列を得て(
図9(k))、加算前ビット列あいまい推測処理を実行しあいまい推測配列1とあいまい推測配列2を得て(
図9(l))、あいまい推測配列1とあいまい推測配列2に論理演算を適用することで結果配列を得る(
図9(m))。その後、結果配列を秘密デ-タとして用い、次の段数以降の秘匿計算を実施することで最終的な結果を得る(
図9(n))。
【0189】
図8の秘匿ベクトル内積計算の正当性を
図26に示すよう検証することができる。一方、秘匿ベクトル内積計算処理の実行中に双方が得た相手機関の情報から相手の秘密入力に関する情報を得ることが難しいかどうか検証する必要がある。機関P1は最終的に得たNew-XYと自分の秘密入力から機関P2の秘密入力の擬似デ-タを作成する。その上で、擬似デ-タを用い機関P1が作成したプロトコルのやりとりの記録と機関P1と機関P2の間で行われた本物のやりとりの記録が異なる秘密入力に対するやりとりであると見分けることができるかどうかを検証する。上記検証ができた場合、プロトコルで得られる情報から秘密入力の情報を解析することが難しいということを示すことができる。検証のため、暗号化関数g
key(M)をg
key(M)=Mg
keyとする。ここで、gは原始元、keyは暗号鍵とする。
【0190】
機関P1は本物のプロトコル実行を通して最終結果New-XYを得る。このNew-XYを用いて自分の秘密入力のn次元ベクトル(X1,X2,…,Xn)から、機関P2の秘密入力の擬似デ-タを作成する。機関P2の秘密入力であるn次元ベクトル(Y1,Y2,…,Yn)に対する擬似デ-タ(SY1,SY2,…,SYn)、スカラ-除数Kに対する擬似デ-タをSk, スカラ-定数Lに対する擬似デ-タをSlとする。このとき、(SY1,SY2,…,SYn)をランダムに決定し、Σ
1≦i≦nXiSYiを計算する。この値の因数の1つをSKとして選ぶ。また、New-XY-(1/Sk)(Σ
1≦i≦nXiSYi)なる計算により得られる値をSLに代入する。上記の方法により作成した擬似デ-タを機関P2の秘密デ-タと見立て、機関P1が機関P2を模倣する。上記、擬似デ-タを入力とした場合、機関P1が行う模倣の計算はNew-XYを得ることができる正当性を満たす計算となる。よって、本物の機関P2とのやりとりによって得られた情報と擬似デ-タを使って作成されたやり取りの情報は正当性の面では見分けることができない。
【0191】
次に機密性の面から、本物のやりとりから何らかの情報を引き出すことが可能かについて注目し、2つのやりとりの違いを認識できるか検証する。本物の(C1i,C2i)=(g
keyAi(Yi),g
keyAi(Li))と擬似デ-タ(C1i,C2i)=(Yi×g
keyAi, Li×g
keyAi)と擬似デ-タ(SC1i,SC2i)=(SYi×g
keySAi, SLi×g
keySAi)とを区別できるかを考える。ここでSLi (1≦i≦n)はΣ
1≦i≦nSLi=SLを満たす乱数とする。Ci1/Ci2=Yi/Liであり、SC1i/SC2i=SYi/SLiと異なる値となるが、これらの比を用いてやりとりの違いを区別することは難しい。
【0192】
次に、機関P1は擬似デ-タ(SC1i,SC2i)を用いて、(D1i,D2i)を各i(1≦i≦n)に対して計算する。その後、擬似デ-タSEiを擬似変数と(D1i,D2i)を用いて作成する。各SEiを受け取ったとき、識別者は機関P1の暗号鍵を用いて、各SEiを鍵keyBiにより復号したとき、(g
keyBi)
-1(SEi)は同じ鍵で暗号化された暗号文となり、かつ、各Li=C2i×Yi/C1iと示せるため、(g
keyBi)
-1(Ei)=(Xi×Yi+(α
i-1×L
i-α
i×L
i+1+L
i))×g
keyAとなり、各E
iはL
iとL
i+1が乱数因子であることよりY
iとY
i+1に係る係数を乱数として設定できるため比より2つのやり取りの違いを区別することができない。
【0193】
さらに受信した暗号文を復号後に加算し、鍵keyBnで暗号化し、暗号文SDを計算し、機関P2に送信する。加算値は乱数の影響を受けており、平文は等しくない。よって、DとSDの見分けがつかない。最後にEの擬似デ-タSEはSDにより計算してもよいし、New-XYを鍵KeyBN+1で暗号化することで作成してもよい。このとき、SEはEと区別できない。
【0194】
以上より機関P1は最終結果Zと自分の情報を使って、機関P2と本物のやりとりと区別のつかない擬似のやりとりを作成できることが示された。したがって、機関P1は最終結果New-XY以外の機関P2に関する情報をやりとりを通して得ることが困難であり、機関P2の安全性を証明できる。
【0195】
一方、機関P1の安全性の検証では機関P2が機関P1とのやりとりを模倣する。各Di(1≦i≦n)の模倣では擬似デ-タSDi(1≦i≦n)を0以外の値のなかからランダムに作成する。この値は各Di’とは異なる暗号鍵で暗号化されているため、識別者は各Diの平文間の関連を調べることは困難であるため、各SDiの値にも関連性と各Diの関連性の違いを検証することも困難である。
【0196】
Dと(D1n,D2n)の関係は乱数α
n、α
n-1の影響を受けているため、Dと(D1n,D2n)をそれぞれ異なる暗号鍵keyA, keyAnで復号したときの復号値の比とSD、(SD1n, SD2n)をそれぞれ暗号鍵SkeyA, SkeyAnで復号したときの比の関連を解析することが難しい。よって、識別者はDとSDの違いを区別することが難しい。以上より、機関P2に対する機関P1の安全性を保証できる。よって、秘匿ベクトル内積計算処理における機関P1、機関P2、双方の安全性が保証できる。
【0197】
以上では秘匿加算撹乱(結果取得)処理、および、秘匿加算撹乱(加算)処理の中の秘匿ベクトル内積計算(結果取得)処理、および、秘匿ベクトル内積計算(加算)処理の安全性について詳細に説明した。秘匿ベクトル内積計算(結果取得)処理と秘匿ベクトル内積計算(加算)処理ではベクトルサイズ変数以上のサイズをもつ乱数ベクトルを用いてもよい。また、秘匿ベクトル内積計算(結果取得)処理、および、秘匿ベクトル内積計算(加算)処理とも、ベクトルサイズ変数以上のサイズをもつ副暗号鍵の列である副暗号鍵ベクトルを用いてもよい。秘匿ベクトル内積計算(結果取得)処理では暗号文D1iを暗号文C2iに2つの乱数の和を乗算することで計算したが、1つの乱数もしくは2つ以上の乱数の和を乗算してもよい。同様に秘匿ベクトル内積計算(加算)処理では暗号文D2iに2つの乱数の和を乗算することで計算したが、1つの乱数もしくは2つ以上の乱数の和を乗算してもよい。さらに、暗号文Eを計算するために使った暗号文(D1n、D2n)は最後のベクトル位置の暗号文二項組でなくても、任意のベクトル位置の暗号文二項組に換えることができる。また、秘匿ベクトル内積(結果取得)処理と秘匿ベクトル内積(加算)処理では相手機関と暗号文列の送受信を2回以上行ってもよい。以降では、秘匿加算撹乱(結果取得)処理、秘匿加算撹乱(加算)処理の全体の安全性に焦点をあて、処理を詳細に説明する。
【0198】
機関P1のデ-タ処理装置において秘匿ベクトル内積計算(結果取得)処理の実行を終えた秘匿ベクトル内積計算(結果取得)部1124より制御を取り戻した秘匿加算撹乱(結果取得)部1120は記憶部1300に記録されている指定繰り返し回数と現在の繰り返し回数loopが等しいかどうかを判定し、等しければ、制御を制御部1300に戻す。そうでなければ、現在の繰り返し回数loopで得られている秘匿ベクトル内積計算の最終結果を秘密デ-タとして記憶部1300に記憶した後、繰り返し回数loopに1を加算した後、切断ブロック作成処理を行うための変数設定(結果取得)処理を実行する。
【0199】
一方、機関P2のデ-タ処理装置1000において、秘匿ベクトル内積計算(加算)部1184より制御を取り戻した秘匿加算撹乱(加算)部1184は記憶部1300に記録されている指定繰り返し回数loop-finalと現在の繰り返し回数loopが等しいかどうかを判定し、等しければ制御を制御部1100に戻す。そうでなければ、繰り返し回数loopに1を加算した後、新しい繰り返し回数において記憶部l300に記録されている撹乱デ-タよりブロックシフト係数処理を行うための変数設定(加算)処理を実行し、変数を設定し、ブロック処理シフト係数処理の準備処理を実行する。
【0200】
秘匿加算撹乱(結果取得)処理および秘匿加算撹乱(加算)処理で複数回の繰り返しを実行する要請は後の加算前ビット列あいまい推測処理で必要となる逆順ビット列の加算結果を計算するためと機関P2側の安全性向上という動機によって行われる。1回目の繰り返しでは機関P1は自分の秘密入力の切断位置を機関P2から直接、切断点順列が送信されることにより知る。この情報と第1の繰り返しの秘匿ベクトル内積計算の最終結果を入力として加算前ビット列あいまい推測処理を実行し、得られた結果と自己の秘密入力の各ブロックのビット並びを比較したとき、機関P1は機関P2の秘密入力の部分を推測できる可能性がある。上記の可能性を取り除くため、機関P2は繰り返しを複数回適用することで機関P1の秘密入力を撹乱し、ビット挿入を撹乱後の秘密入力に実行した後、再度ビット切断を実行する。2回目以降の繰り返しでのビット切断位置を機関P1は第1の繰り返しの秘密入力の位置として認識することが困難になる。上記目標を達成するため、機関P2は1つの加算結果を計算する最終繰り返し回より前の繰り返しでは乱数を仮の秘密入力として、機関P1の秘密入力に加算し、次の繰り返しで前の繰り返しで加算した乱数と挿入したビットの影響を取り消すようそれらの値を対象から減算する。機関P2は最終の繰り返しのみ本物の秘密入力を転置した後のビット列を使用することができる。
【0201】
以上の処理により秘匿加算撹乱(結果取得)処理および秘匿加算撹乱(加算)処理が終了し、最終結果を機関P1が取得すると、次に機関P1の制御部1100は
図10のフロ-に戻り、加算前ビット列あいまい推測処理を開始する。加算前ビット列あいまい推測処理の結果より、2つの秘密入力の各ビットの論理和、論理積、排他的論理和などの可換性二項論理演算を論理演算適用処理にて実行する。機関P1、機関P2の双方が計算したい秘匿関数値を計算できるまで、以前の段数で計算した結果を次の段数で秘密入力として利用する。最終的に機関P1が取得した結果に機関P2が撹乱するために入れた情報の影響を取り除くため、機関P1と機関P2が情報交換し、秘匿関数計算の処理を終了する。
【0202】
本実施の形態によれば、機関P2はビット列の転置、挿入した他のビット列の情報を機関P2に知られることなくビット列の撹乱を実施する。機関P1は自己の秘密入力、および、途中の計算結果を機関P1に知られることなく論理演算をビット列に直接適用することができる。
【0203】
機関P2は機関P1の撹乱情報、ビット挿入情報を推測することが難しく、あいまいに復元された結果の撹乱ビット列のビットと自己のビット列のビットを推測することが困難になる。さらに、あいまい復元では元の加算前のビット位置のビットの値の組合せが0、1の場合には、どちらが0、1になるのかは推測できない。よって、0、1の組合せの数をmとすると2のm乗通りのうちの1つが正確な撹乱後の加算前ビット列となる。よって、あいまい推測では正確な撹乱後のビット列さえも得ることが難しい。
【0204】
さらに、機関P1は高速に、かつ、正確にビット列に対して可換性二項論理演算を適用し、その結果を得ることができる。なぜならば対象としている論理演算は可換性があるので、あいまい推測の結果で正確な結果を計算することができるからである。
【0205】
このように本実施の形態の方法は従来手法の論理演算1つずつを暗号化して実行するという効率上の弱点を克服した斬新な方法となっている。よって、本実施の形態の方法を使用すれば、効率よく一般的な論理関数を適用した結果を互いの入力を秘匿にしたままで計算することが可能となる。
【0206】
(実施の形態2)
本実施の形態の秘匿関数計算システム1は
図27に示すように、複数のデ-タ処理装置1000を備えるシステムである。複数のデ-タ処理装置1000はデ-タ記憶装置3000を介してデ-タを送受信することで、複数の機関での秘匿関数計算を可能にする。以下、秘匿関数計算システム1の構成について説明する。
【0207】
秘匿関数計算システム1は
図27に示すように、複数のデ-タ処理装置1000と、デ-タ処理装置1000それぞれと通信線2000で接続されたデ-タ記憶装置3000とを備える秘匿関数計算システムである。なお、以下の説明ではデ-タ処理装置1000が機関P1、機関P2、機関P3それぞれに設置されているものとして説明する。以下、秘匿関数計算システム1の構成について説明する。
【0208】
秘匿関数計算システム1のデ-タ処理装置1000はそれぞれ「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のいずれかを担当する。「関数評価処理」および「ビット列撹乱処理」を担当するデ-タ処理装置1000の構成と機能については、実施の形態1と同様であるので説明を省略する。「関数評価およびビット列撹乱処理」を担当するデ-タ処理装置1000は実施の形態1での「関数評価処理」を担当するデ-タ処理装置1000がもつ制御部1100の構成と機能と「ビット列撹乱処理」を担当するデ-タ処理装置1000がもつ制御部1100の構成と機能の双方を兼ね備える。
【0209】
デ-タ記憶装置3000は例えば、3つの機関とは別の機関内に設置されたサ-バである。デ-タ記憶装置3000はデ-タを保存するための記憶装置(ハ-ドディスクやフラッシュメモリ等)や、デ-タ処理装置100とデ-タを送受信するための通信装置などを備える。デ-タ処理装置1000は通信線2000を介してデ-タ記憶装置3000にデ-タを保存する。
【0210】
デ-タ記憶装置3000内部の記録装置には、機関ごとに専用のフォルダが用意されている。3つのデ-タ処理装置1000はそれぞれの機関に用意された上記フォルダに暗号文列等を格納する。また、各フォルダ内部にはデ-タ処理履歴を記録するための履歴ファイルが格納されている。各デ-タ処理装置1000は暗号文列を処理するたびに履歴ファイルに所定のデ-タを記録する。
【0211】
実施の形態1とは異なり、秘匿関数計算システム1では各デ-タ処理装置1000は「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のいずれかを担当する。次に、秘匿関数計算システム1で実行される「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」について説明する。本実施の形態では、機関P1が「関数評価処理」を担当し、機関P2が「関数評価およびビット列撹乱処理」を担当し、機関P3が「ビット列撹乱処理」を担当する。
【0212】
「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のそれぞれの処理はほぼ実機の形態1の「関数評価処理」、「ビット列撹乱処理」と同じであるが、通信部1200を介して他のデ-タ処理装置と通信する代わりに、通信部1200を介してデ-タ記憶装置3000に送信する内容を記録、受信する内容を読み出す。また、段数初期化部1110と段数判定部1150では次の段でどの機関が通信する相手となるかを設定する。さらに、「関数評価およびビット列撹乱処理」を担当するデ-タ処理装置1000の制御部1100は各段数での通信する相手機関により、その段で「関数評価処理」を行うのか、「ビット列撹乱処理」を行うかを決定する。
図28では機関P2のデ-タ処理装置1000の制御部1100は相手機関がP1ならば「ビット列撹乱処理」を、相手機関がP3ならば「関数評価処理」を実行する。
【0213】
「ビット列撹乱処理」を担当する機関P3は「関数評価およびビット列撹乱処理」を担当する機関P2に機関P1と機関P2の間の入力に対するビット撹乱処理を機関P2に担当させ、関数評価を機関P1に実行させるため、機関P3の撹乱デ-タの一部を事前に機関P2の撹乱デ-タの一部として機関P2の記憶部1300に格納してもらう。
【0214】
最終的な関数評価は「関数評価処理」を担当する機関P1が実行し、最終交換デ-タを作成し、機関P2、機関P3は自己の撹乱デ-タの情報を変形し最終交換デ-タを作成し、3つの機関が最終交換デ-タを交換することで、最終結果を算出する。
【0215】
本実施の形態によれば、デ-タ記憶装置3000を介してデ-タを送受信することで3つの機関での秘匿関数計算が可能になる。
【0216】
また、デ-タ処理装置3000に保存されるデ-タは暗号化されたデ-タ(暗号化撹乱加算デ-タ、二重暗号化加算対象デ-タ変形など)や最終交換デ-タであるので、機関P1、P2、P3以外の機関がそのデ-タを取得したとしても、最終結果算出手続きを知らない場合には、そこから有意な情報を得ることはできない。また、最終結果算出手続きが知られている場合には、最終交換デ-タを各機関共通の公開鍵などで暗号化し暗号化デ-タとして記憶することで、デ-タを安全に守ることができる。そのため、各機関は安心してこれらのデ-タをデ-タ記憶装置3000に保存しておくことができる。
【0217】
なお、秘匿関数計算システム1は4台以上のデ-タ処理装置1000を有していてもよい。4台以上のデ-タ処理装置1000がデ-タ記憶装置3000にアクセスできるように構成し、実施の形態2と同様の処理を実行することで、4つ以上の機関での秘匿関数計算が可能になる。
【0218】
実施の形態1および2では秘密デ-タに秘密デ-タ名を対応付けて、記憶部1300から読み出し、記憶部1300への格納し、利用したがある秘密デ-タ名をもつ秘密デ-タに別の秘密デ-タを連結して、秘密デ-タを更新してもよい。
【0219】
この方法の利用形態としては、異なる段数で得られた論理演算適用結果を組み合わせて演算を適用したい場合に複数の段数の結果を含む1つの秘密デ-タを入力として秘匿加算撹乱処理を適用する場合が考えられる。
【0220】
本システムの適用は研究機関の間の秘匿関数計算に限られない。会社間、部署間等、さまざまな組織間の秘匿関数計算に適用可能である。また、個人間の秘匿関数計算にも適用可能である。
【0221】
デ-タ処理装置1000は、専用のシステムによらず、通常のコンピュ-タシステムを用いても実現可能である。例えば、上述の動作を実行するためのプログラムをコンピュ-タ読み取り可能な記録媒体に格納して配布し、該プログラムをコンピュ-タにインスト-ルして、上述の処理を実行することによってデ-タ処理装置1000を構成してもよい。また、インタ-ネット等のネットワ-ク上のサ-バ装置が備えるディスク装置に格納しておき、例えばコンピュ-タにダウンロ-ド等できるようにしてもよい。また、上述の機能を、OSとアプリケ-ションソフトの共同より実現してもよい。この場合には、OS以外の部分のみを媒体に格納して配布してもよく、また、コンピュ-タにダウンロ-ド等してもよい。
【0222】
上記のプログラムを記録する記録媒体としては、USBメモリ、CD、DVD、Blu-ray(登録商標) Disc,MO,SDカ-ド、その他、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリ、磁気テ-プ等のコンピュ-タ読み取り可能な記録媒体を使用することができる。また、HDD(ハ-ドディスク)やSDD(ソリッドステ-トドライブ)等、通常、システム又は装置に固定して使用する記録媒体を使用することもできる。