定理(ツリー署名)の証明のアイデア

メッセージ m = m1 ・・・mn の、vk = vkεに関するツリー署名は
  • σ = <<σm|i, vkm|i,0, vkm|i,1>i=0..(n-1), σm>.

ツリー署名の構成より、各ノードm|iに格納される署名はただ一通り、σm|i
よって、偽造者Fが何度署名オラクルから署名を得たとしても、
偽造者Fは各ノードについてはただ一通りの署名しか得られない。

よって、各ノードm|iの署名はワンタイム署名で十分。

定理(ツリー署名)の証明

ツリー署名Ω'=(Gen',Sign',Verify') に対する任意の効率的な偽造者をFとする。
Fが発する署名クエリー回数の上限をl*とし、l = 2nl* + 1 とする
( l は、Fに対する署名オラクルのシミュレーション時に、生成する必要のあるワンタイム署名の検証鍵数の上限)。
偽造者Fを用いてワンタイム署名Ω=(Gen,Sign,Verify) の偽造者Gを構成する。

偽造者G: vk を入力として、
  • i* ← [1..l], vki* = vk
  • i ∈ [1..l], i≠i* : (vki, ski) ← Gen
  • vkε = vk1 を入力として偽造者Fを起動:
    • Fから署名オラクルに対する問い合わせ m' を受け取ったら、
      • 各 i ∈ [0..(n-1)] について: ※ n = len(m')
        • ノードm'|iにまだ署名が格納されていなければ、
          • vkm'|i,0, vkm'|i,1 ← まだ用いていない、つぎの2つの vkj, vkj+1
          • vkm'|iが vkl (l≠i*) に対応していたら、σm'|i ← Sign(skl, vkm'|i,0||vkm'|i,1)
          • else vkm'|i,0||vkm'|i,1 を自身の署名オラクルに問い合わせ、σm'|iをえる。
          • ノードm'|iに <σm'|i, vkm'|i,0, vkm'|i,1>を格納。
        • ノードm' にまだ署名が格納されていなければ、
          • 上と同様にして、vkm'についてのメッセージm'の署名σm'を計算し、ノードm'に格納。
  • Fが出力(m, σ* = <<σ*m|i, vk*m|i,0, vk*m|i,1>i=0..(n-1), σ*m>)で停止したら、
    • ∃j ∈ [0..(n-1)],  vk*m|j,0 ≠ vkm|j,0 OR vk*m|j,1 ≠ vkm|j,1 :
      • インデックス j ← [そのような j のうち最小の j]
      • インデックス i ← [vki = vk*m|j (= vkm|j) となる i]
      • i = i* : (vk*m|j,0||vk*m|j,1, σ*m|j)を出力して停止。
    • else  ※ vk*m = vkm
      • インデックス i ← [vki = vk*m となる i]
      • i = i* : (m, σ*m)を出力して停止。

偽造者Gの解析
Gの構成より、
  • Gは署名オラクルを高々一回しか使っていない。
  • Gによる、Fに対するシミュレーションは完ぺき。
  • i* はランダムでFのviewには属しない。i* = i ならば、Gは偽造に成功。
よって、
  • Pr[Gが偽造に成功] = (1/l) Pr[Fが偽造に成功].
仮定より、左辺はネグリジブルなので、Pr[Fが偽造に成功]もネグリジブル。

Q.E.D.

















最終更新:2009年10月19日 18:58