セキュア・インデックス


セキュア・インデックスの機能

セキュア・インデックスとは、文書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に初期化:
    • h ∈ [1..m] : α[h] = 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) :
  • return TW = H1(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