【発明が解決しようとする課題】
【0024】
以下の分析は、本発明者によってなされたものである。
【0025】
上述のキーワード検索の方法によると、すべてのブルームフィルタに対して関数Checkを実行する必要がある。「特徴2」を用いると、多くの文書に含まれていない単語に関するキーワード検索を効率化することができる。
【0026】
この効率化手法では、まず、各文書に対して1つずつブルームフィルタを生成した後、検索を補助するブルームフィルタを生成する。具体的には、複数のブルームフィルタを入力とし、複数のブルームフィルタを出力する処理Concを導入する。処理Concは、複数のブルームフィルタF_1,…,F_nを入力とする。ここで、_{}の内部に記載されている文字1,…,nは、ブルームフィルタに振られた識別情報として用いる。識別情報は、対応させた文書のファイル名等であってもよい。処理Concにおいては、処理の途中で、集合tmpを用いる。
【0027】
処理Conc:
1.集合tmpを空集合(φ)とする。
2.ブルームフィルタF_1〜F_nが入力される。
3.ブルームフィルタF_1〜F_nを集合tmpに加える。
4.集合tmpから2つの要素F_i,F_jを選択する。
5.論理和F_i○F_jを計算し、集合tmpに加える。
6.要素F_i,F_jを集合tmpから取り除く。
7.(F_i,(i,j))と(F_j,(i,j))を出力する。
8.F_{i,j}を集合tmpに加える。
9.集合tmpに含まれている要素数が1つの場合には、その要素と根ノードを表す識別情報を組として出力して、処理を終了する。それ以外の場合には、4の処理に戻る。
【0028】
以上の処理によって生成されたブルームフィルタは、入力されたブルームフィルタを葉ノードとし、それらの論理和を中間のノードとし、すべてのフィルタの論理和が根ノードである木構造に対応付けることができる。また、各中間のノードのブルームフィルタは親ノードの識別情報との組として出力される。したがって、親ノードの識別情報から、その子ノードに対応するフィルタを容易に選び出すことができる。ブルームフィルタと親の識別情報を組にしているのは、後に根ノードからの検索処理を行う際に利用するためである。ただし、根ノードから葉ノードに向かってたどることができる方法であれば、これ以外の方法であってもよい。
【0029】
図3は、8つのブルームフィルタF_{1},…,F_{8}を処理Concに入力した場合に出力されるフィルタを、一例として木構造に表した図である。
図3は、一例として、2分木構造を示す。
【0030】
「特徴2」によると、以上の方法で生成された各ブルームフィルタF_{i,…}は、{}内に記載された文書が含む単語の和集合を単語の集合として有する文書に対するブルームフィルタとなる。
【0031】
まず、根ノードのフィルタから幅優先で検索処理を行い、0が出力された場合には、どの文書にも含まれていないと判断し、1が出力された場合には、その子のノードに対して検索処理を行い、順に葉ノードまで下って行き、どの文書が対象の単語を含むかを調べることが可能となる。
【0032】
次に、この検索処理を実行する処理TSについて説明する。処理TSには、文書に対して処理Concを用いて生成された複数のブルームフィルタと、キーワードwとが入力される。
【0033】
処理TS:
1.入力されたブルームフィルタから、根ノードを表す識別情報*を組として持つ(F_{i,…,j},(*))を捜し、集合tmp1に挿入する。
2.集合tmp1が空集合でない場合には、集合tmp1からブルームフィルタF_{i,…}を1つ選択する。それ以外の場合には、処理を終了する。
3.Check(F_{i,…},w)=1の場合には、(F_{i,…,j},(*))を集合tmp1から取り除き、集合tmp2に{i,…}を親ノードの識別情報として持つブルームフィルタをすべて挿入する。また、F_{i,…}が単一の文書に対するブルームフィルタである場合には、{i,…}を出力する。一方、Check(F_{i,…},w)=0である場合には、(F_{i,…,j},(*))を集合tmp1から取り除く。
4.集合tmp1が空集合でない場合には、2の処理に戻る。一方、集合tmp1が空集合の場合には、集合tmp2の要素のすべてを集合tmp1に移し、2の処理に戻る。
【0034】
多くの文書が登録されており、かつ、検索対象のキーワードを含む文書の数が少ない場合には、この方法を用いたキーワード検索を効率的に実行することができる。
図3は、2分木構造となっている。しかし、処理Concの設計によっては2分木構造とならないこともある。登録文書数がnであり、2分木構造でフィルタを生成する処理Concを用いた場合において、検索対象のキーワードを含む文書の数がxであるときには、高々2*x*(log_2 n)個のフィルタをチェックすればよいという効果がもたらされる。ここでは、説明の便宜上、2分木構造を用いるものとする。
【0035】
以上の方法によると、検索処理を効率化することが可能となる。しかしながら、この方法では、文書が削除される場合、および、文書が更新される場合が考慮されていないという問題がある。
【0036】
例えば、文書D_1について作成されたブルームフィルタがF_1=10110であり、文書D_{2,…}について作成されたブルームフィルタがF_{2,…}=01110である場合には、文書D_{1,2,…}に対するブルームフィルタはF_{1,2,…}=11110となる。このとき、F_{1,2,…}からF_{1}に関する情報を消去し、F_{2,…}に関するブルームフィルタを求める場合、F_{1,2,…}とF_{1}だけでは不十分である。1,3,4ビット目のようにF_{1,2}とF_{1}の両方が1である箇所について、F_{2,…}が0または1のいずれであるかを判定できないからである。
【0037】
この問題は、ブルームフィルタが有する次の特徴を用いて解決することができる。
【0038】
「特徴3」
ブルームフィルタの各ビットを値とした配列として扱い、集合S_1,S_2に対して生成されたブルームフィルタF_{S_1}とF_{S_2}の配列の各要素を加算した配列を配列Cとする。配列C中の各要素を、要素が0である場合には0とみなし、要素が1以上である場合には1とみなすと、配列Cは集合S_1,S_2の和集合に対して生成したブルームフィルタとなる。また、配列Cの各要素からF_{S_1}の配列の各要素を減算した配列において、配列中の各要素を、要素が0である場合には0とみなし、要素が1以上である場合には1とみなすと、集合S_2のブルームフィルタとなる。
【0039】
以下では、このような配列同士の減算をf_{S_1}−f_{S_2}と記述する。
【0040】
次に、簡単な例に基づいて、配列の加算および減算について説明する。配列同士の加算および減算は、次のように行われる。
配列A :020101
配列B :010100
配列C=配列A+配列B:030201
配列C−配列B :020101
【0041】
なお、複数の配列同士の加算を行う場合には、記憶容量を抑える目的で、各配列の要素の値に上限を定めることがある。上限が定められている場合には、上限値に到達した値に加算するときには上限値のままとし、上限値に到達した値から減算するときにも上限値のままとする。このようにすると、演算後の配列から「特徴3」が失われないことが知られている。なお、非特許文献1においても、本発明においても、処理が正常に行われている限り、0からさらに減算を行うような処理は生じない。
【0042】
本発明において、ブルームフィルタや配列の加算を行う場合に、配列の要素の上限値に関しては、特に説明しない。ただし、加算を行う場合の上限値を定めてもよい。上限値を定めた場合には、上述の方法に従って加算を行うものとする。
【0043】
次に、「特徴3」を用いて、検索を効率化しつつ、登録された文書の削除および更新を可能とする方法について説明する。
【0044】
まず、最初の段階として、複数の文書が登録され、これらに対して検索を補助する情報を生成する場合について説明する。
【0045】
この方法においても、まず、各文書に対して一つずつブルームフィルタを生成した後、検索を補助する配列を生成する。具体的には、複数のブルームフィルタを入力とし、複数の配列を出力するアルゴリズムを用いる。ただし、上述の処理Concのステップ5の○処理を+処理に置き換えるのみであることから、詳細な説明を省略する。
【0046】
図4は、8つのブルームフィルタF_{1},…,F_{8}を処理Conc2に入力した場合に出力される配列を木構造に表した図である。
図4は、処理Concの場合(
図3)と同様に、2分木構造を示す。
【0047】
検索処理も、上述の処理TSと同様の処理に基づいて実行することができる。関数Checkを実行する際に配列が入力されていた場合には、上述の方法においてブルームフィルタとして取り扱う処理を追加するのみであることから、詳細な説明を省略する。
【0048】
次に、上述のようにして作成したデータ列から、文書を削除する方法について説明する。
図5は、
図4で作成したデータ列からF_{8}に関する情報を削除する方法を示す。
【0049】
「特徴3」により、F_{8}を子に持つデータ列からF_{8}を減算すればよい。したがって、F_{7,8},{5,…,8}と,F_{5,…,8},{1,…,8}と、F_{1,…,8},{*}のそれぞれから、F_{8}を減算すれば、それぞれのビット列をブルームフィルタとみなした場合に、F_{8}に関する情報が含まれなくなる。なお、木構造の左側は関与しないため、
図5において、木構造の左側を省略した。ここで、F_{8}以外のブルームフィルタの値は一切必要とされない。したがって、文書の削除を容易に行うことができる。
【0050】
一般に、F_{i}に関する情報を消去する場合には、{,…,}内にiを含むビット列からF_{i}を減算すればよい。
【0051】
次に、文書を更新する方法について説明する。文書の更新は、文書を削除した後に、文書を追加することで実現し得る。
図5に示すように、データ列からF_{8}に関する情報を削除した後、別のF_{8}を追加する方法を、
図6を参照して説明する。
図6を参照すると、「特徴3」により、F_{8}を子に持つデータ列に新規のF_{8}を加算すればよい。
【0052】
一般に、F_{i}に関する情報を追加する場合には、{,…,}内にiを含むビット列にF_{i}を加算すればよい。
【0053】
以上の方法によると、中間ノードは、ビット列ではなくデータ列となる。したがって、以上の方法によると、「特徴2」を用いて検索を効率化した場合と比較して、検索を補助するデータに要する記憶容量が増大するものの、文書の削除および更新が容易となるという効果がもたらされる。
【0054】
ブルームフィルタは、キーワード検索に有用である。しかし、情報漏洩を防ぐ上で、ブルームフィルタには以下の2つの問題がある。
【0055】
「ブルームフィルタの第1の問題」
ブルームフィルタのフィルタ関数に入力されるのは、単語のみである。したがって、文書が異なる場合においても、同一の単語が含まれるときには、ブルームフィルタに現れる特徴は同一となる。したがって、ブルームフィルタ間の類似度は、もとの文書間の類似度と関係し、ブルームフィルタ間の類似度から情報が漏洩する。
【0056】
「ブルームフィルタの第2の問題」
検索処理は、単語とブルームフィルタを入力として行われる。すなわち、ブルームフィルタの情報があれば、誰でも検索を行なうことができる。したがって、フィルタに対応する文書が暗号化された状態で保存されていても、フィルタから多くの情報を取り出すことができる。
【0057】
非特許文献1、2において、これらの問題を解決する方法が記載されている。非特許文献1に記載された方法は、効率および安全性の点で、非特許文献2に記載された方法よりも優れている。そこで、以下では、非特許文献1に記載された2つの方法について説明する。
【0058】
「第1の方法」
第1の方法では、文書を、単語の集合と識別情報の組として扱う。識別情報として、文書を区別するためのファイル名、通し番号等の情報を用いることができる。識別情報がzであって、単語としてw_1,…,w_nを含む文書Dを({w_1,…,w_n},z)とする。
【0059】
第1の方法は、フィルタを生成する主体のみが所有する秘密の情報(以下、「鍵K」とする。)を用いる。鍵Kは、文書に含まれている各単語w_iをトラップドアと呼ばれる値に変換するために用いられる。この変換処理は、鍵と単語を入力とするトラップドア生成関数Trによって実現しうる。トラップドア生成関数Trに、鍵Kと単語wを入力したときの出力を、単語wのトラップドアという。以下では、トラップドア生成関数Trにより単語のトラップドアを生成する処理を、トラップドア生成処理という。
【0060】
また、第1の方法では、文書ごとに異なるフィルタ関数が用いられる。フィルタ関数として、ビット列を出力する関数であって、識別情報zとトラップドアとを入力とする関数を用いる。この関数を、識別情報依存フィルタ関数F’とする。
【0061】
第1の方法において、フィルタを生成する関数をGen2とする。関数Gen2は、次のように表すことができる。
【0062】
関数Gen2:
1.文書({w_1,…,w_n},z)と鍵Kが入力される。
2.トラップドアx_1=Tr(K,w_1),…,x_n=Tr(K,w_n)を計算する。
3.ビット列y_1=F’(z,x_1),…,y_n=F’(z,x_n)を計算する。
4.ビット列y_1〜y_nの論理和を求めて出力する。
【0063】
以上の処理によって生成されるフィルタを、セキュアインデックスという。ここでは、セキュアインデックスを生成する処理をセキュアインデックス生成処理という。
【0064】
図7は、第1の方法におけるセキュアインデックスの生成方法を説明するための図である。
図7は、文書({w_1,w_2,
w_3},z)と鍵Kが関数Gen2に入力された場合の処理を示す。
【0065】
次に、識別情報zに対応するフィルタfが単語wを含んでいるかを調べる処理について説明する。ブルームフィルタでは、上述のように、単語とフィルタを入力とする関数Checkを用いる。一方、第1の方法では、トラップドアxとフィルタfと識別情報zを入力とする関数Check2を用いる。関数Check2は、次のように表すことができる。
【0066】
関数Check2:
1.フィルタfと識別情報zとトラップドアxが入力される。
2.ビット列y=F’(z,x)を計算する。
3.ビット列yにおいて1である箇所のすべてがフィルタfにおいても1であるかを調べ、すべてが1である場合には1を出力し、それ以外の場合には0を出力する。
【0067】
以上の処理を、セキュアインデックス判定処理という。
図8は、第1の方法におけるセキュアインデックスの判定方法を説明するための図である。
図8は、関数Check2の動作を一例として示す。トラップドアは、単語と鍵Kを用いて計算される。したがって、ある単語に関する検索を実行しようとしても、鍵Kを持っていない場合には、その単語に対応するトラップドアを計算することができず、関数Check2を使用することができない。
【0068】
したがって、鍵Kを持っている主体のみが、トラップドアを計算し、文書とフィルタを保管しているデータベース等に検索処理を依頼することができる。ブルームフィルタを用いる場合には、データベースはどのような単語に関する検索も単独で実行することができた。一方、第1の方法によって生成されたフィルタに対しては、トラップドアを知っている値に関する検索しか行うことができない。なお、関数Check2に入力されたフィルタがビット列ではなく、データ配列である場合には、各配列の値が0のときには0とみなし、それ以外のときには1とみなして、関数Check2に記載された処理を実行するものとする。以上の方法によって、「ブルームフィルタの第2の問題」が解決される。
【0069】
また、「ブルームフィルタの第1の問題」は、すべての文書に関するフィルタ関数が同一であることに起因する。しかし、関数Gen2によると、識別情報が異なる場合には、識別情報依存フィルタ関数F’も異なる出力を行う。したがって、「ブルームフィルタの第1の問題」も解決される。
【0070】
第1の方法では、単語がトラップドアに変換される点でブルームフィルタと相違する。しかし、単語毎にビット列を計算し、その論理和をとるという点では、第1の方法はブルームフィルタと同一である。したがって、第1の方法は、ブルームフィルタが有する「特徴1」を備えている。すなわち、第1の方法はトラップドアを用いる点でブルームフィルタと相違するものの、すべてのフィルタに対して関数Check2を適用することで、ブルームフィルタと同様にキーワード検索を実行することができる。
【0071】
また、第1の方法では、文書毎にフィルタ関数が異なる。したがって、2つの文書に対して生成された2つのフィルタの論理和を計算しても、2つの文書の持つ単語の和集合によって構成される文書のフィルタにはならない。したがって、第1の方法は、ブルームフィルタが有する「特徴2」を備えていない。同様の理由で、第1の方法は、ブルームフィルタが有する「特徴3」も備えていない。したがって、第1の方法によると、ブルームフィルタのように、検索を効率化する技術や、文書の削除、更新を容易化する技術を適用することができないという問題がある。
【0072】
この問題を解決するための方法も、非特許文献1に記載されている。以下では、非特許文献1に記載された方法を第2の方法として説明する。
【0073】
「第2の方法」
第2の方法では、文書を単語の集合として扱う。第2の方法でも、第1の方法と同様に、フィルタを生成する主体のみが所有する秘密の情報(すなわち鍵K)を用いるとともに、トラップドア生成関数Trを用いる。しかし、第2の方法では、ブルームフィルタと同様に、すべての文書に対して共通のフィルタ関数Fを用いる。
【0074】
第2の方法において、フィルタを生成する関数をGen3とする。関数Gen3は、次のように表すことができる。
【0075】
関数Gen3:
1.文書{w_1,…,w_n}と鍵Kが入力される。
2.トラップドアx_1=Tr(K,w_1),…,x_n=Tr(K,w_n)を計算する。
3.ビット列y_1=F(x_1),…,y_n=F(x_n)を計算する。
4.ビット列y_1〜y_nの論理和を求めて出力する。
【0076】
図9は、第2の方法におけるセキュアインデックスの生成方法を説明するための図である。
図9は、文書{w_1,w_2,
w_3}と鍵Kが関数Gen3に入力された場合の処理を示す。
【0077】
次に、あるフィルタyが単語wを含んでいるか否かを調べる処理について説明する。第2の方法では、トラップドアとフィルタを入力とする関数Check3を用いる。関数Check3は、次のように表すことができる。
【0078】
関数Check3:
1.フィルタfとトラップドアxが入力される。
2.ビット列y=F(x)を計算する。
3.ビット列yにおいて1である箇所のすべてがフィルタfにおいても1であるかを調べ、すべてが1である場合には1を出力し、それ以外の場合には0を出力する。
【0079】
図10は、関数Check3の動作を一例として示す。第2の方法によると、第1の方法と同様の理由により、「ブルームフィルタの第2の問題」が解決される。
【0080】
また、第2の方法では、すべての文書に対して同一のフィルタ関数Fを用いる。したがって、第2の方法は、ブルームフィルタの有する「特徴2」および「特徴3」を備えている。これらの特徴を用いることで、第2の方法によると、ブルームフィルタと同様に、検索を効率化する技術や、文書の削除更新を容易化する技術を適用することができる。
【0081】
しかし、第2の方法では、すべての文書で同一のフィルタ関数Fを用いるため、「ブルームフィルタの第1の問題」が生じる。
【0082】
以上により、第1の方法によると、情報漏洩に対する耐性が高い。しかし、第1の方法によると、出現率の低い単語に関する検索であっても、すべての文書に対応するインデックスを調べる必要があり、検索に時間を要するという問題がある。一方、第2の方法によると、検索を効率的に実行することができ、文書の削除や更新も容易に行うことができる。しかし、第2の方法によると、情報漏洩に対する耐性が弱いという問題がある。
【0083】
そこで、情報漏洩に耐性を有する、キーワード検索用のインデックスを生成することが課題となる。本発明の目的は、かかる課題を解決する情報処理装置、情報処理方法およびプログラムを提供することにある。