セキュア・インデックス
セキュア・インデックスの機能
セキュア・インデックスとは、文書Dに対して、検索キーwを隠したままでそれが文書Dに含まれるか否かを知ることができるインデックスIDを生成するスキーム。インデックスIDから文書Dの内容が知られてはならない。
インデックス・スキーム
I = (Keygen, Trapdoor, BuildIndex, SearchIndex):
- Kpriv ← Keygen()
- Tw ← Trapdoor(Kpriv, w)
- ID ← BuildIndex(D, Kpriv)
- 1/0 ← SearchIndex(Tw, ID)
文書Dと鍵Kprivは私的に保持し、そのインデックスIDは第三者に預けておく。
ユーザはワードwについて検索したいときには、そのトラップドアTwを計算し、第三者に渡して検索結果SearchIndex(Tw, ID)を受け取る。
完全性 (completness)
∀Kpriv ← Keygen(s), ∀w : ワード, ∀D : 文書,
∀Tw ← Trapdoor(Kpriv, w), ∀ID ← BuildIndex(D, Kpriv)
- SearchIndex(Tw, ID) = ( w∈? D ).
セキュア・インデックスの安全性
どのような攻撃者も、いくつかのワードのトラップドアを入手したとしても、インデックスIDから文書Dの内容が全く分からないこと。
ゲーム
- q個のワードからなる集合Sを選択する。
- 攻撃者Aを起動し、集合Sを渡す。
- 攻撃者Aより、Sの部分集合の族S*を受け取り、
- Kpriv ← Keygen()
- V ∈ S* : IV ← BuildIndex(V, Kpriv)
- { (V, IV) }V∈S* をAに渡す。
- 以下をAが望むだけ複数回繰り返す: ※ トラップドアクエリ
- 攻撃者Aがワードxについてトラップドアを要求したら、
- Tx ← Trapdoor(Kpriv, x) を計算し、返す。
- 攻撃者Aより2つの文書V0, V1 を受け取り、 ※ チャレンジクエリ
- V0∈S*、V1∈S*、V0 not⊆ V1、V1 not⊆ V0 を確認する。
- AはまだV0とV1の対称差に含まれるワードのトラップドアを要求していないことを確認する。
- b ← {0,1}、 IVb ← BuildIndex(Vb, Kpriv)
- IVbを返す。
- 以下をAが望むだけ複数回繰り返す: ※ トラップドアクエリ
- 攻撃者Aがワードxについてトラップドアを要求したら、
- x が V0とV1の対称差に含まれないことを確認する。
- Tx ← Trapdoor(Kpriv, x) を計算し、返す。
- Aはb'を出力して停止する。
攻撃者Aのアドバンテージ:
- AdvA =def | Pr[b=b'] - 1/2 |
※ トラップドアTxがワードxを隠すかどうかは考慮されていない。
定義 (IND-CKA)
インデックス・スキーム I = (Keygen, Trapdoor, BuildIndex, SearchIndex)が適応的選択キーワード攻撃に対し識別不可能(IND-CKA)であるとは、どのような効率的な攻撃者Aについても上記のゲームにおけるアドバンテージAdvAが無視可能であることを云う。
セキュア・インデックスの構成
ブルーム・フィルター
機能:
- 与えれたaが、集合S= {s1, ・・・, sn}に属するか否かを、o(n)の計算量で、判定する。
準備:
- パラメータ m, r
- mビットのアレイ α
- r個の独立なハッシュ関数 h1, ・・・, hr
- hi : {0,1}* → [1..m] (i = 1,...,r)
動作:
- すべてのアレイビットを0に初期化:
- s ∈ S :
- α[h1(s)] = ・・・ = α[hr(s)] = 1
- a ∈ S かどうかを判定するのに
- αをビット位置 h1(a), ・・・ , hr(a)でチェック
- それらがすべて1ならば、a ∈ Sと判定する。
※ フォース・ポジティブの確率あり。
インデックス・スキーム Z-IDX
部品
擬似ランダム関数 f : {0,1}s x {0,1}n → {0,1}s
Keygen (s) :
- return Kpriv = (k1, ... , kr) ← {0,1}sr
Trapdoor (Kpriv, w) :
- return Tw = (f(k1, w), ... , f(kr, w))).
BuildIndex (D=(idD, (w1, ... , wt))) :
- // 簡単のため、対象文書Dのワード数tは一定であるとする。
- ブルーム・フィルターBFを用意
- i∈[1..t] :
- x1 = f(k1, wi), ... , xr = f(kr, wi)
- y1 = f(x1, idD), ... , yr = f(xr, idD)
- ブルーム・フィルターBFのアレイのビット位置y1, ... , yrを1にセット。
- return (idD, BF)
SearchIndex ( Tw=(x1, ... , xr), I = (idD, BF) ) :
- y1 = f(x1, idD), ... , yr = f(xr, idD)
- BFがビット位置y1, ... , yrですべて1であるか否かをチェック。
- そうならば1を、そうでないならば0を出力。
スキームの観察
- ブルーム・フィルターで用いるハッシュ関数を鍵付きのハッシュ関数とし、その鍵をマスターシークレットとした。
- 鍵付きのハッシュ関数を擬似ランダム関数で実現すれば、インデックスはランダム値となるので、文書の内容を隠す。
- ただし、トラップドアを実現するために、擬似ランダム関数の使い方に無理が生じている。
- 後半の使い方(yi = f(xi, idD))に注意を要する。論文の証明は不十分と思われる。
- シードが既知の乱数のときの、擬似ランダム関数の値の分布が問題となりそう。
- 統計的な安全性の議論が必要となるのでは?
定理 (セキュアインデックス)
関数fが擬似ランダム関数ならば、インデックス・スキーム Z-IDXは、選択キーワード攻撃に対し識別不可能である。
証明について
上に見たように、論文の証明にはギャップがある。関数fについてもっと強い仮定が必要だろうと思われる。
検索可能公開鍵暗号
ワードWのトラップドアがあれば、暗号文SがワードWを暗号化したものか否かがわかる
公開鍵暗号。
検索可能公開鍵暗号スキーム
PEKS = (KeyGen, PEKS, Trapdoor, Test):
- (Apub, Apriv) ← KeyGen(s)
- S ← PEKS(Apub, W)
- TW ← Trapdoor(Apriv, W)
- 1/0 ← Test(Apub, S, TW)
完全性 (completness)
(Apub, Apriv) ← KeyGen(s),
∀W, S ← PEKS(Apub, W), TW ← Trapdoor(Kpriv, W)
- Test(Apub, S, TW) = ( SはWの暗号文? ).
検索可能公開鍵暗号の安全性
どのような攻撃者も、いくつかのワードのトラップドアを適応的に入手したとしても、そのほかのワードの暗号文については、どんなワードの暗号化か全く分からないこと。
ゲーム
- (Apub, Apriv) ← KeyGen(s)
- Apubを入力として攻撃者Aを起動する。
- Aが望むだけ以下を複数回繰り返す: ※ トラップドアクエリ
- 攻撃者AがワードWについてトラップドアを要求したら、
- TW ← Trapdoor(Apriv, W) を計算して返す。
- 攻撃者Aより2つのワードW0, W1 を受け取り、 ※ チャレンジクエリ
- b ← {0,1}、 S ← PEKS(Apub, Wb)
- Sを返す。
- Aが望むだけ以下を複数回繰り返す: ※ トラップドアクエリ
- 攻撃者AがワードWについてトラップドアを要求したら、
- W が W0やW1とは異なることを確認する。
- TW ← Trapdoor(Apriv, W) を計算して返す。
- Aはb'を出力して停止する。
攻撃者Aのアドバンテージ:
- AdvA(s) =def | Pr[b=b'] - 1/2 |
定義 (IND-CKA)
検索可能公開鍵暗号 PEKS = (KeyGen, PEKS, Trapdoor, Test)が適応的選択キーワード攻撃に対し識別不可能(IND-CKA)であるとは、どのような効率的な攻撃者Aについても上記のゲームにおけるアドバンテージAdvA(s)が無視可能であることを云う。
検索可能公開鍵暗号の構成
双線形写像を用いた構成
PEKS = (KeyGen, PEKS, Trapdoor, Test)
部品
- 双線形写像 e : G1 x G1 → G2, #G1 = #G2 = 素数p
- ハッシュ関数 H1 : {0,1}* → G1
- ハッシュ関数 H2 : G2 → {0,1}log p
KeyGen
- α ← Zp*, g ← G1の生成元
- return Apub = (g, h = gα), Apriv = α.
PEKS (Apub, W) :
- r ← Zp*
- return (gr, H2( e(H1(W), hr) )).
Trapdoor(Apriv = α, W) :
Test(Apub, S=(A,B), TW) :
- return H2(e(TW, A)) =? B.
スキームの観察
- Wの暗号文は、(gr, H2(e(H1(W), gαr)))
- よって、H1(W) = gβ とするとき、e(g, g)αβrが問題。
- 一方、トラップドアオラクルは、H1(W) = gβとするとき、gαβを返す。
定理 (PEKS)
双線形ディフィー・ヘルマン仮定が成り立つならば、ランダムオラクルモデルのもとで、PEKSは適応的選択キーワード攻撃に対し識別不可能(IND-CKA)である。
双線形ディフィー・ヘルマン仮定
g, ga, gb, gcを与えらて、e(g,g)a,b,cを計算することは困難。
証明について
- 上でみたようにH1オラクルのシミュレーションがポイント。
- 適切な確率で、
- 問題文gbを返答に埋め込む → チャレンジクエリへの応答
- 自ら生成した乱数aを用いて、gaを返答する。 → トラップドアクエリへの応答
- [Goh 03]
- [BCOP 04]
- [ABCKKLMNPS 05]
- [CGKO 06]
最終更新:2011年05月02日 12:45