上一篇詳細分析了幾種分解因子的算法,這是攻擊RSA密碼最為明顯的算法,這一篇中我們考慮是否有不用分解模數n就可以解密RSA的密文的方法,這是因為前面也提到,當n比較大的時候進行分解成素數的乘積是非常困難的。
一、計算$\phi (n)$
首先要說明的是計算$\phi (n)$並不比分解n容易,但是,如果n和$\phi (n)$都已知,通過求解$$n=pq$$ $$\phi (n) = (p-1)(q-1)$$,這就很容易得到一個二元方程完成破解。但實際上,計算$\phi (n)$並不比分解n容易。
二、計算解密指數a
如果解密指數$a$是已知,那么$n$可以通過一個隨機算法在多項式時間內分解。但是,計算$a$也是不比分解n容易的。只是它提醒我們,一旦$a$被泄露,Bob重新選擇一個加密指數是不夠的,還需要重新選擇一個模數$n$。
通過已知解密指數$a$分解$n$的算法是一個Las Vegas型的隨機算法,它最壞情形成功的概率至少為$1-\epsilon$,因此,對於任何一個問題實例,算法不能給出一個答案的概率至多為$\epsilon$。
如果我們有了這樣一個Las Vegas算法,只需要一次又一次運行它,知道找到答案為止,算法連續m次返回“沒有答案”的概率為$\epsilon ^{m}$,為了得到一個答案,必須運行算法的平均次數是$\frac {1}{1-\epsilon}$。因此,在給定的值$a,b$和$n$作為輸入,以至少$\frac{1}{2}$的概率分解$n$的Las Vegas算法在運行$m$次時,$n$被分解的概率至少為$1-(\frac{1}{2})^{m}$。
算法基於當$n=pq$是兩個不同奇素數的乘積時與1模n的平方根相關的一些事實。若$x^{2} \equiv 1 (mod \, p)$,前面的定理告訴我們,一共有4個根,其中兩個根為$\pm 1 (mod \, n)$,稱為平凡平方根,另外兩個根為非平凡的,它們模n互為相反數。
Alg1 RSA-FACTOR(n,a,b)
Comment:假定$ab \equiv 1 (mod \, n)$
記$ab - 1 = 2^{s}r$,r為奇數
隨機選擇$w$使得$1 \leq w \leq n-1$
$x \leftarrow gcd(w,n)$
if $1 < x < n$
then return(x)
Comment:x是n的一個因子
$v \leftarrow w^{r} (mod \, n)$
if $v \equiv 1 (mod \, n)$
then return("failure")
while $v \neq 1(mod \, n)$
$v_{0} \leftarrow v$
$v \leftarrow v^{2} (mod \, n)$
if $v_{0} \equiv -1(mod \, n)$
then return("failure")
else
$x \leftarrow gcd(v_{0}+1 , n)$(也有可能是 $x \leftarrow gcd(v_{0}-1,n)$)
return(x)
Comment:x是n的一個因子
這個算法分析起來比較的長,逐一來看,下面假定如果$n$可分解,其形式為$n=pq$
算法的第一步計算出$s$和$r$,都是常數,接着開始選取一個$w$,需要計算$w$和$n$的最大公約數。如果我們幸運地選取到$w$為$p$或$q$的倍數,那么可以直接分解$n$,如果$w$與$n$互素,那么可以通過連續的平方運算$w^{r},w^{2r},w^{4r}…$直到某個$t$,有$$w^{2^{t}r} \equiv 1 (mod \, n)$$由於$ab -1 = 2^{s}r \equiv 0 (mod \, \phi (n))$
又因為$w^{2^{s}r} \equiv 1 (mod \, n)$,因此while循環至多運行$s$次就會終止,在while循環結束時,我們可以找到一個值$v_{0}$,使得$(v_{0})^{2} \equiv 1 (mod \, n)$,但有$v_{0} \neq 1 (mod \, n)$,再根據下面的條件語句判斷,$v_{0} \neq -1 (mod \, n)$,這說明$v_{0}$是1模$n$的一個非平凡平方根,我們能夠分解$n$。
接下來需要證明的是,這個Las Vegas算法的成功概率至少為$\frac {1}{2}$,觀察算法,有兩種地方使得算法失敗,第一處是$w^{r} \equiv 1 (mod \, n)$,第二處是$w^{2^{t}r} \equiv -1 (mod \, n)$,對於某個$t, 0 \leq t \leq s-1$。
我們需要考慮$s+1$個同余方程,如果$w$是這$s+1$個同余方程中至少一個的解,那么它是一個"壞"選擇,下面討論其中每一個同余方程的解的個數。
考慮同余方程$w^{r} \equiv 1 (mod \, n)$,利用中國剩余定理,分析方程的解的方法是分別考慮模p和模q的解,這個同余方程有解當且僅當$w^{r} \equiv 1 (mod \, p)$和$w^{r} \equiv 1 (mod \, q)$。當p為一個素數時,$Z_{p}^{\star}$是一個循環群,設$g$為$Z_{p}^{\star}$的生成元,可以記$w = g^{u}$,其中$0 \leq u \leq p-2$,於是有$$w^{r} \equiv 1 (mod \, p)$$ $$g^{ur} \equiv 1 (mod \, p)$$因此有$(p-1) | ur$。記$p-1 = 2^{i}p_{1}$,其中$p_{1}$是一個奇數,同理記$q-1 = 2^{j}q_{1}$,其中$q_{1}$是一個奇數。由於$$\phi (n) = (p-1)(q-1) | (ab-1) = 2^{s}r$$得到$$2^{i+j}p_{1}q_{1} | 2^{s}r$$
因此$i+j \leq s$,且$p_{1}q_{1} | r$,現在條件$(p-1) | ur$變成了$2^{i}p_{1} | ur$。由於$p_{1} | r$且$r$為奇數,因此充要條件為$2^{i} | u$,得到$u=k2^{i} , 0 \leq k \leq p_{1} -1$,且同余方程$w^{r} \equiv 1 (mod \, p)$的解的個數為$p_{1}$。同理可以得到$w^{r} \equiv 1 (mod \, q)$恰好有$q_{1}$個解,把任一模p的解和模q的解組合起來,利用中國剩余定理,就可以得到模n的解,個數為$p_{1}q_{1}$。
下一步是對固定的$t(0 \leq t \leq s-1)$考慮同余方程$w^{2^{t}r} \equiv -1 (mod \, n)$的解,同理也是考慮模$p$和模$q$的解,類似的也記$w = g^{u}$,有$$g^{u2^{t}r} \equiv -1 (mod \, p)$$由於$g^{\frac {p-1}{2}} \equiv -1 (mod \, p)$有$$u2^{t}r \equiv \frac{p-1}{2} (mod \, p-1)$$ $$(p-1) | (u2^{t}r - \frac{p-1}{2})$$ $$2(p-1) | (u2^{t+1}r - (p-1))$$由於$p-1 = 2^{i}p_{1}$,可以得到$$2^{i+1}p_{1} | (u2^{t+1}r-2^{i}p_{1})$$取出公因子$p_{1}$,上式變為$$2^{i+1} | (\frac{u2^{t+1}r}{p_{1}}-2^{i})$$現在,如果$t \geq i$,因為此時$2^{i+1} | 2^{t+1}$,但$2^{i+1} 不能整除2^{i}$,另一方面,如果$t \leq i-1$,那么$u$是一個解,當且僅當$u$是$2^{i-t-1}$的奇數倍,這種情況下解的個數為$$\frac {p-1}{2^{i-t-1}}× \frac{1}{2} = 2^{t}p_{1}$$
通過類似的推理,同余方程$w^{2^tr} \equiv -1 (mod \, q)$當$t \geq j$時沒有解,當$t \geq j$時沒有解,當$t \leq j-1$時有$2^{t}q_{1}$個解,利用中國剩余定理,可以知道$w^{2^tr} \equiv -1 (mod \, n)$的解的個數為$$\begin{align} 0 & \quad t \geq min\{ i,j \} \\ 2^{2t}p_{1}q_{1} & \quad t \leq min \{ i,j \}-1 \\ \end{align}$$
現在,$t$可以從$0$到$s-1$取值。不失一般性,假定$i \leq j$;那么當$t \geq i$時解的個數為0,對於$w$的“壞”選擇的總數最多為$$\begin{align} p_{1}q_{1}+p_{1}q_{1}(1+2^{2}+2^{4}+…+2^{2i-2}) =& p_{1}q_{1}(1+\frac{2^{2i}-1}{3}) \\ =& p_{1}q_{1}(\frac{2}{3} + \frac{2^{2i}}{3}) \\ \end{align}$$
前面已知$p-1 = 2^{i}p_{1}$,且$q-1 =2^{j}q_{1}$,現在有$j \geq i \geq 1$,所以$p_{1}q_{1} < \frac {n}{4}$,得到$$2^{2i}p_{1}q_{1} \leq 2^{i+j}p_{1}q_{1} \leq (p-1)(q-1) < n$$因此,可以得到$$\begin{align} p_{1}q_{1}(\frac{2}{3} + \frac{2^{2i}}{3})<& \frac{n}{6}+\frac{n}{3}\\ =& \frac{n}{2} \\ \end{align}$$
由於至多$\frac{n-1}{2}$個$w$的選擇是“壞”的,容易知道至少有$\frac{n-1}{2}$個選擇是“好”的,算法的成功概率至少為\frac{1}{2}。
三、Wiener的低解密指數攻擊
和前面一樣假定$n=pq$,其中$p$和$q$為素數,那么$\phi (n)=(p-1)(q-1)$。由M.Wiener提出的一種攻擊,當滿足以下條件時可以成功地計算解密指數a。$$3a<n^{\frac{1}{4}} 且 q<p<2q$$如果$n$的二進制表示有$l$比特,那么當$a$的二進制表示位數小於$\frac{l}{4}-1$,$p$和$q$相距離不太遠時有效。
由於$ab \equiv 1 (mod \phi (n))$,可知存在一個整數$t$使得$$ab-t \phi(n) = 1$$
由於$n=pq > q^{2}$,我們有$q < \sqrt{n}$,因此得到$$0 < n-\phi (n) = p+q-1 < 2q+q-1<3q<3 \sqrt{n}$$
現在考慮$$ \begin{align} |\frac{b}{n} - \frac{t}{a}| =& |\frac{ba-tn}{an}| \\ =& |\frac{1+t(\phi (n)-n)}{an}| \\ <& \frac{3t \sqrt{n}}{an} \\ =& \frac{3t}{a \sqrt{n}} \\ \end{align}$$
由於$t<a$,我們有$3t<3a<n^{\frac{1}{4}}$,因此有$$|\frac{b}{n} - \frac{t}{a}| < \frac{1}{an^{\frac{1}{4}}}$$
最后,由於$3a<n^{\frac{1}{4}}$,我們有$$|\frac{b}{n} - \frac{t}{a}| < \frac{1}{3a^{2}}$$
因此,分數$\frac{t}{a}$是分數$\frac{b}{n}$的一個很接近的近似,從連分數理論可知,這樣接近的近似值是$\frac{b}{n}$的連分數展開的一個收斂子,這種擴展可以用Euclidean算法得到。
Def2 (有限連分數)一個有限連分數是非負整數的m組,即[$q_{1},…,q_{m}$],它是下面表達式的簡寫形式:$$q_{1}+\cfrac{1}{q_{2}+\cfrac{1}{q_{3}+\dotsb + \cfrac{1}{q_{m}}}}$$
假定$a$和$b$為滿足$gcd(a,b)=1$的正整數,且假定Euclidean算法的輸出為m組$(q_{1},…,q_{m})$,容易看到$\frac{a}{b} = [q_{1},…,q_{m}]$,稱$[q_{1},…,q_{m}]$是$a/b$在這種情形下的連分數展開。現在,對$1 \leq j \leq m$,定義$C_{j} = [q_{1},…,q_{j}]$,稱$C_{j}$為$[q_{1},…,q_{m}]$的第$j$個收斂子。於是每一個$C_{j}$可以寫成有理數形式$\frac{c_{j}}{d_{j}}$,其中$c_{j}$和$d_{j}$滿足如下的遞推關系:$$ c_{j} = \begin{cases} 1 & \quad \text{j=0} \\ q_{1} & \quad \text{j=1} \\ q_{j}c_{j-1}+c_{j-2} & \quad \text {$j \geq 2$} \\ \end{cases}$$ $$d_{j} = \begin{cases} 0 & \quad \text{j=0} \\ 1 & \quad \text{j=1} \\ q_{j}d_{j-1}+d_{j-2} & \quad \text {$j \geq 2$} \\ \end{cases}$$
對於有理數的連分數,它的收斂子滿足很多有趣的性質,下面是其中一個定理。
Thm3 假定$gcd(a,b) = gcd(c,d) = 1$且$$|\frac{a}{b} - \frac{c}{d}| < \frac{1}{2d^{2}}$$那么$\frac{c}{d}$是$\frac{a}{b}$連分數展開的一個收斂子。
在前面的數學推導過程中,未知分數$\frac{t}{a}$是$\frac{b}{n}$的一個很接近的近似,上面的定理告訴我們,$\frac{t}{a}$一定是$\frac{b}{n}$的連分數展開的一個收斂子,既然$\frac{b}{n}$是公開信息,很容易計算出它的收斂子,我們所需要的僅僅是測試它們中間哪一個是正確的方法。
這並不難做到,如果$\frac{t}{a}$和$\frac{b}{n}$的一個收斂子,那么就能夠計算得$\phi (n) = \frac{ab-1}{t}$,一旦$n$和$\phi (n)$已知,就可以根據二次方程解出$p$值來分解$n$值,但我們事先不知道$\frac{b}{n}$的哪個收斂子能得到$n$的分解,所以要依次試驗直到找到$n$的分解為止。否則不能用這種方法分解$n$。
下面我們可以詳細看看Wiener算法的偽代碼。
Alg4 Wiener Algorithm(n,b)
$(q_{1},…,q_{m};r_{m}) \leftarrow Euclidean Algorithm(n,b)$
$c_{0} \leftarrow 1$
$c_{1} \leftarrow q_{1}$
$d_{0} \leftarrow 0$
$d_{1} \leftarrow 1$
for $j \leftarrow 2 $ to $m$
$c_{j} \leftarrow q_{j}c_{j-1} + c_{j-2}$
$d_{j} \leftarrow q_{j}d_{j-1} + d_{j-2}$
$n^{'} \leftarrow \frac{d_{j}b-1}{c_{j}}$
Comment:$n^{'} = \phi (n)$,如果$\frac{c_{j}}{d_{j}}$是正確的收斂子。
if $n^{'}$是一個整數
設p和q為方程$x^{2}-(n-n^{'}+1)x+n=0$的根
if p和q為小於n的整數
return (p,q)
return ("failure")
最后有趣的一點是,條件$3a<n^{\frac{1}{4}}$可以在算法運行前預先估計解密指數是否滿足要求。
本篇到此結束,關於RSA密碼體制我應該還會有一篇讀書筆記,主要講述Rabin密碼體制以及RSA的語義安全性。