定理(ツリー署名)の証明のアイデア
メッセージ 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