一方向関数


順方向は効率的に計算できるが、逆方向は決して効率的に計算できない関数を一方向関数という。
すなわち、

定義(一方向関数)
関数 f: {0,1}* → {0,1}* が一方向関数であるとは、
  • ある効率的なアルゴリズムMがあって、どのようなxについてもM(x) = f(x).
  • どのような効率的なアルゴリズムAについても、その成功確率
    • Pr[ x ← {0,1}n, x' ← A(1n, f(x)) : f(x') = f(x) ]
  • がネグリジブル
であることをいう。

定義(RSA仮定)
どのような効率的なアルゴリズムAについても、確率
  • Pr[ (N, e, d) ← GenRSA(1n), x ← ZN*, y = xe mod N : A(N, e, y) = x ]
は(nについて)ネグリジブルである、という仮定をアルゴリズムGenRSAに関するRSA仮定と呼ぶ。

RSA仮定のもとで、RSA関数 fe,N(x) = xe mod N は一方向関数である。

定義(離散対数仮定)
どのような効率的なアルゴリズムAについても、確率
  • Pr[ (q, g) ← GenG(1n), x ← Zq, y = gx : A(q, g, y) = x ]
は(nについて)ネグリジブルである、という仮定をアルゴリズムGenGに関する離散対数仮定と呼ぶ。

離散対数仮定のもとで、離散指数関数 fq,g(x) = gx は一方向関数である。

疑似乱数生成器


真の乱数をそれより長い疑似的な乱数に拡大する効率的な変換を疑似乱数生成器と呼ぶ。
すなわち、

定義
l(n)をnの多項式とする。
関数G : {0,1}n → {0,1}l(n)疑似乱数生成器であるとは、
  • ある効率的なアルゴリズムMがあって、どのようなsについてもM(s) = G(s)であり、
  • 任意の効率的なアルゴリズムDについて、その識別利得
    • | Pr[r ← {0,1}l(n) : D(r) = 1] - Pr[s ← {0,1}n : D(G(s)) = 1] |
  • はネグリジブル
であることをいう。

  • 上のl(n)を拡大因子とよぶ。
  • Gが疑似乱数生成器ならばGは一方向関数である。

ハードコア述語


一方向関数fが確実に隠す、原像の1ビットをハードコア述語という。すなわち、

定義
述語hc : {0,1}* → {0,1} が(一方向)関数f : {0,1}* → {0,1}* のハードコア述語であるとは、
  • ある効率的なアルゴリズムMがあって、どのようなxについてもM(x) = hc(x)であり、
  • 任意の効率的なアルゴリズムAについて、その識別利得
    • | Pr[x ← {0,1}n : A(f(x)) = hc(x)] - 1/2 |
  • はネグリジブルであることをいう。

  • 関数fがハードコア述語をもてば、fは一方向関数。

ハードコア述語の存在

ジェネリックケース
一方向関数の原像のランダムビットの総和はそのハードコア述語である。
すなわち、

定理 (Goldreich-Levin) [GL 89]
f:{0,1}n → {0,1}n を一方向関数とする。
このとき、g(x,r) = (f(x), r)も一方向関数となるが、
  • gl(x,r) = Σi=1..n(xi ri)
はそのハードコア述語である。


一方向関数が存在するならば、ハードコア述語をもつ一方向関数が存在する。

RSA関数のハードコア
RSA仮定のもとで、パリティはRSA関数のハードコア述語である:
  • パリティ Lsb(x) =def xの最下位ビット.

定理(RSA-HC1)
(n, e, d) ← GenRSA(1k) とする。
ある確定的なPTアルゴリズムA1があって、任意のx ∈ Zn*, y = xe mod n について
  • A1(n, e, y) = Lsb(x)
ならば、ある確定的なPTアルゴリズムA2があって、任意のx ∈ Zn*, y = xe mod n について
  • A2(n, e, y) = x
である。


定理(RSA-HC2)
あるPPTアルゴリズムA1とある多項式ξがあって、
  • Pr[ x ← Zn*, y = xe mod n : A1(n, e, y) = Lsb(x) ] ≧ (1/2) + (1/ξ(l))
ならば(l=|n|)、あるPPTアルゴリズムA2とある正の定数cがあって、
  • Pr[ x ← Zn*, y = xe mod n : A2(n, e, y) = x ] ≧ c
である。


離散指数関数のハードコア
gを素数pを法とする原始元とする。離散対数仮定のもとで、最上位ビットは、離散指数関数fp-1,g(x) = gx mod pのハードコア述語である。ここで、離散対数xの最上位ビットとは、xが(p-1)/2以上であるか否かを表す。
(ヒント: h = gxl...x1x0に対し、(h g-x0)1/2 = g0xl...x1。ここで、1/2乗の符号が問題。)

疑似乱数生成器の存在


一方向置換とそのハードコア述語によって、真の乱数を、それより1ビットだけ長い疑似乱数に変換することができる。
すなわち、

定理(PSG)
f : {0,1}n→{0,1}n を一方向置換とし、hcをそのハードコア述語とするならば、
関数G(s) = (f(s), hc(s))は拡大因子l(n)=n+1の疑似乱数生成器である。


1ビットさえ長くできれば、それを繰り返すことによって、いくらでも長い疑似乱数を生成することができる。
すなわち、

構成(PSG2)
G0 : 拡大因子l0(n)=n+1の疑似乱数生成器
p(n): nより大きい任意の多項式, p'(n) := p(n) - n

G: s (∈{0,1}n) を入力として、     /* 先頭nビットに繰り返しG0を適用する */
  • s0 = s
  • i ∈ [1..p'(n)] :
    • (s'i-1, σi-1) = si-1      /* s'i-1はsi-1の先頭nビットをとる */
    • si = (G0(s'i-1), σi-1)      /* siはn+iビットとなる */
  • return sp'(n)

定理(PSG2)
p(n)をnより大きい任意の多項式とする。
G0が拡大因子l0(n)=n+1の疑似乱数生成器ならば、
構成(PSG2)のGは、多項式p(n)を拡大因子l(n)とする疑似乱数生成器である。


定理(PSG1)と定理(PSG2)より、以下の構成(PSG3)の G: {0,1}n → {0,1}p(n) は疑似乱数生成器である。

構成(PSG3)
p(n): nより大きい任意の多項式, p'(n) := p(n) - n
f : {0,1}n → {0,1}n : 一方向置換
hc : {0,1}n → {0,1} : fのハードコア述語
  • G(s) = (fp'(n)(s), hc(fp'(n)-1(s)), ..., hc(s))

  • 以上より、一方向置換が存在するならば、疑似乱数生成器が存在することがわかった。
  • 一方向関数が存在するならば、疑似乱数生成器が存在することが示されている。

疑似ランダム関数


ある関数が、その入力値と出力値の組み合わせからは、ランダム関数と区別できないとき、それを疑似ランダム関数という。
すなわち、

定義
F : {0,1}* x {0,1}* → {0,1}* を効率的に計算可能で、長さ保存の、鍵付き関数であるとする。
Fが疑似ランダム関数であるとは、
  • 任意の効率的なアルゴリズムDについて、その識別利得
    • | Pr[k ← {0,1}n : DF(k,・)(1n) = 1] - Pr[f ← Fnc(n,n) : Df(・)(1n) = 1] |
  • がネグリジブル
であることをいう。ここで、Fnc(n,n)はnビット入力nビット出力のすべての関数の集合を表す。

真の乱数の長さを2倍にする疑似乱数生成器があれば、疑似ランダム関数を構成できる。
すなわち、

構成(PSF)
拡大因子l(n)=2nの疑似乱数生成器G=(G0,G1)を用いて、鍵付き関数Fを構成する:
  • k ∈ {0,1}n について
  • F(k, (x1,x2,・・・,xn)) =def Gx_n(・・・(Gx_2(Gx_1(k)))・・・).

構成(PSF)はnビット入力x=(x1,x2,・・・,xn)に対し、レベルnの2分木を構成し各ノードにGを用いて疑似乱数を割り当てている。
ラベルxをもつ葉ノードに割り当てられた疑似乱数がF(k,・)のxにおける値となる。

定理(PSF)
Gが拡大因子l(n)=2nの疑似乱数生成器ならば、構成(PSF)の鍵付き関数Fは疑似ランダム関数である。





















最終更新:2012年09月18日 17:25