【論文閱讀筆記】-針對RSA的短解密指數的密碼學分析(Cryptanalysis of Short RSA Secret Exponents)

01am發表於2022-02-13

1. 介紹

從RSA公鑰加密系統的所有金鑰對的集合中,一些金鑰對有著可以被各種密碼分析攻擊利用的性質。這些攻擊一些利用模量(N)中的弱點來進攻,而另一些則利用公鑰或私鑰的弱點。這篇文章所討論的弱點是可以在模量長度上和多項式時間內完成攻擊的的弱點(The weaknesses discussed here are those which allow an attack on RSA to be completed in a length of time which is polynomial in the length of the modulus.)

注:我也理解不了什麼叫做模量長度,維基百科給的解釋是:在抽象代數中,模組的長度是衡量其大小的向量空間維度的概括。至於更近一步的理解,這裡給出維基百科的連結:Length of a module,我自己就是簡單理解為空間複雜度。。

針對RSA模量的攻擊的目標都是找到這個模量N的兩個質因子p和q。一種該類攻擊在p-1或q-1的質因數都很小的時候可以用來分解模量N[1]。而模量也同樣可以在p+1或q+1的質因數都很小的時候被分解[2]。這裡也有一個簡單的演算法可以在兩個素數的差值僅僅比任意素數的平方根大多項式倍時分解模量。這個演算法基於下面這個恆等式:

\[(\frac{p+q}{2})^2-pq=(\frac{p-q}{2})^2 \]

\(\frac{p+q}{2}\)\(\frac{p-q}{2}\)已知的情況下,模數就可以被分解,而數字\((\frac{p+q}{2})^2\)可以在大於模數的完全平方數中線性搜尋。而正確的數字k則滿足條件:k-pq也是一個完全平方數。

上面這個式子說明\((\frac{p+q}{2})^2\)大於\(pq\)

然後是關於文中提及的大多項式倍,這裡有:

polynomially larger

來源:Meaning of "polynomially larger"

提問:

For example

Is \(n\) polynomially larger than \(\frac{n}{\log n}\)? Than \(n\log n\)?

Is \(n^2\) polynomially larger than \(\frac{n}{\log n}\)? Than \(n\log n\)?

I am trying to understand the difference because apparently the first line isn't, but the second is (Master Theorem).

回答:

"Polynomially larger" means that the ratio of the functions falls between two polynomials, asymptotically. Specifically, \(f(n)\) is polynomially greater than \(g(n)\) if and only if there exist generalized polynomials (fractional exponents are allowed) \(p(n),q(n)\) such that the following inequality holds asymptotically:

“Polynomially larger”的意思是函式比率漸進的落在兩個多項式之間。具體的說,\(f(n)\)對於\(g(n)\)是polynomially greater的當且僅當存在一個廣義多項式(允許指數為小數)\(p(n),q(n)\),使得以下不等式漸進成立:

\[p(n)\le \frac{f(n)}{g(n)}\le q(n) \]

For the first problem, we have the ratio is equal to \(log⁡(n)\). It is not the case that there exist polynomials \(p(n),q(n)\) such that \(p(n)≤log(n)≤q(n)\) asymptotically, because no polynomial is a lower bound for \(log(n)\). Thus it is not polynomially bounded. \(nlog(n)\) is the same (even the same quotient if taken in the other order).

對於第一個問題,我們有比率(這個比率應該就是\(\frac{n}{\frac{n}{\log n}}\))等於\(\log n\)。因為不存在多項式時\(log(n)\)的下界,所以不存在多項式\(p(n),q(n)\),使得\(p(n)\le\log (n)\leq(n)\)漸進成立。因此這個不是多項式有界的。對於\(n\log n\)同理(儘管用不同的順序得到相同的商,應該指的時把分子分母的順序顛倒)

For the second problem, we have the ratio is equal to \(nlog(n)\). It is the case that \(n≤nlog(n)≤n^2\) asymptotically, so it is polynomially bounded and therefore \(n^2\) is polynomially larger. \(\frac{n^2}{nlog(n)}=\frac{n}{log(n)}\), and we have that (asymptotically)

對於第二個問題,我們有比率等於\(n\log n\)。存在\(n≤nlog(n)≤n^2\) 漸進成立,所以這是多項式有界並且因此\(n^2\)是polynomially larger。第二種情況的比率:\(\frac{n^2}{nlog(n)}=\frac{n}{log(n)}\),我們有(漸進的):

\[n^{\frac{1}{3}}≤\frac{n}{log(n)}≤n \]

另一個相關問題連結:asymptotically larger vs polynomially larger

關於RSA的攻擊還有很多,除去其它的條件,都會要求加密或解密指數是較小的。在一些案例中,人們會更喜歡使用較小的加解密指數,因為這樣可以減小加解密的執行時間。這是因為,對於一個固定的模數大小,RSA加解密的時間簡單的與指數的位元位長度成比例。如果通訊兩端的裝置的運算效能差距過大,那麼這種情況下使用小指數就會尤其的有利。一個例子就是當RSA系統應用在智慧卡和大型計算機之間的通訊時。在這個例子中,智慧卡最好使用小的解密指數/私鑰,而大型計算機使用小的加密指數/公鑰,這樣可以減小智慧卡通訊所需要的過程。然而,人們需要警惕對於RSA的小指數攻擊。

小公鑰可以在向多方廣播同一訊息時被利用。為了說明這種攻擊,假設向三方廣播一個訊息m,分別採用公鑰\(e_1=e_2=e_3=3\)和模數\(n_1,n_2,n_3\),那麼加密的訊息就是:

\[m^3\ mod\ n_1,\ m^3\ mod\ n_2,\ m^3\ mod\ n_3 \]

使用中國剩餘定理(CRT),就可以找到\(m^3\ mod\ n_1n_2n_3\),但是,\(m^3<n_1n_1n_3\)因為\(m<n_1,n_2,n_3\)。因此,\(m^3\)在模\(n_1n_2n_3\)的情況下不會發生變化,並且訊息\(m\)可以通過開三次方根來恢復。

在這篇論文中,會介紹一個針對小金鑰情況的,基於連分式的攻擊方法。

這裡這個中國剩餘定理的運用時要求在RSA中,明文的大小小於模數。

2. 連分數背景知識

連分數可以在一個分式足夠接近的近似已知的情況下被用來尋找這個分式的分子和分母。這將會與第四節中的RSA有關,其中公鑰和模量將用於構建涉及私鑰的分數的估計值。

這個使用連分數來尋找給定估計值分數形式的分子和分母的演算法在此處稱作連分數演算法。這個演算法會在第3節中進行闡述。而關於這個連分數演算法有關的連分數背景知識則會在這一節進行介紹。關於連分數更深入的討論可以在[3]中尋找。

一個連分數的一個如下形式的表示式:

\[\frac{a_1}{q_1+\displaystyle\frac{a_2}{q_2+\displaystyle\frac{a_3}{...\displaystyle\frac{}{q_{m-1}+\displaystyle\frac{a_m}{q_m}}}}}=a_1/(q_1+a_2/(q_2+a_3/(.../(q_{m-1}+a_m/q_m)...))). \tag 1 \]

我們討論的連分數更多是在所有的\(a_i=1\)的情況下。為了方便,讓我們定義:

\[<q_0,q_1,...,q_m>=q_0+1/(q_1+1/(q_2+1/(.../(q_{m-1}+1/q_m)...))).\tag 2 \]

例如:\(<0,2,1,3>=0+1/(2+1/(1+1/3))=\displaystyle\frac{4}{11}\)

\(<0,2,1,3>\)被稱作\(\displaystyle\frac{4}{11}\)的連分數展開式( continued fraction expansion)。一個正有理數( positive rational number)\(f\)的連分數展開式是通過減去\(f\)的整數部分並取剩餘部分的倒數,再減去整數部分,再取倒數,如此反覆直到餘數為零。設\(q_i\)為整數部分,\(r_i\)是第i步的餘數,m為取倒數的次數,則有:

\[\begin{equation} \begin{aligned} &q_0=\lfloor f \rfloor ,\ \ \ r_0=f-q_0,\ \ \ and \\ &q_i=\lfloor \frac{1}{r_{i-1}} \rfloor,\ \ \ r_i=\frac{1}{r_{i-1}}-q_i,\ \ \ for\ \ i=1,2,...,m \end{aligned} \tag 3 \end{equation} \]

因為\(r_m\)為0,我們有\(f=<q_0,q_1,...,q_m>\)

關於連分數有兩個需要注意的點,後面會很有用。第一個是\(q_i\ge 2\)。因為\(q_i=1\)意味著\(r_{i-1}=1\),而這是不可能的。第二個則是對於任意的\(x>0\),有:

\[\begin{equation} \begin{aligned} &\langle q_0,q_1,q_2,...,q_m\rangle\ <\ \langle q_0,q_1,...,q_{m-1},q_m+x\rangle \ \ \ m為奇數\\ &\langle q_0,q_1,q_2,...,q_m\rangle\ >\ \langle q_0,q_1,...,q_{m-1},q_m+x\rangle \ \ \ m為偶數 \end{aligned} \tag 4 \end{equation} \]

這個可以通過連分數式子驗證。

這裡第一點原文中下標都是m,但是這裡我覺得i更合理。

我們現在要考慮的是如何通過連分數展開式來重建\(f\)。可以根據式子(2)來逆推,也就是將\(q_m\)取倒數,然後加上\(q_{m-1}\),然後再去倒數……一直到\(q_0\)。但是,更有效的方法是從\(q_0\)開始重建\(f\)。設\(n_i\)\(d_i,i=0,1,2,...,m\)是一個如下定義的分子分母的序列:

\[\frac{n_i}{d_i}=\langle q_0,q_1,...,q_i\rangle,\ \ \ gcd(n_i,d_i)=1\ \ \ i=1,2,...,m.\tag 5 \]

過程如下:

\[\begin{equation} \begin{aligned} &n_0=q_0,&&d_0=1,\\ &n_1=q_0q_1+1,&&d_1=q_1\\ &n_i=q_in_{i-1}+n_{i-2},&&d_i=q_id_{i-1}+d_{i-2}\ \ \ i=2,3,...,m. \end{aligned} \tag 6 \end{equation} \]

可以通過這種方法重建分式\(f=\frac{n_m}{d_m}\)

這裡有關於一個關於\(f\)的分子與分母之間的關係,在後面會有用:

\[n_id_{i-1}-n_{i-1}d_i=-(-1)^i\ \ \ \ i=1,2,...,m.\tag 7 \]

現在關於連分數演算法的背景知識都已經在這裡介紹完畢了。

關於連分數可以看我之前發的一篇關於連分數的介紹,可以當作參考~

3. 連分數演算法

\(f\)作一個較小的估計\(f'\)

\[f'=f(1-\delta),\ \delta \ge 0.\tag 8 \]

\(q_i,r_i\)\(q_i',r_i'\)分別是\(f,f'\)的第i個整數部分和小數部分。如果\(\delta\)足夠的小,那麼\(f\)的分子分母就可以用下面的演算法來尋找:

重複下列步驟直到\(f\)被找到:

- 生成\(f'\)的連分數展開式的第i項(\(q_i\),就是\(\langle q_1,q_2,...,q_i\rangle\)

- 用公式(6)來將展開式重建一個數

如果\(i\)為偶數,展開式為:\(\langle q_0',q_1',...,q_{i-1}',q_i+1\rangle\)

如果\(i\)為奇數,展開式為:\(\langle q_0',q_1',...,q_{i-1}',q_i\rangle\)

​ - 檢查這個數是否等於\(f\)

我對於這個演算法的理解是:跟公式(6)的原理有關。\(i\)不是最後一位,所以奇數個\(\langle q_1,q_2,...,q_i\rangle\)然後因為\(f>f'\),所以

之所以在每一個(不是隻有最後一個)偶數項(\(i\)為偶數)上加1,是因為對於\(f\)的猜測(guess)要大於\(f'\)(因為\(f>f'\)),並且從公式(4)中可以看出,\(\langle q_0',q_1',...,q_{i-1}',q_i'\rangle\)是小於\(f'=\langle q_0',q_1',...,q_{i-1}',q_i'+r_i'\rangle\)。注意必須存在一個測試來確定對於\(f\)的猜測是否正確。

當:

\[\langle q_0,q_1,...,q_{m-1},q_m-1\rangle<f'\le\langle q_0,q_1,...,q_m\rangle\ \ \ m為偶數時\\ \langle q_0,q_1,...,q_{m-1},q_m+1\rangle<f'\le\langle q_0,q_1,...,q_m\rangle\ \ \ m為奇數時 \tag 9 \]

時連分數演算法是正確的。

我對於這個地方的理解:

\(i=m\)時,因為這時候偶數項都加上了1,所以是可以滿足當m為偶數且不是最後一項時,仍然可以滿足\(f'\le\langle q_0,q_1,...,q_m\rangle\),而\(\langle q_0,q_1,...,q_{m-1},q_m-1\rangle\)並不是一定小於\(f'\),而是小於\(\langle q_0,q_1,...,q_m\rangle\),奇數同理。不過我看不出來為啥一定要滿足這個條件,也許是為了體現\(f\)\(f'\)相差不大(\(\delta\)很小)?

現在我們考慮(9)對於\(\delta\)大小的影響。對於(8)求解,得到:

\[\delta =1-\frac{f'}{f}.\tag {10} \]

分別按照下列情況來分析:m=0,m=1,m是偶數並且m\(\ge 2\),m是奇數並且m\(\ge 3\)

下面的n和d與q的關係可以在(6)中檢視

  • m=0

    用(9)在(10)中代替\(f'\)(把(9)帶入(10)),有:

    \[\delta <1-\frac{\langle q_0-1\rangle}{\langle q_0\rangle}\tag {11} \]

    結合(2),可以化簡為\(\delta < \displaystyle\frac {1}{q_0}\),這個也可以被寫成(設\(n_0=q_0,d_0=1\)):

    \[\delta < \frac{1}{n_0d_0}\tag {12} \]

  • m=1

    用(9)在(10)中代替\(f'\),有:

    \[\delta < 1-\frac {\langle q_0,q_1+1\rangle}{\langle q_0,q_1\rangle}\tag{13} \]

    結合(2),可以化簡為:

    \[\delta < \displaystyle\frac {1}{(q_0q_1+1)(q_1+1)}\tag {14} \]

    在前面有說明過:\(q_m\ge 2\)。在(14)中\(q_1+1\le \displaystyle\frac{3}{2}q_1\)。將這個和(6)中關於\(n_1,d_1\)的表示式與(14)結合,有:

    \[\delta < \frac{1}{\displaystyle\frac{3}{2}n_1d_1}\tag {15} \]

    足以保證連分數演算法成功。

  • m是偶數且m\(\ge 2\)

    用(9)在(10)中代替\(f'\),有:

    \[\delta < 1-\frac {\langle q_0,q_1,...,q_{m-1}q_m-1\rangle}{\langle q_0,q_1,q_2,...,q_m\rangle}\tag{16} \]

    根據(6),有(其實還有(5)):

    \[\begin{equation} \begin{aligned} &\langle q_0,q_1,...,q_{m-1}q_m-1\rangle &&=&&\frac{(q_m-1)n_{m-1}+n_{m-2}}{(q_m-1)d_{m-1}+d_{m-2}}\\ &\langle q_0,q_1,q_2,...,q_m\rangle &&=&&\frac{q_mn_{m-1}+n_{m-2}}{q_md_{m-1}+d_{m-2}} \end{aligned} \tag {17} \end{equation} \]

    帶進(16):

    \[\delta < \frac{n_{m-1}d_{m-2}-n_{m-2}d_{m-1}}{(q_mn_{m-1}+n_{m-2})(q_md_{m-1}+d_{m-2}-d_{m-1})}\tag{18} \]

    通過(7)和(6)中\(n_m,d_m\)的表示式,有:

    \[\delta <\frac{1}{n_m(d_m-d_{m-1})} \]

    因此,可知

    \[\delta <\frac{1}{n_md_m} \]

    足以保證連分數演算法的成功

  • m是奇數且m\(\ge 3\)

    分析過程與上面類似,有:

    \[\delta < \frac{1}{n_m(d_m+d_{m-1})}.\tag{21} \]

    因為\(d_m=q_md_{m-1}+d_{m-2}\)並且\(q_m\ge 2\),我們得到了\(d_m+d_{m-1}\le \displaystyle\frac{3}{2}d_m\)。因此,可知:

    \[\delta < \frac{1}{\displaystyle\frac{3}{2}n_md_m}\tag{22} \]

    足以保證連分數演算法的成功。

    注:\(d_m+d_{m-1}\le \displaystyle\frac{3}{2}d_m\)的來源:

    \[\begin{equation} \begin{aligned} d_m&=q_md_{m-1}+d_{m-2}\\ d_m+d_{m-1}&=(q_m+1)d_{m-1}+d_{m-2}\\ \because q_m\ge &2,\ \therefore q_m+1\le \frac{3}{2}\\ \therefore d_m+d_{m-1}&=(q_m+1)d_{m-1}+d_{m-2}\le \end{aligned} \end{equation} \]

綜合四個情況的結果,

\[\delta <\frac{1}{\displaystyle\frac{3}{2}n_md_m}\tag{23} \]

足夠保證連分數演算法的成功。且,\(n_m,d_m\)分別是\(f\)的分子和分母。

讓我們現在考慮這個演算法的執行時間。設\(x=max(n_m,d_m)\)。連分數展開式商(這個商就是連分數展開式中的每一個\(q_i\))的個數是\(O(\log x)\)。對於每一個商,都要生成並測試一個對於\(f\)的猜測。生成每一個關於\(f\)的猜測所需要的計算都是\(\log x\)多項式。因此假設對於\(f\) 的猜測是否正確的檢驗是\(\log x\)多項式,那麼連分數演算法執行的時間是\(\log x\)多項式。

4. 連分數演算法在RSA中的應用

公鑰\(e\)和私鑰\(d\)的下列關係在參考文獻[4]中提及:

\[ed\equiv 1(mod\ LCM(p-1,q-1))\tag{24} \]

公私鑰之間互為逆元的關係在求冪中是必須的。從(24)中可知,一定存在一個整數\(K\)

\[ed=K\cdot LCM(p-1,q-1)+1\tag{25} \]

如果我們設\(G=GCD(p-1,q-1)\),並且利用\(LCM(p-1,q-1)=\displaystyle\frac{(p-1)(q-1)}{G}\),會得到:

\[ed=\frac{K}{G}(p-1)(q-1)+1\tag{26} \]

\(K\)\(G\)可能會有公因數。所以定義\(k=\displaystyle\frac{K}{GCD(K,G)},g=\displaystyle\frac{G}{GCD(K,G)}\),會得到\(\displaystyle\frac{k}{g}=\displaystyle\frac{K}{G},GCD(k,g)=1\)。我們現在有:

\[ed=\frac{k}{g}(p-1)(q-1)+1\tag{27} \]

(27)兩邊分別除以\(dpq\)

\[\frac{e}{pq}=\frac{k}{dg}(1-\delta),\ \ \delta=\frac{p+q-1+\displaystyle\frac{g}{k}}{pq}\tag{28} \]

注意到\(\displaystyle\frac{e}{pq}\)完全由公開的資訊組成,並且還是\(\displaystyle\frac{k}{dg}\)的一個較低的估計。在使用連分數演算法之前,我們需要想到這個演算法總是在尋找最簡分式(fractions in lowest terms)。從(25)中可以看到\(GCD(K,d)=1\)。因為\(k\)可以整除\(K\),可以得到\(GCD(k,d)=1\)。並且\(GCD(k,g)\)是前面定義中就有的。因此\(GCD(k,dg)=1\),並且連分數演算法可以在\(\delta\)足夠小的時候被用來尋找\(k\)\(dg\)

通過(28)中\(\delta\)的表示式和(23)中關於\(\delta\)的約束,可以看出:

\[kdg<\frac{pq}{\displaystyle\frac{3}{2}(p+q)}\tag{29} \]

足以讓\(k\)\(dg\)被找到。注意到在關於\(\delta\)的表示式中\((-1-\displaystyle\frac{g}{k})\)被去掉了,這是因為它相對於\((p+q)\)來說太小了。因為\((-1-\displaystyle\frac{g}{k})\)會減小\(\delta\)的大小,所以這不會影響到(29)的正確性。

過程如下:

\[\begin{equation} \begin{aligned} \delta &<\frac{1}{\frac{3}{2}n_md_m}\\ \frac{p+q-1-\frac{g}{k}}{pq}&<\frac{1}{\frac{3}{2}kdg}\\ kdg&<\frac{pq}{\frac{3}{2}(p+q-1-\frac{g}{k})} \end{aligned} \end{equation} \]

然後去掉\((-1-\displaystyle\frac{g}{k})\),會讓\(kdg\)的約束條件變的更加嚴格,範圍更小,所以是沒有影響的。而且去掉了之後,式子就都是由已知量組成的。

我們現在考慮如何測試一個關於\(k\)\(dg\)的猜想是正確的。為了簡化這個測試,我們要假設\(ed>pq\)。這並非是一個很嚴格的假設,因為當\(e\)\(d\)是固定的時候,剩下的那個值是接近\(\displaystyle\frac{pq}{G}\)(回想一下\(G=GCD(p-1,q-1)\)。除非\(G\)非常大,否則\(ed>pq\)。根據(27),\(ed>pq\)的一個結論就是\(k>g\)。重新排列(27),有:

\[edg=k(p-1)(q-1)+g\tag{30} \]

雖然不知道為什麼\(e,d\)中的一個值確定,另一個值就會接近\(\displaystyle\frac{pq}{G}\),但是有這個條件後,設\(e\)是固定的,那麼:\(ed=e\cdot \displaystyle\frac{pq}{G}=\displaystyle\frac{e}{G}pq\),只要\(G\)不大於\(e\),那麼就會有\(ed>pq\)。後面那個則是因為展開(27),有\(ed=\displaystyle\frac{k}{g}pq-[\displaystyle\frac{k}{g}(p+q-1)-1]\),式子中中括號部分一定是正數,所以\(ed<\displaystyle\frac{k}{g}pq\Rightarrow\displaystyle\frac{k}{g}>1\Rightarrow k>g\)

我們看到當\(k>g\),將\(edg\)除以\(k\)就會得到一個商\((p-1)(q-1)\)和餘數 \(g\)。這提供了一個關於\((p-1)(q-1)\)\(g\)的猜想。如果這個關於\((p-1)(q-1)\)的猜想為0,那麼這個\(k\)\(dg\)就是錯誤的。這種情況必須被過濾掉,否則這個測試之後會將pq分解為pq和1。關於\((p-1)(q-1)\)的猜測可以利用下面這個式子來建立另一個關於\(\displaystyle\frac{p+q}{2}\)的猜測:

\[\frac{pq-(p-1)(q-1)+1}{2}=\frac{p+q}{2}\tag{31} \]

如果(通過\((p-1)(q-1)\)的猜測求出的)關於\(\displaystyle\frac{p+q}{2}\)的猜測不是一個整數,那麼關於\(k\)\(dg\)的猜測就是錯誤的。而這個關於\(\displaystyle\frac{p+q}{2}\)的猜想還可以來建立\(\displaystyle\frac{p-q}{2}\)的猜測:

\[(\frac{p+q}{2})^2-pq=(\frac{p-q}{2})^2\tag{32} \]

如果(計算出的)關於\((\displaystyle\frac{p-q}{2})^2\)可以被完全開方,那麼,關於\(k\)\(dg\)的原始猜測就是正確的。金鑰\(d\)就可以通過將\(dg\)除以\(g\)來找到。回想一下,當\(edg\)除以\(k\)時,\(g\)是餘數。我們還可以從\(\displaystyle\frac{p+q}{2}\)\(\displaystyle\frac{p-q}{2}\)中恢復\(p,q\)

\(\displaystyle\frac{edg}{k}\)的小數部分,乘上得到的k,就可以求出g

如果沒有采取任何措施來反制這種針對RSA的連分數攻擊,那麼人們就可以預計\(g\)很小,\(k<dg\)。在這些條件下,從(29)中可以看到可以在多項式時間內找到位數最多約為模量四分之一的金鑰。這種攻擊不能擴充套件到金鑰和模量大小近似想等的情況。因為這種攻擊依賴於公鑰提供的資訊來幫助分解模量,而在正常情況下,公鑰的選擇幾乎獨立於模量。

5. 例子

在這一節,連分數演算法會應用於一個小的RSA指數對中。例如:

\[pq=8927,e=2621 \]

連分數演算法會在\(\displaystyle\frac{e}{pq}=\displaystyle\frac{2621}{8927}\)上執行:

變數名 計算方法 i=0 i=1 i=2
\(q_i'\) (3) 0 3 2
\(r_i'\) (3) \(\displaystyle\frac{2621}{8927}\) \(\displaystyle\frac{1064}{2621}\) \(\displaystyle\frac{493}{1064}\)
\(\displaystyle\frac{n_i'}{d_i'}=\langle q_0',q_1',...,q_i'\rangle\) (6) \(\displaystyle\frac{0}{1}\) \(\displaystyle\frac{1}{3}\) \(\displaystyle\frac{2}{7}\)
\(\displaystyle\frac{k}{dg}\)的猜測值 \(i為奇數:\langle q_0',q_1',...,q_i'\rangle\\i為偶數:\langle q_0',q_1',...,q_i+1'\rangle\) \(\displaystyle\frac{1}{1}\) \(\displaystyle\frac{1}{3}\) \(\displaystyle\frac{3}{10}\)
\(edg\)的猜測值 \(e\cdot dg\) 2621 7863 26210
\((p-1)(q-1)\)的猜測值 \(\lfloor \displaystyle\frac{edg}{k}\rfloor\) 2621 7863 8736
\(g\)的猜測值 \(edg\mod k\) 0 0 2
\(\displaystyle\frac{p+q}{2}\)的猜測值 (31) 3153.5 532.5 96
\(\displaystyle\frac{p-q}{2}\)的猜測值 (32) \(289=17^2\)
d \(\displaystyle\frac{dg}{g}\) 5

在這個例子中,連分數攻擊產生了:

\[d=5,p=113,q=79,k=3,g=2 \]

我們可以看出這些值是滿足(27)的,所以可知\(d=5\)是對應\(e=2621\)在模\(pq=8927\)下的金鑰。還可以看出這些條件也符合(29)。

這個例子說明了連分數攻擊的細節,但是考慮實際情況是更加有意義的。假設RSA使用了1024位的模數。那麼\(p,q\)都是接近\(2^512\)。假設\(g=2\),並且\(e\approx pq\)使得\(k\approx dg\)(見(28))。然後根據(29),可以看出連分數攻擊將找到大小約小於\(2^{255}\)的金鑰。

因為\(pq\approx 2^{1024},p,q\approx 2^{512},k\approx dg\),有:

\[\begin{equation} \begin{aligned} kdg<&\frac{pq}{\displaystyle\frac{3}{2}(p+q)}\\ 4d^2<&\frac{2^{1024}}{2^{512}}=2^{512}\\ 2d<&2^{256}\\ d<&2^{255} \end{aligned} \end{equation} \]

6. 對RSA連分數攻擊的反制

有兩種方法可以減小RSA連分數攻擊可以找到的金鑰的最大範圍。從(29)中可以看出,這兩種方法分別是讓\(k\)變大和讓\(g\)變大。

為了讓\(k\)變大,我們需要讓公鑰\(e\)變大(從(27)中得出)。這可以給\(e\)加上\(LCM(p-1.q-1)\)的倍數。假設\(e>(pq)^{1.5}\)。這意味著\(\displaystyle\frac{k}{dg}>(pq)^{0.5}\)(從(28)得出)。將\(k=dg(pq)^{0.5}\)代入(29),可以得到\(d<1\)。因此,如果\(e>(pq)^{1.5}\),那麼無論金鑰大小,連分數演算法都將失效。提高\(e\)的大小會有增加加密過程執行時間的缺點。但是這也許在某些系統中是可行的。

\(k=dg(pq)^{0.5}\)代入(29),有:

\[\begin{equation} \begin{aligned} (dg)^2\sqrt{pq}&=\frac{pq}{\frac{3}{2}(p+q)}\\ (dg)^2&=\frac{\sqrt{pq}}{\frac{3}{2}(p+q)} \end{aligned} \end{equation} \]

根據基本不等式\(\displaystyle\frac{a+b}{2}\ge \sqrt{ab}\),可知\(\sqrt{pq}\le \displaystyle\frac{a+b}{2}<\displaystyle\frac{3(p+q)}{2}\)。而\(g\ge 1\),所以可以得到\(d<1\)。而當\(e>(pq)^{1.5}\)\(\displaystyle\frac{k}{dg}>(pq)^{0.5}\),根據相同的過程,可以知道\(d\)肯定小於1

為了讓\(g\)變大,\(p,q\)需要被精細挑選以滿足\(GCD(p-1,q-1)\)足夠大。然而我們可以在後面看見在某些特定的條件下可以找到\(g\)\(g\)的因子。

7. 對於攻擊的改進

在這一節,會討論四種針對短金鑰攻擊的可行的改進。第一種改進是允許連分數演算法可以在略微超出(29)的界限中繼續搜尋\(d\)。這個演算法僅保證可以達到這個界限,但是實際上它可能會在略微超出這個界限的地方繼續工作。這使得即使私鑰\(d\)的大小大了一個bit左右也可以被找到。

第二種改進是基於\(\displaystyle\frac{e}{pq}\)的分母(這個式子是\(\displaystyle\frac{k}{dg}\)的一個較低的估計)是\((p-1)(q-1)\)的一個簡單的較高估計。一個更加接近\((p-1)(q-1)\)的較高估計是:

\[\lfloor (\sqrt{pq}-1)^2\rfloor \]

用這個估計,(29)會變成:

\[kdg<\frac{2}{3}(\frac{\sqrt{pq}-1}{\sqrt{p}-\sqrt{q}})^2 \]

這增加了可以被找到的私鑰範圍。而改善幅度隨著\(|p-q|\)的降低而提高。

拋去那個向下取整,很容易看出\((p-1)(q-1)<(\sqrt{pq}-1)^2<pq\)。而:

\[\begin{equation} \begin{aligned} &\ \frac{pq}{p+q},(\frac{\sqrt{pq}-1}{\sqrt{p}-\sqrt{q}})^2\\ \Rightarrow &\ \frac{pq}{p+q},\frac{pq-2\sqrt{pq}+1}{p+q-2\sqrt{pq}}\\ \Rightarrow &\ \frac{pq}{p+q}-1,\frac{pq-2\sqrt{pq}+1}{p+q-2\sqrt{pq}}-1\\ \Rightarrow &\ \frac{pq-p-q}{p+q},\frac{pq-p-q+1}{p+q-2\sqrt{pq}}\\ \end{aligned} \end{equation} \]

我覺得從最後的式子來看,左邊的式子比右邊的式子明顯要小,所以範圍提升了,只不過還是不清楚這個是怎麼變過去的,只能這樣倒著往回看了……

第三種是在許多的\(\displaystyle\frac{k}{dg}\)的猜想上執行演算法。執行演算法可能從很小的初始猜測開始,而在較大的猜測上成功。在這種情況下需要對\(\displaystyle\frac{k}{dg}\)進行線性搜尋。當金鑰在(29)的範圍中,演算法需要執行多項式次,而超出範圍的部分,演算法必須執行的次數會呈現指數增長。

第四種是尋找\(g\)\(g\)的因子。假設已知\(t\)\(g\)的因子,那麼就可以用\(t(\displaystyle\frac{e}{pq})\)作為\(\displaystyle\frac{k}{d(\displaystyle\frac{g}{t})}\)的一個較低估計。

在這種情況下,(29)會變成:

\[kd(\frac{g}{t})<\frac{pq}{\frac{3}{2}(p+q)} \]

這通過尋找\(t\)提高了可以找到的\(d\)的範圍。我們現在需要一種方法來找到\(g\)的因子。因為\(g\)可以整除\(GCD(p-1,q-1)\),\(g\)就可以整除\(p-1\)\(q-1\)。這意味著\(g\)也可以整除\(pq-1\)。因為:

\[pq-1=(p-1)(q-1)+(p-1)+(q-1) \]

所以或許可以通過分解\(pq-1\)來尋找\(g\)的因子。但如果\(g\)很大並且所有\(g\)的素因子都很大,這種方法就會變得很困難,然而,如果\(g\)太大了以至於\(\displaystyle\frac{p-1}{g}\)\(\displaystyle\frac{q-1}{g}\)很小,那麼就可以通過搜尋\(\displaystyle\frac{p-1}{g}\)\(\displaystyle\frac{q-1}{g}\)的可能值來找到\(g\)

8. 未解決的問題

使用低解密指數的原因主要是為了減少解密所用的時間。而有一項技術可以通過利用\(p,q\)的知識(而不僅僅是\(pq\))來減少解密時間[5]。使用這種技術要進行兩次一般大小的指數化。第一次結果是\(d_p=d\%(p-1)\),第二次結果是\(d_q=d\%(q-1)\)。這兩個結果可以用中國剩餘定理結合,得到結果。人們可以通過選擇\(d\),使得\(d_p,d_q\)都很小來減少時間。一個有趣的開放問題是當\(d_p,d_q\)很小但不相等時,是否存在一種攻擊手法。

上面這一段看懂的不多,為了減少解密時間也是我猜測的,原文給出的是secret key exponentiation time,直譯就是金鑰指數化時間。並且這個過程我也沒有完全弄懂

還有另一個關於公鑰大小有關的開放性問題。回顧一下,若公鑰至少比\(pq\)長50%,那麼本文描述的攻擊就會失效。對於某些系統而言,為了追求快速,這只是一個很小的代價。問題是,當金鑰很短,而公鑰大於模數時,是否存在針對RSA的攻擊。

9. 總結

連分數演算法可以在多項式時間內找到足夠短的金鑰。對於一個典型的情況:\(e<pq\)\(GCD(p-1,q-1)\)是很小的,而\(p,q\)有著幾乎相同的位數,該演算法最多可以找到約為模數四分之一位長度的金鑰。

有一些方法可以對抗這種攻擊。若\(e>(pq)^{1.5}\),那麼連分數演算法就不能保證對任意位數的私鑰都有效。並且,人們可能會選擇\(GCD(p-1,q-1)\)大的情況,因為可以找到的金鑰大小與\(GCD(p-1,q-1)\)的大小成反比。然而,這樣同樣也會導致一些問題。

這裡討論了幾種連分數攻擊的改進方法。然而,它們只是在可以用多項式時間找到的金鑰最大位數商增加了幾個bit。當金鑰的大小超過這個最大值時,尋找金鑰的時間就會指數級增長。

這種攻擊不能被擴充套件到金鑰與模數帶下近似相等的正常情況下。

References


  1. Pollard, J.M., "Theorems on factorization and primality testing", Proc. Cambridge Philos. Soc., vol. 76, 1974, pp. 521-528. ↩︎

  2. Williams, H.C., "A p+1 Method of Factoring", Mathematics of Computation, vol. 39, no. 159, July 1982, pp. 225-234. ↩︎

  3. Knuth, D.E., Art of Computer Programming Volume 2 / Seminumerical Algorithms, Addison Wesley, 1969. ↩︎

  4. Rivest, R.L., A. Shamir, and L. Adleman, "A Method for Obtaining Digital Signatures and Public-Key Cryptosystems", Communications of the ACM, vol. 21, no. 2, February 1978, pp. 158-164. 14 ↩︎

  5. Quisquater, J.J. and C. Couvreur, "Fast Decipherment Algorithm for RSA Public Key Cryptosystem", Electronics Letters, vol. 18, no. 21, October 1982, pp. 905- 907. ↩︎

相關文章