当曲高和寡不是一个结果的时候,它往往会成为一种错觉,……,若你的思考真的精妙到了只有你自己能理解,那你岂不是更应该将你精妙的思考分享给他人?

【论文阅读笔记】-针对RSA的短解密指数的密码学分析(Cryptanalysis of Short RSA Secret Exponents)

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. ↩︎

posted @ 2022-02-13 17:06  01am  阅读(669)  评论(2编辑  收藏  举报