定理(CPA暗号)の証明のアイデア
構成(CPA暗号)の暗号文は、
- c = (m + (hci(fil-1(r)), hci(fil-2(r)), ..., hc(r)), fil(r)).
(hci(fil-1(r)), hci(fil-2(r)), ..., hc(r),fil(r))は、
真の乱数(p, s) と区別がつかない。(p,sはそれぞれlビット、nビット)
よって、cは
と区別がつかない。
c'は完全にmを隠しているので、cも(効率的な攻撃者に対しは)mを隠す。
定理(CPA暗号)の証明
構成(CPA暗号)をΠとし、Πに対する任意の効率的な攻撃者をAとする。
Aの成功確率 | Pr[CPAΠ,A(n) = 1] - 1/2 | がネグリジブルであることを示したい。
まず、Game G0を定義する。Game G0は、試行 CPAΠ,A(n)をΠ=構成(CPA暗号)として具体化したものである:
Game G0:
- (pk, sk) = (i, ti) ← G(1n)
- pk=iを入力としてAを起動する。
- Aから同じ長さlの2つのメッセージからなるチャレンジクエリ(m0,m1)を受け取ったら、
- 0または1をランダムに選択し、bとする。
- mbをpkで暗号化し、c*をえる:
- r ← {0,1}n
- fi(r), fi2(r), ..., fil(r) を計算。
- p = ( hci(fil-1(r)), hci(fil-2(r)), ..., hc(r) )
- c* = (mb + p, fil(r))
- c*をチャレンジクエリに対する応答として返す。
- Aが出力b'で終了したら、b =? b' の1ビットを出力とする。
Game G1では、Game G0で疑似乱数であるpを真の乱数に変更する:
Game G1:
- (pk, sk) = (i, ti) ← G(1n)
- pk=iを入力としてAを起動する。
- Aから同じ長さlの2つのメッセージからなるチャレンジクエリ(m0,m1)を受け取ったら、
- 0または1をランダムに選択し、bとする。
- mbをpkで暗号化し、c*をえる:
- r ← {0,1}n
- p ← {0,1}l
- c* = (mb + p, r)
- c*をチャレンジクエリに対する応答として返す。
- Aが出力b'で終了したら、b =? b' の1ビットを出力とする。
主張1
Pr[ G1 = 1] = 1/2.
証明 pが真にランダムなので、c* = (mb + p, r) は、b=0のときも b=1のときも、(l+n)ビットの乱数である。
よって、Aのview(Aが入手するすべての情報)はbと統計的に独立である。
よって、Aの出力もbと統計的に独立なので、b = b' となる確率は1/2である。Q.E.D.
主張2

Pr[G
1 = 1] - Pr[G
0= 1]

はネグリジブルである。
証明 攻撃者Aを用いて、構成(
PSG3)の疑似乱数生成器Gに対する識別者Dを構成する:
識別者D: 長さ(n+l)ビットの文字列(w, p)を入力として、インデックスiを補助入力として、
- pk=iを入力としてAを起動する。
- Aから同じ長さlの2つのメッセージからなるチャレンジクエリ(m0,m1)を受け取ったら、
- 0または1をランダムに選択し、bとする。
- mbをpkで暗号化し、c*をえる:
- c*をチャレンジクエリに対する応答として返す。
- Aが出力b'で終了したら、b =? b' の1ビットを出力とする。
[識別者Dの解析]:
- 入力(w,p)が疑似乱数(fil(r), hci(fil-1(r)), hci(fil-2(r)), ..., hc(r))のとき、
- (識別者D内のAが受け取るc*) ≡ (G0におけるc*)
- 入力(w,p)が真のn+lビット乱数のとき、
- (識別者D内のAが受け取るc*) ≡ (G1におけるc*)
よって、識別者Dの識別利得は
- | Pr[G1(1n) = 1] - Pr[G0(1n) = 1] |
に等しく、Gは疑似乱数生成器なので、これはネグリジブルである。Q.E.D.
主張1より、
- | Pr[CPAΠ,A(n) = 1] - 1/2 | = |Pr[G0 = 1] - Pr[G1 = 1] |
であり、主張2よりこれはネグリジブルである。
Q.E.D.
最終更新:2009年10月03日 17:58