如何寫好Simulation證明(一): 語義安全

神龙小虾發表於2024-05-09

密碼學中很多證明需要用到Simulation, 尤其是ZK, MPC等等. 對於初學者來說, 涉及Simulation的證明往往不容易理解, 更別說自己獨立證明, 所以有必要學習一下如何寫這樣的證明.
文章主要參考Yehuda Lindell的講義: How to simulate it.

1. Introduction

什麼是Simulation? 中文翻譯成模擬. 在證明中, 我們需要用Simulation去說明, 某件事在"真實世界"和"理想世界"中是差不多的. 理想世界就是secure by definition, 是安全性定義裡的安全.

舉個例子, 語義安全性(semantic security)中, 要求接收到密文的敵手和什麼都沒有接收到的敵手學到的東西一樣. 後者就是理想世界. 顯然理想世界中的敵手學到的東西為0, 所以實際上需要證明的東西就是現實世界中敵手學到的東西為0. 可能會有人覺得這樣定義很冗餘. 但是事實上這樣的定義能夠formal地說明, 現實世界的敵手"learned nothing".

2. The Basic Paradigm: Semantic Security

基於複雜性的密碼學就誕生於Semantic Security的定義. 這個定義形式化的表達了"nothing be learned".

2.1 定義

在給出定義前, 我們先做一些解釋. 這個定義允許敵手在之前獲得一些額外的關於明文的訊息 \(h\) (可能是透過各種方式洩露出去的), 增強定義的魯棒性.

語義安全性的正式定義如下:

現在有對稱加密方案 \((G, E, D)\), 若對於任意的 nuPPT \(\mathcal A\), 都存在 nuPPT \(\mathcal A'\), 使得對於任意的prob. ensemble \(\{X_n\}_n\), \(|X_n| < poly(n)\), 對於任意的 poly-bound 函式 \(f, h\), 所有多項式 \(p()\), 當 \(n\) 足夠大時, 下面的不等式成立, 則該方案是語義安全的.

\[\begin{aligned} &\Pr_{k \gets G(1^n)} [\mathcal{A}(1^n,E_k(X_n),1^{|X_n|},h(1^n,X_n))=f(1^n,X_n)] \\ <&\Pr\Big[\mathcal{A}'(1^n,1^{|X_n|},h(1^n,X_n))=f(1^n,X_n)\Big]+\frac{1}{p(n)}. \end{aligned} \]

定義中涉及符號比較多, 我們簡單解釋一下. \(\mathcal A\) 是獲得了密文的敵手, 它的輸入中有 \(E_k(X_n)\). \(\mathcal A'\) 是沒有獲得密文的人, 輸入為明文 \(X_n\) 的長度. 其中函式 \(h\) 表示的是一些附加資訊. \(\mathcal A\)\(\mathcal A'\) 都分別嘗試去猜函式 \(f(1^n,X_n)\) 的值, 要求他們猜的結果是幾乎一樣的.

2.2 分析

我們對語義安全性的定義進行分析. 雖然定義中並沒有明確提出Simulation, Real world這些字眼, 但是實際上暗含了這個意思. 我們想 \(\mathcal A'\) 其實就是理想世界, 他獲得的東西只有 \(h\)\(X_n\) 的長度. 所以他能學到的知識就是從這兩個東西中來的. 而 \(\mathcal A\) 就是真實世界, 他們兩個學到知識的比較, 其實就是real world 與 ideal world的比較.

下面我們看如何使用定義證明一個加密方案是語義安全的. 主要的問題就是如何構造一個 \(\mathcal A'\), 與 \(\mathcal A\) 以幾乎相同的機率輸出 \(f(1^n, X_n)\). 方法就是讓 \(\mathcal A'\) simulate \(\mathcal A\) 的執行, 然後輸出 \(\mathcal A\) 的輸出. 但還有一個問題, 就是 \(\mathcal A\) 真的接收到了一個密文, 但是顯然 \(\mathcal A'\) 是沒有的. 解決方法是 \(\mathcal A\) 餵給 \(\mathcal A\) 一堆垃圾. 下面是具體的模擬.

Simulator \(\mathcal A'\) with input \((1^n,1^{|X_n|},h(1^n,X_n))\):

  1. Run \(G(1^n)\) to get \(k\)(secret key).
  2. Compute \(c = E_k(0^{|X_n|})\).
  3. Run \(\mathcal A(1^n, c,h(1^n,X_n))\) and output what \(\mathcal A\) outputs.

這個simulation可行的前提是: 該加密方案是indistinguishable的. 這樣的話 \(\mathcal A\) 無論是收到什麼訊息的加密, 輸出都是一樣的. 否則 \(\mathcal A\) 就能區分訊息的加密了.

2.3 總結

這個證明實際上是一個典型的simulation proof. 我們透過構造一個模擬器simulator, 他的內部呼叫敵手執行敵手的程式. 然後證明這個simulator的輸出和敵手的輸出是不可區分的. 在這個例子中, 我們讓simulator給敵手一堆不可區分的垃圾, 以此完成構造.

相關文章