Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

完全秘匿性を持つ暗号の鍵と平文のサイズの定理とLean4での形式化

 

今回は完全秘匿性の話題に戻り、シャノンの論文でも証明されている、鍵の集合$K$と平文の集合$M$の大きさに関する定理をLean4で形式化して証明します。

https://tcc.c.titech.ac.jp/yasunaga/appmath6/perfect.pdf

では定理6として述べられている次の定理です。

定理 6 (Shannon の定理) 秘密鍵暗号方式 $(M, K,Gen, Enc, Dec)$ が完全秘匿であるならば,$|K| \ge |M|$.

平文集合$M$も鍵集合$K$もそれぞれ一定の長さのビット列からなるとすると、鍵の長さの方が平文の長さよりも長い、という風にも解釈できます。

この定理の驚きは、暗号アルゴリズム$Enc, Dec$に寄らずに成り立つ、というところです。

 

PDFでは簡潔な証明が11行で述べられています。流れとしてはこんな感じです。

1. 背理法を使います。$|K| \lt |M|$として矛盾を導きます。

2. 適当に$k_0\in K$, $m_0 \in M$を選んで暗号化し$c_0 \in C$を得ます。

3. $K$の全ての鍵を使って$c_0$を復号して得られる平文の集合を$S_0$とします。この定義から$|S_0| \le |K|$です。

4. $|S_0| \le |K| \lt |M|$から$S_0$に含まれない平文があることがわかります。これを1つとって$m_1$とします。

5. $m_1$の定義から$Enc(k, m_1)=c_0$となるような$k$は存在しません。従って$Pr(k \leftarrow Gen, Enc(k, m_1)=c_0) =0$です。

6. 一方$m_0$の定義から $Pr(k \leftarrow Gen, Enc(k, m_0) =c_0) \gt 0$です。

7. これは完全秘匿性の定義式

$$ Pr(k \leftarrow Gen, Enc(k, m_0)=c_0) = Pr(k \leftarrow Gen, Enc(k, m_1)=c_0) $$

に矛盾します。

 

証明の途中で必要だったので、この定理6に2つの条件を追加してLean4では以下のように形式化してみました。

def full_support {T : Type} (A : PMF T) :Prop := ∀t:T, t∈A.support

theorem K_GE_M (Enc : K → M → C) (Dec : K → C → M) (Gen : PMF K) :
    (full_support Gen ∧ correctness Enc Dec ∧ perfect_secrecy Enc Gen)
    → Fintype.card K ≥ Fintype.card M := by

full_supportとはPMFの台となる有限型の全ての要素に0より大きい確率が定義される、という意味です。

その上で、$K\_GE\_M$という定理の意味は、与えられた暗号システム$K, M, C, Enc, Dec, Gen$が、鍵についてfull_supportであり$Enc, Dec$が正当性を満たし、$Enc, Gen$が完全秘匿性を持てば$K$の要素数$M$の要素数以上である、ということです。追加した2つの条件はGenがfull_supportであることと暗号の正当性でした。

 

Lean4による証明はほぼ上記の流れに沿っているのですが、それぞれが10行から15行くらいあり、それにプラスアルファの部分を合わせると全体は90行弱の証明になってしまいました。上記の各ステップに対応する形で概要を下記にお見せします。

 

theorem K_GE_M (Enc : K → M → C) (Dec : K → C → M) (Gen : PMF K) :
    (full_support Gen ∧ correctness Enc Dec ∧ perfect_secrecy Enc Gen)
    → Fintype.card K ≥ Fintype.card M := by

  by_contra K_M
  have m₀:M := default
  have k₀:K := default
  let c₀:C := Enc k₀ m₀

 

  let f : K → M := fun k => Dec k c₀
  -- let S₀ := {m:M | ∃k:K, m=Dec k c₀}
  let S₀ := Finset.image f Finset.univ

  ...

  obtain ⟨m₁, hm₁⟩ : ∃m₁:M, ¬ m₁ ∈ S₀ := by

  ...

  have Enc_m1_ne_c₀ : ∀ k : K, Enc k m₁ ≠ c₀ := by

  ...

  have Enc_m1_zero : (Enc_dist Enc Gen m₁) c₀ = 0 := by

  ...

  have Enc_m0_pos : (Enc_dist Enc Gen m₀) c₀ > 0 := by

  ...

  have ps := FullGen_CR_PS.2.2 m₀ m₁ c₀
  simp_all

 

1. に対応するのがby_contra K_Mです。K_Mは結論を否定したFintype.card K < Fintype.card Mとなり、仮定に付け加えられます。ゴールはFalseに変わり、なにかしら矛盾を導くことが仕事になります。

 

2. に対応するのが、
  have m₀:M := default
  have k₀:K := default
  let c₀:C := Enc k₀ m₀

の部分です。ここでは略してありますが、[Inhabited M] [Inhabited K]が宣言されており、その場合にはK, Mから元を適当に選ぶことがdefaultという関数で可能になります。

 

3. に対応するのがlet S₀ := Finset.image f Finset.univです。Finset.univはFinset.univ Kであり、その全ての元でf (c₀を復号する)を呼び出して作られるimageがS₀ です。

 

4.に対応するのが、obtain ⟨m₁, hm₁⟩ : ∃m₁:M, ¬ m₁ ∈ S₀ := by の部分です。このobtainを実行すると、仮定に m₁:Mとhm₁ : ¬ m₁ ∈ S₀が付け加えられます。

 

5. に対応するのが、have Enc_m1_zero : (Enc_dist Enc Gen m₁) c₀ = 0 := by、
6. に対応するのがhave Enc_m0_pos : (Enc_dist Enc Gen m₀) c₀ > 0 := by です。

 

7. に対応するのが have ps := FullGen_CR_PS.2.2 m₀ m₁ c₀ です。これで仮定に

ps : (Enc_dist Enc Gen m₀) c₀ = (Enc_dist Enc Gen m₁) c₀

が加わります。すでに仮定には5, 6で上式の「左辺が正、右辺がゼロ」が加わっています。そこで最後にsimp_allで矛盾が出て、証明が終了します。

 

次回はLean4による証明を全てお見せします。