(57)【要約】      （修正有）【課題】複数の機関が個別にもつ大規模な入力に対して複雑な関数を秘匿に計算する場合であっても無関係な情報を他に知られることなく関数適用結果を高速に計算する。【解決手段】２以上のデ-タ処理装置１０００で構成され、それぞれ秘密デ-タ、撹乱デ-タを記憶する記憶部１３００と、論理演算適用段数を記録する変数を初期化する段数初期化部１１１０をもち、関数評価処理かデ-タ撹乱処理のいずれかを担当し、関数評価処理を担当するデ-タ処理装置１０００は、他のデ-タ処理装置１０００より自己の主暗号鍵で暗号化された状態で撹乱デ-タと秘密デ-タを組み合わせて作成された暗号化撹乱加算結果を自己の保有する主暗号鍵で復号し加算結果ビット列を作成する秘匿加算撹乱（結果取得）部１１２０を有する。【選択図】図４
2015132690.tif 000002
【特許請求の範囲】
【請求項１】
２以上のデ-タ処理装置で構成される秘匿関数計算システムであって、
前記デ-タ処理装置はそれぞれ
段数変数、（主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、）最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する手続きである最終結果算出手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タとし、前記最終交換デ-タ変数の値と前記受信最終交換デ-タを入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段での主暗号鍵を記憶する主暗号鍵記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タを記憶する撹乱デ-タ記憶手段と、
前記段数変数の値の段数での前記主暗号鍵、加算対象秘密デ-タとなる前記秘密デ-タ、前記撹乱デ-タをそれぞれ読み出し、撹乱デ-タの一部である撹乱部分デ-タを他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タの内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し、前記暗号化撹乱後加算対象デ-タに設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ秘密デ-タと前記暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置のもつ主暗号鍵で暗号化して作成した暗号化加算対象秘密デ-タ変形と二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、前記二重暗号化撹乱後加算対象デ-タを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形を暗号化したまま加算し、結果を作成し、暗号化撹乱加算結果とし、前記暗号化撹乱加算結果を他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
前記段数変数の値の段数での前記主暗号鍵、前記秘密デ-タを前記加算対象秘密デ-タとして読み出し、他のデ-タ処理装置より前記撹乱部分デ-タと前記他のデ-タ処理の主暗号鍵で暗号化した暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変形と前記二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、前記暗号化撹乱加算結果を受信し、前記暗号化撹乱結果を前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列とする秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて適用すべき可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を論理演算結果ビット配列の前記配列位置に設定し、前記論理演算結果ビット配列の内容を秘密デ-タとして記憶する論理演算適用手段と、
前記秘密デ-タを出力秘密デ-タとして読み出し、前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タに前記最終交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タとする最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果に設定されているとき、あいまい推測後に前記あいまい推測ビット列１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を生成する、
ことを特徴とする秘匿関数計算システム。
【請求項２】
前記秘匿関数計算システムを構成ずる前記デ-タ処理装置はさらにそれぞれ、
前記デ-タ処理装置はそれぞれ
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶手段と、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶手段と、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする請求項１に記載の秘匿関数計算システム。
【請求項３】
前記秘匿関数計算システムを構成する前記デ-タ処理装置はさらにそれぞれ、
繰り返し回数変数、指定繰り返し回数変数と、
前記段数初期値から前記指定段数までの各段で繰り返し回数変数に設定すべき繰り返し回数初期値と指定繰り返し回数変数に設定すべき指定繰り返し回数を記憶する指定繰り返し回数記憶手段と、
を有し、
さらに前記関数評価処理を担当する前記デ-タ処理装置は結果秘密デ-タ名配列変数と加算結果（正順）ビット配列変数、加算結果（逆順）ビット配列変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記加算結果（正順）ビット配列変数と前記加算結果（逆順）ビット配列変数、それぞれに設定すべき二進数表現の元となる秘密デ-タの名前それぞれを加算結果（正順）秘密デ-タ名、加算結果（逆順）秘密デ-タ名として記憶する加算結果秘密デ-タ名記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で、前記繰り返し変数が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記結果秘密デ-タ名配列変数に設定すべき名前を記憶する結果秘密デ-タ名記憶手段と、
を有し、
前記主暗号鍵記憶手段は、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記主暗号鍵変数に設定すべき暗号鍵を記憶し、
前記加算対象秘密デ-タ名記憶手段は、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前を加算対象秘密デ-タ名として記憶し、
前記段数変数の値の段での前記繰り返し回数初期値、および、前記指定繰り返し回数を読み出し、前記繰り返し回数変数の値を前記繰り返し回数初期値に設定し、前記指定繰り返し変数の値に前記指定繰り返し回数を設定する繰り返し回数初期化部分手段と、
前記段数変数の値の段で、前記繰り返し変数の値の繰り返しで前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名と、前記主暗号鍵変数に設定すべき前記暗号鍵と、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名を読み出し、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ前記秘密デ-タを、前記主暗号鍵変数に前記暗号鍵を、前記撹乱デ-タ変数に前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定する変数設定（加算）部分手段と、
前記撹乱デ-タ変数の一部である撹乱部分デ-タを他のデ-タ処理装置に送信し、前記撹乱デ-タ変数の内容の一部と前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し、前記暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置のもつ加算対象秘密デ-タの変形、および、送信した前記暗号化撹乱後加算対象デ-タもしくは、前記暗号化撹乱後加算対象デ-タの変形を前記他のデ-タ処理装置の主暗号鍵で暗号化して作成された暗号化加算対象秘密デ-タと二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置から受信し、受信した前記暗号化加算対象変形デ-タと前記二重暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数の内容の暗号鍵、もしくは、前記主暗号鍵変数の内容の暗号鍵に対応する復号鍵によって復号した後、暗号化したまま加算し、暗号化撹乱加算結果を作成し、前記暗号化撹乱加算結果を他のデ-タ処理装置へ送信する秘匿加算・挿入・転置（加算）手段と、
前記繰り返し回数変数の値と前記指定繰り返し回数変数の値が等しいかを判定し、等しくなければ前記繰り返し回数変数の値に１だけ加算する繰り返し回数判定（加算）部分手段、
によって構成され、
前記秘匿加算撹乱（結果取得）手段は、
前記段数変数の値の段数で、前記繰り返し変数の値の繰り返しで前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名、前記結果秘密デ-タ名配列変数に設定すべき名前である前記結果秘密デ-タ名をそれぞれ読み出し、前記主暗号鍵変数に前記暗号鍵を、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ秘密デ-タを、前記結果秘密デ-タ名配列変数に前記結果秘密デ-タ名をそれぞれ設定する変数設定（結果取得）部分手段と、
他のデ-タ処理装置より送信された撹乱デ-タの一部である撹乱部分デ-タ、前記他のデ-タ処理装置の主暗号鍵変数に設定された暗号鍵で暗号化された暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象変形デ-タを作成し、前記暗号化加算対象変形デ-タと前記二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、前記二重暗号化撹乱後加算対象デ-タ、前記暗号化加算対象変形デ-タを前記他のデ-タ処理装置の暗号鍵もしくは前記暗号鍵に対応する復号鍵で復号した後、暗号化したまま加算することで作成された暗号化撹乱加算結果を受信し、受信した前記暗号化撹乱加算結果を前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果を前記結果秘密デ-タ名配列変数に設定された名前をもつ秘密デ-タとして記憶する秘匿加算・挿入・転置（結果取得）手段と、
前記繰り返し回数変数の値と前記指定繰り返し回数変数の値が等しいかを判定し、等しくなければ前記繰り返し回数変数の値に１だけ加算し、等しければ前記段数変数の値の段で前記加算結果（正順）ビット配列変数と前記加算結果（逆順）ビット配列変数それぞれに設定すべき秘密デ-タの前記加算結果（正順）秘密デ-タ名と前記加算結果（逆順）秘密デ-タ名を読み出し、前記加算結果（正順）ビット配列変数、前記加算結果（逆順）ビット配列変数それぞれに、読み出した前記加算結果（正順）秘密デ-タ名をもつ秘密デ-タの二進数表現と、読み出した前記加算結果（逆順）秘密デ-タ名をもつ秘密デ-タの二進数表現を設定する繰り返し回数判定（結果取得）部分手段、
によって構成され、
前記加算前ビット列あいまい推測手段は、
前記加算結果（正順）ビット配列変数に設定されている正順結果ビット列と前記加算結果（逆順）ビット配列変数に設定されている逆順結果ビット配列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列３とあいまい推測ビット列４を導出し、前記あいまい推測ビット配列変数１にあいまい推測ビット列３を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列４を設定し、
前記あいまい推測ビット列３と前記あいまいビット列４は、
２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果（正順）ビット配列変数に設定され、加算前入力１、加算前入力２それぞれを二進数表現の最上位ビット位置から最下位ビット位置までのビットの並びを逆順序にしたときのビットの並びをそれぞれ加算前逆順ビット列１と加算前逆順ビット列２とし、前記加算前逆順ビット列１と前記加算前逆順ビット列２の加算結果の二進数表現が加算結果（逆順）ビット配列変数に設定されたとき、あいまい推測後に前記あいまい推測ビット配列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット配列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいという性質を満たす、
ことを特徴する請求項２に記載の秘匿関数計算システム。
【請求項４】
前記秘匿関数計算システムを構成する前記デ-タ処理装置はさらに、
切断ブロック数変数、ブロック切断点順列変数、ベクトルサイズ変数、内積対象ベクトル変数、暗号化内積対象ベクトル変数、暗号化定数ベクトル変数、二重暗号化内積対象乗算結果ベクトル変数、暗号化秘匿ベクトル内積結果変数と、
前記ビット列撹乱処理を担当する前記デ-タ処理装置はさらに、
ブロックシフト係数順列変数、撹乱挿入加算値変数、スカラ-乗数変数、スカラ-除数変数、副暗号鍵ベクトル変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記副暗号鍵ベクトル変数に設定すべき暗号鍵のベクトルを記憶する副暗号鍵ベクトル記憶手段と、
をもち、
前記撹乱デ-タは、
撹乱のために加算対象秘密デ-タを切断して作成する切断ブロック数と、切断する配列位置を前記切断ブロック数個並べたブロック切断点順列と、切断後にブロックを転置するために各ブロックに乗算したいブロックシフト係数順列と、前記ブロックシフト係数順列により挿入した空白ブロックの内容を指定する撹乱挿入加算値を含み、
前記変数設定（加算）部分手段は
前記段数変数の値の段で、前記繰り返し変数の値の繰り返しで前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名と、前記主暗号鍵変数に設定すべき前記暗号鍵と、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名と、前記副暗号鍵ベクトル変数に設定すべき暗号鍵ベクトルを読み出し、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ前記秘密デ-タを、前記主暗号鍵変数に前記暗号鍵を、前記撹乱デ-タ変数に前記撹乱デ-タ名をもつ撹乱デ-タを、前記副暗号鍵ベクトル変数に前記暗号鍵ベクトルをそれぞれ設定し、
前記秘匿加算・挿入・転置（加算）部分手段は、
前記撹乱デ-タ変数に設定されている撹乱デ-タより切断ブロック数と前記切断点順列、ブロックシフト係数順列、撹乱挿入加算値をそれぞれ読み出し、前記切断ブロック変数、前記ブロック切断点順列変数、前記ブロックシフト係数変数、前記撹乱挿入加算値変数にそれぞれ設定し、前記切断ブロック数変数の値と前記ブロック切断点順列変数に設定されている順列を他のデ-タ処理装置へ送信し、前記加算対象秘密デ-タ変数に設定されている秘密デ-タを前記ブロック切断点順列に設定されている順列に従って、前記切断ブロック数変数の値の個数のブロックに切断し、切断ブロック列を作成し、前記切断ブロック列と前記ブロックシフト係数順列変数に設定されている順列との内積を計算し切断ブロックシフト後秘密デ-タとし、前記切断ブロックシフト後秘密デ-タと前記撹乱挿入加算値変数に設定されている値を加算し撹乱後加算対象秘密デ-タを作成し、前記スカラ-定数変数に前記撹乱後加算対象秘密デ-タを設定し、前記ブロックシフト係数順列変数に設定されている順列の要素で１以下の値の要素がある場合、最も小さい値の要素を探し最小値要素とし、前記最小値要素の値を前記スカラ-除数変数に設定し、１以下の値の要素がない場合には前記スカラ-除数変数に１を設定し、前記ブロックシフト係数順列変数に設定されている順列の各要素の値に前記スカラ-除数変数の値の逆数を乗じることで計算できる順列を前記内積対象ベクトル変数に設定し、前記ベクトルサイズ変数に前記切断ブロック変数の値を設定するブロックシフト係数設定小部分手段と、
前記ベクトルサイズ個以上の乱数の列で、前記列の要素の値の総和が前記スカラ-定数変数に乱数加えた値となる前記乱数列を定数ベクトルとして作成し、前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されたベクトルの前記ベクトル位置の要素を暗号化し暗号化内積対象ベクトルを作成し、前記定数ベクトルの各ベクトル位置で前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵により定数ベクトルの前記ベクトル位置の要素を暗号化し暗号化定数ベクトルを作成し、他のデ-タ処理装置に前記暗号化内積対象ベクトルと前記暗号化定数ベクトルを送信し、他のデ-タ処理装置より、前記他のデ-タ処理装置が保有する内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で前記内積対象ベクトルの要素と前記暗号化内積対象ベクトルの前記ベクトル位置の要素を乗算した後、前記暗号化定数ベクトルの前記ベクトル位置の要素を加算し得られた結果を前記他のデ-タ処理装置の前記主暗号鍵変数に設定されている暗号鍵で暗号化し得られた結果を前記ベクトル位置の要素とすることで作成された二重暗号化内積対象乗算結果ベクトルを受信し、前記二重暗号化内積対象乗算結果ベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵、もしくは前記暗号鍵に対応する復号鍵により前記二重暗号化内積対象乗算結果ベクトルの前記ベクトル位置の要素を復号し、暗号化内積対象乗算結果ベクトルを作成し、前記暗号化内積対象乗算結果ベクトルの全要素を加算し暗号化内積結果を作成し、前記暗号化内積結果を前記スカラ-除数で除算した結果を前記暗号化秘匿ベクトル内積結果変数に設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を他のデ-タ処理装置へ送信する秘匿ベクトル内積計算（加算）小部分手段と、
によって構成され、
前記秘匿加算・挿入・転置（結果取得）部分手段は、
他のデ-タ処理装置より前記他のデ-タ処理装置の前記切断ブロック数変数と前記ブロック切断点順列変数に設定されている値と順列を受信し、前記切断ブロック変数と前記ブロック切断点順列変数に受信した前記値と前記順列をそれぞれ設定し、前記加算対象秘密デ-タに設定されているデ-タを前記ブロック切断点順列変数に設定されている順列に従い、前記切断ブロック数変数の値の個数のブロックに分割し、前記ブロックをベクトル表現として並べ前記内積対象ベクトル変数に設定する切断ブロック作成小部分手段と、
他のデ-タ処理装置より他のデ-タ処理装置の前記暗号化内積対象ベクトル変数に設定されている暗号化ベクトルと前記暗号化定数ベクトル変数に設定されている暗号化ベクトルを受信し、それぞれを前記暗号化内積対象ベクトル変数と前記暗号化定数ベクトル変数に設定し、前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置において、前記ベクトル位置の前記暗号化内積対象ベクトル変数に設定されているベクトルの要素と、前記内積対象ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を乗算した結果に前記ベクトル位置の暗号化定数ベクトル変数に設定されているベクトルの要素を加算し、前記主暗号鍵変数に設定されている暗号鍵で暗号化し、前記ベクトル位置の要素とすることで二重暗号化内積対象乗算結果ベクトルを作成し、前記二重暗号化内積対象乗算結果ベクトルを前記他のデ-タ処理装置へ送信し、他のデ-タ処理装置より他のデ-タ処理装置の前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を受信し、前記暗号化秘匿ベクトル内積変数に受信した前記暗号値を設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、得られた結果をベクトル内積結果とし、前記結果秘密デ-タ名変数に設定されている名前をもつ秘密デ-タとして前記ベクトル内積結果を記憶する秘匿ベクトル内積（結果取得）小部分手段によって構成され、
前記変数設定（結果取得）部分手段は
前記加算対象秘密デ-タ変数に前記秘匿ベクトル内積小部分手段により作成された前記ベクトル内積結果を設定することができる、
ことを特徴とする請求項３に記載の秘匿関数計算システム。
【請求項５】
前記秘匿関数計算システムの前記デ-タ処理装置は、さらに、
乱数ベクトル変換行列変数、二重暗号化内積対象ベクトル変数、暗号化乱数ベクトル変数、指定除外ベクトル位置変数、二重暗号化除外以外乗算結果ベクトル変数、二重暗号化除外以外総和変数をもち、
前記関数評価処理を担当する前記デ-タ処理装置は、さらに
副暗号鍵ベクトル変数をもち、
前記秘匿ベクトル内積（結果取得）小部分手段は、
前記ベクトルサイズ変数に設定されている個数以上の暗号鍵を生成し、暗号鍵ベクトルを作成し、前記ベクトルを前記副暗号鍵ベクトル変数に設定し、前記ベクトルサイズ変数に設定されている個数以上の乱数を生成し、乱数のベクトルを作成し、前記ベクトルを前記乱数ベクトルとし、行数、列数ともに前記ベクトルサイズ変数の値をもち、各要素を乱数とする行列を作成し、前記行列を前記乱数ベクトル変換行列変数に設定し、前記乱数行列ベクトル変数に設定された行列に前記乱数ベクトル変数に設定されているベクトルを乗算し乱数変形ベクトルを作成し、前記乱数変形ベクトルの各要素に値１を加算し、乱数係数ベクトルを作成し、前記乱数係数ベクトルの各ベクトル位置において、前記乱数ベクトル変数に設定されているベクトルの前記ベクトル位置の要素と前記乱数係数ベクトルの前記ベクトル位置の要素を乗算し、得られた結果を前記ベクトル位置の要素とすることで乱数変形ベクトルを作成し、
前記デ-タ列撹乱処理を担当する他のデ-タ処理装置より前記他のデ-タ処理装置の前記暗号化内積対象ベクトル変数に設定されている暗号化内積対象ベクトルと前記暗号化定数ベクトル変数に設定されている暗号化定数ベクトルを受信し、前記暗号化内積対象ベクトルと前記暗号化定数ベクトルをそれぞれ前記暗号化内積対象ベクトル変数と前記暗号化定数ベクトル変数に設定し、
前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置において、前記ベクトル位置の前記暗号化内積対象ベクトル変数に設定されているベクトルの要素と前記内積対象ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を乗算した結果に前記ベクトル位置の暗号化定数ベクトル変数に設定されているベクトルの要素と前記乱数変形ベクトルの前記ベクトル位置の要素を乗算した結果を加算し、得られた結果を前記副暗号鍵ベクトル変数に設定されている暗号鍵により暗号化し、前記ベクトル位置の要素とすることでベクトルを作成し前記ベクトルを前記二重暗号化内積対象ベクトル変数に設定し、
前記乱数ベクトル変数の各ベクトル位置において前記ベクトル位置の前記乱数ベクトル変数の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵で暗号化し、前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを前記暗号化乱数ベクトル変数に設定し、
前記乱数ベクトル変換行列変数に設定されている行列と前記二重暗号化内積対象ベクトル変数に設定されているベクトルと前記暗号化乱数ベクトル変数に設定されているベクトルを他のデ-タ処理へ送信し、
他のデ-タ処理装置より、前記デ-タ列撹乱処理を担当する他のデ-タ処理装置の前記指定除外ベクトル位置変数に設定されているベクトル位置、前記二重暗号化除外以外乗算結果ベクトル変数に設定されているベクトルを受信し、前記ベクトル位置と前記ベクトルをそれぞれ自身がもつ前記指定除外ベクトル位置変数と前記二重暗号化除外以外乗算結果ベクトル変数に設定し、
前記主暗号鍵変数に前記副暗号鍵ベクトル変数に設定されているベクトルの前記指定除外ベクトル位置変数に設定されているベクトル位置に設定されている暗号鍵を設定し、
前記二重暗号化除外以外乗算結果ベクトルの各ベクトル位置において、前記ベクトル位置が前記指定除外ベクトル位置変数に設定されているベクトル位置と異なるなら、前記二重暗号化除外以外乗算結果ベクトルの前記ベクトル位置の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵もしくは前記暗号鍵に対応する復号鍵により復号し、結果をベクトル位置の要素とすることで暗号化乗算結果ベクトルを作成し、
前記暗号化乗算結果ベクトルの前記指定除外ベクトル位置以外にある要素の総和を求め、結果を暗号化除外以外総和とし、前記暗号化除外以外総和を前記主暗号鍵変数に設定されている暗号鍵で暗号化し、二重暗号化除外以外総和とし前記二重暗号化除外以外総和変数に設定し、前記二重暗号化除外以外総和変数に設定されている暗号文を他のデ-タ処理装置に送信し、
前記デ-タ列撹乱処理を担当する他のデ-タ処理装置が前記秘匿ベクトル内積（加算）小部分手段によって作成し、前記暗号化秘匿ベクトル内積結果変数に設定した暗号文を受信し、前記暗号化秘匿ベクトル内積結果変数に前記暗号文を設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号文を前記主暗号鍵に設計されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、得られた結果をベクトル内積結果とし、前記結果秘密デ-タ名変数に設定されている名前をもつ秘密デ-タをして前記ベクトル内積結果を記憶し、
前記秘匿ベクトル内積計算（加算）小部分手段は
前記ベクトルサイズ個以上の乱数の列で、前記列の要素の値の総和が前記スカラ-定数変数に乱数を加算した値である前記乱数列を定数ベクトルとして作成し、
前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されたベクトルの前記ベクトル位置の要素を暗号化し暗号化内積対象ベクトルを作成し、前記暗号化内積対象ベクトルを前記暗号化内積対象ベクトル変数に設定し、
前記定数ベクトルの各ベクトル位置で前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵により定数ベクトルの前記ベクトル位置の要素を暗号化し暗号化定数ベクトルを作成し、前記暗号化定数ベクトル変数に前記暗号化定数ベクトルを設定し、
他のデ-タ処理装置に前記暗号化内積対象ベクトル変数に設定されているベクトルと前記暗号化定数ベクトル変数に設定されているベクトルを送信し、
他のデ-タ処理装置より、前記関数評価処理を担当する他のデ-タ処理装置がもつ前記乱数ベクトル変換行列変数に設定されている行列、前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトル１と前記暗号化乱数ベクトル変数に設定されているベクトル２を受信し、前記行列、前記ベクトル１、前記ベクトル２を自身がもつ前記乱数ベクトル変換行列変数、前記二重暗号化内積対象ベクトル変数、前記暗号化乱数ベクトル変数にそれぞれ設定し、
前記乱数ベクトル変換行列変数に設定された行列の転置行列を計算し、得られた行列を前記変換転置行列変数に設定し、前記変換転換行列変数に設定されている行列に前記定数ベクトルを乗算し、得られたベクトルを定数変形ベクトルとし、
前記暗号化乱数ベクトル変数に設定されている各ベクトル位置において、前記暗号化乱数ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている要素と前記定数変形ベクトルの前記ベクトル位置の要素を乗算し、得られた結果を前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを暗号化定数変形ベクトルとし、
前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの全ベクトル位置からベクトル位置を選び、前記ベクトル位置を前記除外ベクトル位置変数に設定し、前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの各ベクトル位置において前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、前記ベクトル位置の要素とすることで復号二重暗号化内積対象乗算結果ベクトルを作成し、前記復号二重暗号化内積対象乗算結果ベクトルの各ベクトル位置において、前記復号二重暗号化内積対象乗算結果ベクトルの前記ベクトル位置の要素と前記暗号化定数変形ベクトルの前記ベクトル位置の要素を加算し、得られた結果を前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを前記暗号化乗算結果ベクトルとし、前記暗号化乗算結果ベクトルの前記除外ベクトル位置以外の各ベクトル位置において、前記暗号化乗算結果ベクトルの前記ベクトル位置の要素を前記主暗号鍵変数に設定されている暗号鍵で暗号化した結果を前記ベクトル位置の要素とし、前記除外ベクトル位置の要素を空とし、二重暗号化除外以外乗算結果ベクトルを作成し、前記に二重暗号化除外以外乗算結果ベクトル変数に前記二重暗号化除外以外乗算結果ベクトルを設定し、
前記除外ベクトル位置変数に設定されているベクトル位置と前記二重暗号化除外以外乗算結果ベクトル変数に設定されているベクトルを他のデ-タ処理装置へ送信し、
他のデ-タ処理装置より前記関数評価処理を担当するデ-タ処理装置の前記二重暗号化除外以外総和変数に設定されていた暗号値を受信し、前記暗号値を前記二重暗号化除外以外総和変数に設定し、前記二重暗号化除外以外総和変数の暗号値を前記主暗号鍵変数に設定されている暗号鍵、または、前記暗号鍵に対応する復号鍵で復号し、得られた結果を前記暗号化除外以外総和変数に設定し、前記暗号化除外以外総和変数に設定されている要素と前記暗号化乗算結果ベクトル変数に設定されているベクトルで前記除外ベクトル位置変数に設定されているベクトル位置に設定されている要素を加算し、結果を生成し、前記結果を前記暗号化秘匿ベクトル内積結果変数に設定し、
他のデ-タ処理装置に前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を送信し、
前記ベクトル内積結果は前記関数処理を担当するデ-タ処理装置がもつ前記内積対象変数ベクトルに設定されているベクトルと前記デ-タ列撹乱処理を担当するデ-タ処理装置がもつ前記内積対象変数に設定されているベクトルの内積結果に前記デ-タ列撹乱処理を担当する前記デ-タ処理装置がもつ前記スカラ-除数変数に設定されている値を除算した結果に前記デ-タ処理装置がもつ前記スカラ-定数変数に設定されている値を加算した結果と等しい、
という特徴をもつ請求項４に記載の秘匿関数計算システム。
【請求項６】
前記秘匿関数計算システムは、
２以上の前記デ-タ処理装置がアクセス可能なデ-タ記憶装置、をさらに有し、
２以上の前記デ-タ処理装置は、それぞれ、
自己の保有する各変数に設定されたデ-タを前記デ-タ記憶装置に保存し、
他のデ-タ処理装置が保存したデ-タを前記デ-タ記憶装置から取得する、
ことを特徴とする請求項１及至５のいずれか１項に記載の秘匿関数計算システム。
【請求項７】
３以上の前記デ-タ処理装置で構成される前記秘匿関数計算システムであって、
前記秘密デ-タは、２以上の他のデ-タ処理装置の前記主暗号鍵で順次暗号化されることによって生成される、
ことを特徴とする請求項１及至６いずれか１項に記載の秘匿関数計算システム。
【請求項８】
他のデ-タ処理装置と連携してデ-タを処理するデ-タ処理装置であって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶手段と、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶手段と、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とするデ-タ処理装置。
【請求項９】
他のデ-タ処理装置と連携してデ-タを処理するデ-タ処理装置により使用される秘匿関数計算方法であって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶ステップと、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶ステップと、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化ステップと、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定ステップと、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶ステップと、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶ステップと、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置によって使用される前記秘匿関数計算方法は、
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）ステップと、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶ステップと、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定ステップと、
を有し、
前記関数評価処理を担当するデ-タ処理装置により使用される前記秘匿関数計算方法はさらに、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶ステップと、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）ステップと、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測ステップと、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成ステップを、有し、
前記あいまい推測ステップは２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする秘匿関数計算方法。
【請求項１０】
他のコンピュ-タと連携してデ-タを処理するコンピュ-タにより実行される秘匿関数計算プログラムであって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶ステップと、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶ステップと、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化ステップと、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定ステップと、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶ステップと、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶ステップと、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置によって使用される前記秘匿関数計算方法は、
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）ステップと、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶ステップと、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定ステップと、
を有し、
前記関数評価処理を担当するデ-タ処理装置により使用される前記秘匿関数計算方法はさらに、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶ステップと、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）ステップと、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測ステップと、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成ステップを、有し、
前記あいまい推測ステップは２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする秘匿関数計算プログラム。
【請求項１１】
請求項１０に記載の秘匿関数計算プログラムが記録されていることを特徴とするコンピュ-タ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は複数の機関でそれぞれがもつ値、もしくは、それらの二値表現の集合に対して任意の指定した関数を適用したときに得られる出力を互いの入力の値を秘匿したまま計算するためのビット並び替え加算に基づく汎用秘匿関数計算システム、デ-タ処理装置、汎用秘匿関数計算方法、汎用秘匿関数計算プログラム、および、記録媒体に関する。
【背景技術】
【０００２】
複数の機関がもつ情報を入力として関数を適用したときに得られる出力を第三者機関を介さずに、入力値の集合を秘匿にしたまま計算する秘匿関数計算方法が知られている。それらのほとんどが一般的な関数の秘匿計算方法としてＧａｒｂｌｅｄ  Ｃｉｒｃｕｉｔを基礎としている。Ｇａｒｂｌｅｄ  ＣｉｒｃｕｉｔはＹａｏによって非特許文献１において１９８６年に開発された汎用秘匿関数計算法であり、対象とする関数を論理関数によって表現し、論理関数に対応する論理回路上の演算を入力値を暗号化したまま実現するための仕組み、方法である。
【０００３】
Ｇａｒｂｌｅｄ  Ｃｉｒｃｕｉｔでは二者間での秘匿関数計算を考えるとき、２者のうち１者を回路作成者、他者を回路評価者という役割で相互通信させる。回路作成者は計算したい関数の論理関数表現が与えられたときに、その論理関数を実現するある論理回路をまず作成する。論理回路を構成するブロックは例えば論理積ゲ-ト、論理和ゲ-ト、排他的論理和ゲ-トである。このとき、各ブロックへの配線に対して取りうる値、例えば、‘０’や‘１’にランダムな暗号鍵を割り当てる。次に、各ブロックにおいて暗号化した真理値表を作成する。このとき、例えば、入力線が２本ｗｉ、ｗｊ で出力線が１本でｗｋとなる論理積ブロックを考える。入力線ｗｉの値が０のときに対応した暗号鍵をｗｉ０、値が１のときに対応した暗号鍵をｗｉ１とする。同様にｗｊ０，ｗｊ１，ｗｋ０，ｗｋ１を定める。このとき、真理値表ではｗｉ１とｗｊ１が入力されたときだけｗｋ１が出力され、その他の入力の組合せではｗｋ０が出力されるよう指定する。この真理値表を暗号的に実現するために真理値表の各行に対応する暗号文をｗｉｂｉとｗｊｂｊを連結した鍵がそろったときにｗｋＡＮＤ（ｂｉ，ｂｊ）が復号できるよう作成する。つまり、２入力のゲ-トの場合、４つの暗号文を作成する。回路作成者は各ブロックで作成された暗号文の集合を各集合内でランダムに並び替え、かつ、ブロックとの対応が明確になるようにして回路評価者へ渡す。最後に回路作成者は自分が入力すべき各配線の秘密入力に対応する暗号鍵を直に、または、回路評価者が入力すべき配線の秘密入力に対応する暗号鍵を忘却通信技術（Ｏｂｌｉｖｉｏｕｓ  Ｔｒａｎｓｆｅｒ）を使って送信する。回路評価者は、各入力ビットに対応する暗号鍵を組み合わせて、各ブロック内の暗号文を全ての復号を試みるため、復号関数を適用する。作成された復号関数適用文のうち１つが出力ビットの暗号鍵に対応する。この動作を繰り返した後に最終的に得られた復号関数適用文のうちの１つが値０であるか値１であるかを回路評価者が評価できる情報を回路作成者が与えることで最終結果のみを復号する。
【０００４】
Ｙａｏによって開発されたＧａｒｂｌｅｄ  Ｃｉｒｃｕｉｔの初期概念は回路評価者が作成する復号関数適用文数は回路段数に関して指数関数的に増加するため、理論的には重要な成果であるが、実際には利用できないものと見なされていた。
【０００５】
２００４年に非特許文献２によって、Ｆａｉｒ  ｐｌａｙという技術をＧａｒｂｌｅｄ  Ｃｉｒｃｕｉｔに導入することによって、回路段数に関して指数関数的に復号関数適用回数が増加するという問題が解消され、ブロックに対して出力配線数だけ復号関数を適用することで汎用秘匿関数計算が可能となった。これにより秘匿関数計算の実用に注目が集まるようになった。
【０００６】
しかしながら、大規模な入力や複雑な関数を扱う場合には汎用Ｇａｒｂｌｅｄ  Ｃｉｒｃｕｉｔは暗号回数が論理関数の真理値表に比例する可能性があるためやはり実用的には適用困難である。この後、加算や乗算など、暗号文に対する演算により、平文に対する演算を実行できる準同型暗号方式が注目を集めるようになり、論理回路のブロックとして準同型暗号方式を適用することにより効率化する方法が問題ごとに個別に考えられるようになってきた。非特許文献３では加算準同型暗号方式を利用した秘匿集合積サイズ判定手法が提案されている。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】Ａｎｄｒｅｗ  Ｃ．Ｙａｏ：“Ｈｏｗ  ｔｏ  ｇｅｎｅｒａｔｅ  ａｎｄ  ｅｘｃｈａｎｇｅ  ｓｅｃｒｅｔｓ，”  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  Ｔｈｅ  ２７ｔｈ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｆｏｕｎｄａｔｉｏｎｓ  ｏｆ  Ｃｏｍｐｕｔｅｒ  Ｓｃｉｅｎｃｅ（ＦＯＣＳ），  ｐｐ．１６２-１６７，１９８６．
【非特許文献２】Ｄ．Ｍａｌｋｈｉ，  Ｎ．Ｎｉｓａｎ，  Ｂ．Ｐｉｎｋａｓ，ａｎｄ  Ｙ．Ｓｅｌｌａ，  “Ｆａｉｒｐｌａｙ-ａ  ｓｅｃｕｒｅ  ｔｗｏ-ｐａｒｔｙ  ｃｏｍｐｕｔａｔｉｏｎ  ｓｙｓｔｅｍ，”Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  Ｔｈｅ  13ｔｈ  ＵＳＥＮＩＸ  Ｓｅｃｕｒｉｔｙ  Ｓｙｍｐｏｓｉｕｍ，  ２００４．
【非特許文献３】Ｗ．Ｊｉａｎｇ  ａｎｄ  Ｃ．Ｃｌｉｆｔｏｎ，“Ａ  ｓｅｃｕｒｅ  ｄｉｓｔｒｉｂｕｔｅｄ  ｆｒａｍｅｗｏｒｋ  ｆｏｒ  ａｃｈｉｖｉｎｇ  ｋ-ａｎｏｎｙｍｉｔｙ，”Ｔｈｅ  ＶＬＤＢ  Ｊｏｕｒｎａｌ，Ｖｏｌ．１５，ｐｐ．３１６-３３３  （２００６）．
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記準同型暗号方式による秘匿関数計算にも問題がある。準同型暗号方式では基本的な演算の準同型性を保証するため一般的な暗号で利用できる平文の値域よりも限定された狭い値域しか扱うことができない。また、いつくかのブロックはやはりＧａｒｂｌｅｄ  Ｃｉｒｃｕｉｔによって実現せざるを得ず、各ゲ-トに対応する真理値表を作成しなければならない。よって、大規模な入力を複雑な関数に適用する場合には汎用Ｇａｒｂｌｅｄ  Ｃｉｒｃｕｉｔと同じ欠点をもつ。以下、図２５を参照して、この問題を具体的に説明する。
【０００９】
以下、医療を扱っている機関Ｐ１とＰ２が図２に示すような「受診者リスト」を用意する。この表は機関Ｐ１とＰ２が住民基本台帳等に従って、国民１人１人に一意の番号を付したものである。機関Ｐ１とＰ２はこの番号表を使って、それぞれが担当したことのある受診者の番号の位置には‘１’をそうでない番号の位置には‘０’を記載した「受診者リスト」（図３：「リストＸ」、「リストＹ」）を作成する。
【００１０】
次に、機関Ｐ１は加法準同型な公開鍵暗号方式での公開鍵ＫｅｙＰ１、秘密鍵ＳＫｅｙＰ１を決定し、公開鍵ＰＫｅｙＰ１を機関Ｐ２に対して公開する。さらに、自分のリスト「リストＸ」の内容をインデックス順に個別に自分の公開鍵ＰＫｅｙＰ１により暗号化する。これにより暗号文リストＡＸを作成する。その後、機関Ｐ１は暗号文リストＡＸを機関Ｐ２に送信する。
【００１１】
機関Ｐ１より暗号文リストＡＸを受信した機関Ｐ２は自身のリストＹで値が‘１’となっている位置に対応する暗号文リストＡＸの位置に格納されている暗号文を全て抜き出し、それらの暗号文を暗号的に加算し、新しい暗号文Ｂを作成する。さらに機関Ｐ１はランダムに選択した値をＲとし、Ｒを機関Ｐ１の公開鍵ＰＫｅｙＰ１で暗号化し、暗号文Ｂと暗号的に加算し暗号文ＢＲを作成する。ここで暗号文ＢＲの平文が表す値は、機関Ｐ１のリストＸと機関Ｐ２のリストＹの両方のリストで該当位置に格納されている値が‘１’である配列位置の数、つまり、共通受診者の数ＮＩに乱数Ｒを加算した値である。機関Ｐ２は暗号文ＢＲを機関Ｐ１に送信する。暗号文ＢＲを受信した機関Ｐ１は自身の秘密鍵ＳＫｅｙＰ１で暗号文ＢＲを復号し、値Ｃを得る。
【００１２】
最後に、機関Ｐ１，機関Ｐ２はそれぞれ値Ｃと値Ｒを秘密入力、値ｋを共通入力として、Ｃ-Ｒ≧ｋという関係が成り立つかどうかを判定する秘匿計算回路に与え、Ｃ-Ｒ≧ｋなら値‘１’をそうでないなら値‘０’の出力を得る。
【００１３】
上記手続きでは、機関Ｐ２は受診したリストが暗号化されていることより、リストの内容を知ることはできない。また、暗号文ＢＲを受信した機関Ｐ１も乱数Ｒという撹乱情報が加算されているため、機関Ｐ２に関する情報（例えば、共通受診者数ＮＩ等の情報）を推測することができない。
【００１４】
理解を深めるため、図２９を参照して数値を具体的に追ってみる。まず、機関Ｐ１はリストＰ１に格納されている‘０’か‘１’を１つの平文を様々な暗号文に変換可能である確率的暗号方式のＥｌＧａｍａｌ暗号を用いて暗号化する。具体的には、平文Ｍを暗号文の2項組（２Ｍ（ＫｅｙＰ１）r, ｇr）の形式に暗号化する。ここで、公開鍵ＫｅｙＰ１と秘密鍵ＳｋｅｙＰ１の関係はＫｅｙＰ１≡ｇＳｋｅｙＰ１（ｍｏｄ ｐ）であり、ｐは素数、gは原始元である。以降では暗号鍵および暗号文作成において行うｐを法とする計算についての記載を省略する。このような方式で作成した暗号文リストＡＰ１を受信した機関Ｐ２は自己の暗号文リストＡＰ２で‘１’の内容をもつ配列位置に対応する暗号文リストＡＰ１の暗号文を抜き出し、それらの第一項どうし、第二項どうしを乗算する。これにより（２Ｍ１＋Ｍ２＋．．．＋Ｍｌｙｒ１＋ｒ２＋…＋ｒｌ、ｇｒ１＋ｒ２＋…＋ｒｌ）という暗号文Ｂを作成する。さらに、乱数Ｒを（２Ｒｙｒｐ２,ｇｒｐ２）によって暗号化し、暗号文Ｂと暗号文（２Ｒｙｒｐ２, ｇｒｐ２）と第１項どうし、第２項どうしを乗算することで、暗号文ＢＲ＝（２Ｍ１＋Ｍ２ +…＋Ｍｌ＋Ｒｙｒ１＋ｒ２＋．．．＋ｒｌ＋ｒｐ２，  ｇｒ１＋ｒ２＋．．．＋ｒｌ＋ｒｐ２）を作成する。この暗号文ＢＲを機関Ｐ２は機関Ｐ１に送信し、機関Ｐ１は暗号文の第２項に秘密鍵ＳｋｅｙＰ１を指数乗することよりＥｘｐＣ＝２（Ｍ１＋Ｍ２＋．．．＋Ｍｌ＋Ｒ）ｙｒ１＋ｒ２＋…＋ｒｌ＋ｒｐ２／（gｒ１＋ｒ２＋．．．＋ｒｌ＋ｒｐ２）ＳｋｅｙＰ１を計算し、Ｃ＝ｌｏｇ２ＥｘｐＣ=Ｍ１＋Ｍ２＋…＋Ｍｌ＋Ｒを得る。機関Ｐ１は値Ｃ＝Ｍ１＋Ｍ２＋… +Ｍｌ＋Ｒを得る。機関Ｐ１は値Ｃを得るだけであり、値Ｃがどのような成分の加算によって構成されたか、機関Ｐ２の１の数等の機関Ｐ２に関する情報を知ることはできない。
【００１５】
しかしながら、この方法にも問題がある。住民基本台帳に記載されているような全ての国民を対象とする場合、数千万単位の配列位置に対応する値を個別に暗号化することは多大な計算時間を要する。また、加法準同型暗号方式では指数部で暗号文を表現しなければならないため、表現できる値域としては、０から暗号鍵のビット長程度の範囲しか扱うことができない。また、公開鍵暗号方式では機関Ｐ２の情報は乱数Ｒで守られるだけであり、機関Ｐ１の暗号化がプロトコルどおりでない場合、情報が漏れる可能性がある。
【００１６】
本発明はこれらの問題を鑑みてなされたものであり、大規模な入力で複雑な関数を扱う場合であっても、Ｇａｒｂｌｅｄ  Ｃｉｒｃｕｉｔに依らず、複数のビットからなるビット列に対する秘匿論理演算を基本要素として秘匿計算を行う汎用秘匿関数計算システム、デ-タ処理装置、汎用秘匿関数計算方法、汎用秘匿関数計算プログラム、および、該汎用秘匿関数計算プログラムを記録した記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００１７】
２以上のデ-タ処理装置で構成される秘匿関数計算システムであって、
前記デ-タ処理装置はそれぞれ
段数変数、（主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、）最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する手続きである最終結果算出手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タとし、前記最終交換デ-タ変数の値と前記受信最終交換デ-タを入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段での主暗号鍵を記憶する主暗号鍵記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タを記憶する撹乱デ-タ記憶手段と、
前記段数変数の値の段数での前記主暗号鍵、加算対象秘密デ-タとなる前記秘密デ-タ、前記撹乱デ-タをそれぞれ読み出し、撹乱デ-タの一部である撹乱部分デ-タを他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タの内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し、前記暗号化撹乱後加算対象デ-タに設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ秘密デ-タと前記暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置のもつ主暗号鍵で暗号化して作成した暗号化加算対象秘密デ-タ変形と二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、前記二重暗号化撹乱後加算対象デ-タを前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形を暗号化したまま加算し、結果を作成し、暗号化撹乱加算結果とし、前記暗号化撹乱加算結果を他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
前記段数変数の値の段数での前記主暗号鍵、前記秘密デ-タを前記加算対象秘密デ-タとして読み出し、他のデ-タ処理装置より前記撹乱部分デ-タと前記他のデ-タ処理の主暗号鍵で暗号化した暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変形と前記二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、前記暗号化撹乱加算結果を受信し、前記暗号化撹乱結果を前記主暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列とする秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて適用すべき可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を論理演算結果ビット配列の前記配列位置に設定し、前記論理演算結果ビット配列の内容を秘密デ-タとして記憶する論理演算適用手段と、
前記秘密デ-タを出力秘密デ-タとして読み出し、前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タに前記最終交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タとする最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果に設定されているとき、あいまい推測後に前記あいまい推測ビット列１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を生成する、
ことを特徴とする。
【００１８】
前記秘匿関数計算システムを構成する前記デ-タ処理装置はそれぞれ、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶手段と、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶手段と、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴としてもよい。
【００１９】
前記秘匿関数計算システムを構成する前記デ-タ処理装置はさらにそれぞれ、
繰り返し回数変数、指定繰り返し回数変数と、
前記段数初期値から前記指定段数までの各段で繰り返し回数変数に設定すべき繰り返し回数初期値と指定繰り返し回数変数に設定すべき指定繰り返し回数を記憶する指定繰り返し回数記憶手段と、
を有し、
さらに前記関数評価処理を担当する前記デ-タ処理装置は結果秘密デ-タ名配列変数と加算結果（正順）ビット配列変数、加算結果（逆順）ビット配列変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記加算結果（正順）ビット配列変数と前記加算結果（逆順）ビット配列変数、それぞれに設定すべき二進数表現の元となる秘密デ-タの名前それぞれを加算結果（正順）秘密デ-タ名、加算結果（逆順）秘密デ-タ名として記憶する加算結果秘密デ-タ名記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で、前記繰り返し変数が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記結果秘密デ-タ名配列変数に設定すべき名前を記憶する結果秘密デ-タ名記憶手段と、
を有し、
前記主暗号鍵記憶手段は、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記主暗号鍵変数に設定すべき暗号鍵を記憶し、
前記加算対象秘密デ-タ名記憶手段は、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前を加算対象秘密デ-タ名として記憶し、
前記段数変数の値の段での前記繰り返し回数初期値、および、前記指定繰り返し回数を読み出し、前記繰り返し回数変数の値を前記繰り返し回数初期値に設定し、前記指定繰り返し変数の値に前記指定繰り返し回数を設定する繰り返し回数初期化部分手段と、
前記段数変数の値の段で、前記繰り返し変数の値の繰り返しで前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名と、前記主暗号鍵変数に設定すべき前記暗号鍵と、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名を読み出し、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ前記秘密デ-タを、前記主暗号鍵変数に前記暗号鍵を、前記撹乱デ-タ変数に前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定する変数設定（加算）部分手段と、
前記撹乱デ-タ変数の一部である撹乱部分デ-タを他のデ-タ処理装置に送信し、前記撹乱デ-タ変数の内容の一部と前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し、前記暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置のもつ加算対象秘密デ-タの変形、および、送信した前記暗号化撹乱後加算対象デ-タもしくは、前記暗号化撹乱後加算対象デ-タの変形を前記他のデ-タ処理装置の主暗号鍵で暗号化して作成された暗号化加算対象秘密デ-タと二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置から受信し、受信した前記暗号化加算対象変形デ-タと前記二重暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数の内容の暗号鍵、もしくは、前記主暗号鍵変数の内容の暗号鍵に対応する復号鍵によって復号した後、暗号化したまま加算し、暗号化撹乱加算結果を作成し、前記暗号化撹乱加算結果を他のデ-タ処理装置へ送信する秘匿加算・挿入・転置（加算）手段と、
前記繰り返し回数変数の値と前記指定繰り返し回数変数の値が等しいかを判定し、等しくなければ前記繰り返し回数変数の値に１だけ加算する繰り返し回数判定（加算）部分手段、
によって構成され、
前記秘匿加算撹乱（結果取得）手段は、
前記段数変数の値の段数で、前記繰り返し変数の値の繰り返しで前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名、前記結果秘密デ-タ名配列変数に設定すべき名前である前記結果秘密デ-タ名をそれぞれ読み出し、前記主暗号鍵変数に前記暗号鍵を、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ秘密デ-タを、前記結果秘密デ-タ名配列変数に前記結果秘密デ-タ名をそれぞれ設定する変数設定（結果取得）部分手段と、
他のデ-タ処理装置より送信された撹乱デ-タの一部である撹乱部分デ-タ、前記他のデ-タ処理装置の主暗号鍵変数に設定された暗号鍵で暗号化された暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象変形デ-タを作成し、前記暗号化加算対象変形デ-タと前記二重暗号化撹乱後加算対象デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、前記二重暗号化撹乱後加算対象デ-タ、前記暗号化加算対象変形デ-タを前記他のデ-タ処理装置の暗号鍵もしくは前記暗号鍵に対応する復号鍵で復号した後、暗号化したまま加算することで作成された暗号化撹乱加算結果を受信し、受信した前記暗号化撹乱加算結果を前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果を前記結果秘密デ-タ名配列変数に設定された名前をもつ秘密デ-タとして記憶する秘匿加算・挿入・転置（結果取得）手段と、
前記繰り返し回数変数の値と前記指定繰り返し回数変数の値が等しいかを判定し、等しくなければ前記繰り返し回数変数の値に１だけ加算し、等しければ前記段数変数の値の段で前記加算結果（正順）ビット配列変数と前記加算結果（逆順）ビット配列変数それぞれに設定すべき秘密デ-タの前記加算結果（正順）秘密デ-タ名と前記加算結果（逆順）秘密デ-タ名を読み出し、前記加算結果（正順）ビット配列変数、前記加算結果（逆順）ビット配列変数それぞれに、読み出した前記加算結果（正順）秘密デ-タ名をもつ秘密デ-タの二進数表現と、読み出した前記加算結果（逆順）秘密デ-タ名をもつ秘密デ-タの二進数表現を設定する繰り返し回数判定（結果取得）部分手段、
によって構成され、
前記加算前ビット列あいまい推測手段は、
前記加算結果（正順）ビット配列変数に設定されている正順結果ビット列と前記加算結果（逆順）ビット配列変数に設定されている逆順結果ビット配列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列３とあいまい推測ビット列４を導出し、前記あいまい推測ビット配列変数１にあいまい推測ビット列３を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列４を設定し、
前記あいまい推測ビット列３と前記あいまいビット列４は、
２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果（正順）ビット配列変数に設定され、加算前入力１、加算前入力２それぞれを二進数表現の最上位ビット位置から最下位ビット位置までのビットの並びを逆順序にしたときのビットの並びをそれぞれ加算前逆順ビット列１と加算前逆順ビット列２とし、前記加算前逆順ビット列１と前記加算前逆順ビット列２の加算結果の二進数表現が加算結果（逆順）ビット配列変数に設定されたとき、あいまい推測後に前記あいまい推測ビット配列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット配列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいという性質を満たす、
ことを特徴としてもよい。
【００２０】
前記秘匿関数計算システムを構成する前記デ-タ処理装置はさらに、
切断ブロック数変数、ブロック切断点順列変数、ベクトルサイズ変数、内積対象ベクトル変数、暗号化内積対象ベクトル変数、暗号化定数ベクトル変数、二重暗号化内積対象乗算結果ベクトル変数、暗号化秘匿ベクトル内積結果変数と、
前記ビット列撹乱処理を担当する前記デ-タ処理装置はさらに、
ブロックシフト係数順列変数、撹乱挿入加算値変数、スカラ-乗数変数、スカラ-除数変数、副暗号鍵ベクトル変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記繰り返し回数変数の値が前記繰り返し回数初期値から前記指定繰り返し回数までの各繰り返しにおいて前記副暗号鍵ベクトル変数に設定すべき暗号鍵のベクトルを記憶する副暗号鍵ベクトル記憶手段と、
をもち、
前記撹乱デ-タは、
撹乱のために加算対象秘密デ-タを切断して作成する切断ブロック数と、切断する配列位置を前記切断ブロック数個並べたブロック切断点順列と、切断後にブロックを転置するために各ブロックに乗算したいブロックシフト係数順列と、前記ブロックシフト係数順列により挿入した空白ブロックの内容を指定する撹乱挿入加算値を含み、
前記変数設定（加算）部分手段は
前記段数変数の値の段で、前記繰り返し変数の値の繰り返しで前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名と、前記主暗号鍵変数に設定すべき前記暗号鍵と、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名と、前記副暗号鍵ベクトル変数に設定すべき暗号鍵ベクトルを読み出し、前記加算対象秘密デ-タ変数に前記加算対象秘密デ-タ名をもつ前記秘密デ-タを、前記主暗号鍵変数に前記暗号鍵を、前記撹乱デ-タ変数に前記撹乱デ-タ名をもつ撹乱デ-タを、前記副暗号鍵ベクトル変数に前記暗号鍵ベクトルをそれぞれ設定し、
前記秘匿加算・挿入・転置（加算）部分手段は、
前記撹乱デ-タ変数に設定されている撹乱デ-タより切断ブロック数と前記切断点順列、ブロックシフト係数順列、撹乱挿入加算値をそれぞれ読み出し、前記切断ブロック変数、前記ブロック切断点順列変数、前記ブロックシフト係数変数、前記撹乱挿入加算値変数にそれぞれ設定し、前記切断ブロック数変数の値と前記ブロック切断点順列変数に設定されている順列を他のデ-タ処理装置へ送信し、前記加算対象秘密デ-タ変数に設定されている秘密デ-タを前記ブロック切断点順列に設定されている順列に従って、前記切断ブロック数変数の値の個数のブロックに切断し、切断ブロック列を作成し、前記切断ブロック列と前記ブロックシフト係数順列変数に設定されている順列との内積を計算し切断ブロックシフト後秘密デ-タとし、前記切断ブロックシフト後秘密デ-タと前記撹乱挿入加算値変数に設定されている値を加算し撹乱後加算対象秘密デ-タを作成し、前記スカラ-定数変数に前記撹乱後加算対象秘密デ-タを設定し、前記ブロックシフト係数順列変数に設定されている順列の要素で１以下の値の要素がある場合、最も小さい値の要素を探し最小値要素とし、前記最小値要素の値を前記スカラ-除数変数に設定し、１以下の値の要素がない場合には前記スカラ-除数変数に１を設定し、前記ブロックシフト係数順列変数に設定されている順列の各要素の値に前記スカラ-除数変数の値の逆数を乗じることで計算できる順列を前記内積対象ベクトル変数に設定し、前記ベクトルサイズ変数に前記切断ブロック変数の値を設定するブロックシフト係数設定小部分手段と、
前記ベクトルサイズ個の乱数の列で、前記列の要素の値の総和が前記スカラ-定数変数の値に前記スカラ-除数の逆数を乗じた値に乱数を加えた値となる前記乱数列を定数ベクトルとして作成し、前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されたベクトルの前記ベクトル位置の要素を暗号化し暗号化内積対象ベクトルを作成し、前記定数ベクトルの各ベクトル位置で前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵により定数ベクトルの前記ベクトル位置の要素を暗号化し暗号化定数ベクトルを作成し、他のデ-タ処理装置に前記暗号化内積対象ベクトルと前記暗号化定数ベクトルを送信し、他のデ-タ処理装置より、前記他のデ-タ処理装置が保有する内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で前記内積対象ベクトルの要素と前記暗号化内積対象ベクトルの前記ベクトル位置の要素を乗算した後、前記暗号化定数ベクトルの前記ベクトル位置の要素を加算し得られた結果を前記他のデ-タ処理装置の前記主暗号鍵変数に設定されている暗号鍵で暗号化し得られた結果を前記ベクトル位置の要素とすることで作成された二重暗号化内積対象乗算結果ベクトルを受信し、前記二重暗号化内積対象乗算結果ベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵、もしくは前記暗号鍵に対応する復号鍵により前記二重暗号化内積対象乗算結果ベクトルの前記ベクトル位置の要素を復号し、暗号化内積対象乗算結果ベクトルを作成し、前記暗号化内積対象乗算結果ベクトルの全要素を加算し暗号化内積結果を作成し、前記暗号化内積結果を前記スカラ-除数で除算した結果を前記暗号化秘匿ベクトル内積結果変数に設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を他のデ-タ処理装置へ送信する秘匿ベクトル内積計算（加算）小部分手段と、
によって構成され、
前記秘匿加算・挿入・転置（結果取得）部分手段は、
他のデ-タ処理装置より前記他のデ-タ処理装置の前記切断ブロック数変数と前記ブロック切断点順列変数に設定されている値と順列を受信し、前記切断ブロック変数と前記ブロック切断点順列変数に受信した前記値と前記順列をそれぞれ設定し、前記加算対象秘密デ-タに設定されているデ-タを前記ブロック切断点順列変数に設定されている順列に従い、前記切断ブロック数変数の値の個数のブロックに分割し、前記ブロックをベクトル表現として並べ前記内積対象ベクトル変数に設定する切断ブロック作成小部分手段と、
他のデ-タ処理装置より他のデ-タ処理装置の前記暗号化内積対象ベクトル変数に設定されている暗号化ベクトルと前記暗号化定数ベクトル変数に設定されている暗号化ベクトルを受信し、それぞれを前記暗号化内積対象ベクトル変数と前記暗号化定数ベクトル変数に設定し、前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置において、前記ベクトル位置の前記暗号化内積対象ベクトル変数に設定されているベクトルの要素と、前記内積対象ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を乗算した結果に前記ベクトル位置の暗号化定数ベクトル変数に設定されているベクトルの要素を加算し、前記主暗号鍵変数に設定されている暗号鍵で暗号化し、前記ベクトル位置の要素とすることで二重暗号化内積対象乗算結果ベクトルを作成し、前記二重暗号化内積対象乗算結果ベクトルを前記他のデ-タ処理装置へ送信し、他のデ-タ処理装置より他のデ-タ処理装置の前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を受信し、前記暗号化秘匿ベクトル内積変数に受信した前記暗号値を設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、得られた結果をベクトル内積結果とし、前記結果秘密デ-タ名変数に設定されている名前をもつ秘密デ-タとして前記ベクトル内積結果を記憶する秘匿ベクトル内積（結果取得）小部分手段によって構成され、
前記変数設定（結果取得）部分手段は
前記加算対象秘密デ-タ変数に前記秘匿ベクトル内積小部分手段により作成された前記ベクトル内積結果を設定することができてもよい。
【００２１】
前記秘匿関数計算システムの前記デ-タ処理装置は、さらに、
乱数ベクトル変換行列変数、二重暗号化内積対象ベクトル変数、暗号化乱数ベクトル変数、指定除外ベクトル位置変数、二重暗号化除外以外乗算結果ベクトル変数、二重暗号化除外以外総和変数をもち、
前記関数評価処理を担当する前記デ-タ処理装置は、さらに
副暗号鍵ベクトル変数をもち、
前記秘匿ベクトル内積（結果取得）小部分手段は、
前記ベクトルサイズ変数に設定されている個数以上の暗号鍵を生成し、暗号鍵ベクトルを作成し、前記ベクトルを前記副暗号鍵ベクトル変数に設定し、前記ベクトルサイズ変数に設定されている個数以上の乱数を生成し、乱数のベクトルを作成し、前記ベクトルを前記乱数ベクトルとし、行数、列数ともに前記ベクトルサイズ変数の値をもち、各要素を乱数とする行列を作成し、前記行列を前記乱数ベクトル変換行列変数に設定し、前記乱数行列ベクトル変数に設定された行列に前記乱数ベクトル変数に設定されているベクトルを乗算し乱数変形ベクトルを作成し、前記乱数変形ベクトルの各要素に値１を加算し、乱数係数ベクトルを作成し、前記乱数係数ベクトルの各ベクトル位置において、前記乱数ベクトル変数に設定されているベクトルの前記ベクトル位置の要素と前記乱数係数ベクトルの前記ベクトル位置の要素を乗算し、得られた結果を前記ベクトル位置の要素とすることで乱数変形ベクトルを作成し、
前記デ-タ列撹乱処理を担当する他のデ-タ処理装置より前記他のデ-タ処理装置の前記暗号化内積対象ベクトル変数に設定されている暗号化内積対象ベクトルと前記暗号化定数ベクトル変数に設定されている暗号化定数ベクトルを受信し、前記暗号化内積対象ベクトルと前記暗号化定数ベクトルをそれぞれ前記暗号化内積対象ベクトル変数と前記暗号化定数ベクトル変数に設定し、
前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置において、前記ベクトル位置の前記暗号化内積対象ベクトル変数に設定されているベクトルの要素と前記内積対象ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を乗算した結果に前記ベクトル位置の暗号化定数ベクトル変数に設定されているベクトルの要素と前記乱数変形ベクトルの前記ベクトル位置の要素を乗算した結果を加算し、得られた結果を前記副暗号鍵ベクトル変数に設定されている暗号鍵により暗号化し、前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを前記二重暗号化内積対象ベクトル変数に設定し、
前記乱数ベクトル変数の各ベクトル位置において前記ベクトル位置の前記乱数ベクトル変数の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵で暗号化し、前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを前記暗号化乱数ベクトル変数に設定し、
前記乱数ベクトル変換行列変数に設定されている行列と前記二重暗号化内積対象ベクトル変数に設定されているベクトルと前記暗号化乱数ベクトル変数に設定されているベクトルを他のデ-タ処理へ送信し、
他のデ-タ処理装置より、前記デ-タ列撹乱処理を担当する他のデ-タ処理装置の前記指定除外ベクトル位置変数に設定されているベクトル位置、前記二重暗号化除外以外乗算結果ベクトル変数に設定されているベクトルを受信し、前記ベクトル位置と前記ベクトルをそれぞれ自身がもつ前記指定除外ベクトル位置変数と前記二重暗号化除外以外乗算結果ベクトル変数に設定し、
前記主暗号鍵変数に前記副暗号鍵ベクトル変数に設定されているベクトルの前記指定除外ベクトル位置変数に設定されているベクトル位置に設定されている暗号鍵を設定し、
前記二重暗号化除外以外乗算結果ベクトルの各ベクトル位置において、前記ベクトル位置が前記指定除外ベクトル位置変数に設定されているベクトル位置と異なるなら、前記二重暗号化除外以外乗算結果ベクトルの前記ベクトル位置の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵もしくは前記暗号鍵に対応する復号鍵により復号し、結果をベクトル位置の要素とすることで暗号化乗算結果ベクトルを作成し、
前記暗号化乗算結果ベクトルの前記指定除外ベクトル位置以外にある要素の総和を求め、結果を暗号化除外以外総和とし、前記暗号化除外以外総和を前記主暗号鍵変数に設定されている暗号鍵で暗号化し、二重暗号化除外以外総和とし前記二重暗号化除外以外総和変数に設定し、前記二重暗号化除外以外総和変数に設定されている暗号文を他のデ-タ処理装置に送信し、
前記デ-タ列撹乱処理を担当する他のデ-タ処理装置が前記秘匿ベクトル内積（加算）小部分手段によって作成し、前記暗号化秘匿ベクトル内積結果変数に設定した暗号文を受信し、前記暗号化秘匿ベクトル内積結果変数に前記暗号文を設定し、前記暗号化秘匿ベクトル内積結果変数に設定されている暗号文を前記主暗号鍵に設計されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、得られた結果をベクトル内積結果とし、前記結果秘密デ-タ名変数に設定されている名前をもつ秘密デ-タをして前記ベクトル内積結果を記憶し、
前記秘匿ベクトル内積計算（加算）小部分手段は
前記ベクトルサイズ個以上の乱数の列で、前記列の要素の値の総和が前記スカラ-定数変数の値に前記スカラ-除数の逆数を乗じた値に乱数を加えた値と等しいような前記乱数列を定数ベクトルとして作成し、
前記内積対象ベクトル変数に設定されているベクトルの各ベクトル位置で、前記副暗号鍵ベクトル変数に設定されたベクトルの前記ベクトル位置の要素を暗号化し暗号化内積対象ベクトルを作成し、前記暗号化内積対象ベクトルを前記暗号化内積対象ベクトル変数に設定し、
前記定数ベクトルの各ベクトル位置で前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵により定数ベクトルの前記ベクトル位置の要素を暗号化し暗号化定数ベクトルを作成し、前記暗号化定数ベクトル変数に前記暗号化定数ベクトルを設定し、
他のデ-タ処理装置に前記暗号化内積対象ベクトル変数に設定されているベクトルと前記暗号化定数ベクトル変数に設定されているベクトルを送信し、
他のデ-タ処理装置より、前記関数評価処理を担当する他のデ-タ処理装置がもつ前記乱数ベクトル変換行列変数に設定されている行列、前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトル１と前記暗号化乱数ベクトル変数に設定されているベクトル２を受信し、前記行列、前記ベクトル１、前記ベクトル２を自身がもつ前記乱数ベクトル変換行列変数、前記二重暗号化内積対象ベクトル変数、前記暗号化乱数ベクトル変数にそれぞれ設定し、
前記乱数ベクトル変換行列変数に設定された行列の転置行列を計算し、得られた行列を前記変換転置行列変数に設定し、前記変換転換行列変数に設定されている行列に前記定数ベクトルを乗算し、得られたベクトルを定数変形ベクトルとし、
前記暗号化乱数ベクトル変数に設定されている各ベクトル位置において、前記暗号化乱数ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている要素と前記定数変形ベクトルの前記ベクトル位置の要素を乗算し、得られた結果を前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを暗号化定数変形ベクトルとし、
前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの全ベクトル位置からベクトル位置を選び、前記ベクトル位置を前記除外ベクトル位置変数に設定し、前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの各ベクトル位置において前記二重暗号化内積対象乗算結果ベクトル変数に設定されているベクトルの前記ベクトル位置の要素を前記副暗号鍵ベクトル変数に設定されているベクトルの前記ベクトル位置に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵で復号し、前記ベクトル位置の要素とすることで復号二重暗号化内積対象乗算結果ベクトルを作成し、前記復号二重暗号化内積対象乗算結果ベクトルの各ベクトル位置において、前記復号二重暗号化内積対象乗算結果ベクトルの前記ベクトル位置の要素と前記暗号化定数変形ベクトルの前記ベクトル位置の要素を加算し、得られた結果を前記ベクトル位置の要素とすることでベクトルを作成し、前記ベクトルを前記暗号化乗算結果ベクトルとし、前記暗号化乗算結果ベクトルの前記除外ベクトル位置以外の各ベクトル位置において、前記暗号化乗算結果ベクトルの前記ベクトル位置の要素を前記主暗号鍵変数に設定されている暗号鍵で暗号化した結果を前記ベクトル位置の要素とし、前記除外ベクトル位置の要素を空とし、二重暗号化除外以外乗算結果ベクトルを作成し、前記に二重暗号化除外以外乗算結果ベクトル変数に前記二重暗号化除外以外乗算結果ベクトルを設定し、
前記除外ベクトル位置変数に設定されているベクトル位置と前記二重暗号化除外以外乗算結果ベクトル変数に設定されているベクトルを他のデ-タ処理装置へ送信し、
他のデ-タ処理装置より前記関数評価処理を担当するデ-タ処理装置の前記二重暗号化除外以外総和変数に設定されていた暗号値を受信し、前記暗号値を前記二重暗号化除外以外総和変数に設定し、前記二重暗号化除外以外総和変数の暗号値を前記主暗号鍵変数に設定されている暗号鍵、または、前記暗号鍵に対応する復号鍵で復号し、得られた結果を前記暗号化除外以外総和変数に設定し、前記暗号化除外以外総和変数に設定されている要素と前記暗号化乗算結果ベクトル変数に設定されているベクトルで前記除外ベクトル位置変数に設定されているベクトル位置に設定されている要素を加算し、結果を生成し、前記結果を前記暗号化秘匿ベクトル内積結果変数に設定し、
他のデ-タ処理装置に前記暗号化秘匿ベクトル内積結果変数に設定されている暗号値を送信し、
前記ベクトル内積結果は前記関数処理を担当するデ-タ処理装置がもつ前記内積対象変数ベクトルに設定されているベクトルと前記デ-タ列撹乱処理を担当するデ-タ処理装置がもつ前記内積対象変数に設定されているベクトルの内積結果に前記デ-タ列撹乱処理を担当する前記デ-タ処理装置がもつ前記スカラ-除数変数に設定されている値を除算した結果に前記デ-タ処理装置がもつ前記スカラ-定数変数に設定されている値を加算した結果と等しい、
という特徴をもってもよい。
【００２２】
前記秘匿関数計算システムは、
２以上の前記デ-タ処理装置がアクセス可能なデ-タ記憶装置、をさらに有し、
２以上の前記デ-タ処理装置は、それぞれ、
自己の保有する各変数に設定されたデ-タを前記デ-タ記憶装置に保存し、
他のデ-タ処理装置が保存したデ-タを前記デ-タ記憶装置から取得してもよい。
【００２３】
３以上の前記デ-タ処理装置で構成される前記秘匿関数計算システムであって、
前記秘密デ-タは、２以上の他のデ-タ処理装置の前記主暗号鍵で順次暗号化されることによって生成されてもよい。
【００２４】
上記目的を達成するため、本発明の第2の観点にかかるデ-タ処理装置は、
他のデ-タ処理装置と連携してデ-タを処理するデ-タ処理装置であって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶手段と、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶手段と、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化手段と、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定手段と、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶手段と、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶手段と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶手段と、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置は
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）手段と、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶手段と、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定手段と、
を有し、
前記関数評価処理を担当するデ-タ処理装置は、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶手段と、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶手段と、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶手段と、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）手段と、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測手段と、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成手段を、有し、
前記あいまい推測手段は２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする。
【００２５】
上記目的を達成するため、本発明の第３の観点にかかる秘匿関数計算方法は、
他のデ-タ処理装置と連携してデ-タを処理するデ-タ処理装置により使用される秘匿関数計算方法であって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶ステップと、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶ステップと、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化ステップと、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定ステップと、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶ステップと、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶ステップと、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置によって使用される前記秘匿関数計算方法は、
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）ステップと、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶ステップと、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定ステップと、
を有し、
前記関数評価処理を担当するデ-タ処理装置により使用される前記秘匿関数計算方法はさらに、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶ステップと、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）ステップと、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測ステップと、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成ステップを、有し、
前記あいまい推測ステップは２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする。
【００２６】
上記目的を達成するため、本発明の第４の観点にかかる秘匿関数計算プログラムは、
他のコンピュ-タと連携してデ-タを処理するコンピュ-タにより実行される秘匿関数計算プログラムであって、
段数変数、加算対象秘密デ-タ変数、主暗号鍵変数、撹乱部分デ-タ変数、暗号化撹乱後加算対象秘密デ-タ変数、暗号化加算対象秘密デ-タ変形変数、二重暗号化撹乱後加算対象秘密デ-タ変数、暗号化撹乱加算結果変数、最終交換デ-タ変数、受信最終交換デ-タ変数と、
秘密デ-タを前記秘密デ-タの名前である秘密デ-タ名とともに記憶する秘密デ-タ記憶ステップと、
前記段数変数に設定すべき段数変数初期値と前記段数変数の値の上限値である指定段数を記憶する指定段数記憶ステップと、
前記段数変数初期値を読み出し、前記段数変数に前記段数初期値を設定する段数初期化ステップと、
前記段数変数の値と前記指定段数が等しいか否かを判定し、等しくなければ、前記段数変数の値を１だけ増加する段数判定ステップと、
前記最終交換デ-タ変数の値と他のデ-タ処理装置より送信された最終交換デ-タを入力として最終結果を算出するために適用する関数手続きである最終結果算出関数手続きを記憶する最終結果算出手続き記憶ステップと、
前記最終結果算出関数手続きを読み出し、前記最終交換デ-タ変数に設定された値を他のデ-タ処理装置に送信し、前記他のデ-タ処理装置の前記最終交換デ-タ変数に設定されている値を受信し、受信した前記値を前記受信最終交換デ-タ変数に設定し、前記最終交換デ-タ変数の値と前記受信最終交換デ-タ変数の値を入力として前記最終結果算出関数を適用し、最終結果を算出する最終結果算出ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段で前記主暗号鍵変数に設定すべき暗号鍵を記憶する主暗号鍵記憶ステップと、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タの名前を加算対象秘密デ-タ名として記憶する加算対象秘密デ-タ名記憶ステップと、
を有し、
さらに、前記デ-タ処理装置は関数評価処理かビット列撹乱処理のどちらかを担当し、
前記ビット列撹乱処理を担当する前記デ-タ処理装置によって使用される前記秘匿関数計算方法は、
撹乱デ-タ変数と、
前記段数変数の値が前記段数初期値から前記指定段数までの各段において、前記撹乱デ-タ変数に設定すべき前記撹乱デ-タの名前を撹乱デ-タ名として段数とともに記憶する撹乱デ-タ名記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記主暗号鍵、前記加算対象秘密デ-タ変数に設定すべき前記秘密デ-タ名、前記撹乱デ-タ変数に設定すべき撹乱デ-タの名前である前記撹乱デ-タ名をそれぞれ読み出し、前記暗号鍵変数に読み出した暗号鍵を、前記加算対象秘密デ-タに読み出した前記秘密デ-タ名を持つ秘密デ-タを、前記撹乱デ-タ変数に読み出した前記撹乱デ-タ名をもつ撹乱デ-タをそれぞれ設定し、前記撹乱デ-タ変数に設定されている撹乱デ-タの一部である撹乱部分デ-タを前記撹乱部分デ-タ変数に設定し、他のデ-タ処理装置に送信し、前記撹乱部分デ-タと前記加算対象秘密デ-タ変数の内容を組み合わせて撹乱後加算対象秘密デ-タを作成し、前記撹乱後加算対象秘密デ-タを前記主暗号鍵で暗号化し、暗号化撹乱後加算対象秘密デ-タを作成し前記暗号化撹乱後加算対象秘密デ-タ変数に設定し、前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号デ-タを他のデ-タ処理装置に送信し、前記他のデ-タ処理装置のもつ前記暗号化加算対象秘密デ-タ変形変数に設定されている暗号化加算対象秘密デ-タ変形と前記二重暗号化撹乱後加算対象デ-タ変数に設定されている二重暗号化撹乱後加算対象デ-タを前記他のデ-タ処理装置から受信し、それぞれを前記暗号化加算対象秘密デ-タ変形変数、前記二重暗号化撹乱後加算対象デ-タ変数に設定し、前記二重暗号化撹乱後加算対象デ-タ変数の暗号デ-タを前記主暗号鍵変数に設定されている暗号鍵、もしくは、前記暗号鍵に対応する復号鍵によって復号した結果と前記暗号化加算対象デ-タ変形変数に設定されている暗号デ-タを暗号化したまま加算し、暗号デ-タを作成し、前記暗号デ-タを前記暗号化撹乱加算結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを他のデ-タ処理装置へ送信する秘匿加算撹乱（加算）ステップと、
前記最終交換デ-タ変数に設定される撹乱デ-タの名前である最終交換デ-タ名を記憶する最終交換デ-タ名記憶ステップと、
前記最終交換デ-タ名を読み出し、前記最終交換デ-タ変数に前記最終交換デ-タ名をもつ前記撹乱デ-タを設定する最終交換デ-タ設定ステップと、
を有し、
前記関数評価処理を担当するデ-タ処理装置により使用される前記秘匿関数計算方法はさらに、
加算結果ビット配列変数、あいまい予測結果ビット配列変数１、あいまい予測結果ビット配列変数２、指定論理演算型配列変数、論理演算適用結果ビット配列変数、出力秘密デ-タ変数をもち、
前期段数変数の値が前期段数初期値から前期指定段数までの各段において
前記指定論理演算型配列変数に設定すべきであり、各配列位置で前記あいまい推測ビット配列１と前記あいまい推測ビット配列２の前記配列位置の２つのビットに適用したい可換性論理演算の種類を列形式で記している指定論理演算型列を記憶する指定論理演算型列記憶ステップと、
前記段数変数の値が前記段数変数初期値から前記指定段数までの各段において、前記論理演算結果変数の内容を秘密デ-タとして記憶するときに前記秘密デ-タの名前として設定すべき格納デ-タ名前を記憶する格納デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定すべき秘密デ-タの名前である出力秘密デ-タ名を記憶する出力秘密デ-タ名記憶ステップと、
前記出力秘密デ-タ変数に設定された値を入力として前記最終交換デ-タ変数に設定する値を出力するために適用する関数手続きである交換デ-タ作成手続きを記憶する交換デ-タ作成手続き記憶ステップと、
前記段数変数の値の段数で前記主暗号鍵変数に設定すべき前記暗号鍵、前記加算対象秘密デ-タ変数に設定すべき秘密デ-タの名前である前記加算対象秘密デ-タ名をもつ秘密デ-タをそれぞれ設定し、他のデ-タ処理装置より前記他のデ-タ処理装置の前記撹乱部分デ-タ変数に設定されている撹乱部分デ-タ、前記他のデ-タ処理装置の前記暗号化撹乱後加算対象デ-タ変数に設定されている暗号化撹乱後加算対象デ-タを受信し、受信した前記撹乱部分デ-タと前記加算対象デ-タを組み合わせて加算対象デ-タ変形を作成し、前記加算対象デ-タ変形と前記暗号化撹乱後加算対象デ-タそれぞれを前記主暗号鍵変数に設定されている暗号鍵で暗号化し暗号化加算対象デ-タと二重暗号化撹乱後加算対象デ-タを作成し、前記暗号化加算対象デ-タ変数と前記二重暗号化撹乱後加算対象デ-タ変数にそれぞれを設定し、前記暗号化加算対象デ-タ変形変数に設定された暗号デ-タと前記二重暗号化撹乱後加算対象デ-タ変数に設定された暗号デ-タを他のデ-タ処理装置に送信し、他のデ-タ処理装置より、他のデ-タ処理装置の前記暗号化撹乱加算結果変数に設定されている暗号デ-タを受信し、前記暗号デ-タを前記暗号化撹乱結果変数に設定し、前記暗号化撹乱加算結果変数に設定されている暗号デ-タを前記主暗号鍵変数に設定された暗号鍵、もしくは、前記暗号鍵に対応する復号鍵により復号し、撹乱加算結果を作成し、前記撹乱加算結果の二進数表現を前記加算結果ビット配列変数に設定する秘匿加算撹乱（結果取得）ステップと、
前記加算結果ビット配列変数に設定されているビット列より、加算前の２つのビット列をあいまいに推測し、あいまい推測ビット列１とあいまい推測ビット列２を導出し、前記あいまい推測結果ビット配列変数１にあいまい推測ビット列１を設定し、前記あいまい推測結果ビット配列変数２にあいまい推測ビット列２を設定する加算前ビット列あいまい推測ステップと、
前記段数変数の値の段数にて前記指定論理演算型配列変数に設定すべき指定論理演算型列を読み出し、前記指定論理演算型配列に設定し、前記格納デ-タ名変数に設定すべき格納デ-タ名を読み出し、前記格納デ-タ名変数に設定し、前記指定論理演算型配列の各配列位置において、前記配列位置で指定されている型の可換性論理演算を前記あいまい推測ビット配列変数１の前記配列位置のビットと前記あいまい推測ビット配列変数２の前記配列位置のビットに適用した演算結果を導出し、前記演算結果を前記論理演算結果ビット配列変数の前記配列位置に設定し、前記指定論理演算型配列のすべての配列位置の論理演算を適用した後、前記論理演算結果ビット配列変数の内容を秘密デ-タとして前記格納デ-タ名変数に設定された名前をつけて記憶する論理演算適用手段と、
前記出力秘密デ-タ名と前記最終交換デ-タ作成手続きを読み出し、前記出力秘密デ-タ変数に読み出した前記出力秘密デ-タ名をもつ秘密デ-タを設定し、前記出力秘密デ-タ名をもつ前記秘密デ-タに前記交換デ-タ作成手続きを適用し、得られた結果を前記最終交換デ-タ変数に設定する最終交換デ-タ作成ステップを、有し、
前記あいまい推測ステップは２つの数である加算前入力１と加算前入力２の加算結果の二進数表現が加算結果変数に設定されているとき、あいまい推測後に前記あいまい推測ビット列変数１に設定されたビット列の任意のビット位置のビットと前記あいまい推測ビット列変数２に設定されたビット列の前記ビット位置のビットに対して任意の可換性二項論理演算を適用したときの結果が前記加算前入力１の二進数表現のビット列の前記ビット位置のビットと前記加算前入力２の二進数表現のビット列の前記ビット位置のビットに対して前記可換性二項論理演算を適用したときの結果と等しいということを満たす前記あいまい推測ビット列１と前記あいまい推測ビット列２を前記あいまい推測ビット列変数１と前記あいまい推測ビット変数２に設定する、
ことを特徴とする。
【００２７】
上記目的を達成するため、本発明の第５の観点にかかる記録媒体は、
秘匿関数計算プログラムが記録されていることを特徴とする。
【発明の効果】
【００２８】
本発明によれば、複数のビットからなるビット列に対し論理演算を組み合わせることで実現できる秘匿関数計算をビット列を単位とした暗号化により無関係な情報を他に知られることなく、高速に実行することができる。
【図面の簡単な説明】
【００２９】
【図１】本発明の実施の形態１にかかる秘匿関数計算システムの構成例を示すブロック図である。
【図２】複数の機関による事前の取り決めに基づいて、地域の住民に一意の番号を付した住民番号表を示す図である。
【図３】図２に示す住民番号表に基づいて、各医療機関が担当した受診者には’1’をそうでない住民には’0’を割り当てた受診者リストを示す図である。
【図４】図１に示す制御部によって実現される機能を示す機能ブロック図である。
【図５】図４に示す秘匿加算撹乱（結果取得）部によって実現される機能を示す機能ブロック図である。
【図６】図４に示す秘匿加算撹乱（加算）部によって実現される機能を示す機能ブロック図である。
【図７】本発明の実施の形態１にかかる「関数評価処理」と「ビット列撹乱処理」の概要を説明するための処理概要図（前半）である。
【図８】本発明の実施の形態１にかかる「関数評価処理」と「ビット列撹乱処理」の概要を説明するための処理概要図（中間）である。
【図９】本発明の実施の形態１にかかる「関数評価処理」と「ビット列撹乱処理」の概要を説明するための処理概要図（後半）である。
【図１０】本発明の実施の形態１にかかる「関数評価処理」と「ビット列撹乱処理」の概要を説明するためのフロ-チャ-トである。
【図１１】図１０に示す「関数評価処理」および「ビット列撹乱処理」で実行される「段数初期化処理」を説明するためのフロ-チャ-トである。
【図１２】図１０に示す「関数評価処理」で実行される「秘匿加算撹乱（結果取得）処理」と「ビット列撹乱処理」で実行される「秘匿加算撹乱（加算）処理」を説明するためのフロ-チャ-トである。
【図１３】図１２に示す「秘匿加算撹乱（結果取得）処理」および「秘匿加算撹乱（加算）処理」で実行される「繰り返し回数初期化処理」を説明するためのフロ-チャ-トである。
【図１４】図１２に示す「秘匿加算撹乱（結果取得）処理」で実行される「変数設定（結果取得）処理」および「秘匿加算撹乱（加算）処理」で実行される「変数設定（加算）処理」を説明するためのフロ-チャ-トである。
【図１５】図１２に示す「秘匿加算撹乱（結果取得）処理」で実行される「切断ブロック作成処理」および「秘匿加算撹乱（加算）処理」で実行される「ブロックシフト係数設定処理」を説明するためのフロ-チャ-トである。
【図１６】図１２に示す「秘匿加算撹乱（結果取得）処理」で実行される「秘匿ベクトル内積計算（結果取得）処理」および「秘匿加算撹乱（加算）処理」で実行される「秘匿ベクトル内積計算（加算）処理」を説明するためのフロ-チャ-トである。
【図１７】図１２に示す「秘匿加算撹乱（結果取得）処理」で実行される「繰り返し回数判定（結果取得）処理」および「秘匿加算撹乱（加算）処理」で実行される「繰り返し回数判定（加算）」処理を説明するためのフロ-チャ-トである。
【図１８】図１０に示す「関数評価処理」で実行される「加算前ビット列あいまい推測処理」を説明するためのフロ-チャ-トである。
【図１９】図１０に示す「関数評価処理」で実行される「論理演算適用処理」を説明するためのフロ-チャ-トである。
【図２０】図１０に示す「関数評価処理」と「ビット列撹乱処理」で実行される「段数判定処理」を説明するためのフロ-チャ-トである。
【図２１】図１０に示す「関数評価処理」と「ビット列撹乱処理」で実行される「最終交換デ-タ作成処理」を説明するためのフロ-チャ-トである。
【図２２】図１０に示す「関数評価処理」と「ビット列撹乱処理」で実行される「最終結果算出処理」を説明するためのフロ-チャ-トである。
【図２３】図１８に示す「加算前ビット列あいまい推測処理」で用いる加算前ビット列あいまい推測表である。
【図２４】図２３に示す「加算前ビット列あいまい推測表」を作成するための基本となった加算結果とキャリ-ビットの関係を示す２つの表である。
【図２５】図１８に示す「加算前ビット列あいまい推測処理」で実行される「あいまい推測処理」の概要を説明するための概略図である。
【図２６】図８に示す「秘匿ベクトル内積計算（結果取得）処理」と「秘匿ベクトル内積計算（加算）処理」の正当性検証の概略である。
【図２７】本発明の実施の形態２にかかる秘匿関数計算システムの構成例を示すブロック図である。
【図２８】本発明の実施の形態２にかかる「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」を説明するためのフロ-チャ-トである。
【図２９】ビットごとの暗号化を使用した従来の秘匿関数計算方法を説明するための概略図である。
【発明を実施するための形態】
【００３０】
（実施の形態１）
本実地の形態の秘匿関数計算システム１は、機関Ｐ１もしくは機関Ｐ２のもつ入力に対して互いの入力を相手に知られることなく、関数を適用したときの解のみを互いに知るための秘匿関数計算システムである。以下、秘匿関数計算システム１について図面を参照しながら説明する。まず、図１を参照して秘匿関数計算システム１の構成について説明する。
【００３１】
秘匿関数計算システム１は図１に示すように、機関Ｐ１と機関Ｐ２それぞれに設置された２代のデ-タ処理装置１０００と、それらを接続する通信線２０００とで構成される。２台のデ-タ処理装置１０００は通信線２０００を通じて互いにデ-タを送受信することで連携して１つの処理を実行する。
【００３２】
デ-タ処理装置１０００は例えばＰＣ、サ-バやメインフレ-ムなどで構成され、実験デ-タ等の非公開情報を格納している。デ-タ処理装置１０００は図１に示すように、制御部１１００、通信部１２００、記憶部１３、操作部１４００、インタフェ-ス部１５００から構成される。
【００３３】
制御部１１００はなどで構成され、デ-タ処理装置１０００の各部を制御する。また、制御部１１００は操作部１４００から「関数計算開始」を受信すると、後述の「関数計算処理」を実行する。また、制御部１１００は操作部１４００から「ビット列撹乱開始」を受信すると、後述の「ビット列撹乱処理」を実行する。「関数計算処理」は２台のデ-タ処理装置１０００のうち１台で、他方のデ-タ処理装置１０００で「ビット列撹乱処理」が実行される。
【００３４】
通信部１２００はＬＡＮコネクタや送受信処理用のプロセッサなどから構成され、通信線２０００と通じて外部の装置（例えばパ-ソナルコンピュ-タ）との通信を行う。
【００３５】
記憶部１３００はハ-ドディスクやＲＡＭ (Random Access Memory) などの記憶装置から構成され、デ-タ処理装置１０００の動作に必要なデ-タ（例えば「秘密デ-タ」、「撹乱デ-タ」や「暗号鍵」、「復号鍵」）などを記憶する。
【００３６】
ここで、「秘密デ-タ」とは「担当住民リスト」などの非公開な情報のことをいう。また、「担当住民リスト」とは、各医療機関で各住民を担当したことがあるかないかを示すリストである。また、処理の実行途中に得られた非公開な情報も「秘密デ-タ」として記録される。また、「撹乱デ-タ」とは「ビット列撹乱処理」を実行するときに秘密デ-タを撹乱するときに用いる情報（詳細は後述する）のことをいう。
【００３７】
また、「暗号鍵」とはデ-タの暗号化に使用するための鍵となる数値であり、それぞれの機関において任意に選択される。本実施の形態では記憶部１３００に２種類の暗号鍵が保存される。１つは「主暗号鍵」であり、もう１つは「副暗号鍵」である。「主暗号鍵」は後述する暗号文列である二重暗号化内積対象乗算結果ベクトル、暗号文である暗号化内積結果を作成するための暗号鍵である。「副暗号鍵」は暗号文列である二重暗号化内積対象乗算結果ベクトルを生成する過程で一時的に使用される暗号鍵である。「副暗号鍵」は複数個用意される（詳細は後述する）。
【００３８】
さらに、「復号鍵」とは暗号化された暗号文を復号し、暗号前のデ-タに復元するために使用する鍵となる数値であり、対応する暗号鍵と対をなして記憶される。
【００３９】
操作部１４００はデ-タ処理装置１０００の外面上に構成されている各種ボタンなどによって構成される。ユ-ザにより所定のボタンが押されると、制御部１１００に対し「関数計算開始通知」または、「ビット列撹乱開始通知」を送信する。関数計算開始通知は、関数計算処理を開始するためのトリガとなるデ-タである。
【００４０】
インタフェ-ス部１５００は例えばＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）コネクタやビデオ出力端子などから構成され、外部の装置（例えばＰＣやモニタなど）へ処理結果を送信する。
【００４１】
以上、秘匿関数計算システム１の構成について説明したが、次に、制御部１１００が備える機能について、図４，図５、図６の機能ブロック図、及び、図７、図８、図９の処理概略図を参照しながら説明する。
【００４２】
制御部１１００は複数の機関で入力を秘匿したままで関数値を計算するため、「関数評価処理」か「ビット列撹乱処理」のどちらかを実行する。関数評価処理は操作部１４００からの「関数評価開始通知」により開始される。また、ビット列撹乱処理は操作部１４００からの「ビット列撹乱開始通知」により開始される。以下に説明する各機能は関数評価処理、および、ビット列撹乱処理を実現するための機能である。はじめに「関数評価処理」を実現するための機能について説明する。
【００４３】
段数初期化部１１１０は秘匿関数計算に必要な論理演算適用の段数を達成したかを後に判定するために論理演算適用段数を記憶する変数Ｒａｎｋを初期化する。
【００４４】
秘匿加算撹乱（結果取得）部１１２０は他の機関のデ-タ処理装置の秘匿加算撹乱（加算）部１１８０と連携して、自己の担当住民ビット列「リストＸ」と相手機関の担当住民ビット列「リストＹ」を撹乱し、追加ビットを挿入した後に加算した結果を記録した加算結果を加算結果ビット列変数に設定する。
【００４５】
加算前ビット列あいまい推測部１１３０は、秘匿加算撹乱（結果取得）部で加算結果ビット列変数に設定した加算結果より、加算前の２つのビット列をあいまいに復元し、結果をあいまい推測結果ビット配列変数１、あいまい推測結果ビット配列変数２に設定する。
【００４６】
論理演算適用部１１４０は加算前ビット列あいまい推測部１１３０で求めた加算前あいまい推測ビット列１変数と加算前あいまい予測ビット列２変数に設定されている２つのビット列に対して、ビットごとに論理和、論理積、排他的論理和などの可換性二項論理演算を適用し、得られた論理演算結果を記憶部１３００に格納する。
【００４７】
段数判定部１１５０は秘匿関数計算に必要な段数の論理演算を適用したかを判定する。段数変数Ｒａｎｋの値が必要な段数と等しくなければ、Ｒａｎｋの値を１だけ増加させ制御を秘匿加算撹乱（結果取得）部１１２０か秘匿加算撹乱（加算）部１１８０に移す。
【００４８】
最終交換デ-タ作成部１１６０は記憶部１３００に格納されている論理演算結果と最終交換デ-タを作成するために論理演算結果に適用する最終交換デ-タ作成プログラムを読み出し、論理演算結果を最終交換デ-タ作成プログラムに記載された関数に入力して与えたときの出力を最終交換デ-タとする。
【００４９】
最終結果算出部１１７０では作成した最終交換デ-タを他のデ-タ処理装置に送信し、また、他のデ-タ処理装置より最終交換デ-タを受信し、それら２つの最終交換デ-タに対して、記憶部１３００より読み出した最終結果算出関数を適用し、計算結果を算出し、インタフェ-ス部１５００を介し外部へ計算結果を出力する。
【００５０】
以上、制御部１１００の機能について説明したが、制御部１１００の中の「関数評価処理」の部分処理である「秘匿加算撹乱（結果取得）処理」と実行する秘匿加算撹乱（結果取得）部１１２０と「秘匿関数計算処理」の部分処理である「秘匿加算撹乱（加算）処理」を実行する秘匿加算撹乱（加算）部１１８０の機能について以下に説明する。まず、秘匿加算撹乱（結果取得）部１１２０の機能について説明する。
【００５１】
秘匿加算撹乱（結果取得）部１１２０は図５に示すよう繰り返し回数初期化部１１２１、変数設定（結果取得）部１１２２、切断ブロック作成部１１２３、秘匿ベクトル内積計算（結果取得）部１１２４、繰り返し回数判定部１１２５をもつ。
【００５２】
制御部１１００より「秘匿加算撹乱（結果取得）開始通知」を受け取った秘匿加算撹乱（結果取得）部１１２０の繰り返し回数初期部１１２１は繰り返し変数ｌｏｏｐの値を初期化し、段数変数の値での繰り返し回数上限を記憶部１３００より読み出し、指定繰り返し回数変数ｌｏｏｐ-ｆｉｎａｌに設定する。
【００５３】
変数設定（結果取得）部１１２２は記憶部１３００より段数変数の段数、繰り返し変数ｌｏｏｐの変数で用いる加算対象秘密デ-タ名、主暗号鍵を読み出し、さらに記憶部１３００より加算対象秘密デ-タ名をもつ秘密デ-タを読み出し、加算対象秘密デ-タ変数Ｘと主暗号鍵変数ｋｅｙＢに設定する。
【００５４】
切断ブロック作成部１１２３は「ビット列撹乱処理」を担当している他の機関のデ-タ処理装置より切断ブロック数とブロック切断点順列という撹乱デ-タの一部を受信し、受信した切断ブロック数Ｎと切断点順列ｒ＝（ｒ１、ｒ２、…、ｒＮ-１）に従って、加算対象秘密デ-タ変数Ｘの内容をＮ個のブロックに分割する。
【００５５】
秘匿内積計算（結果取得）部１１２４は切断ブロック作成部１１２３にて作成したＮ個のブロック列（Ｘ１，Ｘ２,…,ＸＮ）と「ビット列撹乱処理」を担当している他の機関のデ-タ処理装置の撹乱デ-タが一部であるＮ個のシフト系列の列（Ｙ１，Ｙ２,…, ＹＮ）をベクトル次数ｎ（＝Ｎ）の２つのベクトルとみなし、内積を取った後に撹乱デ-タの一部である撹乱乗数という値を加算した値をブロック列Ｘ＝（Ｘ１、Ｘ２、…,ＸＮ）の情報を相手に知られることなく計算する。計算の途中において主暗号鍵ｋｅｙＢで暗号化された暗号文である暗号化秘匿ベクトル内積結果を他の機関より受信し、主暗号鍵ｋｅｙＢ、または主暗号鍵に対応する復号鍵で暗号化秘匿ベクトル内積結果を復号し、得られた結果をベクトル内積結果変数Ｎｅｗ-ＸＹに設定する。
【００５６】
以上、秘匿加算撹乱（結果取得）部１１２０の機能について説明したが、次に、秘匿加算撹乱（加算）部１１８０の機能について説明する。
【００５７】
秘匿加算撹乱（加算）部１１８０は図６に示すよう繰り返し回数初期化部１１８１、変数設定（加算）部１１８２、ブロックシフト係数作成部１１８３、秘匿ベクトル内積計算（加算）部１１８４、繰り返し回数判定部１１８５をもつ。
【００５８】
繰り返し回数初期化部１１８１は関数評価処理を担当するデ-タ処理装置１０００の秘匿加算撹乱（結果取得）部１１２０の繰り返し回数初期化部１１２１と同じ機能をもつ。
【００５９】
変数設定（加算）部１１８２は段数変数Ｒａｎｋの値と繰り返し回数変数ｌｏｏｐの値で用いるデ-タ名、主暗号鍵を記憶部１３００から読み出し、読み出したデ-タ名をもつデ-タを加算対象秘密デ-タ変数Ｙと撹乱デ-タ変数Ｍｉｘ-ｄａｔａに設定し、読み出した主暗号鍵を主暗号鍵変数ＫｅｙＡに設定する。
【００６０】
ブロックシフト係数設定部１１８３は撹乱デ-タ変数Ｍｉｘ-ｄａｔａの一部を通信部１２００を通じて送信し、加算対象秘密デ-タ変数Ｙの内容を撹乱デ-タ変数Ｍｉｘ-ｄａｔａの内容に応じて撹乱し、スカラ-定数変数Ｌに設定し、撹乱デ-タ変数Ｍｉｘ-ｄａｔａの一部をブロックシフト係数順列変数Ｓに設定し、それら順列の全ての要素を整数化できる倍数ｋを求めブロックシフト係数順列Ｓの各要素に倍数ｋを乗じることで内積対象ベクトル変数Ｙ＝（Ｙ１，Ｙ２、…,ＹＮ）にベクトルを設定し、倍数ｋをスカラ-除数変数Ｋに設定する。
【００６１】
秘匿ベクトル内積計算（加算）部１１８４は、内積対象ベクトル変数Ｙと他の機関のもつ内政対象ベクトル変数Ｘの内積にスカラ-除数変数Ｋの値を除算し、かつ、スカラ-定数変数Ｌの値を加算した値を計算するため、相手機関のもつデ-タ処理装置１０００の秘匿ベクトル内積計算（結果取得）部１１２４と協調し、主暗号鍵ｋｅｙＡで暗号化した内積対象ベクトルを作成し、通信部１２００を介して相手機関に送信し、相手機関より暗号化内積対象ベクトルと内積対象ベクトルＸとの各ベクトル位置でベクトル要素どうしを乗算し、得られた結果を相手機関の所有する主暗号鍵で暗号化することで作成された二重暗号化内積対象乗算結果ベクトルを受信し、二重暗号化内積対象乗算結果ベクトルの各要素を主暗号鍵ｋｅｙＡ、またはｋｅｙＡに対応する復号鍵で復号した後、得られた結果を加算することで暗号化秘匿ベクトル内積結果を作成し、暗号化秘匿ベクトル内積結果を他の機関のデ-タ処理装置１０００へ送信する。
【００６２】
また、繰り返し回数判定部１１８５は関数評価処理を担当するデ-タ処理装置１０００の繰り返し回数判定部１１２５と同じ機能を有する。
【００６３】
制御部１１００の機能について説明したが、次にデ-タ処理装置１０００で実行される「関数評価処理」と「ビット列撹乱処理」について説明する。機関Ｐ１に設置された１台のデ-タ処理装置１０００は「関数評価処理」を、機関Ｐ２に設置された１台のデ-タ処理装置１０００は「ビット列撹乱処理」を互いに協力しながら実行することで秘匿したい入力情報を相手機関に知られることなく関数適用後の解のみを互いに知る。
【００６４】
制御部１１００の機能について説明したが、次にデ-タ処理装置１０００で実行される「関数評価処理」と「ビット列撹乱処理」について説明する。機関Ｐ１に設置された１台のデ-タ処理装置１０００は「関数評価処理」を、機関Ｐ２に設置された１台のデ-タ処理装置１０００は「ビット列撹乱処理」を互いに協力しながら実行することで秘匿したい入力情報を相手機関に知られることなく関数適用後の解のみを互いに知る。
【００６５】
制御部１１００は操作部１４００から「関数評価開始通知」または「ビット列撹乱開始通知」を受信すると図９に示す「関数評価処理」または「ビット列撹乱処理」を開始する。この「関数評価処理」は大きく７つのステップで構成される。また、「ビット列撹乱処理」は大きく５つのステップで構成される。以下、図７、図８の処理概略図を参照しながら「関数評価処理」、「ビット列撹乱処理」の概要について説明する。なお以下に説明する各ステップの内容は「関数評価処理」に関しては、機関Ｐ１のデ-タ処理装置１０００で、「ビット列撹乱処理」に関しては、機関Ｐ２のデ-タ処理装置１０００でそれぞれ実行される。まず、機関Ｐ１で実行される「関数評価処理」について説明する。
【００６６】
最初にステップＳ１００の段数初期化処理について説明する。制御部１１００は段数変数Ｒａｎｋを初期化する。ここではＲａｎｋ＝１とする。
【００６７】
次に、ステップＳ２００の秘匿加算撹乱（結果取得）処理について説明する。制御部１１００は自己の「住民リストＸ」を記憶部１３００より読み出し加算対象秘密デ-タ変数Ｘに設定し、相手機関の「住民リストＹ」を２つの整数ビット列と見なしたとき、ビット位置をそろえた上で撹乱させ、さらに、同じビット位置に追加ビットを挿入し作成された２つのビット列の加算結果の暗号文である暗号化撹乱加算結果を取得し、自己の主暗号鍵ｋｅｙＢもしくはｋｅｙＢに対応する復号鍵で復号することにより得られた結果を加算結果ビット配列変数Ｒｅｓｕｌｔ-ｏｒｄに設定する。
【００６８】
ここで１つ疑問が生じる。暗号化撹乱加算結果を得るためには相手機関の「住民リストＹ」と自己の「住民リストＸ」に対してビット位置の撹乱、追加ビットの挿入などを相手機関が実行する必要があるなら、その際に、自身の「住民リストＸ」が相手機関に知られてしまうのではないかという疑問である。しかしながら、本実施の形態では暗号化したまま、ビット位置の移動、挿入ビットの挿入、加算などを有限体で四則演算を行うことができるという暗号の性質を利用した新しい暗号プロトコルにより、自身のリストを相手に知られることなく、撹乱加算ビット列の暗号文を取得することが可能となっている。その具体的方法は後で詳しく述べる。
【００６９】
次にステップＳ４００の加算前ビット列あいまい推測処理について説明する。制御部１１００は秘匿加算撹乱処理の適用後、撹乱加算ビット列を得る。この撹乱加算ビット列Ｒｅｓｕｌｔ-ｏｒｄから加算前の２つのビット列をあいまいに復元し、復元した結果を推測結果ビット配列変数１Ｃｏｎ-Ｏｒｉｇｉｎａｌ１と推測結果ビット配列変数２Ｃｏｎ-Ｏｒｉｇｉｎａｌ２に設定する。ここでも、加算結果ｚを得る加算前の２つの入力の組合せ（ｘ、ｙ）、つまり、ｚ＝ｘ＋ｙを満たすｘ、ｙの組み合わせはビット列の値域の大きさに等しい数ほど存在することより、どのようにｘ、ｙを復元するのかという疑問が生じる。しかしながら、本実施の形態では、逆順ビット列という加算前のビット列の最上位ビットから最下位ビットに並んでいたビット列を最下位ビットから最上位ビットに並び替えたビット列についての撹乱加算ビット列Ｒｅｓｕｌｔ-ｒｅｖも利用することで、元のビット列ｘ、ｙをビットごとの正確な可換性二項論理演算適用結果を得ることができる程度に復元する。その具体的な方法は後で詳しく述べる。
【００７０】
次にステップＳ５００の論理演算処理について説明する。制御部１１００はあいまい推測したＣｏｎ-Ｏｒｉｇｉｎａｌ１、Ｃｏｎ-Ｏｒｉｇｉｎａｌ２に格納された２つのビット列に対して、各ビット位置で論理和、論理積、排他的論理和、等価等の可換性二項論理演算を適用し、結果ビット列を論理演算ビット列変数Ａｒｉｔｈ-Ｒｅｓｕｌｔに設定し、論理演算結果ビット列変数Ａｒｉｔｈ-Ｒｅｓｌｔの内容を段数Ｒａｎｋの演算結果として記憶部１３００に記録する。
【００７１】
次にステップＳ６００の反復回数判定処理について説明する。制御部１１００は段数変数Ｒａｎｋの値と記憶部１３００に格納されている指定段数Ｒａｎｋ-ｆｉｎａｌの値を比較し、Ｒａｎｋ＝Ｒａｎｋ-ｆｉｎａｌならステップＳ７００へ進む。そうでなければ、段数変数Ｒａｎｋの値に１を加算し、制御をステップＳ２００へ戻す。
【００７２】
さらに、ステップＳ７００の最終交換デ-タ作成処理について説明する。制御部１１００は記憶部１３００に記録された最終交換デ-タ作成手続きとその入力として指定されている秘密デ-タＦｉｎａｌ-Ｓｅｃｒｅｔを読み出し、最終交換デ-タ作成手続きを読み出した秘密デ-タに適用することで結果を算出し、得られた結果を最終交換デ-タ変数Ｅｘ-ｄａｔａに設定する。
【００７３】
最後に、ステップＳ８００の最終結果取得処理では、ビット列撹乱処理担当の相手機関と最終交換デ-タ変数Ｅｘ-ｄａｔａに設定されている値を通信部１２００を介して交換し、記憶部１３００に記録されている最終結果算出手続きに最終交換デ-タ変数Ｅｘ-Ｄａｔaに設定されている値と受信した相手機関の最終交換デ-タの値を入力として最終結果算出手続きを実行し、計算結果を得る。
【００７４】
以上、関数評価処理について説明したが、次に、他方のデ-タ処理装置１０００で実行される「ビット列撹乱処理」について説明する。機関Ｐ２に設置された１台のデ-タ処理装置１０００が機関Ｐ１のデ-タ処理装置１０００上で実行される「関数評価処理」と協力して「ビット列撹乱処理」を実行することによって、秘匿関数計算を行うことができる。
【００７５】
制御部１１００は操作部１４００から「ビット列撹乱開始通知」を受信すると図１０に示す「ビット列撹乱処理」を開始する。この「ビット列撹乱処理」は大きく５つのステップで構成される。以下、図１０のフロ-チャ-トを参照しながら「ビット列撹乱処理」について説明する。
【００７６】
最初にステップＳ１００の段数初期化処理は「関数評価処理」を担当するデ-タ処理装置で実行される段数初期化処理と同様に段数変数Ｒａｎｋを初期化する。
【００７７】
次にステップＳ２００の秘匿加算撹乱（加算）処理について説明する。制御部１１００は自己の「担当住民リスト」をビット列表現した担当住民ビット列Ｙと相手機関のもつ担当住民ビット列Ｘを複数のビットに対してビットごとに同じように機関Ｐ２が定めるビット位置に移動、また、同じ位置にそれぞれ機関Ｐ２が定めるビット列を挿入した後、でき上がった２つのビット列の加算結果と等しい値を機関Ｐ１の暗号鍵で暗号化した暗号化撹乱加算結果を生成し、機関Ｐ１に送信する。
【００７８】
ここでも疑問が生じる。暗号文である暗号化撹乱加算結果を生成するためには、どのような位置に各ビットを移動させたが、自己の住民リストビット列、挿入ビット列などの情報を相手機関に知らせ相手機関の主暗号鍵で暗号化してもらう必要があり、それらの情報を組み合わせることで相手機関が自己の住民リストビット列Ｙに関する情報を得ることができるのではないかという疑問である。しかしながら、本実施の形態では有限体で四則演算を行うことができるという暗号の性質を利用し暗号化したまま加算と乗算を組み合わせて実施する新しい暗号プロトコルを実行することにより、自身の住民リストＹの情報、撹乱のために実行したビット操作情報を相手機関に知られることなく、暗号化撹乱結果を生成することが可能となる。その具体的方法は後で詳しく述べる。
【００７９】
次に、ステップＳ６００の反復回数判定処理について説明する。制御部１１００は、関数評価処理での反復回数判定処理と同様に、現在の反復回数と記憶部１３００に記録されている指定反復回数とを比較し、現在の反復回数と指定反復回数が同じならステップＳ７００へ制御を移動し、そうでなければ、ステップＳ２０００へ制御を移動する。
【００８０】
最後に、ステップＳ６００の段数判定処理、ステップＳ７００の最終交換デ-タ作成処理、ステップＳ８００の最終結果算出処理について説明する。これらの処理は、関数評価処理を担当するデ-タ処理装置１０００で実行される段数判定処理、最終交換デ-タ作成処理、最終結果算出処理とほぼ同じである。ただ最終交換デ-タ作成処理のみ最終交換デ-タ作成手続きの入力として、記憶部１３００に格納されている撹乱デ-タを秘密デ-タとして利用することができる点のみ異なる。
【００８１】
以上、関数評価処理、ビット列撹乱処理について説明したが、次に関数評価処理、ビット撹乱処理について詳細に説明する。最初に、関数評価処理のステップＳ１００と撹乱ビット列取得処理のステップＳ１００の「段数初期化処理」について説明する。次に、関数評価処理のステップＳ２００の「秘匿加算撹乱（結果取得）処理」とビット列撹乱処理ステップＳ２００の「秘匿加算撹乱（加算）処理」について詳細に説明した後、関数評価処理のステップＳ４００の「加算前ビット列あいまい推測処理」、ステップＳ５００の「論理演算適用処理」について詳細に説明した後、関数評価処理とビット列撹乱処理のステップＳ６００の「段数判定処理」、ステップＳ７００の「最終交換デ-タ作成処理」、ステップＳ８００の「最終結果算出処理」について説明する。
【００８２】
最初に、ステップＳ１００の「段数初期化処理」について説明する。ステップＳ１００は図１１の「段数初期化処理」のフロ-チャ-トを参照して「段数初期化処理」について説明する。なお、段数初期化処理は段数初期化部１１１０で実行される。
【００８３】
段数初期化部１１１０は段数初期化値と段数初期値と指定段数を記憶部１３００から読み出し、段数変数初期値を段数変数Ｒａｎｋに指定段数を指定段数変数Ｒａｎｋ-ｆｉｎａｌに設定する。以上の段数初期化処理が完了すると、関数評価処理を担当しているデ-タ処理装置１０００の制御部１１００は図９のフロ-に戻り、ステップＳ２００の秘匿加算撹乱（結果取得）処理を開始する。秘匿加算撹乱（結果取得）処理は秘匿加算撹乱（結果取得）部１１２０で実行される。また、ビット列撹乱処理を担当しているデ-タ処理装置１０００の制御部１１００は図１０のフロ-に戻り、ステップＳ２００の秘匿加算撹乱（加算）処理を開始する。秘匿加算撹乱（加算）処理は秘匿加算撹乱（加算）部１１８０で実行される。なお、図１０での関数評価処理でのステップＳ２００とビット列撹乱処理でのステップＳ２００は図１２の「秘匿加算撹乱（結果取得）処理」と「秘匿加算撹乱（加算）処理」にそれぞれ対応している。以下、図１２のフロ-チャ-トを参照して「秘匿加算撹乱（結果取得）処理」と「秘匿加算撹乱（加算）処理」について説明する。
【００８４】
秘匿加算撹乱（結果取得）部１１２０および秘匿加算撹乱（加算）部１１８０はステップＳ２１０で現在の段数Ｒａｎｋでの繰り返し回数の初期値を記憶部１３００より読み出し、繰り返し変数ｌｏｏｐの値を初期化する。繰り返し回数初期化処理を実行する。
【００８５】
次に、秘匿加算撹乱（結果取得）部１１２０はステップＳ２２０で現在のＲａｎｋと現在の繰り返しｌｏｏｐでの加算対象となる秘密デ-タを記憶部１３００より読み出し加算対象秘密デ-タ変数Ｘに設定する。変数設定（結果取得）処理を実行する。
【００８６】
一方、秘匿加算撹乱（加算）部１１８０はステップＳ２２０で現在の段数Ｒａｎｋと現在の繰り返し回数ｌｏｏｐでの加算対象となる秘密デ-タ、および、撹乱デ-タを記憶部１３００より読み出し、加算対象秘密デ-タ変数Ｙと撹乱デ-タ変数Ｍｉｘ-ｄａｔaに設定する変数設定（加算）処理を実行する。
【００８７】
次に秘匿加算撹乱（結果取得）部１１２０はステップＳ２３０で加算対象秘密デ-タ変数Ｘの内容を相手機関より送信される切断ブロック数Ｎとブロック切断点順列ｒ＝（ｒ１、ｒ２、…,ｒＮ-１）に従ってＮ個のブロックに切断し、結果をＮ次の内積対象ベクトル変数Ｘ＝（Ｘ１、Ｘ２、…,ＸＮ）に設定する切断ブロック作成処理を実行する。
【００８８】
一方、秘匿加算撹乱（加算）部１１８０はステップＳ２３０で、撹乱デ-タ変数Ｍｉｘ-ｄａｔaのデ-タより、切断ブロック数、切断点順列、ブロックシフト係数順列、撹乱挿入値を読み出し、それぞれを切断ブロック変数Ｎ、ブロック切断点順列変数ｒ＝（ｒ１、ｒ２、…,ｒＮ-１）、ブロックシフト係数順列変数Ｓ＝（ｓ１、ｓ２、…、ｓＮ）、撹乱挿入加算値変数Ｖに設定し、切断ブロック変数Ｎとブロック変数順列ｒを相手機関に送信する。さらに、自己の加算対象秘密デ-タ変数Ｙの内容をブロックシフト係数順列ｒに従って、Ｎ個のブロックに切断した後、撹乱挿入加算値変数Ｖの値を加算した結果をスカラ-定数変数Ｌに設定し、ブロックシフト係数順列の各要素を整数化できる乗数を求め、その乗数をブロックシフト係数の各要素に乗算し得られた結果を内積対象ベクトル変数Ｙ＝（ｙ１、ｙ２、…,ｙＮ）に設定し、
スカラ-除数変数Ｋに乗数とベクトル次数変数ｎにＮの値を設定するブロックシフト係数設定処理を実行する。
【００８９】
次に秘匿加算撹乱（結果取得）部１１２０はステップＳ３００で内積対象ベクトル変数Ｘに設定されているｎ次のベクトルの内積結果に相手機関のスカラ-乗数変数Ｋに設定されている値を除算し、その後、相手機関のスカラ-除数変数Ｋに設定されている値を除算し、その後、相手機関のスカラ-定数変数Ｌに設定されている値を加算した結果を自己のもつ主暗鍵ｋｅｙＢで暗号化したときに得られる暗号文を暗号化内積結果Ｆとして取得し、自己のもつ主暗号鍵ｋｅｙBもしくはｋｅｙＢに対応する復号鍵で復号し、ベクトル内積結果変数Ｎｅｗ-ＸＹに設定する秘匿ベクトル内積計算（結果取得）処理を実行する。
【００９０】
一方、秘匿加算撹乱（加算）部１１８０はステップＳ３００で相手機関がもつ内積対象ベクトル変数Ｘに設定されているｎ次のベクトルと自己のもつ内積対象ベクトル変数Ｙに設定されているｎ次のベクトルの内積結果Σ１≦ｉ≦ｎｘｉｙｉに自己のもつスカラ-除数変数ｋに設定されている値を除算し、その後、自己のもつスカラ-定数変数Ｌに設定されている値を加算した結果（１／Ｋ）・Σ１≦ｉ≦ｎｘｉｙｉ＋Ｌを相手機関のもつ主暗号鍵ｋｅｙＢで暗号化したときに得られる暗号文を作成し暗号化内積結果変数Ｆに設定し、Ｆの内容を相手機関に送信する秘匿ベクトル内積計算（加算）処理を実行する。
【００９１】
ここで、複数のビット列に対して、暗号化したまま四則演算を実行するため暗号化に利用できる鍵が制限され、互いの情報が漏洩してしまう可能性があるのではないかという疑問が生じる。しかしながら、本実施の形態では、複数の演算を一度に暗号に利用し、複数の鍵を使用する新しい暗号プロトコルにより、各ブロックの情報を相手に知られることなく、撹乱切断ビット列の暗号文を作成することができる。
【００９２】
最後に、秘匿加算撹乱（結果取得）部１１２０はステップＳ３５０で繰り返し回数変数Ｌｏｏｐの値が指定繰り返し回数変数ｌｏｏｐ-ｆｉｎａｌの値と等しいかどうかを判定し、等しければ繰り返しで得られた内積結果のうちの一部を加算結果ビット配列変数Ｒｅｓｕｌｔ-ｏｒｄに設定し、制御を制御部１１００に戻し、ｌｏｏｐ≠ｌｏｏｐ-Ｆｉｎａｌの場合には繰り返し回数変数ｌｏｏｐの値に１を加算し、制御をステップＳ２００に戻し、繰り返し回数判定（結果取得）処理を実行する。
【００９３】
一方、秘匿加算撹乱（加算）部１１８０はステップＳ３５０で繰り返し回数変数ｌｏｏｐの値が指定繰り返し回数変数ｌｏｏｐの値が指定繰り返し回数変数ｌｏｏｐ-ｆｉｎａｌの値と等しいかどうかを判定し、等しければ制御を制御部１１００へ戻し、等しくなければ、制御をステップＳ２００へ戻す繰り返し回数判定（加算）処理を実行する。
【００９４】
以上、関数評価処理、ビット列撹乱処理について詳細に説明したが、さらに詳細に関数評価処理、ビット列撹乱処理について説明する。関数評価処理およびビット列撹乱処理のＳ１００は図１３の「段数初期化処理」に対応している。以下、図１３のフロ-チャ-トを参照して「段数初期化処理」について説明する。なお、段数初期化処理は段数初期化部１１１０で実行される。
【００９５】
段数初期化部１１１０は段数初期値と指定段数を記憶部１３００から読み出す（ステップＳ１０１）。
【００９６】
次に、段数初期化部１１１０は段数初期値を段数変数Ｒａｎｋに、指定段数を指定段数変数Ｒａｎｋ-ｆｉｎａｌに設定する（ステップＳ１０２）。段数変数の初期化が終了すると制御部１１００は図１０のフロ-に戻りＳ２００の秘匿加算撹乱（結果取得）処理または秘匿加算撹乱（加算）処理のどちらかを開始する。秘匿加算撹乱（結果取得）処理は秘匿加算撹乱（結果取得）部１１２０で秘匿加算撹乱（加算）処理は秘匿加算撹乱（加算）部１１８０で実行される。以下、図１２のフロ-チャ-トを参照して「秘匿加算撹乱（結果取得）処理」と「秘匿加算撹乱（加算）処理」について説明する。
【００９７】
秘匿加算撹乱（結果取得）部１１２０および秘匿加算撹乱（加算）部１１８０はステップＳ２１０の「繰り返し回数初期化処理」を実行する。繰り返し回数初期化処理Ｓ２１０は図１３の「繰り返し初期化処理」に対応している以下、図１３のフロ-チャ-トを参照して「繰り返し初期化処理」について説明する。なお、繰り返し初期化処理は秘匿加算撹乱（結果取得）部１１２０の場合は繰り返し回数初期化部１１２１が、秘匿加算撹乱（加算）部１１８０の場合は繰り返し回数初期化部１１８１が実行する。
【００９８】
秘匿加算撹乱（結果取得）部１１２０の繰り返し初期化部１１２１および秘匿加算撹乱（加算）部１１８０の繰り返し初期化部１１８１は段数Ｒａｎｋでの繰り返し回数初期値、指定繰り返し回数を記憶部１３００から読み出す（ステップＳ２１１）。
【００９９】
繰り返し回数初期化が終了したら、制御は秘匿加算撹乱（結果取得）部１１２０または秘匿加算撹乱（加算）部１１８０に戻される。秘匿加算撹乱（結果取得）部１１２０および秘匿加算撹乱（加算）部１１８０は図１１のフロ-に戻り、ステップＳ２２０の変数設定（結果取得）処理、変数設定（加算）処理をそれぞれ実行する。
【０１００】
ステップＳ２２０はそれぞれ図１４の変数設定（結果取得）処理および変数設定（加算）処理に対応している。以下、図１４のフロ-チャ-トを参照して変数設定（結果取得）処理、変数設定（加算）処理を説明する。
【０１０１】
変数設定（結果取得）部１１２２は段数Ｒａｎｋ、繰り返し回数Ｌｏｏｐで用いるデ-タの名前である加算対象秘密デ-タ名ｔａｒｇｅｔ-ｄａｔａ-ｎａｍｅ，主記憶鍵ｋｅｙＢを記憶部１３００から読み出す（ステップＳ２２１）.
【０１０２】
次に変数設定（結果取得）部１１２２は加算対象秘密デ-タ名ｔａｒｇｅｔ-ｄａｔａ-ｎａｍｅをもつデ-タを記憶部１３００から読み出し、加算対象秘密デ-タ変数Ｘに設定する（ステップＳ２２２）。
【０１０３】
最後に変数設定（結果取得）部１１２２は主暗号鍵変数ｋｅｙＢに読み出した暗号鍵ｋｅｙを設定する（ステップＳ２２３）。以上により、変数設定（結果取得）処理を完了する。
【０１０４】
変数設定（加算）部１１８２は段数Ｒａｎｋ、繰り返し回数ｌｏｏｐで用いるデ-タの名前である加算対象秘密デ-タ名ｔａｒｇｅｔ-ｄａｔａ-ｎａｍｅ、撹乱デ-タ名ｍｉｘ-ｄａｔａ-ｎａｍｅ、主暗号鍵ｋｅｙを記憶部１３００から読み出す（ステップＳ２２１）。
【０１０５】
次に変数設定（加算）部１１８２は、加算対象秘密デ-タ名ｔａｒｇｅｔ-ｄａｔａ-ｎａｍｅをもつデ-タと撹乱デ-タ名ｍｉｘ-ｄａｔａ-ｎａｍｅをもつデ-タを記憶部１３００から読み出し、加算対象秘密デ-タ変数Ｙと撹乱デ-タ変数ｍｉｘ-ｄａｔａ、それぞれに設定する（ステップＳ２３１）。
【０１０６】
最後に変数設定（加算）部１１８２は、主暗号鍵変数ｋｅｙＡに読み出した暗号鍵ｋｅｙを設定する（ステップＳ２１３）。以上により変数設定（加算）処理が完了する。
【０１０７】
変数設定（結果取得）処理が完了したら秘匿加算撹乱（結果取得）部１１２０は図１２のフロ-に戻り、ステップＳ２３０の「切断ブロック作成処理」を実行する。ステップＳ２３０の図１５の切断ブロック作成処理に対応する。以下では図１５のフロ-チャ-トを用い「切断ブロック作成処理」を説明する。切断ブロック作成処理は切断ブロック作成部１１２３で実行する。
【０１０８】
同様に変数設定（加算）処理が完了したら秘匿加算撹乱（加算）部１１８０は図１２のフロ-に戻り、ステップＳ２３０の「ブロックシフト係数設定処理」を実行する。ステップＳ２３０は図１５の「ブロックシフト係数設定処理」に対応する。以下では図１５のフロ-チャ-トを用いブロックシフト係数設定処理を説明する。ブロックシフト係数設定処理はブロックシフト係数設定部１１８３が実行する。
【０１０９】
ブロックシフト係数設定部１１８３は撹乱デ-タ変数Ｍｉｘ-ｄａｔａに設定されている撹乱デ-タより切断ブロック数、切断点順列、ブロックシフト係数順列、撹乱挿入加算値を読み出し、切断ブロック変数Ｎ、ブロック切断点順列変数ｒ＝（ｒ１，ｒ２，．．．，ｒＮ-１）、ブロックシフト係数順列変数Ｓ＝（ｓ１，ｓ２，．．．，ｓＮ）、撹乱挿入加算値変数Ｖにそれぞれ設定する（ステップＳ２３１）。
【０１１０】
次に、ブロックシフト係数設定部１１８３は切断ブロック変数Ｎとブロック切断点順列変数ｒの内容を通信部１４００を介して相手機関に送信する（ステップＳ２３２）。
【０１１１】
次に、ブロックシフト係数設定部１１８３はブロック切断点順列変数ｒの内容に従って、加算対象秘密デ-タ変数Ｙの内容をＮ個のブロックに切断し、切断ブロック列を作成する（ステップＳ２３３）。
【０１１２】
ブロックシフト係数設定部１１８３は切断ブロック列とブロックシフト係数順列Ｓの内積を計算し、切断ブロックシフト後秘密デ-タを作成する（ステップＳ２３４）。
【０１１３】
その後、切断ブロックシフト後秘密デ-タと撹乱挿入加算値変数Ｖの値を加算し、撹乱後加算対象秘密デ-タを作成しスカラ-定数変数Ｌに設定する（ステップＳ２３５）。
【０１１４】
次に切断ブロック変数Ｎの値をベクトル次数変数ｎに設定し（ステップＳ２３６）、さらにブロックシフト係数順列の要素のどれかが整数でない場合、全ての要素を整数化できる乗数を求め、スカラ-除数変数Ｋに設定する（ステップＳ２３７）。
【０１１５】
最後にブロックシフト係数設定部１１８３はブロックシフト係数順列Ｓの各係数にスカラ-除数を乗じることで得られる順列を内積対象ベクトル変数Ｙ＝（ｙ１，ｙ２，．．．，ｙｎ）に設定する（ステップＳ２３８）。以上により、ブロックシフト係数設定処理は完了する。
【０１１６】
次に切断ブロック作成処理について説明する。まず、切断ブロック作成部１１２３は、切断ブロック数とブロック切断点順列を相手機関より受信する（ステップＳ２３３）。
【０１１７】
さらに、切断ブロック作成部１１２３は受信した切断ブロック数とブロック切断点順列を切断ブロック変数Ｎとブロック切断点順列変数ｒ＝（ｒ１，ｒ２，．．．，ｒＮ-１）に設定する（ステップＳ２３５）。
【０１１８】
次にブロック切断点順列変数ｒの内容に従って、加算対象秘密デ-タ変数Ｘの内容をＮ個のブロックに切断し、切断ブロック列を作成し（ステップＳ２３６）、作成した切断ブロック列を内積対象ベクトル変数Ｘ＝（ｘ１，ｘ２，．．．，ｘＮ）に設定する（ステップＳ２３７）。
【０１１９】
最後に、切断ブロック作成部１１２３は切断ブロック数変数Ｎの値をベクトル次数変数ｎに設定する（ステップＳ２３８）。以上により切断ブロック作成処理は完了する。
【０１２０】
ここで、ビット列切断位置をそのまま送信することにより、後にビット列をあいまいに復元したときに、相手機関がビット列切断位置情報を利用して、自己のビット列を予測できてしまうのではないかという疑問が生じる。しかしながら、本実施の形態では撹乱ビット列の挿入、および、撹乱後のビット列に対し、新しいプロトコルにより、ビット列撹乱処理を複数回適用することが可能となり、送信された切断位置が元のビット列ではその位置であるかという情報を推測不能にする。その具体的方法は後で詳しく述べる。
【０１２１】
切断ブロック作成処理が完了したら、秘匿加算撹乱（結果取得）部１１２０は図１２のフロ-に戻り、Ｓ３００の秘匿ベクトル内積結果（結果取得）処理を開始する。Ｓ３００は図１６の秘匿ベクトル内積結果（結果取得）処理に対応する。以下では図１６のフロ-チャ-トを用い秘匿ベクトル内積計算（結果取得）処理を説明する。秘匿ベクトル内積結果（結果取得）処理は秘匿ベクトル内積計算（結果取得）部１１２４が実行する。
【０１２２】
また、ブロックシフト係数作成処理が完了したら、秘匿加算撹乱（加算）部１１８０は図１２のフロ-に戻り、Ｓ３００の秘匿ベクトル内積計算（加算）処理を開始する。Ｓ３００は図１６の秘匿ベクトル内積計算（加算）処理に対応する。以下では図１６のフロ-チャ-トを用いて秘匿ベクトル内積計算（加算）処理を説明する。秘匿ベクトル内積計算（加算）処理は秘匿ベクトル内積計算（加算）部１１８４が実行する。
【０１２３】
秘匿ベクトル内積計算（加算）部１１８４はまず、ベクトル次数ｎと同じ個数の０以外の乱数の列で要素の総和がスカラ-定数変数Ｌの値とスカラ-除数変数Ｋの値を乗算した結果と等しくなるような列を作成し、定数ベクトルＬ＝（Ｌ１，Ｌ２，．．．，Ｌｎ）に設定する（ステップＳ３０１）。ここでΣ１≦ｉ≦ｎＬｉ＝Ｌ・Ｋを満たす。
【０１２４】
次に、ｎ個の副暗号鍵を記憶部１３００より読み出し副暗号鍵ベクトル（ｋｅｙＡ１，ｋｅｙＡ２，．．．，ｋｅｙＡｎ）を作成し、各ベクトル位置ｉ（１≦ｉ≦ｎ）において、副暗号鍵ベクトル（ｋｅｙＡ１，ｋｅｙＡ２，．．．，ｋｅｙＡｎ）のベクトル位置ｉの副暗号鍵ｋｅｙＡｉを用いて、内積対象ベクトル変数のベクトル位置ｉの要素ｙｉを暗号化し、暗号化内積対象ベクトルＣ１＝（Ｃ１１，Ｃ１２，．．．，Ｃ１ｎ）を作成する（ステップＳ３０２）。
【０１２５】
同様に秘匿ベクトル内積計算（加算）部１１８４は、各ベクトル位置ｉ（１≦ｉ≦ｎ）において、副暗号鍵ベクトルのベクトル位置ｉの副暗号鍵ｋｅｙＡｉを用いて、定数ベクトルＬのベクトル位置ｉの副暗号鍵ｋｅｙＡｉを用いて、定数ベクトルＬのベクトル位置ｉの要素Ｌｉを暗号化し、暗号化定数ベクトルＣ２＝（Ｃ２１，Ｃ２２，．．．，Ｃ２ｎ）を作成する（ステップＳ３０３）。
【０１２６】
次に秘匿ベクトル内積計算（加算）部１１８４は、暗号化内積対象ベクトルＣ１＝（Ｃ１１,Ｃ１２，．．．，Ｃ１ｎ）と暗号化定数ベクトルＣ２＝（Ｃ２１,Ｃ２２，．．．，Ｃ２ｎ）を相手機関に送信し、ステップＳ３１１へ進む（ステップＳ３０４）。
【０１２７】
秘匿ベクトル内積計算（結果取得）部１１２４は始めに、相手機関より次数ｎの暗号化内積対象ベクトルと暗号化定数ベクトルが送信されるのをまつ（ステップＳ３０５：Ｎｏ）。相手機関から暗号化内積対象ベクトルと暗号化定数ベクトルが送信されたら、ステップＳ３０６へ進む（ステップＳ３０６：Ｙｅｓ）。
【０１２８】
次に秘匿ベクトル内積計算（結果取得）部１１２４は受信した暗号化内積対象ベクトルと暗号化定数ベクトルを暗号化対象ベクトル変数Ｃ１と暗号化定数ベクトル変数Ｃ２に設定し（ステップＳ３０６）、各ベクトル位置（１≦ｉ≦ｎ）において、内積対象ベクトル変数Ｘ＝（Ｘ１，Ｘ２，．．．，Ｘｎ）のベクトル位置ｉの要素Ｘｉに暗号化内積対象ベクトル変数のベクトル位置ｉの要素Ｃｉを乗じた結果をベクトル位置ｉの要素とする乗算結果ベクトルを計算する（ステップＳ３０７）。
【０１２９】
さらに、秘匿ベクトル内積計算（結果取得）部１１２４は、各ベクトル位置ｉ（１≦ｉ≦ｎ）において、乗算結果ベクトルのベクトル位置ｉの要素Ｃｉｘｉと暗号化定数ベクトル変数のベクトル位置ｉの要素Ｃ２ｉを加算した結果をベクトル位置ｉの要素とする乗算加算結果ベクトルを計算する（ステップＳ３０８）。
【０１３０】
次に、主暗号鍵ｋｅｙＢにて各乗算加算結果ベクトルの要素を暗号化し二重暗号化内積対象乗算結果ベクトルＤ＝（Ｄ１，Ｄ２，．．．，Ｄｎ）に設定する（ステップＳ３０９）。
【０１３１】
そして、秘匿ベクトル内積計算（結果取得）部１１２４は次数ｎの二重暗号化内積対象乗算結果ベクトルＤを相手機関に送信し、ステップＳ３１６へ進む（ステップＳ３１０）。
【０１３２】
秘匿ベクトル内積計算（加算）部１１８４は二重暗号内積対象乗算結果ベクトルが相手機関より送信されるのをまつ（ステップＳ３１１：Ｎｏ）。二重暗号化内積対象乗算結果ベクトルが送信されたならステップＳ３１２へ進む（ステップＳ３１１：Ｙｅｓ）。
【０１３３】
次に、秘匿ベクトル内積計算（加算）部１１８４は二重暗号化内積対象乗算結果ベクトルを二重暗号化内積乗算結果ベクトル変数Ｄ＝（Ｄ１，Ｄ２，．．．，Ｄｎ）に設定する（ステップＳ３１２）。
【０１３４】
さらに各ベクトル位置ｉ（１≦ｉ≦ｎ）において、副暗号鍵ベクトル（ｋｅｙＡ１，ｋｅｙＡ２，．．．，ｋｅｙＡｎ）のベクトル位置ｉの副暗号鍵ベクトルｋｅｙＡｉもしくはｋｅｙＡｉに対応する復号鍵を用いて二重暗号化内積対象乗算結果ベクトルのベクトル位置ｉの要素Ｄｉを復号し、暗号化内積対象乗算結果ベクトルＥ＝（Ｅ１，Ｅ２，．．．，Ｅｎ）を作成する（ステップＳ３１３）。
【０１３５】
次に暗号化内積対象乗算結果ベクトルＥ＝（Ｅ１，Ｅ２，．．．，Ｅｎ）の全要素を加算し、結果を暗号化内積結果変数Ｆに設定し（ステップＳ３１４）、暗号化内積結果変数Ｆに設定し（ステップＳ３１４）、暗号化内積結果変数Ｆの暗号文を相手機関に送信する（ステップＳ３１５）。以上により、秘匿ベクトル内積計算（加算）処理は完了する。
【０１３６】
秘匿ベクトル内積計算（結果取得）部１１２４は相手機関より暗号化内積結果が送信されるのをまつ（ステップＳ３１６：Ｎｏ）。暗号化内積結果が送信されたらステップＳ３１７へ進む（ステップＳ３１６：Ｙｅｓ）。
【０１３７】
次に暗号化秘匿ベクトル内積結果変数Ｆの内容を主暗号鍵ｋｅｙＢもしくはｋｅｙＢに対応する復号鍵にて復号しベクトル内積結果変数Ｎｅｗ-ＸＹに設定する（ステップＳ３１７）。
【０１３８】
最後に、秘匿ベクトル内積計算（結果取得）部１１２４はベクトル内積結果変数Ｎｅｗ-ＸＹを結果秘密デ-タ名変数の内容の名前をもつ秘密デ-タとして記憶部１３００に記憶する（ステップＳ３１８）。以上により、秘匿ベクトル内積計算（結果取得）処理は完了する。
【０１３９】
秘匿ベクトル内積計算（結果取得）処理を完了した秘匿加算撹乱（結果取得）部１１２０は図１２のフロ-に戻りステップＳ３５０の繰り返し回数判定（結果取得）処理を実行する。繰り返し判定（結果取得）処理は図１７のフロ-チャ-トで示される処理である。以下では図１７のフロ-チャ-トを用い、繰り返し判定（結果取得）処理を説明する。繰り返し判定（結果取得）処理は繰り返し判定（結果取得）部１１２５で実行される。
【０１４０】
秘匿ベクトル内積計算（加算）処理を完了した秘匿加算撹乱（加算）部１１８０は図１２のフロ-に戻りステップＳ３５０の繰り返し判定（加算）処理を実行する。繰り返し判定（加算）処理は図１７のフロ-チャ-トで示される処理である。以下では、図１７のフロ-チャ-トを用い、繰り返し判定（加算）処理を説明する。繰り返し判定（加算）処理は繰り返し判定（加算）部１１８５で実行される。
【０１４１】
繰り返し回数判定（結果取得）部１１２５は現在の繰り返し回数変数ｌｏｏｐと指定繰り返し回数変数ｌｏｏｐ-ｆｉｎａｌの値が一致するかを判定し、一致しなければステップＳ３５１へ進む（ステップＳ３５１：Ｎｏ）。一致するならば、ステップＳ３５３へ進む（ステップＳ３５１：Ｙｅｓ）。
【０１４２】
判定が一致した場合、繰り返し回数判定（結果取得）部１１２５は、繰り返し回数変数ｌｏｏｐの値に１を加算し、戻り値Ｎｏとともに、制御を秘匿加算撹乱（加算）部１１２０へ返す（ステップＳ３５２）。
【０１４３】
判定が一致しなかった場合、繰り返し回数判定（結果取得）部１１２５は、段数Ｒａｎｋの値の段で加算結果（正順）ビット配列変数と加算結果（逆順）ビット配列変数に設定すべき秘密デ-タの名前を記憶部１３００より読み出し、それぞれ加算結果（正順）秘密デ-タ名と加算結果（逆順）秘密デ-タ名とする（ステップＳ３５３）。
【０１４４】
次に、繰り返し回数判定（結果取得）部１１２５は加算結果（正順）秘密デ-タ名をもつ秘密デ-タと加算結果（逆順）秘密デ-タ名をもつ秘密デ-タを記憶部１３００より読み出し、それぞれを加算結果（正順）ビット配列変数Ｒｅｓｕｌｔ-ｏｒｄと加算結果（逆順）ビット配列変数Ｒｅｓｕｌｔ-ｒｅｖに設定し、戻り値Ｙｅｓとともに制御を秘匿加算撹乱（加算）部１１２０へ返す（ステップＳ３５４）。
【０１４５】
繰り返し回数判定（加算）部１１８５は繰り返し回数変数ｌｏｏｐが指定繰り返し回数ｌｏｏｐ-ｆｉｎａｌと一致するかどうかを判定し、一致すれば戻り値Ｙｅｓとともに制御を秘匿加算撹乱（加算）部１１８０へ返す（ステップＳ３５１：Ｙｅｓ）。一致しなければ、ステップＳ３５２へ進む（ステップＳ３５１：Ｎｏ）。
【０１４６】
一致しなかった場合、現在の繰り返し回数変数ｌｏｏｐの値に１を加算し、戻り値Ｎｏとともに制御を秘匿加算撹乱（加算）部１１８０へ返す（ステップｓ３５２）。
【０１４７】
繰り返し回数判定（結果取得）部１１２５より戻り値を受け取った秘匿加算撹乱（結果取得）部１１２０は図Ｇのフロ-に戻り、その戻り値がＮｏだった場合にはステップＳ２２０へ進む（ステップＳ３５０：Ｎｏ）。戻り値がＹｅｓだった場合は制御を制御部１１００へ戻す（ステップＳ３５０：Ｙｅｓ）。
【０１４８】
同様に繰り返し回数判定（加算）部１１８５より戻り値を受け取った秘匿加算撹乱（加算）部１１８０は図１２のフロ-に戻り戻り値がＮｏだった場合には、ステップＳ２２０へ進み、秘匿加算撹乱処理を続ける（ステップＳ３５０：Ｎｏ）。戻り値がＹｅｓだった場合は、制御を制御部１１００へ戻す（ステップＳ３５０：Ｙｅｓ）。
【０１４９】
以上により秘匿加算撹乱（結果取得）処理と秘匿加算撹乱（加算）処理の詳細について説明した。機関Ｐ１のデ-タ処理装置１０００で秘匿加算撹乱（結果取得）処理と機関Ｐ２のデ-タ処理装置１０００で秘匿加算撹乱（加算）処理が協調して実行されることにより、機関Ｐ２の秘匿加算撹乱（加算）部１１８０は相手機関に知られることなくビット列を撹乱した上で互いのビット列を加算することができる。一方、機関Ｐ１の秘匿加算撹乱（結果取得）部１１２０では自己のビット列を相手に知らせることなく、相手機関のビット列と加算した結果に等しい撹乱加算ビット列を得ることができる。秘匿加算撹乱（結果取得）処理を完了した制御部１１００は図１０のフロ-に戻り、Ｓ４００の加算前ビット列あいまい推測処理を実行する。ビット列あいまい推測処理は図１８のフロ-チャ-トに示される。以下では図１８のフロ-チャ-トを用い説明する。ビット列あいまい推測処理はビット列あいまい推測部１１３０が実行する。
【０１５０】
ビット列あいまい推測部１１３０は加算結果（正順）ビット配列変数Ｒｅｓｕｌｔ-ｏｒｄに設定されている正順結果ビット列と加算結果（逆順）ビット配列変数Ｒｅｓｕｌｔ-ｒｅｖに設定されている逆順結果ビット列より加算前の撹乱ビット列Ｘ’,Ｙ’を推測する。つまり、Ｘ’＋Ｙ’の結果としてＲｅｓｕｌｔ-ｏｒｄを得た元々のＸ’とＹ’を推測する（ステップＳ４０１）。
【０１５１】
ここでも、加算結果がＲｅｓｕｌｔ-ｏｒｄとなる２つのビット列の組は加算前のビット列の長さをＭ’とすると２のＭ’ 乗の個ほど存在するし、この中からＸ’、Ｙ’を選ぶことは不可能ではないかという疑問が生じる。しかしながら、本実施形態では加算結果Ｒｅｓｕｌｔ-ｏｒｄを得た処理と同様な処理を適用して、Ｘ’を逆順にしたビット列Ｘ’’と、Ｙ’を逆順にしたビット列Ｙ’’（つまり、Ｘ’’[ｉ]=Ｘ’[Ｍ’-ｉ-１], Ｙ’’[ｉ]=Ｙ’[Ｍ’-ｉ-１], ０≦ｉ＜Ｍ’）の加算結果Ｒｅｓｕｌｔ ｒｅｖ（＝Ｘ’’＋Ｙ’’）を秘匿撹乱加算（結果取得）処理と秘匿撹乱加算（加算）処理を適用して計算し、機関Ｐ１は逆順結果ビット列Ｒｅｓｕｌｔ-ｒｅｖを取得することで、Ｘ’、Ｙ’の推測の範囲を格段に狭めることを可能とする。さらに推測を論理演算が正確に計算できる程度、つまり、２つの値の組み合わせだけを明確にし、どちらがＸ’側であるかは不明とする程度にとどめることによって、正確なビット情報を秘匿する。
【０１５２】
加算前ビット列あいまい推測部１１３０は撹乱加算ビット列Ｒｅｓｕｌｔ-ｏｒｄの１番目のビットをキャリ-ビットＣ-ｏｒｄ［０］を’０’とし、撹乱加算ビット列Ｒｅｓｕｌｔ-ｒｅｖのＭ’＋１番目のキャリ-ビットＣ-ｒｅｖ［Ｍ’］を撹乱加算結果ビット列Ｒｅｓｌｔ-ｒｅｖのＭ’＋１番目のビットＲｅｓｕｌｔ-ｒｅｖ［Ｍ’］とし、変数ｉに０を設定した上でＲｅｓｕｌｔ-ｏｒｄ[ｉ], Ｒｅｓｕｌｔ-ｒｅｖ[Ｍ-ｉ], Ｃ-ｏｒｄ［ｉ］, Ｃ-ｒｅｖ［Ｍ-ｉ］より、Ｃｏｎ-Ｏｒｉｇｉｎａｌ１[ｉ], Ｃｏｎ-Ｏｒｉｇｉｎａｌ[ｉ]をあいまいに推測し、次のビットのキャリ-Ｃ-ｏｒｄ［ｉ＋１］, Ｃ-ｒｅｖ［Ｍ-ｉ-１］を正確に推測するために記憶部１３００に記録している図２３の加算前ビット列あいまい推測表を用いる。
【０１５３】
図２３の加算前ビット列あいまい推測表は図２４に示す２つの表（ａ），（ｂ）を組み合わせることで作成できる。表（ａ）ではＲｅｓｕｌｔ-ｏｒｄ［ｉ］, Ｃ-ｏｒｄ［ｉ］の組合せより、Ｘ’’［ｉ］，Ｙ’’［ｉ］の順不同の組合せの候補を２つ以下に絞ることが可能であることがわかる。表（ｂ）でもＲｅｓｕｌｔ-ｒｅｖ［Ｍ’-ｉ］, Ｃ-ｏｒｄ［Ｍ’-ｉ］の組合せより、Ｘ’’［ｉ］，Ｙ’’［ｉ］の順不同の組合せの候補を２つ以下に絞ることが可能だとわかる。さらに、表（ａ）と表（ｂ）を組み合わせることにより、加算前の２つビットＸ’’［ｉ］とＹ’’[ｉ］の値の組合せを一意に絞り込むことができ，Ｘ’’の推測ビット列をＣ-Ｏｒｉｇｉｎａｌ１とＹ’’の推測ビット列をＣ-Ｏｒｉｇｉｎａｌ２と表現することで図２３の加算前ビット列あいまい推測表を作成することができる。図２３の表で示すように、Ｃ-Ｏｒｉｇｉｎａｌ１［ｉ］とＣ-Ｏｒｉｇｉｎａｌ２［ｉ］を一意に絞り込むことができることより、キャリ-ビットＣ-ｏｒｄ［ｉ＋１］，Ｃ-ｒｅｖ［Ｍ’-ｉ-１］も一意に決定することが可能となる。
【０１５４】
加算前ビット列あいまい推測部１１３０は次にビット位置ｉを１だけ増加させ、表より求めたＣ-ｏｒｄ［ｉ＋１］、Ｃ-ｒｅｖ［Ｍ’-ｉ-１］とＲｅｓｕｌｔ-ｏｒｄ［ｉ＋１］,Ｒｅｓｕｌｔ-ｒｅｖ［Ｍ’-ｉ-１］を新たな入力として、加算前ビット列あいまい推測表よりＣ-Ｏｒｉｇｉｎａｌ１［ｉ＋１］とＣ-Ｏｒｉｇｉｎａｌ２［ｉ＋１］の値の組合せ、キャリ-ビットＣ-ｏｒｄ［ｉ＋２］、Ｃ-ｒｅｖ［Ｍ’-ｉ-２］の値の算出を続ける。最終的に、ｉ＝Ｍ’となったときに、全てのビットの組合せを算出でき、制御を制御部１１００に戻す。図２３の加算前ビット列あいまい推測表を用いた加算前ビット列あいまい推測の概要を図２５に示す。図２５ではＲｅｓｕｌｔ-ｏｒｄ［ｉ］＝１、Ｒｅｓｕｌｔ-ｒｅｖ［Ｍ’-ｉ］＝０、Ｃ-ｏｒｄ［ｉ］＝１、Ｃ-ｏｒｄ［Ｍ’-ｉ］＝０である場合に、加算前ビット列あいまい推測表より、Ｃ-Ｏｒｉｇｉｎａｌ１［ｉ］とＣ-Ｏｒｉｇｉｎａｌ２［ｉ］の値の組合せ（０，０）、キャリ-ビットＣ-ｏｒｄ［ｉ＋１］＝０、Ｃ-ｒｅｖ［Ｍ’-ｉ-１］＝０を推測可能となる。推測したキャリ-ビットＣ-ｏｒｄ［ｉ＋１］＝０、Ｃ-ｒｅｖ［Ｍ’-ｉ-１］＝０とＲｅｓｕｌｔ-ｏｒｄ［ｉ＋１］,Ｒｅｓｕｌｔ-ｒｅｖ［Ｍ’-ｉ-１］の値より、以降のビットの推測を続ける。
【０１５５】
次に、ビット列あいまい推測部１１３０は推測された２つのビット列をあいまい推測結果ビット配列１変数Ｃｏｎ-Ｏｒｉｇｉｎａｌ１とあいまい推測結果ビット配列２変数Ｃｏｎ-Ｏｒｉｇｉｎａｌ２に設定する（ステップＳ４０２）。以上により、ビット列あいまい推測処理は完了する。
【０１５６】
ビット列あいまい推測処理を完了した制御部１１００は図１０のフロ-に戻りステップＳ５００の論理演算適用処理へ進む。論理演算適用処理は図１９のフロ-チャ-トに従う処理である。以上では、図１９のフロ-チャ-トを用いて論理演算適用処理を説明する。論理演算適用処理は、論理演算適用部１１４０で実行される。
【０１５７】
論理演算適用部１１４０は段数変数Ｒａｎｋの段数での指定論理演算型列と格納デ-タ名を記憶部１３００より読み出し、指定論理演算型配列変数ｌｏｇｉｃ-Ａｒｉｔｈと格納デ-タ名変数Ｆｉｌｅ-Ｎａｍｅにそれぞれを設定する（ステップＳ５０１）。
【０１５８】
次に論理演算適用部１１４０は指定論理演算型配列Ｌｏｇｉｃ-Ａｒｉｔｈの配列位置変数ｉを配列先頭とし、指定論理演算型配列Ｌｏｇｉｃ-Ａｒｉｔｈの配列位置変数ｊを配列先頭とする（ステップＳ５０２）。
【０１５９】
次に指定論理演算型配列Ｌｏｇｉｃ-Ａｒｉｔｈの配列位置ｉにおいて、指定論理演算型配列の内容Ｌｏｇｉｃ-Ａｒｉｔｈの配列位置ｉにおいて、指定論理演算型配列の内容Ｌｏｇｉｃ-Ａｒｉｔｈ［ｉ］である可換性論理演算を読み出しＯｐｅｒａｔｉｏｎとする（ステップＳ５０３）。
【０１６０】
あいまい推測ビット配列１変数Ｃｏｎ-Ｏｒｉｇｉｎａｌ１の各配列位置ｊに対して、Ｃｏｎ-Ｏｒｉｇｉｎａｌ１の配列位置ｊの内容Ｃｏｎ-Ｏｒｉｇｉｎａｌ１［ｊ］とあいまい推測ビット配列２変数Ｃｏｎ-Ｏｒｉｇｉｎａｌ２の配列位置ｊの内容Ｃｏｎ-Ｏｒｉｇｉｎａｌ２［ｊ］を読み出し、ビットＡとビットＢとする。ビットＡとビットＢに対してＯｐｅｒａｔｉｏｎの型の可換性論理演算を適用し、得られた結果を論理演算結果ビット配列変数Ａｒｉｔｈ-Ｒｅｓｕｌｔの配列位置ｊの要素Ａｒｉｔｈ-Ｒｅｓｕｌｔ［ｊ］として指定する（ステップＳ５０４）。
【０１６１】
さらに、論理演算適用部１１４０は論理演算結果ビット配列変数Ａｒｉｔｈ-Ｒｅｓｕｌｔの内容を格納デ-タ変数Ｆｉｌｅ-ｎａｍｅの名前をもつ秘密デ-タとして記憶部１３００に記憶する（ステップＳ５０５）。
【０１６２】
その後、配列位置ｉが指定論理演算型配列位置の最後か判定し、最後なら制御を制御部１１００へ戻す（ステップＳ５０６：Ｙｅｓ）。最後でないならば、ステップＳ５０７へ進む（ステップＳ５０６：Ｎｏ）。
【０１６３】
最後でない場合、配列位置変数ｉの位置を１つ後にずらすように更新し、格納デ-タ名変数Ｆｉｌｅ-Ｎａｍｅも更新し、ステップＳ５０３へ戻る（ステップＳ５０７）。
【０１６４】
論理演算適用処理を完了した制御部１１００は図１０のフロ-に戻り、ステップＳ６００の段数変数処理を実行する。段数判定処理は図２０のフロ-チャ-トに従う処理である。以下、図２０を用いて段数判定処理を説明する。段数判定処理は段数判定部１１５０で実行される。
【０１６５】
秘匿加算撹乱（加算）処理を完了した制御部１１００は図１０のフロ-に戻り、ステップＳ６００の段数判定処理を実行する。段数判定処理は図２０のフロ-チャ-トに従う処理であり、関数評価処理を実行する制御部１１００が実行する段数判定処理と同じである。段数判定処理は段数判定部１１５０で実行される。
【０１６６】
段数判定部１１５０は段数変数Ｒａｎｋの値が指定段数Ｒａｎｋ-ｆｉｎａｌに等しいかどうかを判定し、等しければ戻り値Ｙｅｓとともに制御を制御部１１００に戻す（ステップＳ６０１：Ｙｅｓ）。等しくなければ、ステップＳ６０２に進む（ステップＳ６０１：Ｎｏ）。等しくない場合、段数変数Ｒａｎｋの値を１だけ加算し、戻り値Ｎｏとともに制御を制御部１１００に戻す（ステップＳ６０２）。
【０１６７】
段数判定処理を完了した制御部１１００は図１０のフロ-に戻り、段数判定処理の戻り値がＹｅｓならステップＳ７００へ進む（ステップＳ６００：Ｙｅｓ）。戻り値がＮｏならステップＳ２００へ制御を戻し、関数評価処理を実行している制御部１１００は秘匿加算撹乱（結果取得）処理を、ビット列撹乱処理を実行している制御部１１００は秘匿加算撹乱（加算）処理を開始する（ステップＳ６００：Ｎｏ）。
【０１６８】
段数判定処理の戻り値がＹｅｓであった場合、制御部１１００はステップＳ７００の最終交換デ-タ作成処理を開始する。最終交換デ-タ作成処理は図２１のフロ-チャ-トで示される処理である。以下では図２１を用いて最終交換デ-タ作成処理を説明する。最終交換デ-タ作成処理は最終交換デ-タ作成部１１６０で実行される。
【０１６９】
最終交換デ-タ作成部１１６０は出力秘密デ-タ名と最終交換デ-タ作成手続きを記憶部１３００から読み出す（ステップＳ７０１）。次に出力秘密デ-タ変数Ｆｉｎａｌ-Ｓｅｃｒｅｔに設定する（ステップＳ７０２）。
【０１７０】
最後に、出力秘密デ-タＦｉｎａｌ-Ｓｅｃｒｅｔに最終交換デ-タ作成手続きを適用し、得られた結果を最終交換デ-タ変数Ｅｘ-ｄａｔａに設定する（ステップＳ７０３）。以上で最終交換デ-タ作成処理は完了する。
【０１７１】
最終交換デ-タ作成処理を完了した制御部１１００は図１０のフロ-に戻りステップＳ８００に進む。ステップＳ８００の図２２のフロ-チャ-トの最終結果算出処理に対応している。以下では図２２を用いて最終結果算出処理を説明する。最終結果算出処理は最終結果算出部１１７０で実行される。
【０１７２】
最終結果算出部１１７０は最終結果算出手続きを記憶部１３００より読み出し（ステップＳ８０１）、最終交換デ-タ変数Ｅｘ-ｄａｔａの値を相手機関に送信する（ステップＳ８０２）。
【０１７３】
次に、相手機関より最終交換デ-タが送信されるのをまつ（ステップＳ８０３：Ｎｏ）。最終交換デ-タが送信されたらステップＳ８０４に進む（ステップＳ８０３：Ｙｅｓ）。受信したデ-タを受信最終交換デ-タ変数Ｒｅｃ-ｄａｔａに設定する（ステップＳ８０５）。
【０１７４】
最後に最終結果算出部１１７０は最終交換デ-タ変数Ｅｘ-ｄａｔａの値と受信最終交換デ-タ変数Ｒｅｃ-ｄａｔａの値に対して最終結果算出手続きを適用し、計算結果Ｆｉｎａｌ-Ｒｅｓｕｌｔを算出し、計算結果Ｆｉｎａｌ-Ｒｅｓｕｌｔを戻り値として制御を制御部１１００に戻す（ステップＳ８０５）。
【０１７５】
最終結果算出処理を完了した制御部１１００は図１０のフロ-に戻りインタフェ-ス部１５００を介し、受け取った戻り値Ｆｉｎａｌ-Ｒｅｓｕｌｔを外部に出力し終了する。
【０１７６】
以上により、「関数評価処理」および「ビット列撹乱処理」の詳細について説明したが、「関数評価処理」、「ビット列撹乱処理」についてさらに図７、図８、図９の処理概略図を用いて詳しく説明する。２つの処理によって、どのように機関Ｐ１は自分の秘匿情報を守り、一方、機関Ｐ２がブロック置換などの撹乱に使う係数等の情報を使い撹乱加算結果を生成するのかについて詳細に説明する。
【０１７７】
秘匿加算撹乱（結果取得）処理と並行に機関Ｐ２の秘匿加算撹乱（加算）部１１８０にて実行される切断ブロックシフト係数処理では、まず、ビット列を切断し、複数ブロックを機関Ｐ１に作成してもらうため、記憶部に記録されている現在の繰り返し回数ｌｏｏｐ、現在の段数Ｒａｎｋでの撹乱デ-タより切断ブロック数Ｎ、切断点順列ｒ＝（ｒ１，ｒ２，…，ｒＮ-１）を読み出し、切断点数Ｎと切断点順列ｒを機関Ｐ１に送信する（図７（ａ））。
【０１７８】
機関Ｐ２より、切断点数Ｎと切断点順列ｒ=（ｒ１，ｒ２，…，ｒＮ-１）を受信した機関Ｐ１の切断ブロック作成部１１２３は切断ブロックを間接的に表現するため、Ｎ-１個の値Ａｉ （１≦ｉ≦Ｎ） をＡｉ←Ｘ[Ｍ-１,…,ｒｉ]×２^(ｒｉ-１)＋Ｘ［ｒｉ-１,…,０]に従って計算する。その後、制御を秘匿加算撹乱（結果取得）部１１２０に戻す（図７（ｂ））。
【０１７９】
機関Ｐ２のブロックシフト係数作成部では切断ブロック数Ｎと切断点列ｒを機関Ｐ１に送信した後、繰り返ｌｏｏｐでの加算対象変数Ｘへの追加ビット列Ｗ, 加算対象変数Ｙへの追加ビット列Ｚを撹乱デ-タより読み出し、設定する。また、各切断ブロックの左シフト回数順列Ｓ=(ｓ１，ｓ２，…，ｓＮ-１，ｓＮ＋１)、追加ビット列に対する切断点順列、左シフト回数順列も撹乱デ-タより読み出す。そして、切断点順列ｒ、左シフト回数順列Ｓ、追加ビット列に対する切断点順列、左シフト回数順列に従って、加算対象変数Ｙ、Ｘへの追加ビット列Ｗ、Ｙへの追加ビット列Ｚを変形し、それぞれＹ’、Ｗ’、Ｚ’とする（図７（ｃ））。
【０１８０】
次にブロックシフト係数作成部１１８３では変数Ｎｅｗ-ＹにＹ’＋Ｗ’＋Ｚ’の値を代入する。また、以下の条件を満たす定数Ｃｍｉｎ＝-ｍｉｎ｛ｓｉ-ｒｉ-１＋１｜１≦ｉ≦Ｎ｝を計算し、各i（１≦i≦Ｎ）に対して係数Liを計算する。ｉ=１のときはＬ１=（２^(Ｓ１＋１)-２^(ｓ２-(ｒ１-１))×２^Ｃｍｉｎ、２≦i≦ＮのときはＬｉ＝（２^(ｓｉ-ｒ(ｉ-１)＋１)-２^(ｓ(ｉ＋１)-ｒｉ＋１)×２^Ｃｍｉｎ, ｉ=ＮのときはLＮ=（２^ｓＮ-１-(ｒＮ-２)-２^ｓ１）×２^Ｃｍｉｎとする。これらの値を計算した後、ブロックシフト係数作成部は制御を秘匿加算撹乱（加算）部１１８０へ戻す（図７（ｄ））。
【０１８１】
機関Ｐ１の秘匿加算撹乱（結果取得）部１１２０と機関Ｐ２の秘匿加算撹乱（加算）部１１８０は互いに協調し、秘匿べクトル内積計算を実行することにより、機関Ｐ１のもつＮ次元のベクトル（Ａ１,Ａ２,…,ＡＮ-１,Ｘ）と機関Ｐ２のもつＮ次元ベクトル（Ｌ１,Ｌ２,…,ＬＮ）、スカラ-除数２Ｃｍｉｎ, スカラ-定数Ｎｅｗ-Ｙとして、Ｎｅｗ-ＸＹ=２-Ｃｍｉｎ(Σ１≦ｉ≦Ｎ-１ＬiＡi＋ＬＮＸ)＋Ｎｅｗ-Ｙを計算する。そのため、秘匿加算撹乱（結果取得）部１１２０は秘匿ベクトル内積計算の入力ベクトル次元ｎにＮを、入力ベクトル （Ｘ１,…,Ｘｎ）に（Ａ１，…，ＡＮ-１,Ｘ）を代入し、秘匿加算撹乱（加算）部は秘匿ベクトル内積計算の入力ベクトル次元ｎにＮを、入力ベクトル（Ｙ１,…,Ｙｎ）に（Ｌ１，Ｌ２，…，ＬＮ）、入力スカラ-除数Ｋに２Ｃｍｉｎ, 入力スカラ-定数ＬにＮｅｗ-Ｙを代入する。その後、機関Ｐ１の秘匿加算撹乱（結果取得）部１１２０は秘匿ベクトル内積（結果取得）部１１２４に制御を移し、秘匿ベクトル内積計算（結果取得）処理を実行する。また、機関Ｐ２の秘匿加算撹乱（加算）部は制御を秘匿ベクトル内積計算（加算）部１１８４に移し、秘匿ベクトル内積計算（加算）処理を実行する（図８（ｅ））。
【０１８２】
機関Ｐ２の秘匿ベクトル内積計算（加算）部は、まず、スカラ-定数ＬをΣＬi＝Ｋ×Ｌを満たすｎ個の整数の組み合わせに分解する。ここで、各Ｌｉ≠０（１≦ｉ≦ｎ）とする。次に、各ｉ（１≦ｉ≦ｎ）に対して、副暗号鍵ｋｅｙＡiを決定し、二項組の暗号文（Ｃ１ｉ,Ｃ２ｉ）をＹｉの副暗号鍵ｋｅｙＡｉでの暗号化結果、Ｌｉの副暗号鍵ｋｅｙＡｉでの暗号化結果とする。ここで用いる暗号化方式ｇは暗号化したままでの四則演算が可能であり、かつ、可換性をもつものとする。つまり、ある平文Ｍがある暗号鍵ｋｅｙＣで暗号化された後、その暗号文をさらにある鍵ｋｅｙＤで暗号化した場合に得られる暗号文は、平文Ｍを鍵ｋｅｙＤで暗号化した後に鍵ｋｅｙＣで暗号化したときに得られる暗号文と同一である。特に、暗号化したままの四則演算に関しては、加算、減算の場合、同じ暗号鍵ｋｅｙＣで平文Ｍ１、Ｍ２を暗号化した二つの暗号文に演算をほどこすことにより平文（Ｍ１＋Ｍ２）を暗号鍵ｋｅｙＣで暗号化した暗号文と等しい暗号文を作成可能であるものとし、Ｍ１の暗号文より（-Ｍ１）の暗号文を作成可能であるものとする。さらに、暗号文に対する演算により平文に対する乗算、除算が可能なこととする。以降では、暗号文ＣがＣ＝ｇｋｅｙＣ（Ｍ）を満たすとき、ｇｋｅｙＣ（ｋ×Ｍ）なる暗号文を算出する関数をＭｕｌｔｉ（ｋ，Ｃ）とする。また、暗号文Ｃ，定数ｋを入力としてｇｋｅｙＣ（ｋ-１×Ｍ）なる暗号文を算出する関数をＤｉｖ（Ｃ，ｋ）とする。また、同じ暗号鍵ｋｅｙＣで暗号化された２つの平文Ｍ１、Ｍ２に対する暗号文Ｃ１、Ｃ２より平文（Ｍ１＋Ｍ２）の暗号文ｇｋｅｙＣ（Ｍ１＋Ｍ２）を算出する関数をＡＤＤ（Ｃ１，Ｃ２）とする。暗号文Ｃ１ｉ＝ｇｋｅｙＡｉ（Ｙｉ）, Ｃ２ｉ＝ｇｋｅｙＡｉ（Ｌｉ×ｋ）とすると機関Ｐ２の秘匿ベクトル内積計算（加算）部１１８４は作成したｎ個の暗号文２項組を機関Ｐ１に２つのｎ次ベクトル（Ｃ１１，Ｃ１２，．．．，Ｃ１ｎ），（Ｃ２１，Ｃ２２，．．．，Ｃ２ｎ）として送信する（図８（ｅ））。
【０１８３】
機関Ｐ１より２つの暗号文列を受信した機関Ｐ２の秘匿ベクトル内積計算（結果取得）部１１２４は、各ｉ（１≦ｉ≦ｎ）に対して暗号鍵ＫｅｙＢｉと乱数αｉを選定する。次に、各ｉ（１≦ｉ≦ｎ）に対して、以下の条件を満たす暗号文の２項組 （Ｄ１ｉ，Ｄ２ｉ）を計算する。ここで、ｉ=１のとき、Ｄ１１＝ｇＫｅｙＢ１（Ｘｉ×Ｃ１ｉ＋（αｎ＋α１＋１）×Ｃ２ｉ）＝ｇＫｅｙＢ１（ＡＤＤ（Ｍｕｌｔｉ（Ｘｉ，Ｃ１ｉ），Ｍｕｌｔｉ（αｎ＋α１＋１、Ｃ２ｉ）））、Ｄ２１＝ｇｋｅｙＢ１（-α１）、２≦ｉ≦ｎのとき、Ｄ１ｉ＝ｇｋｅｙＢｉ（ＡＤＤ（Ｍｕｌｔｉ（Ｘｉ×Ｃ１ｉ），Ｍｕｌｔｉ（αｉ-１＋αｉ＋１,Ｃ２ｉ）），Ｄ２ｉ＝ｇｋｅｙＢｉ（-αｉ）とする。計算によって得られたｎ個の暗号文の２項組（Ｄ１１，Ｄ２１）、機関Ｐ１の秘匿ベクトル内積計算（結果取得）部１１２４は作成したｎ個の暗号文２項組を機関Ｐ２に２つのｎ次ベクトル（Ｄ１１，Ｄ１２，．．．，Ｄ１ｎ），（Ｄ２１，Ｄ２２，．．．，Ｄ２ｎ）として送信する（図８（ｆ））。
【０１８４】
機関Ｐ１よりｎ個の暗号文２項組を受信した機関P２の秘匿ベクトル内積計算（加算）部は各ｉ（１≦ｉ≦ｎ-１）に対し暗号文Ｄ１ｉを鍵ＫｅｙＡｉで復号した値と暗号文Ｄ２ｉに（Ｌｉ＋Ｌｉ＋１）という値をさらに主暗号鍵ｋｅｙＡで暗号化した値Ｅｉ=ｇｋｅｙＡ（ＡＤＤ（ｇＫｅｙＡｉ-１（Ｄ１ｉ），Ｍｕｌｔｉ（Ｌｉ＋Ｌｉ＋１，Ｄ２ｉ）））を計算する。計算によって得られたｎ-１個の暗号文の列Ｅ１,Ｅ２,…,Ｅｎ-１を機関Ｐ１に送信し、機関Ｐ１より暗号文が送信されるまでまつ（図８（ｇ））。
【０１８５】
機関Ｐ２よりｎ-１個の暗号文の列を受信した機関Ｐ１の秘匿ベクトル内積計算（結果取得）部は各ｉ（１≦ｉ≦ｎ-１)に対して暗号文Ｅｉを副暗号鍵ｋｅｙＢｉで復号し、得られたｎ-１個の暗号文を加算した後、この値をさらに副暗号鍵ｋｅｙＢｎで暗号化することにより暗号文Ｄ=ｇｋｅｙＢｎ（ＳＵＭ１≦ｉ≦ｎ-１（ｇｋｅｙＢｉ-１（Ｅｉ））を計算する。ここでＳＵＭ関数はＡＤＤ関数を連続して適用し総和を求める場合にむけ拡張した関数である。得られた暗号文Ｄを機関Ｐ２に送信し、機関Ｐ２より暗号文が送信されるまでまつ（図８（ｈ））。
【０１８６】
機関Ｐ１より暗号文Ｄを受信した機関Ｐ２の秘匿ベクトル内積計算（加算）部１１８４は暗号文Ｄを主暗号鍵ｋｅｙＡで復号した値と、以前に受信していたｎ番目の暗号文２項組（Ｄ１ｎ，Ｄ２ｎ）のＤ１ｎを鍵ｋｅｙＡｎで復号した値とＤ２ｎの値Ｌｎ＋Ｌ１という値の和を求めた後、定数Ｋで除算することにより求めた値Ｅ, Ｅ＝ＤＩＶ（ＡＤＤ（ｇｋｅｙＡ-１（Ｄ），ＡＤＤ（ｇｋｅｙＡｎ-１（Ｄ１ｎ），Ｍｕｌｔｉ（Ｄ２ｎ，（Ｌｎ＋Ｌ１））））を計算する。計算した暗号値Ｅを機関Ｐ１に送信し、秘匿ベクトル内積計算（加算）部１１８４は制御を秘匿加算撹乱（加算）部１１８０に戻し、秘匿ベクトル内積計算（加算）処理を終了する（図８（ｉ））。
【０１８７】
機関Ｐ２より暗号文Ｅを受信した機関Ｐ１の秘匿ベクトル内積計算（結果取得）部１１２４は暗号文Ｅを自信の暗号鍵ｋｅｙＢｎで復号し、最終結果Ｎｅｗ-ＸＹ=ｇｋｅｙＢｎ-１（Ｅ）＝（１／Ｋ）Σ１≦ｉ≦ｎＸｉＹｉ＋Ｌを得る。最終結果を得た秘匿ベクトル内積計算（結果取得）部１１２４は秘匿ベクトル内積計算（結果取得）処理を終了し、制御を秘匿加算撹乱（結果取得）部１１２０へ戻す（図８（ｊ））。
【０１８８】
以上により、機関Ｐ１の秘匿ベクトル内積計算（結果取得）部１１２４と機関Ｐ２の秘匿ベクトル内積計算（加算）部１１８４が協調して処理を実行することにより、機関Ｐ１の秘密入力であるｎ次元ベクトル（Ｘ１,Ｘ２,…,Ｘｎ）と機関Ｐ２の秘密入力であるｎ次元ベクトル（Ｙ１，Ｙ２，…，Ｙｎ）、スカラ-除数Ｋ, スカラ-定数Lに関する値（１／Ｋ）Σ１≦ｉ≦ｎＸｉＹｉ＋Ｌを機関Ｐ１が最終的にＮｅｗ-ＸＹとして得ることができることを処理概略図である図７，８で確認した。その後、図９に示すよう複数の繰り返しにより加算結果（正順）ビット列と加算結果（逆順）ビット列を得て（図９（ｋ））、加算前ビット列あいまい推測処理を実行しあいまい推測配列１とあいまい推測配列２を得て（図９（ｌ））、あいまい推測配列１とあいまい推測配列２に論理演算を適用することで結果配列を得る（図９（ｍ））。その後、結果配列を秘密デ-タとして用い、次の段数以降の秘匿計算を実施することで最終的な結果を得る（図９（ｎ））。
【０１８９】
図８の秘匿ベクトル内積計算の正当性を図２６に示すよう検証することができる。一方、秘匿ベクトル内積計算処理の実行中に双方が得た相手機関の情報から相手の秘密入力に関する情報を得ることが難しいかどうか検証する必要がある。機関Ｐ１は最終的に得たＮｅｗ-ＸＹと自分の秘密入力から機関Ｐ２の秘密入力の擬似デ-タを作成する。その上で、擬似デ-タを用い機関Ｐ１が作成したプロトコルのやりとりの記録と機関Ｐ１と機関Ｐ２の間で行われた本物のやりとりの記録が異なる秘密入力に対するやりとりであると見分けることができるかどうかを検証する。上記検証ができた場合、プロトコルで得られる情報から秘密入力の情報を解析することが難しいということを示すことができる。検証のため、暗号化関数ｇｋｅｙ（Ｍ）をｇｋｅｙ（Ｍ）＝Ｍｇｋｅｙとする。ここで、ｇは原始元、ｋｅｙは暗号鍵とする。
【０１９０】
機関Ｐ１は本物のプロトコル実行を通して最終結果Ｎｅｗ-ＸＹを得る。このＮｅｗ-ＸＹを用いて自分の秘密入力のｎ次元ベクトル（Ｘ１,Ｘ２,…,Ｘｎ）から、機関Ｐ２の秘密入力の擬似デ-タを作成する。機関Ｐ２の秘密入力であるｎ次元ベクトル（Ｙ１,Ｙ２,…,Ｙｎ）に対する擬似デ-タ（ＳＹ１,ＳＹ２,…,ＳＹｎ）、スカラ-除数Ｋに対する擬似デ-タをＳｋ, スカラ-定数Ｌに対する擬似デ-タをＳｌとする。このとき、(ＳＹ１,ＳＹ２,…,ＳＹｎ)をランダムに決定し、Σ１≦ｉ≦ｎＸｉＳＹｉを計算する。この値の因数の１つをＳＫとして選ぶ。また、Ｎｅｗ-ＸＹ-（１／Ｓｋ）（Σ１≦ｉ≦ｎＸｉＳＹｉ）なる計算により得られる値をＳＬに代入する。上記の方法により作成した擬似デ-タを機関Ｐ２の秘密デ-タと見立て、機関Ｐ１が機関Ｐ２を模倣する。上記、擬似デ-タを入力とした場合、機関Ｐ１が行う模倣の計算はＮｅｗ-ＸＹを得ることができる正当性を満たす計算となる。よって、本物の機関Ｐ２とのやりとりによって得られた情報と擬似デ-タを使って作成されたやり取りの情報は正当性の面では見分けることができない。
【０１９１】
次に機密性の面から、本物のやりとりから何らかの情報を引き出すことが可能かについて注目し、２つのやりとりの違いを認識できるか検証する。本物の（Ｃ１ｉ，Ｃ２ｉ）＝（ｇｋｅｙＡｉ（Ｙｉ），ｇｋｅｙＡｉ（Ｌｉ））と擬似デ-タ（Ｃ１ｉ,Ｃ２ｉ）=（Ｙｉ×ｇｋｅｙＡｉ, Ｌｉ×ｇｋｅｙＡｉ）と擬似デ-タ（ＳＣ１ｉ,ＳＣ２ｉ）＝（ＳＹｉ×ｇｋｅｙＳＡｉ, ＳＬｉ×ｇｋｅｙＳＡｉ）とを区別できるかを考える。ここでＳＬｉ （１≦ｉ≦ｎ）はΣ１≦ｉ≦ｎＳＬｉ=ＳＬを満たす乱数とする。Ｃｉ１／Ｃｉ２=Ｙｉ／Ｌｉであり、ＳＣ１ｉ／ＳＣ２ｉ＝ＳＹｉ／ＳＬｉと異なる値となるが、これらの比を用いてやりとりの違いを区別することは難しい。
【０１９２】
次に、機関Ｐ１は擬似デ-タ（ＳＣ１ｉ,ＳＣ２ｉ）を用いて、（Ｄ１ｉ，Ｄ２ｉ）を各ｉ（１≦ｉ≦ｎ）に対して計算する。その後、擬似デ-タＳＥｉを擬似変数と（Ｄ１ｉ，Ｄ２ｉ)を用いて作成する。各ＳＥｉを受け取ったとき、識別者は機関Ｐ１の暗号鍵を用いて、各ＳＥｉを鍵ｋｅｙＢｉにより復号したとき、（ｇｋｅｙＢｉ）-１（ＳＥｉ）は同じ鍵で暗号化された暗号文となり、かつ、各Ｌｉ=Ｃ２ｉ×Ｙｉ／Ｃ１ｉと示せるため、（ｇｋｅｙＢｉ）-１（Ｅｉ）=（Ｘｉ×Ｙｉ+（αｉ-１×Ｌｉ-αｉ×Ｌｉ＋１＋Ｌｉ）)×ｇｋｅｙＡとなり、各ＥｉはＬｉとＬｉ＋１が乱数因子であることよりＹｉとＹｉ＋１に係る係数を乱数として設定できるため比より２つのやり取りの違いを区別することができない。
【０１９３】
さらに受信した暗号文を復号後に加算し、鍵ｋｅｙＢｎで暗号化し、暗号文ＳＤを計算し、機関Ｐ２に送信する。加算値は乱数の影響を受けており、平文は等しくない。よって、ＤとＳＤの見分けがつかない。最後にＥの擬似デ-タＳＥはＳＤにより計算してもよいし、Ｎｅｗ-ＸＹを鍵ＫｅｙＢＮ＋１で暗号化することで作成してもよい。このとき、ＳＥはＥと区別できない。
【０１９４】
以上より機関Ｐ１は最終結果Ｚと自分の情報を使って、機関Ｐ２と本物のやりとりと区別のつかない擬似のやりとりを作成できることが示された。したがって、機関Ｐ１は最終結果Ｎｅｗ-ＸＹ以外の機関Ｐ２に関する情報をやりとりを通して得ることが困難であり、機関Ｐ２の安全性を証明できる。
【０１９５】
一方、機関Ｐ１の安全性の検証では機関Ｐ２が機関Ｐ１とのやりとりを模倣する。各Ｄｉ（１≦ｉ≦ｎ）の模倣では擬似デ-タＳＤｉ（１≦ｉ≦ｎ）を０以外の値のなかからランダムに作成する。この値は各Ｄｉ’とは異なる暗号鍵で暗号化されているため、識別者は各Ｄｉの平文間の関連を調べることは困難であるため、各ＳＤｉの値にも関連性と各Ｄｉの関連性の違いを検証することも困難である。
【０１９６】
Ｄと（Ｄ１ｎ,Ｄ２ｎ）の関係は乱数αｎ、αｎ-１の影響を受けているため、Ｄと（Ｄ１ｎ,Ｄ２ｎ）をそれぞれ異なる暗号鍵ｋｅｙＡ, ｋｅｙＡｎで復号したときの復号値の比とＳＤ、（ＳＤ１ｎ, ＳＤ２ｎ）をそれぞれ暗号鍵ＳｋｅｙＡ, ＳｋｅｙＡｎで復号したときの比の関連を解析することが難しい。よって、識別者はＤとＳＤの違いを区別することが難しい。以上より、機関Ｐ２に対する機関Ｐ１の安全性を保証できる。よって、秘匿ベクトル内積計算処理における機関Ｐ１、機関Ｐ２、双方の安全性が保証できる。
【０１９７】
以上では秘匿加算撹乱（結果取得）処理、および、秘匿加算撹乱（加算）処理の中の秘匿ベクトル内積計算（結果取得）処理、および、秘匿ベクトル内積計算（加算）処理の安全性について詳細に説明した。秘匿ベクトル内積計算（結果取得）処理と秘匿ベクトル内積計算（加算）処理ではベクトルサイズ変数以上のサイズをもつ乱数ベクトルを用いてもよい。また、秘匿ベクトル内積計算（結果取得）処理、および、秘匿ベクトル内積計算（加算）処理とも、ベクトルサイズ変数以上のサイズをもつ副暗号鍵の列である副暗号鍵ベクトルを用いてもよい。秘匿ベクトル内積計算（結果取得）処理では暗号文Ｄ１ｉを暗号文Ｃ２ｉに２つの乱数の和を乗算することで計算したが、１つの乱数もしくは２つ以上の乱数の和を乗算してもよい。同様に秘匿ベクトル内積計算（加算）処理では暗号文Ｄ２ｉに２つの乱数の和を乗算することで計算したが、１つの乱数もしくは２つ以上の乱数の和を乗算してもよい。さらに、暗号文Ｅを計算するために使った暗号文（Ｄ１ｎ、Ｄ２ｎ）は最後のベクトル位置の暗号文二項組でなくても、任意のベクトル位置の暗号文二項組に換えることができる。また、秘匿ベクトル内積（結果取得）処理と秘匿ベクトル内積（加算）処理では相手機関と暗号文列の送受信を２回以上行ってもよい。以降では、秘匿加算撹乱（結果取得）処理、秘匿加算撹乱（加算）処理の全体の安全性に焦点をあて、処理を詳細に説明する。
【０１９８】
機関Ｐ１のデ-タ処理装置において秘匿ベクトル内積計算（結果取得）処理の実行を終えた秘匿ベクトル内積計算（結果取得）部１１２４より制御を取り戻した秘匿加算撹乱（結果取得）部１１２０は記憶部１３００に記録されている指定繰り返し回数と現在の繰り返し回数ｌｏｏｐが等しいかどうかを判定し、等しければ、制御を制御部１３００に戻す。そうでなければ、現在の繰り返し回数ｌｏｏｐで得られている秘匿ベクトル内積計算の最終結果を秘密デ-タとして記憶部１３００に記憶した後、繰り返し回数ｌｏｏｐに１を加算した後、切断ブロック作成処理を行うための変数設定（結果取得）処理を実行する。
【０１９９】
一方、機関Ｐ２のデ-タ処理装置１０００において、秘匿ベクトル内積計算（加算）部１１８４より制御を取り戻した秘匿加算撹乱（加算）部１１８４は記憶部１３００に記録されている指定繰り返し回数ｌｏｏｐ-ｆｉｎａｌと現在の繰り返し回数ｌｏｏｐが等しいかどうかを判定し、等しければ制御を制御部１１００に戻す。そうでなければ、繰り返し回数ｌｏｏｐに１を加算した後、新しい繰り返し回数において記憶部ｌ３００に記録されている撹乱デ-タよりブロックシフト係数処理を行うための変数設定（加算）処理を実行し、変数を設定し、ブロック処理シフト係数処理の準備処理を実行する。
【０２００】
秘匿加算撹乱（結果取得）処理および秘匿加算撹乱（加算）処理で複数回の繰り返しを実行する要請は後の加算前ビット列あいまい推測処理で必要となる逆順ビット列の加算結果を計算するためと機関Ｐ２側の安全性向上という動機によって行われる。１回目の繰り返しでは機関Ｐ１は自分の秘密入力の切断位置を機関Ｐ２から直接、切断点順列が送信されることにより知る。この情報と第１の繰り返しの秘匿ベクトル内積計算の最終結果を入力として加算前ビット列あいまい推測処理を実行し、得られた結果と自己の秘密入力の各ブロックのビット並びを比較したとき、機関Ｐ１は機関Ｐ２の秘密入力の部分を推測できる可能性がある。上記の可能性を取り除くため、機関Ｐ２は繰り返しを複数回適用することで機関Ｐ１の秘密入力を撹乱し、ビット挿入を撹乱後の秘密入力に実行した後、再度ビット切断を実行する。２回目以降の繰り返しでのビット切断位置を機関Ｐ１は第１の繰り返しの秘密入力の位置として認識することが困難になる。上記目標を達成するため、機関Ｐ２は１つの加算結果を計算する最終繰り返し回より前の繰り返しでは乱数を仮の秘密入力として、機関Ｐ１の秘密入力に加算し、次の繰り返しで前の繰り返しで加算した乱数と挿入したビットの影響を取り消すようそれらの値を対象から減算する。機関Ｐ２は最終の繰り返しのみ本物の秘密入力を転置した後のビット列を使用することができる。
【０２０１】
以上の処理により秘匿加算撹乱（結果取得）処理および秘匿加算撹乱（加算）処理が終了し、最終結果を機関Ｐ１が取得すると、次に機関Ｐ１の制御部１１００は図１０のフロ-に戻り、加算前ビット列あいまい推測処理を開始する。加算前ビット列あいまい推測処理の結果より、２つの秘密入力の各ビットの論理和、論理積、排他的論理和などの可換性二項論理演算を論理演算適用処理にて実行する。機関Ｐ１、機関Ｐ２の双方が計算したい秘匿関数値を計算できるまで、以前の段数で計算した結果を次の段数で秘密入力として利用する。最終的に機関Ｐ１が取得した結果に機関Ｐ２が撹乱するために入れた情報の影響を取り除くため、機関Ｐ１と機関Ｐ２が情報交換し、秘匿関数計算の処理を終了する。
【０２０２】
本実施の形態によれば、機関Ｐ２はビット列の転置、挿入した他のビット列の情報を機関Ｐ２に知られることなくビット列の撹乱を実施する。機関Ｐ１は自己の秘密入力、および、途中の計算結果を機関Ｐ１に知られることなく論理演算をビット列に直接適用することができる。
【０２０３】
機関Ｐ２は機関Ｐ１の撹乱情報、ビット挿入情報を推測することが難しく、あいまいに復元された結果の撹乱ビット列のビットと自己のビット列のビットを推測することが困難になる。さらに、あいまい復元では元の加算前のビット位置のビットの値の組合せが０、１の場合には、どちらが０、１になるのかは推測できない。よって、０、１の組合せの数をｍとすると２のｍ乗通りのうちの１つが正確な撹乱後の加算前ビット列となる。よって、あいまい推測では正確な撹乱後のビット列さえも得ることが難しい。
【０２０４】
さらに、機関Ｐ１は高速に、かつ、正確にビット列に対して可換性二項論理演算を適用し、その結果を得ることができる。なぜならば対象としている論理演算は可換性があるので、あいまい推測の結果で正確な結果を計算することができるからである。
【０２０５】
このように本実施の形態の方法は従来手法の論理演算１つずつを暗号化して実行するという効率上の弱点を克服した斬新な方法となっている。よって、本実施の形態の方法を使用すれば、効率よく一般的な論理関数を適用した結果を互いの入力を秘匿にしたままで計算することが可能となる。
【０２０６】
（実施の形態２）
本実施の形態の秘匿関数計算システム１は図２７に示すように、複数のデ-タ処理装置１０００を備えるシステムである。複数のデ-タ処理装置１０００はデ-タ記憶装置３０００を介してデ-タを送受信することで、複数の機関での秘匿関数計算を可能にする。以下、秘匿関数計算システム１の構成について説明する。
【０２０７】
秘匿関数計算システム１は図２７に示すように、複数のデ-タ処理装置１０００と、デ-タ処理装置１０００それぞれと通信線２０００で接続されたデ-タ記憶装置３０００とを備える秘匿関数計算システムである。なお、以下の説明ではデ-タ処理装置１０００が機関Ｐ１、機関Ｐ２、機関Ｐ３それぞれに設置されているものとして説明する。以下、秘匿関数計算システム１の構成について説明する。
【０２０８】
秘匿関数計算システム１のデ-タ処理装置１０００はそれぞれ「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のいずれかを担当する。「関数評価処理」および「ビット列撹乱処理」を担当するデ-タ処理装置１０００の構成と機能については、実施の形態１と同様であるので説明を省略する。「関数評価およびビット列撹乱処理」を担当するデ-タ処理装置１０００は実施の形態１での「関数評価処理」を担当するデ-タ処理装置１０００がもつ制御部１１００の構成と機能と「ビット列撹乱処理」を担当するデ-タ処理装置１０００がもつ制御部１１００の構成と機能の双方を兼ね備える。
【０２０９】
デ-タ記憶装置３０００は例えば、３つの機関とは別の機関内に設置されたサ-バである。デ-タ記憶装置３０００はデ-タを保存するための記憶装置（ハ-ドディスクやフラッシュメモリ等）や、デ-タ処理装置１００とデ-タを送受信するための通信装置などを備える。デ-タ処理装置１０００は通信線２０００を介してデ-タ記憶装置３０００にデ-タを保存する。
【０２１０】
デ-タ記憶装置３０００内部の記録装置には、機関ごとに専用のフォルダが用意されている。３つのデ-タ処理装置１０００はそれぞれの機関に用意された上記フォルダに暗号文列等を格納する。また、各フォルダ内部にはデ-タ処理履歴を記録するための履歴ファイルが格納されている。各デ-タ処理装置１０００は暗号文列を処理するたびに履歴ファイルに所定のデ-タを記録する。
【０２１１】
実施の形態１とは異なり、秘匿関数計算システム１では各デ-タ処理装置１０００は「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のいずれかを担当する。次に、秘匿関数計算システム１で実行される「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」について説明する。本実施の形態では、機関Ｐ１が「関数評価処理」を担当し、機関Ｐ２が「関数評価およびビット列撹乱処理」を担当し、機関Ｐ３が「ビット列撹乱処理」を担当する。
【０２１２】
「関数評価処理」、「ビット列撹乱処理」、「関数評価およびビット列撹乱処理」のそれぞれの処理はほぼ実機の形態１の「関数評価処理」、「ビット列撹乱処理」と同じであるが、通信部１２００を介して他のデ-タ処理装置と通信する代わりに、通信部１２００を介してデ-タ記憶装置３０００に送信する内容を記録、受信する内容を読み出す。また、段数初期化部１１１０と段数判定部１１５０では次の段でどの機関が通信する相手となるかを設定する。さらに、「関数評価およびビット列撹乱処理」を担当するデ-タ処理装置１０００の制御部１１００は各段数での通信する相手機関により、その段で「関数評価処理」を行うのか、「ビット列撹乱処理」を行うかを決定する。図２８では機関Ｐ２のデ-タ処理装置１０００の制御部１１００は相手機関がＰ１ならば「ビット列撹乱処理」を、相手機関がＰ３ならば「関数評価処理」を実行する。
【０２１３】
「ビット列撹乱処理」を担当する機関Ｐ３は「関数評価およびビット列撹乱処理」を担当する機関Ｐ２に機関Ｐ１と機関Ｐ２の間の入力に対するビット撹乱処理を機関Ｐ２に担当させ、関数評価を機関Ｐ１に実行させるため、機関Ｐ３の撹乱デ-タの一部を事前に機関Ｐ２の撹乱デ-タの一部として機関Ｐ２の記憶部１３００に格納してもらう。
【０２１４】
最終的な関数評価は「関数評価処理」を担当する機関Ｐ１が実行し、最終交換デ-タを作成し、機関Ｐ２、機関Ｐ３は自己の撹乱デ-タの情報を変形し最終交換デ-タを作成し、３つの機関が最終交換デ-タを交換することで、最終結果を算出する。
【０２１５】
本実施の形態によれば、デ-タ記憶装置３０００を介してデ-タを送受信することで３つの機関での秘匿関数計算が可能になる。
【０２１６】
また、デ-タ処理装置３０００に保存されるデ-タは暗号化されたデ-タ（暗号化撹乱加算デ-タ、二重暗号化加算対象デ-タ変形など）や最終交換デ-タであるので、機関Ｐ１、Ｐ２、Ｐ３以外の機関がそのデ-タを取得したとしても、最終結果算出手続きを知らない場合には、そこから有意な情報を得ることはできない。また、最終結果算出手続きが知られている場合には、最終交換デ-タを各機関共通の公開鍵などで暗号化し暗号化デ-タとして記憶することで、デ-タを安全に守ることができる。そのため、各機関は安心してこれらのデ-タをデ-タ記憶装置３０００に保存しておくことができる。
【０２１７】
なお、秘匿関数計算システム１は４台以上のデ-タ処理装置１０００を有していてもよい。４台以上のデ-タ処理装置１０００がデ-タ記憶装置３０００にアクセスできるように構成し、実施の形態２と同様の処理を実行することで、４つ以上の機関での秘匿関数計算が可能になる。
【０２１８】
実施の形態１および２では秘密デ-タに秘密デ-タ名を対応付けて、記憶部１３００から読み出し、記憶部１３００への格納し、利用したがある秘密デ-タ名をもつ秘密デ-タに別の秘密デ-タを連結して、秘密デ-タを更新してもよい。
【０２１９】
この方法の利用形態としては、異なる段数で得られた論理演算適用結果を組み合わせて演算を適用したい場合に複数の段数の結果を含む１つの秘密デ-タを入力として秘匿加算撹乱処理を適用する場合が考えられる。
【０２２０】
本システムの適用は研究機関の間の秘匿関数計算に限られない。会社間、部署間等、さまざまな組織間の秘匿関数計算に適用可能である。また、個人間の秘匿関数計算にも適用可能である。
【０２２１】
デ-タ処理装置１０００は、専用のシステムによらず、通常のコンピュ-タシステムを用いても実現可能である。例えば、上述の動作を実行するためのプログラムをコンピュ-タ読み取り可能な記録媒体に格納して配布し、該プログラムをコンピュ-タにインスト-ルして、上述の処理を実行することによってデ-タ処理装置１０００を構成してもよい。また、インタ-ネット等のネットワ-ク上のサ-バ装置が備えるディスク装置に格納しておき、例えばコンピュ-タにダウンロ-ド等できるようにしてもよい。また、上述の機能を、ＯＳとアプリケ-ションソフトの共同より実現してもよい。この場合には、ＯＳ以外の部分のみを媒体に格納して配布してもよく、また、コンピュ-タにダウンロ-ド等してもよい。
【０２２２】
上記のプログラムを記録する記録媒体としては、ＵＳＢメモリ、ＣＤ、ＤＶＤ、Ｂｌｕ-ｒａｙ(登録商標)  Ｄｉｓｃ，ＭＯ，ＳＤカ-ド、その他、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリ、磁気テ-プ等のコンピュ-タ読み取り可能な記録媒体を使用することができる。また、ＨＤＤ（ハ-ドディスク）やＳＤＤ（ソリッドステ-トドライブ）等、通常、システム又は装置に固定して使用する記録媒体を使用することもできる。
【符号の説明】
【０２２３】
１            秘匿関数計算システム
１０００      デ-タ処理装置
１１００      制御部
１１１０      段数初期化部
１１２０      秘匿加算撹乱（結果取得）部
１１２１      繰り返し回数初期化部
１１２２      変数設定（結果取得）部
１１２３      切断ブロック作成部
１１２４      秘匿ベクトル内積計算（結果取得）部
１１２５      繰り返し回数判定部
１１３０      加算前ビット列あいまい推測部
１１４０      論理演算適用部
１１５０      段数判定部
１１６０      最終交換デ-タ作成部
１１７０      最終結果算出部
１１８０      秘匿加算撹乱（加算）部
１１８１      繰り返し回数初期化部
１１８２      変数設定（加算）部
１１８３      ブロックシフト係数作成部
１１８４      秘匿ベクトル内積計算（加算）部
１１８５      繰り返し回数判定部
１２００      通信部
１３００      記憶部
１４００      操作部
１５００      インタフェ-ス部
２０００      通信部
３０００      デ-タ記憶装置
【図１】
2015132690.tif 000003
【図２】
2015132690.tif 000004
【図３】
2015132690.tif 000005
【図４】
2015132690.tif 000006
【図５】
2015132690.tif 000007
【図６】
2015132690.tif 000008
【図７】
2015132690.tif 000009
【図８】
2015132690.tif 000010
【図９】
2015132690.tif 000011
【図１０】
2015132690.tif 000012
【図１１】
2015132690.tif 000013
【図１２】
2015132690.tif 000014
【図１３】
2015132690.tif 000015
【図１４】
2015132690.tif 000016
【図１５】
2015132690.tif 000017
【図１６】
2015132690.tif 000018
【図１７】
2015132690.tif 000019
【図１８】
2015132690.tif 000020
【図１９】
2015132690.tif 000021
【図２０】
2015132690.tif 000022
【図２１】
2015132690.tif 000023
【図２２】
2015132690.tif 000024
【図２３】
2015132690.tif 000025
【図２４】
2015132690.tif 000026
【図２５】
2015132690.tif 000027
【図２６】
2015132690.tif 000028
【図２７】
2015132690.tif 000029
【図２８】
2015132690.tif 000030
【図２９】
2015132690.tif 000031
【手続補正書】
【提出日】平成26年1月21日(2014.1.21)
【手続補正１】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2015132690.tif 000032
【図２】
2015132690.tif 000033
【図３】
2015132690.tif 000034
【図４】
2015132690.tif 000035
【図５】
2015132690.tif 000036
【図６】
2015132690.tif 000037
【図７】
2015132690.tif 000038
【図８】
2015132690.tif 000039
【図９】
2015132690.tif 000040
【図１０】
2015132690.tif 000041
【図１１】
2015132690.tif 000042
【図１２】
2015132690.tif 000043
【図１３】
2015132690.tif 000044
【図１４】
2015132690.tif 000045
【図１５】
2015132690.tif 000046
【図１６】
2015132690.tif 000047
【図１７】
2015132690.tif 000048
【図１８】
2015132690.tif 000049
【図１９】
2015132690.tif 000050
【図２０】
2015132690.tif 000051
【図２１】
2015132690.tif 000052
【図２２】
2015132690.tif 000053
【図２３】
2015132690.tif 000054
【図２４】
2015132690.tif 000055
【図２５】
2015132690.tif 000056
【図２６】
2015132690.tif 000057
【図２７】
2015132690.tif 000058
【図２８】
2015132690.tif 000059
【図２９】
2015132690.tif 000060