Pseudo Random Generator
真的隨機性是要求很強的東西,上一章是對安全性的適當弱化,而這一章就是對隨機性的適當弱化,使得我們可以得到一個“不那么隨機但是可以當成隨機數用的隨機數”
也就是偽隨機性
定義
這里的隨機性指的是一個比特串的分布的隨機性,通常用 \(\text{Dist}\) 表示
為了使用,這個分布通常是計算出來的,即有一個多項式確定性算法 \(G\),可以通過一個真隨機種子 \(s\) 得到一個偽隨機串 \(G(s)\)
通常我們要求 \(G(s)\) 的輸出要比輸入長(否則一個平凡的偽隨機函數可以取 \(G(s)=s\),這沒有意義;),因為在前面我們知道OTP的一大缺陷就在於雙方需要共享很長(與密文等長)的秘鑰。假若我們可以通過 \(G(\cdot)\) 和一個較短的真隨機數 \(s\) 來獲得一個較長的(和密文等長)的比特串,那么就可以部分解決OTP的問題了
我們稱一個 \(G(\cdot)\) 是偽隨機函數,當且僅當對於任意PPT的算法 \(D\),都有 \(|Pr\left[D(G(s))=1\right]-Pr[D(r)=1]|\leqslant\text{negl}(n)\),這里 \(r\) 是一個真隨機串,其中 \(D\) 輸出 \(1\) 表示算法認為這是一個偽隨機函數。
這個式子的含義是:如果任何高效的算法都無法以一個大於 \(\text{negl}\) 的概率區分出我們的\(G(\cdot)\)和真隨機的比特串,那么我們就可以認為這個生成器有比較好的隨機性——即偽隨機性
注意到定義中我們沒有對偽隨機生成函數做出任何行為上的定義,即這樣的函數其實是理想的模型,定義並不是構造的。通常我們可以認為目前已有的一些隨機數生成器具有PRG的性質,即"某樣東西是PRG"屬於安全性證明前提中的假設部分
實現
具體的典型PRG實現一般通過一個有限狀態自動機來完成,即我們的每一步構造其實都是確定性的,但是每一步都依賴於隨機種子 \(s\)
一類比較經典的PRG其實可以生成任意長的比特串,然后再根據需要連續截取來獲得不同的隨機串
應用
如果把OTP的真隨機變成這里的PRG,那么就可以得到一個Computationally Secure的加密策略。注意到與原本需要共享與明文等長的key不同,此處只需要雙方共享PRG的key,而根據PRG的定義這個key是要比明文的長度短的。這樣就通過犧牲一些安全性(多了一個\(\text{negl}\))解決了key太長的問題
Multiple Encryptions
前面的EAV-secure都是基於一個假設的:每次通訊只會傳輸一條密文。這個假設顯然是不夠強的——我們肯定會有多條消息傳輸的需求,在這種情況下,之前的某些安全加密策略就變得不安全了
同樣先定義一個游戲 \(Priv^\text{mult}_{\mathcal A,\Pi}(n)\) 如下:
- 首先生成一個key
 - \(\mathcal A\) 給出兩條明文向量 \(\vec{m_0},\vec{m_1}\)
 - Challenger隨機一個比特 \(b\),把 \(\vec{c_b}\) 發回給 \(\mathcal A\)
 - \(\mathcal A\) 來猜 \(b\)
 
如果 \(Pr[Priv^\text{mult}_{\mathcal A,\Pi}(n)=1]\leqslant\dfrac1 2+\text{negl}(n)\),那么就稱策略 \(\Pi\) 是mult-secure的(這個詞是我自己發明的....囧)
一個很重要的觀察是,如果加密算法是確定性的,那么這個策略一定不是mult-secure的,攻擊構造如下:
- \(\mathcal A\) 只需要給出 \(\vec{m_0}=(M_1,M_1)\),\(\vec{m_1}=(M_1,M_2)\),其中 \(M_1\neq M_2\)
 - 對於接收到的 \(\vec{c_b}=(C_1,C_2)\),若 \(C_1=C_2\) 就猜 \(b=0\),否則猜 \(b=1\)
 
用這個 \(\mathcal A\) 去玩上面的游戲正確率是\(1\),因此這個策略不是mult-secure的。我們還可以發現前面講過的弱化OTP也是確定性的,因此做不到mult-secure
這提醒我們要給加密算法引入隨機性,引入隨機性的方法就是PRF
Pseudo random Functions
首先要引入functionality的概念,即一個概率的函數。對於函數 \(\hat F\),若對於某輸入 \(x\) 而言,其結果 \(\hat F(x)\) 滿足某概率分布,那么我們就稱其為一個 functionality。可以發現傳統的definite function也是一類特殊的functionality
所謂PRF類似PRG,就是期望通過一類確定性的算法來模擬出隨機函數的行為。因此概率的引入就全部在於密鑰 \(k\) 了
也就是說我們有一個函數的集合(A family of functions) \(Func\),我們可以通過一個密鑰 \(k\) 來實例化出一個具體的函數 \(F_k\),這是一個確定性的函數。
由於 \(k\) 是完全隨機的,所以在Adversary 眼中 \(F_k\) 的行為也應該是完全隨機的。但是因為我們的生成算法是多項式的,因此 \(|Func|\) 也是多項式的,即 \(Func\) 只能做到非常有限的采樣,因此 \(F_k\) 又不可能是完全隨機的(這一段要體會一下)
我們稱一個函數集(族)是偽隨機函數當且僅當對於任意PPT的算法 \(D\),都有 \(\left|Pr\left[D^{F_k(\cdot)}(1^n)=1\right]-Pr\left[D^{f(\cdot)}(1^n)=1\right]\right|\leqslant\text{negl}(n)\) 成立。其中 \(D\) 輸出 \(1\) 表示算法猜這是一個偽隨機函數
這個式子的隨機性引入來自兩方面:1. \(k\) 的選取 2. \(f\) 是一個真隨機函數
這里之所以把 \(F\) 寫在右上角是習慣問題,意思是 \(D\) 不需要自己計算函數值,而是通過訪問我們人為提供的oracle(諭示機,這名字好屌)來瞬間得到答案
這么做是因為如果我們把某個函數作為參數傳入,則可能會需要處理指數級的信息,這與多項式時間復雜度是矛盾的。
實現
對PRG進行定長采樣就可以得到一個PRF了
應用
可以構造如下加密策略:
- \(\text{Enc}(m)\) 會隨機生成一個 \(r\),然后把 \(\left<r,m\oplus F_k(r)\right>\) 作為密文輸出
 - \(\text{Dec}(\left<r,c\right>)\) 則通過計算 \(c\oplus F_k(r)=m\oplus F_k(r)\oplus F_k(r)=m\) 就能得到明文
 
這個策略的安全性的保障在於,對於Adversary而言 \(k\) 是未知的,而 \(F\) 是PRF。要證明也很簡單,只需要把 PRF換成真隨機函數,這樣就可以確保 \(\mathcal A\) 只有 \(\dfrac12\) 的成功率(why?),而一個能有效攻擊PRF策略的算法,必然也能用於有效區分PRF和真隨機函數(證明這一點需要構造一下),這與PRF的定義矛盾,因此是不存在這樣的策略的。
Weakly Pseudo random Function
密碼學的一個套路就是先引入一個問題,然后通過實踐或者需求來強化/弱化某些條件,再猜想/證明這些情況下的構造仍然具有一些良好的性質
所謂Weakly Pseudo random的意思就是,對於任意的PPT算法 \(D\),都有 \(\left|Pr\left[D^{F_k^\$(\cdot)}(1^n)=1\right]-Pr\left[D^{f^\$(\cdot)}(1^n)=1\right]\right|\leqslant\text{negl}(n)\) 對任意的 \(\text{negl}(n)\) 成立
和PRF的區別在於,這里我們給 \(D\) 的是一個概率oracle,即每次 \(D\) 向oracle查詢的時候,會由oracle生成一個隨機數 \(r\),然后把 \(\left<r,F(r)\right>\) 給 \(D\)
意思是雖然 \(D\) 有能力知道一些 \(F\) 的取值,但是具體取到哪些 \(x\) 並不由 \(D\) 決定
有一個定理:一個PRF一定是WPRF,但反之不一定成立。證明比較簡單,因為是課后習題所以不放具體證明了
一個經典的構造如下:如果我們有一個PRF \(F\),那么我們就可以構造一個WPRF \(F'(x)=\left\{\begin{aligned}F(y)&,&x=y||0\\F(y)&,&x=y||1\end{aligned}\right.\)
根據這個例子可以發現,構造同樣長度的PRF要比WPRF簡單的多,因為我們只需要一個更短的PRF就可以弱化得到一個更長的WPRF了
