一、Rabin密碼體制
Rabin密碼體制是RSA密碼體制的一種,假定模數$n=pq$不能被分解,該類體制對於選擇明文攻擊是計算安全的。因此,Rabin密碼體制提供了一個可證明安全的密碼體制的例子:假定分解整數問題是整數上不可行的,那么Rabin密碼體制是安全的。
Thm1 (Rabin密碼體制)設$n=pq$,其中$p$和$q$是素數,且$p,q \equiv 3 (mod \, 4)$,設$P=C=Z^{\star}_{n}$,且定義$$\kappa =\{(n,p,q)\}$$對$K=(n,p,q)$,定義$$e_{K}(x)=x^{2} (mod \, n)$$和$$d_{K}=\sqrt{y} (mod \, n)$$ $n$為公鑰,$p$和$q$為私鑰。
注:條件$p,q \equiv 3 (mod \, 4)$可以省去,條件$P=C=Z^n_{\star}$也可以弱化為$P=C=Z^n$,只是在使用更多的限制性描述的時候,簡化了許多方面的計算和密碼體制分析。
注意看到這個函數$y=x^{2}$對於加密來說不是一個單射,所以解密不能以一種明顯的方式完成,特別的,對於$y \equiv x^{2} (mod \, n)$,對於某一個$x \in Z^{\star}_{n}$,存在$y$模$n$的是個解,除非有其他的冗余信息,否則無法確認是那一個值。
從Bob的觀點來看解密問題,它有一個密文y,要想得到x使得$$x^2 \equiv y(mod \, n)$$這是一個關於$Z_{n}$中未知元$x$的二次方程,解密需要求出模$n$的平方根,等價於求解以下兩個同余方程。$$z^{2} \equiv y (mod \, p)$$ $$z^{2} \equiv y (mod \, q)$$雖然我們可以利用Euler准則來判斷$y$是否為一個模$p$或模$q$的二次剩余。事實上,如果加密正確的執行,$y$是一個模$p$和模$q$的二次剩余,遺憾的是它並不能幫助我們找到$y$。
當$p \equiv 3(mod \, 4)$時,有一個簡單公式來計算模$p$的二次剩余的平方根,假定$y$是一個模$p$的二次剩余,且$y \equiv 3 (mod \, 4)$那么有$$\begin{align} (\pm y^{\frac {p+1}{4}})^{2} \equiv & y^{\frac{p+1}{2}} (mod \, p) \\ \equiv & y^{\frac{p-1}{2}}y (mod \, p) \\ \equiv & y(mod \, p) \\ \end{align}$$這里又一次使用了Euler准則,即當$y$是一個模$p$的二次剩余時,有$y^{\frac{p-1}{2}} \equiv 1 (mod \, p)$,因此,$y$模$p$的兩個平方根為$\pm y^{\frac{p+1}{4}} (mod \, p)$,同樣的討論可以知道,$y$模$q$的兩個平方根為$\pm y^{\frac{p+1}{4}} (mod \, q)$,再利用中國剩余定理可以得到$y$模$n$的四個平方根。
二、Rabin密碼體制的安全性
它的安全性證明使用了一個圖靈歸約,定義如下:
Def2 (圖靈歸約)假定G和H為問題,一個從G到H的圖靈歸約是一個具有如下性質的算法SolveG:
1. SolveG假定了存在某一算法SolveH求解問題H;
2. SolveG可以調用SolveH並使用它的任一輸出值,但SolveG不能對SolveH執行的實際運算做任何限定(也就是說,SolveH被看作一個黑盒子,稱為一個諭示器);
3. SolveG是一個多項式時間算法;
4. SolveG正確地求解問題G。
如果存在一個從G到H的圖靈歸約,記為$G \varpropto _{T} H$。
一個圖靈歸約$G \varpropto_{T} H$並不一定得到一個求解問題G的多項式時間算法,它實際上證明的是:如果存在一個多項式時間算法求解問題H,那么存在一個多項式時間算法求解時間G。
下面將提供圖靈歸約的一個清晰的例子,可以證明,一個解密諭示器Rabin Decrypt可以並入到一個分解模數$n$的$Las Vegas$算法中且具有至少$\frac{1}{2}$的概率,也就是說,可以得到Factoring $\varpropto_{T}$ Rabin Decryption,其中圖靈歸約本身是一個隨機算法。假定$n$是兩個不同素數$p$和$q$的乘積,那么Rabin Decryption是一個執行Rabin解密過程的諭示器,對一個給定的密文返回對應四個可能的明文中的一個。
Alg3 Rabin Oracle Factoring(n)
external Rabin Decrypt
隨機選擇一個整數$r \in Z^n_{\star}$
$y \leftarrow r^{2} (mod \, n)$
$x \leftarrow Rabin Decrypt(y)$
if $x \equiv \pm r(mod \, n)$
then return ("failure")
else
$p \leftarrow gcd(x+r , n)$
$q \leftarrow n/p$
return("n = p × q")
計算過程沒有太多問題,Rabin Decrypt(y)將返回四個可能明文中的一個作為$x$的值,有$x \equiv \pm r(mod \, n)$或者$x \equiv \pm \omega r(mod \, n)$,其中$\omega$是1模$n$的一個非平凡平方根,在第二種情形下計算$gcd(x+r,n)$一定能夠得到$p$或$q$,這就完成了$n$的分解。
剩下的一個問題是計算所有可能的隨機值$r \in Z^{\star}_{n}$的成功概率,對於一個剩余$r \in Z^{\star}_{n}$,定義$$[r] = \{ \pm r (mod \, n) \ , \ \pm \omega r (mod \, n) \}$$顯然在$[r]$中分別有兩個剩余能用算法得到相同的$y$值,且由諭示器Rabin Decrypt給出的輸出$x$值也在$[r]$中,而算法能夠成功當且僅當$x \equiv \pm \omega r (mod \, n)$,這個諭示器並不知道用四個可能的$r$值中的哪一個來構造$y$,且$r$是調用諭示器Rabin Decrypt之前隨機選擇,因此$x \equiv \pm \omega r (mod \, n)$的概率為$\frac{1}{2}$,即成功概率為$\frac{1}{2}$。
這就證明了Rabin密碼體制對選擇明文攻擊是可證明安全的,然而該體制對選擇密文攻擊是完全不安全的,因為假想的諭示器Rabin Decrypt用實際解密算法來代替,就可以攻破了密碼體制。
三、RSA的語義安全性
前面所說的所有攻破密碼體制實際上是試圖找出秘密密鑰(對稱密碼體制的情形)或者私鑰(公鑰密碼體制的情形)。然而,可能敵手的目標並沒有那么大的野心,即不能找到秘密密鑰或者私鑰,他仍可以獲得比我們所希望的更多的信息,如果要確保一個密碼體制是“安全”的,我們應該考慮這些敵手所具有的適度的目標。
完全攻破
敵手能夠找出Bob的秘密密鑰(對稱密碼體制的情形)或者私鑰(公鑰密碼體制的情形),因此,他能解密利用給定密鑰加密的任意密文。
部分攻破
敵手能以某一不可忽略的概率解密以前沒有見過的密文(無需知道密鑰),或者,敵手能夠對於給定的密文,得出明文的一些特定信息。
密文識別
敵手能夠以超過$\frac{1}{2}$的概率識別兩個給定明文對應的密文,或者識別出給定明文的密文和隨機串。
下面的內容中,我們考慮一些針對RSA類密碼體制達到上面某種類型的目的的可能攻擊,我們也描述在一定的計算假設成立的情形下如何構造一個公鑰密碼體制使得敵手不能在多項式時間內識別密文。這樣的密碼體制稱為語義安全的,為了達到這個目的是很困難的,因為是要針對非常弱的目的提供保護。
首先來討論與明文比特相關的部分信息。容易想到的是,一些關於明文的信息可以通過密文“泄露”出去,這表示對系統的一種部分攻破。假定我們給定密文$y=x^{b} (mod \, n)$,其中$x$表示明文,由於$gcd(b,\phi (n)) = 1$,必然包含了$b$為奇數的情形,因此Jacobi符號$$\lgroup \frac{y}{n} \rgroup = \lgroup \frac{x}{n} \rgroup ^ {b} = \lgroup \frac{x}{n} \rgroup $$這表明,在給定密文$y$的情況下,任何人無須解密密文就可以有效的計算$\lgroup \frac{x}{n} \rgroup$,它泄漏了關於明文的信息。
我們考慮由密碼體制泄漏的一些其他特定類型的部分信息。
1. 給定$y=e_{K}(x)$,計算$parity(y)$,其中$parity(y)$表示$x$的二進制表示的最低位數,即當$x$為偶數時$parity(y) = 0$;$x$為奇數時$parity(y)=1$。
2. 給定$y=e_{K}(x)$,計算$half(y)$,其中當$0 \leq x < \frac{n}{2}$時$half(y) = 0$;當$\frac{n}{2} < x \leq n-1$時$half(y) = 1$
如果假定RSA加密是安全的,那么它的密碼體制就不會泄漏這種類型的信息,更精確的說,RSA解密問題可以圖靈歸約為計算$half(y)$的問題,這意味着,如果存在一個多項式算法$half(y)$,那么存在RSA解密的多項式時間算法。現在討論,在給定計算$half(y)$的假設算法(諭示器)的前提下,如何計算$x=d_{K}(y)$,則該算法為:
Alg4 Oracle RSA Decryption(n,b,y)
external HALF
$k \leftarrow \lfloor lbn \rfloor$
for $i \leftarrow 0$ to $k$
$h_{i} \leftarrow $ HALF $(n,b,y)$
$y \leftarrow (y × 2^{b}) (mod \, n)$
$l_{o} \leftarrow 0$
$hi \leftarrow n$
for $i \leftarrow 0$ to $k$
$mid \leftarrow \frac{hi+lo}{2}$
if $h_{i} = 1$
then $lo \leftarrow mid$
else $hi \leftarrow mid$
return $(\lfloor hi \rfloor)$
根據RSA加密滿足在$Z_{n}$中的如下性質$$e_{K}(x_{1})e_{K}(x_{2})=e_{K}(x_{1}x_{2})$$現在,利用如下事實$$y=e_{K}(x)=x^{b}(mod \, n)$$容易看到,對於$0 \leq i \leq \lfloor lbn \rfloor$,第一個for循環運行第$i$次,有$$h_{i}=half(y×(e_{K}(2))^{i})=half(e_{K}(x×2^{i}))$$於是根據half函數的特殊性,我們可以利用二分查找的技術的找到$x$,這是在第二個for循環中找到的。
因此,如果half是一個多項式時間算法,那么我們可以得到一個RSA解密的多項式時間算法。上述算法的時間復雜度是$o((log(n))^{3})+o(logn)×half的復雜度$。容易看到的是,計算parity(y)是多項式等價於計算half(y),這是由於在RSA加密過程中涉及兩個等式$$half(y)=parity((y×e_{K}(2))mod \, n)$$ $$parity(y)=half((y×e_{K}(2^{-1}))mod \, n)$$以及前面的乘法規則。
最后需要注意的是,我們只是說明了計算parity和half是很困難的,即RSA解密是很困難的,但並沒有排除說我們可以以75%的准確率計算parity和half的有效算法,還有其他的一些可能泄露的攻擊。
四、最優非對稱加密填充
我們真正想要的是找到一個設計這樣的密碼體制的方法,這個密碼體制允許我們證明(在一些似是而非的計算假設下)不可能在多項式時間內通過檢查密文的手段找到任何有關明文的信息,可以證明這等價於證明如下問題:敵手不能區別密文。因此我們需要考慮一個密文識別問題。
Def5 (密碼識別問題)
一個加密函數$f:X \rightarrow X$;兩個明文$x_{1},x_{2} \in X$和一個密文$y=f(x_{i})$,其中$i \in {1,2}$,問是否$i=1?$
如果加密函數$f$是確定性的,由於此時能夠計算$f(x_{1})$和$f(x_{2})$,只要看哪一個能得到密文$y$即可。要使得密文識別在計算上是不可行,就要求加密過程是隨機的,我們想具體的辦法來達到這個目標。為此提出下面的密碼體制。
Thm6 (語義安全的公鑰密碼體制)
設$m,k$為正整數:設$F$為一組陷門單向置換,且對任意的$f \in F$,有$f:\{ 0,1 \}^{k} \rightarrow \{ 0,1 \}^{k}$,且設$G:\{ 0,1 \}^{k} \rightarrow \{ 0,1 \} ^{m}$為一個隨機諭示器。令$P=\{ 0,1 \} ^{m}$,且$C=\{ 0,1 \}^{k} × \{ 0,1 \}^{m}$。定義$$K= \{ (f,f^{-1},G): f \in F \}$$對$k= \{ (f,f^{-1},G)$,隨機選取$r \in \{ 0,1 \} ^{k}$,且定義$$e_{K}(x)=(y_{1},y_{2})=(f(r),G(r) \oplus x)$$其中$y_{1} \in \{ 0,1 \} ^{k},x,y_{2} \in \{ 0,1 \} ^{m}$。進一步,定義$$d_{K}(y_{1},y_{2}) = G(f^{-1}(y_{1}) \oplus y_{2})$$($y_{1} \in \{ 0,1 \} ^{k},y_{2} \in \{ 0,1 \} ^{m}$)。函數$f$和$G$為公鑰;函數$f^{-1}$為私鑰。
注:所謂陷門單向置換的意思就是說集合$X$到自身的(雙射)陷門單向函數。
在RSA密碼體制的情況下,取$n=pq,X=Z_{n},f(x) = x^{b} mod \, n$,且$f^{-1}(x) = x^{a} mod \, n$其中$ab \equiv 1 mod \, \phi (n)$,該密碼體制引入了一個特定的隨機函數$G$,實際上,$G$是通過一個隨機諭示器模型化。
我們觀察到密碼體制是非常有效的,相對於底層的基於$f$的公鑰密碼體制而言,只需要添加很少的運算。實際中,函數$G$可以由安全Hash函數如SHA-1用很有效的方式給出,密碼體制的主要缺點是數據擴展:$m$比特的明文加密成$k+m$比特的密文,如果$f$基於RSA加密函數,那么為了使體制安全,需要取$k \geq 1024$。
容易知道,在語義安全的公鑰密碼體制中必須有一定的數據擴展,因此需要做到加密是隨機的。然而,存在更為有效的方案,仍可以證明是安全的,其中最重要的一種是最優非對稱加密填充。
關於這個密碼體制,隨機諭示模型中語義安全的一個直覺的論據如下:為了確定關於明文$x$的任一信息,我們需要知道關於$G(r)$的信息,假定$G$是一個隨機諭示器,確定關於$G(r)$值的任一信息的唯一方式是首先計算$r=f^{-1}(y_{1})$,因此我們必須得到關於$r$的全部信息,如果$f$是單向的,那么對於不知道陷門$f^{-1}$的敵手而言,不能在合理的時間算出$r$。
現在考慮一種比圖靈歸約更一般的歸約。假定存在一個算法Distinguish可以對兩個明文$x_{1},x_{2}$求解密文識別問題,那么我們可以修改這個算法得到$f$的逆算法。算法Distinguish必然是一個完善的算法,我們僅需要它以$\frac{1}{2}+ \epsilon$的概率給出正確的答案即可。這樣子,Distinguish允許詢問一個隨機諭示器,它就可以計算明文的加密,也就是說可以假定它是一個選擇明文攻擊。
下面詳細來論證上面的密碼體制在隨機諭示模型中是語義安全的,這個模型的主要特性和歸約如下:
(1) 假定$G$是一個隨機諭示器,所以確定關於值$G(r)$的任何信息的唯一輸入方式就是用輸入$r$調用函數$G$。
(2) 通過修改算法Distinguish來構造一個新算法Invert,可以以不為0的概率對隨機選擇的元素$y$來逆(即給定一個值$y=f(x)$,其中$x$隨機選擇,那么算法Invert能夠以某一特定的概率找出$x$)。
(3) 算法Invert將用我們描述的一個特定函數SIMG替換隨機諭示器,它的所有輸出為隨機數,SIMG是隨機諭示器的一個完善的模擬。
Alg7 Invery(y)
external f
global RList,GList,$l$
procedure SIMG(r)
$i \leftarrow 1$
$found \leftarrow $ false
while $i \leq l$ and not found
if RList[i] = r
then fount $\leftarrow$ true
else $i \leftarrow i+1$
if found
then return(GList[i])
if $f(r)=y$
then 隨機選擇 $j \in \{ 1,2 \}$
$g \leftarrow y_{2} \oplus x_{j}$
else
隨機選擇g
$l \leftarrow l+1$
RList[l] $\leftarrow$ r
GList[l] $\leftarrow$ g
return g
main
$y_{1} \leftarrow y$
隨機選擇$y_{2}$
$l \leftarrow 0$
在Distinguish($x_{1}$,$x_{2}$,($y_{1}$,$y_{2}$))中插入代碼
for $i \leftarrow 1$ to $l$
if $f(RList[i]) = y$
then return(RList[i])
return("failure")
給定兩個明文$x_{1}$和$x_{2}$,算法Distinguish以$\frac{1}{2}+ \epsilon$的概率求解密文識別問題。算法Invert的輸入$y$是需要求逆的;目的是輸出$f^{-1}(y)$,算法Invert開始時構造$(y_{1},y_{2})$,其中$y_{1},y_{2}$隨機選取,算法Invert對密文$(y_{1},y_{2})$運行算法Distinguish,試圖確定它是$x_{1}$或者$x_{2}$的密文,算法Distinguish將會在執行過程中不同的地方詢問SIMG,SIMG的操作概括如下:
(1) SIMG包含一個列表,記為RList,記錄了算法在Distinguish執行過程中詢問的所有輸入$r$;相應的列表,記為GList,記錄了SIMG的所有輸出。
(2) 如果一個輸入$r$滿足$f(r)=y$,那么SIMG定義為使得$(y_{1},y_{2})$是$x_{1}$和$x_{2}$其中一個的有效加密。
(3) 如果前面已經用輸入$r$詢問過諭示器,那么SIMG(r)已定義。
(4) 其他情況下,SIMG(r)的值隨機選取。
可以看到,對於任一明文$x_{0} \in X$,$(y_{1},y_{2})$是$x_{0}$的一個有效加密,當且僅當$SIMG(f^{-1}(y_{1})) = y_{2} \oplus x_{0}$。特別地,假定$SIMG(f^{-1}(y_{1}))$被適當定義,$(y_{1},y_{2})$可能是$x_{1}$或者$x_{2}$的有效加密,算法SIMG的描述保證了$(y_{1},y_{2})$是$x_{1}$或者$x_{2}$的有效加密。
最后,算法Distinguish將會以回答1或者2終止,回答可能正確也可能不正確,到此,算法Invert檢查列表RList看是否對其詢問的$r$有$y=f(r)$,如果有,那么它就是$f^{-1}(y)$,算法Invert成功,如果沒有發現就是失敗。
事實上,通過觀察函數SIMG對每個詢問$r$檢測是否有$y=f(r)$可以使得算法Invert更有效,一旦發現這樣的$r$可以立即結束,返回$r$值,沒有必要繼續運行。
現在需要計算算法Invert的成功概率的一個下界,通過檢查算法Distinguish的成功概率來做到這一點,假定Distinguish與一個隨機諭示器相互作用的成功概率至少為$\frac{1}{2}+\epsilon$,在算法Invert中,算法Distinguish與模擬隨機諭示器SIMG相互作用。顯然,SIMG對任何輸入與一個真正隨機諭示器的輸出是完全不可區分的,除了可能對於輸入$r=f^{-1}(y)$例外。因此,只要$f(r)=y$且$(y_{1},y_{2})$是$x_{1}$或者$x_{2}$的有效加密,那么必然有$SIMG(r)=y_{2} \oplus x_{1}$或者$SIMG(r)=y_{2} \oplus x_{2}$。SIMG從這兩個選擇中隨機選取,它對於輸入$r=f^{-1}(y)$的輸出也是與真正的隨機諭示器不可區分的,於是算法Distinguish與模擬隨機諭示器SIMG相互作用時,其成功概率為至少$\frac{1}{2}+\epsilon$。
接下來,還需要計算算法Distinguish的成功概率,以是否$f^{-1}(y) \in RList$來考慮$$P[Distinguish succeeds] = P[Distinguish succeeds | f^{-1}(y) \in RList]P[f^{-1}(y) \in RList]+ P[Distinguish succeeds | f^{-1}(y) \notin RList]P[f^{-1}(y) \notin RList]$$
顯然有$$P[Distinguish succeeds | f^{-1}(y) \notin RList] = \frac{1}{2}$$因為如果不知道$SIMG(f^{-1}(y))$的值,就無法區別由$x_{1}$還是由$x_{2}$加密的密文,利用如下事實:$$P[Distinguish succeeds | f^{-1}(y) \in RList] \leq 1$$容易得到如下關系$$\begin{align} \frac{1}{2}+ \epsilon \leq & P[Distinguish succeeds]\\ \leq & P[f^{-1}(y) \in RList]+\frac{1}{2}P[f^{-1}(y) \notin RList]\\ \leq & P[f^{-1}(y) \in RList]+\frac{1}{2} \\ \end{align}$$
因此可以得到$$P[f^{-1}(y) \in RList] \geq \epsilon$$由於$$P[Invert succeeds] = P[f^{-1}(y) \in RList]$$就可以推出$$P[Invert succeeds] \geq \epsilon$$
綜合以上所述,可以直接考慮算法Invert相對於算法Distinguish的運行時間,假定$t_{1}$是算法Distinguish的運行時間,$t_{2}$是對函數$f$求值需要的時間,用$q$記算法Distinguish所做的詢問諭示器的次數,算法Invert的運行時間為$t_{1}+o(q^2+qt_{2})$
最后,給出一個完整的最優非對稱加密填充密碼體制。
Thm8 Optimal Asymmetric Encryption Padding
設$m,k$為正整數,且$m < k$。令$k_{0}=k-m$。設$F$為一族陷門單向置換,使得對於所有的$f \in F$,有$f:\{ 0,1 \} ^{k} \rightarrow \{ 0,1 \} ^{k}$。設$G:\{ 0,1 \} ^{k_{0}} \rightarrow \{ 0,1 \} ^{m}$,且設$H:\{ 0,1 \} ^{m} \rightarrow \{ 0,1 \} ^{k_{0}}$為隨機函數。定義$$P=\{ 0,1 \} ^{m},C= \{ 0,1 \}^{k},K=\{ (f,f^{-1},G,H):f \in F \}$$
對於當中的某個$K=\{ (f,f^{-1},G,H):f \in F \}$,設$r \in \{ 0,1 \} ^{k_{0}}$隨機選擇,定義$$e_{K}(x) = f(y_{1} || y_{2})$$其中$$y_{1} = x \oplus G(r)$$且$$y_{2} = r \oplus H(x \oplus G(r))$$其中有$x,y_{1} \in \{ 0,1 \} ^{m},y_{2} \in \{ 0,1 \} ^{k_{0}}$,其中“||”表示向量的串聯,進一步定義$$f^{-1}(y)=x_{1} || x_{2}$$其中$x_{1} \in \{ 0,1 \} ^{m}$且$x_{2} \in \{ 0,1 \} ^{k_{0}}$,最后定義$$r=x_{2} \oplus H(x_{1})$$且$$d_{K}(y) = G(r) \oplus x_{1}$$函數$f,G,H$為公鑰,函數$f^{-1}$為私鑰。
在這個密碼體制中,只需要取$k_{0}$足夠大即可,這樣子有$2^{k_{0}}$是一個不可行的大運行時間,而且密文長度比明文長度多出了$k_{0}$比特,有了一定的數據擴展位。關鍵在於,觀察到任一明文有$2^{k_{0}}$種可能的有效加密,解決密文識別問題的一種方式就是直接計算兩個給定明文中的一個的所有可能密文,但是這個密文有$2^{k_{0}}$的可能性,使得計算也成為不可能。
至此,第五章RSA密碼體制已經介紹完畢,其實還沒補完這些博客的時候我已經在閱讀第六章了,寒假剩下一半的時間了,老師要求的7-14章我還一點沒動,至少還有接近100多頁,希望能按時讀完和做完讀書筆記。