Typesetting math: 100%

曲高和寡往往会成为一种错觉,倘若思考真的精妙到了只有自己才能理解,推广它便是理所应当的下一步

【论文阅读笔记】-针对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]。这里也有一个简单的算法可以在两个素数的差值仅仅比任意素数的平方根大多项式倍时分解模量。这个算法基于下面这个恒等式:

(p+q2)2pq=(pq2)2(p+q2)2pq=(pq2)2

p+q2p+q2pq2pq2已知的情况下,模数就可以被分解,而数字(p+q2)2(p+q2)2可以在大于模数的完全平方数中线性搜索。而正确的数字k则满足条件:k-pq也是一个完全平方数。

上面这个式子说明(p+q2)2(p+q2)2大于pqpq

然后是关于文中提及的大多项式倍,这里有:

polynomially larger

来源:Meaning of "polynomially larger"

提问:

For example

Is nn polynomially larger than nlognnlogn? Than nlognnlogn?

Is n2n2 polynomially larger than nlognnlogn? Than nlognnlogn?

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)f(n) is polynomially greater than g(n)g(n) if and only if there exist generalized polynomials (fractional exponents are allowed) p(n),q(n)p(n),q(n) such that the following inequality holds asymptotically:

“Polynomially larger”的意思是函数比率渐进的落在两个多项式之间。具体的说,f(n)f(n)对于g(n)g(n)是polynomially greater的当且仅当存在一个广义多项式(允许指数为小数)p(n),q(n)p(n),q(n),使得以下不等式渐进成立:

p(n)f(n)g(n)q(n)p(n)f(n)g(n)q(n)

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

对于第一个问题,我们有比率(这个比率应该就是nnlognnnlogn)等于lognlogn。因为不存在多项式时log(n)log(n)的下界,所以不存在多项式p(n),q(n)p(n),q(n),使得p(n)log(n)(n)p(n)log(n)(n)渐进成立。因此这个不是多项式有界的。对于nlognnlogn同理(尽管用不同的顺序得到相同的商,应该指的时把分子分母的顺序颠倒)

For the second problem, we have the ratio is equal to nlog(n)nlog(n). It is the case that nnlog(n)n2nnlog(n)n2 asymptotically, so it is polynomially bounded and therefore n2n2 is polynomially larger. n2nlog(n)=nlog(n)n2nlog(n)=nlog(n), and we have that (asymptotically)

对于第二个问题,我们有比率等于nlognnlogn。存在nnlog(n)n2nnlog(n)n2 渐进成立,所以这是多项式有界并且因此n2n2是polynomially larger。第二种情况的比率:n2nlog(n)=nlog(n)n2nlog(n)=nlog(n),我们有(渐进的):

n13nlog(n)nn13nlog(n)n

另一个相关问题链接:asymptotically larger vs polynomially larger

关于RSA的攻击还有很多,除去其它的条件,都会要求加密或解密指数是较小的。在一些案例中,人们会更喜欢使用较小的加解密指数,因为这样可以减小加解密的运行时间。这是因为,对于一个固定的模数大小,RSA加解密的时间简单的与指数的比特位长度成比例。如果通信两端的设备的运算性能差距过大,那么这种情况下使用小指数就会尤其的有利。一个例子就是当RSA系统应用在智能卡和大型计算机之间的通讯时。在这个例子中,智能卡最好使用小的解密指数/私钥,而大型计算机使用小的加密指数/公钥,这样可以减小智能卡通信所需要的过程。然而,人们需要警惕对于RSA的小指数攻击。

小公钥可以在向多方广播同一消息时被利用。为了说明这种攻击,假设向三方广播一个消息m,分别采用公钥e1=e2=e3=3e1=e2=e3=3和模数n1,n2,n3n1,n2,n3,那么加密的消息就是:

m3 mod n1, m3 mod n2, m3 mod n3m3 mod n1, m3 mod n2, m3 mod n3

使用中国剩余定理(CRT),就可以找到m3 mod n1n2n3m3 mod n1n2n3,但是,m3<n1n1n3m3<n1n1n3因为m<n1,n2,n3m<n1,n2,n3。因此,m3m3在模n1n2n3n1n2n3的情况下不会发生变化,并且消息mm可以通过开三次方根来恢复。

在这篇论文中,会介绍一个针对小密钥情况的,基于连分式的攻击方法。

这里这个中国剩余定理的运用时要求在RSA中,明文的大小小于模数。

2. 连分数背景知识

连分数可以在一个分式足够接近的近似已知的情况下被用来寻找这个分式的分子和分母。这将会与第四节中的RSA有关,其中公钥和模量将用于构建涉及私钥的分数的估计值。

这个使用连分数来寻找给定估计值分数形式的分子和分母的算法在此处称作连分数算法。这个算法会在第3节中进行阐述。而关于这个连分数算法有关的连分数背景知识则会在这一节进行介绍。关于连分数更深入的讨论可以在[3]中寻找。

一个连分数的一个如下形式的表达式:

a1q1+a2q2+a3...qm1+amqm=a1/(q1+a2/(q2+a3/(.../(qm1+am/qm)...))).a1q1+a2q2+a3...qm1+amqm=a1/(q1+a2/(q2+a3/(.../(qm1+am/qm)...))).(1)

我们讨论的连分数更多是在所有的ai=1ai=1的情况下。为了方便,让我们定义:

<q0,q1,...,qm>=q0+1/(q1+1/(q2+1/(.../(qm1+1/qm)...))).<q0,q1,...,qm>=q0+1/(q1+1/(q2+1/(.../(qm1+1/qm)...))).(2)

例如:<0,2,1,3>=0+1/(2+1/(1+1/3))=411<0,2,1,3>=0+1/(2+1/(1+1/3))=411

<0,2,1,3><0,2,1,3>被称作411411的连分数展开式( continued fraction expansion)。一个正有理数( positive rational number)ff的连分数展开式是通过减去ff的整数部分并取剩余部分的倒数,再减去整数部分,再取倒数,如此反复直到余数为零。设qiqi为整数部分,riri是第i步的余数,m为取倒数的次数,则有:

q0=f,   r0=fq0,   andqi=1ri1,   ri=1ri1qi,   for  i=1,2,...,mq0=f,   r0=fq0,   andqi=1ri1,   ri=1ri1qi,   for  i=1,2,...,m(3)

因为rmrm为0,我们有f=<q0,q1,...,qm>f=<q0,q1,...,qm>

关于连分数有两个需要注意的点,后面会很有用。第一个是qi2qi2。因为qi=1qi=1意味着ri1=1ri1=1,而这是不可能的。第二个则是对于任意的x>0x>0,有:

q0,q1,q2,...,qm < q0,q1,...,qm1,qm+x   mq0,q1,q2,...,qm > q0,q1,...,qm1,qm+x   mq0,q1,q2,...,qm < q0,q1,...,qm1,qm+x   mq0,q1,q2,...,qm > q0,q1,...,qm1,qm+x   m(4)

这个可以通过连分数式子验证。

这里第一点原文中下标都是m,但是这里我觉得i更合理。

我们现在要考虑的是如何通过连分数展开式来重建ff。可以根据式子(2)来逆推,也就是将qmqm取倒数,然后加上qm1qm1,然后再去倒数……一直到q0q0。但是,更有效的方法是从q0q0开始重建ff。设ninidi,i=0,1,2,...,mdi,i=0,1,2,...,m是一个如下定义的分子分母的序列:

nidi=q0,q1,...,qi,   gcd(ni,di)=1   i=1,2,...,m.nidi=q0,q1,...,qi,   gcd(ni,di)=1   i=1,2,...,m.(5)

过程如下:

n0=q0,d0=1,n1=q0q1+1,d1=q1ni=qini1+ni2,di=qidi1+di2   i=2,3,...,m.n0=q0,d0=1,n1=q0q1+1,d1=q1ni=qini1+ni2,di=qidi1+di2   i=2,3,...,m.(6)

可以通过这种方法重建分式f=nmdmf=nmdm

这里有关于一个关于ff的分子与分母之间的关系,在后面会有用:

nidi1ni1di=(1)i    i=1,2,...,m.nidi1ni1di=(1)i    i=1,2,...,m.(7)

现在关于连分数算法的背景知识都已经在这里介绍完毕了。

关于连分数可以看我之前发的一篇关于连分数的介绍,可以当作参考~

3. 连分数算法

ff作一个较小的估计ff

f=f(1δ), δ0.f=f(1δ), δ0.(8)

qi,riqi,riqi,riqi,ri分别是f,ff,f的第i个整数部分和小数部分。如果δδ足够的小,那么ff的分子分母就可以用下面的算法来寻找:

重复下列步骤直到ff被找到:

- 生成ff的连分数展开式的第i项(qiqi,就是q1,q2,...,qiq1,q2,...,qi

- 用公式(6)来将展开式重建一个数

如果ii为偶数,展开式为:q0,q1,...,qi1,qi+1q0,q1,...,qi1,qi+1

如果ii为奇数,展开式为:q0,q1,...,qi1,qiq0,q1,...,qi1,qi

​ - 检查这个数是否等于ff

我对于这个算法的理解是:跟公式(6)的原理有关。ii不是最后一位,所以奇数个q1,q2,...,qiq1,q2,...,qi然后因为f>ff>f,所以

之所以在每一个(不是只有最后一个)偶数项(ii为偶数)上加1,是因为对于ff的猜测(guess)要大于ff(因为f>ff>f),并且从公式(4)中可以看出,q0,q1,...,qi1,qiq0,q1,...,qi1,qi是小于f=q0,q1,...,qi1,qi+rif=q0,q1,...,qi1,qi+ri。注意必须存在一个测试来确定对于ff的猜测是否正确。

当:

q0,q1,...,qm1,qm1<fq0,q1,...,qm   mq0,q1,...,qm1,qm+1<fq0,q1,...,qm   mq0,q1,...,qm1,qm1<fq0,q1,...,qm   mq0,q1,...,qm1,qm+1<fq0,q1,...,qm   m(9)

时连分数算法是正确的。

我对于这个地方的理解:

i=mi=m时,因为这时候偶数项都加上了1,所以是可以满足当m为偶数且不是最后一项时,仍然可以满足fq0,q1,...,qmfq0,q1,...,qm,而q0,q1,...,qm1,qm1q0,q1,...,qm1,qm1并不是一定小于ff,而是小于q0,q1,...,qmq0,q1,...,qm,奇数同理。不过我看不出来为啥一定要满足这个条件,也许是为了体现ffff相差不大(δδ很小)?

现在我们考虑(9)对于δδ大小的影响。对于(8)求解,得到:

δ=1ff.δ=1ff.(10)

分别按照下列情况来分析:m=0,m=1,m是偶数并且m22,m是奇数并且m33

下面的n和d与q的关系可以在(6)中查看

  • m=0

    用(9)在(10)中代替ff(把(9)带入(10)),有:

    δ<1q01q0δ<1q01q0(11)

    结合(2),可以化简为δ<1q0δ<1q0,这个也可以被写成(设n0=q0,d0=1n0=q0,d0=1):

    δ<1n0d0δ<1n0d0(12)

  • m=1

    用(9)在(10)中代替ff,有:

    δ<1q0,q1+1q0,q1δ<1q0,q1+1q0,q1(13)

    结合(2),可以化简为:

    δ<1(q0q1+1)(q1+1)δ<1(q0q1+1)(q1+1)(14)

    在前面有说明过:qm2qm2。在(14)中q1+132q1q1+132q1。将这个和(6)中关于n1,d1n1,d1的表达式与(14)结合,有:

    δ<132n1d1δ<132n1d1(15)

    足以保证连分数算法成功。

  • m是偶数且m22

    用(9)在(10)中代替ff,有:

    δ<1q0,q1,...,qm1qm1q0,q1,q2,...,qmδ<1q0,q1,...,qm1qm1q0,q1,q2,...,qm(16)

    根据(6),有(其实还有(5)):

    q0,q1,...,qm1qm1=(qm1)nm1+nm2(qm1)dm1+dm2q0,q1,q2,...,qm=qmnm1+nm2qmdm1+dm2q0,q1,...,qm1qm1=(qm1)nm1+nm2(qm1)dm1+dm2q0,q1,q2,...,qm=qmnm1+nm2qmdm1+dm2(17)

    带进(16):

    δ<nm1dm2nm2dm1(qmnm1+nm2)(qmdm1+dm2dm1)δ<nm1dm2nm2dm1(qmnm1+nm2)(qmdm1+dm2dm1)(18)

    通过(7)和(6)中nm,dmnm,dm的表达式,有:

    δ<1nm(dmdm1)δ<1nm(dmdm1)

    因此,可知

    δ<1nmdmδ<1nmdm

    足以保证连分数算法的成功

  • m是奇数且m33

    分析过程与上面类似,有:

    δ<1nm(dm+dm1).δ<1nm(dm+dm1).(21)

    因为dm=qmdm1+dm2dm=qmdm1+dm2并且qm2qm2,我们得到了dm+dm132dmdm+dm132dm。因此,可知:

    δ<132nmdmδ<132nmdm(22)

    足以保证连分数算法的成功。

    注:dm+dm132dmdm+dm132dm的来源:

    dm=qmdm1+dm2dm+dm1=(qm+1)dm1+dm2qm2, qm+132dm+dm1=(qm+1)dm1+dm2dm=qmdm1+dm2dm+dm1=(qm+1)dm1+dm2qm2, qm+132dm+dm1=(qm+1)dm1+dm2(1)

综合四个情况的结果,

δ<132nmdmδ<132nmdm(23)

足够保证连分数算法的成功。且,nm,dmnm,dm分别是ff的分子和分母。

让我们现在考虑这个算法的执行时间。设x=max(nm,dm)x=max(nm,dm)。连分数展开式商(这个商就是连分数展开式中的每一个qiqi)的个数是O(logx)O(logx)。对于每一个商,都要生成并测试一个对于ff的猜测。生成每一个关于ff的猜测所需要的计算都是logxlogx多项式。因此假设对于ff 的猜测是否正确的检验是logxlogx多项式,那么连分数算法执行的时间是logxlogx多项式。

4. 连分数算法在RSA中的应用

公钥ee和私钥dd的下列关系在参考文献[4]中提及:

ed1(mod LCM(p1,q1))ed1(mod LCM(p1,q1))(24)

公私钥之间互为逆元的关系在求幂中是必须的。从(24)中可知,一定存在一个整数KK

ed=KLCM(p1,q1)+1ed=KLCM(p1,q1)+1(25)

如果我们设G=GCD(p1,q1)G=GCD(p1,q1),并且利用LCM(p1,q1)=(p1)(q1)GLCM(p1,q1)=(p1)(q1)G,会得到:

ed=KG(p1)(q1)+1ed=KG(p1)(q1)+1(26)

KKGG可能会有公因数。所以定义k=KGCD(K,G),g=GGCD(K,G)k=KGCD(K,G),g=GGCD(K,G),会得到kg=KG,GCD(k,g)=1kg=KG,GCD(k,g)=1。我们现在有:

ed=kg(p1)(q1)+1ed=kg(p1)(q1)+1(27)

(27)两边分别除以dpqdpq

epq=kdg(1δ),  δ=p+q1+gkpqepq=kdg(1δ),  δ=p+q1+gkpq(28)

注意到epqepq完全由公开的信息组成,并且还是kdgkdg的一个较低的估计。在使用连分数算法之前,我们需要想到这个算法总是在寻找最简分式(fractions in lowest terms)。从(25)中可以看到GCD(K,d)=1GCD(K,d)=1。因为kk可以整除KK,可以得到GCD(k,d)=1GCD(k,d)=1。并且GCD(k,g)GCD(k,g)是前面定义中就有的。因此GCD(k,dg)=1GCD(k,dg)=1,并且连分数算法可以在δδ足够小的时候被用来寻找kkdgdg

通过(28)中δδ的表达式和(23)中关于δδ的约束,可以看出:

kdg<pq32(p+q)kdg<pq32(p+q)(29)

足以让kkdgdg被找到。注意到在关于δδ的表达式中(1gk)(1gk)被去掉了,这是因为它相对于(p+q)(p+q)来说太小了。因为(1gk)(1gk)会减小δδ的大小,所以这不会影响到(29)的正确性。

过程如下:

δ<132nmdmp+q1gkpq<132kdgkdg<pq32(p+q1gk)δ<132nmdmp+q1gkpq<132kdgkdg<pq32(p+q1gk)(2)

然后去掉(1gk)(1gk),会让kdgkdg的约束条件变的更加严格,范围更小,所以是没有影响的。而且去掉了之后,式子就都是由已知量组成的。

我们现在考虑如何测试一个关于kkdgdg的猜想是正确的。为了简化这个测试,我们要假设ed>pqed>pq。这并非是一个很严格的假设,因为当eedd是固定的时候,剩下的那个值是接近pqGpqG(回想一下G=GCD(p1,q1)G=GCD(p1,q1)。除非GG非常大,否则ed>pqed>pq。根据(27),ed>pqed>pq的一个结论就是k>gk>g。重新排列(27),有:

edg=k(p1)(q1)+gedg=k(p1)(q1)+g(30)

虽然不知道为什么e,de,d中的一个值确定,另一个值就会接近pqGpqG,但是有这个条件后,设ee是固定的,那么:ed=epqG=eGpqed=epqG=eGpq,只要GG不大于ee,那么就会有ed>pqed>pq。后面那个则是因为展开(27),有ed=kgpq[kg(p+q1)1]ed=kgpq[kg(p+q1)1],式子中中括号部分一定是正数,所以ed<kgpqkg>1k>ged<kgpqkg>1k>g

我们看到当k>gk>g,将edgedg除以kk就会得到一个商(p1)(q1)(p1)(q1)和余数 gg。这提供了一个关于(p1)(q1)(p1)(q1)gg的猜想。如果这个关于(p1)(q1)(p1)(q1)的猜想为0,那么这个kkdgdg就是错误的。这种情况必须被过滤掉,否则这个测试之后会将pq分解为pq和1。关于(p1)(q1)(p1)(q1)的猜测可以利用下面这个式子来创建另一个关于p+q2p+q2的猜测:

pq(p1)(q1)+12=p+q2pq(p1)(q1)+12=p+q2(31)

如果(通过(p1)(q1)(p1)(q1)的猜测求出的)关于p+q2p+q2的猜测不是一个整数,那么关于kkdgdg的猜测就是错误的。而这个关于p+q2p+q2的猜想还可以来创建pq2pq2的猜测:

(p+q2)2pq=(pq2)2(p+q2)2pq=(pq2)2(32)

如果(计算出的)关于(pq2)2(pq2)2可以被完全开方,那么,关于kkdgdg的原始猜测就是正确的。密钥dd就可以通过将dgdg除以gg来找到。回想一下,当edgedg除以kk时,gg是余数。我们还可以从p+q2p+q2pq2pq2中恢复p,qp,q

edgkedgk的小数部分,乘上得到的k,就可以求出g

如果没有采取任何措施来反制这种针对RSA的连分数攻击,那么人们就可以预计gg很小,k<dgk<dg。在这些条件下,从(29)中可以看到可以在多项式时间内找到位数最多约为模量四分之一的密钥。这种攻击不能扩展到密钥和模量大小近似想等的情况。因为这种攻击依赖于公钥提供的信息来帮助分解模量,而在正常情况下,公钥的选择几乎独立于模量。

5. 例子

在这一节,连分数算法会应用于一个小的RSA指数对中。例如:

pq=8927,e=2621pq=8927,e=2621

连分数算法会在epq=26218927epq=26218927上执行:

变量名 计算方法 i=0 i=1 i=2
qiqi (3) 0 3 2
riri (3) 2621892726218927 1064262110642621 49310644931064
nidi=q0,q1,...,qinidi=q0,q1,...,qi (6) 0101 1313 2727
kdgkdg的猜测值 iq0,q1,...,qiiq0,q1,...,qi+1iq0,q1,...,qiiq0,q1,...,qi+1 1111 1313 310310
edgedg的猜测值 edgedg 2621 7863 26210
(p1)(q1)(p1)(q1)的猜测值 edgkedgk 2621 7863 8736
gg的猜测值 edgmodkedgmodk 0 0 2
p+q2p+q2的猜测值 (31) 3153.5 532.5 96
pq2pq2的猜测值 (32) 289=172289=172
d dggdgg 5

在这个例子中,连分数攻击产生了:

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

我们可以看出这些值是满足(27)的,所以可知d=5d=5是对应e=2621e=2621在模pq=8927pq=8927下的密钥。还可以看出这些条件也符合(29)。

这个例子说明了连分数攻击的细节,但是考虑实际情况是更加有意义的。假设RSA使用了1024位的模数。那么p,qp,q都是接近25122512。假设g=2g=2,并且epqepq使得kdgkdg(见(28))。然后根据(29),可以看出连分数攻击将找到大小约小于22552255的密钥。

因为pq21024,p,q2512,kdgpq21024,p,q2512,kdg,有:

kdg<pq32(p+q)4d2<210242512=25122d<2256d<2255kdg<pq32(p+q)4d2<210242512=25122d<2256d<2255(3)

6. 对RSA连分数攻击的反制

有两种方法可以减小RSA连分数攻击可以找到的密钥的最大范围。从(29)中可以看出,这两种方法分别是让kk变大和让gg变大。

为了让kk变大,我们需要让公钥ee变大(从(27)中得出)。这可以给ee加上LCM(p1.q1)LCM(p1.q1)的倍数。假设e>(pq)1.5e>(pq)1.5。这意味着kdg>(pq)0.5kdg>(pq)0.5(从(28)得出)。将k=dg(pq)0.5k=dg(pq)0.5代入(29),可以得到d<1d<1。因此,如果e>(pq)1.5e>(pq)1.5,那么无论密钥大小,连分数算法都将失效。提高ee的大小会有增加加密过程执行时间的缺点。但是这也许在某些系统中是可行的。

k=dg(pq)0.5k=dg(pq)0.5代入(29),有:

(dg)2pq=pq32(p+q)(dg)2=pq32(p+q)(dg)2pq=pq32(p+q)(dg)2=pq32(p+q)(4)

根据基本不等式a+b2aba+b2ab,可知pqa+b2<3(p+q)2pqa+b2<3(p+q)2。而g1g1,所以可以得到d<1d<1。而当e>(pq)1.5e>(pq)1.5kdg>(pq)0.5kdg>(pq)0.5,根据相同的过程,可以知道dd肯定小于1

为了让gg变大,p,qp,q需要被精细挑选以满足GCD(p1,q1)GCD(p1,q1)足够大。然而我们可以在后面看见在某些特定的条件下可以找到gggg的因子。

7. 对于攻击的改进

在这一节,会讨论四种针对短密钥攻击的可行的改进。第一种改进是允许连分数算法可以在略微超出(29)的界限中继续搜索dd。这个算法仅保证可以达到这个界限,但是实际上它可能会在略微超出这个界限的地方继续工作。这使得即使私钥dd的大小大了一个bit左右也可以被找到。

第二种改进是基于epqepq的分母(这个式子是kdgkdg的一个较低的估计)是(p1)(q1)(p1)(q1)的一个简单的较高估计。一个更加接近(p1)(q1)(p1)(q1)的较高估计是:

(pq1)2(pq1)2

用这个估计,(29)会变成:

kdg<23(pq1pq)2kdg<23(pq1pq)2

这增加了可以被找到的私钥范围。而改善幅度随着|pq||pq|的降低而提高。

抛去那个向下取整,很容易看出(p1)(q1)<(pq1)2<pq(p1)(q1)<(pq1)2<pq。而:

 pqp+q,(pq1pq)2 pqp+q,pq2pq+1p+q2pq pqp+q1,pq2pq+1p+q2pq1 pqpqp+q,pqpq+1p+q2pq pqp+q,(pq1pq)2 pqp+q,pq2pq+1p+q2pq pqp+q1,pq2pq+1p+q2pq1 pqpqp+q,pqpq+1p+q2pq(5)

我觉得从最后的式子来看,左边的式子比右边的式子明显要小,所以范围提升了,只不过还是不清楚这个是怎么变过去的,只能这样倒着往回看了……

第三种是在许多的kdgkdg的猜想上执行算法。执行算法可能从很小的初始猜测开始,而在较大的猜测上成功。在这种情况下需要对kdgkdg进行线性搜索。当密钥在(29)的范围中,算法需要执行多项式次,而超出范围的部分,算法必须执行的次数会呈现指数增长。

第四种是寻找gggg的因子。假设已知ttgg的因子,那么就可以用t(epq)t(epq)作为kd(gt)kd(gt)的一个较低估计。

在这种情况下,(29)会变成:

kd(gt)<pq32(p+q)kd(gt)<pq32(p+q)

这通过寻找tt提高了可以找到的dd的范围。我们现在需要一种方法来找到gg的因子。因为gg可以整除GCD(p1,q1)GCD(p1,q1),gg就可以整除p1p1q1q1。这意味着gg也可以整除pq1pq1。因为:

pq1=(p1)(q1)+(p1)+(q1)pq1=(p1)(q1)+(p1)+(q1)

所以或许可以通过分解pq1pq1来寻找gg的因子。但如果gg很大并且所有gg的素因子都很大,这种方法就会变得很困难,然而,如果gg太大了以至于p1gp1gq1gq1g很小,那么就可以通过搜索p1gp1gq1gq1g的可能值来找到gg

8. 未解决的问题

使用低解密指数的原因主要是为了减少解密所用的时间。而有一项技术可以通过利用p,qp,q的知识(而不仅仅是pqpq)来减少解密时间[5]。使用这种技术要进行两次一般大小的指数化。第一次结果是dp=d%(p1)dp=d%(p1),第二次结果是dq=d%(q1)dq=d%(q1)。这两个结果可以用中国剩余定理结合,得到结果。人们可以通过选择dd,使得dp,dqdp,dq都很小来减少时间。一个有趣的开放问题是当dp,dqdp,dq很小但不相等时,是否存在一种攻击手法。

上面这一段看懂的不多,为了减少解密时间也是我猜测的,原文给出的是secret key exponentiation time,直译就是密钥指数化时间。并且这个过程我也没有完全弄懂

还有另一个关于公钥大小有关的开放性问题。回顾一下,若公钥至少比pqpq长50%,那么本文描述的攻击就会失效。对于某些系统而言,为了追求快速,这只是一个很小的代价。问题是,当密钥很短,而公钥大于模数时,是否存在针对RSA的攻击。

9. 总结

连分数算法可以在多项式时间内找到足够短的密钥。对于一个典型的情况:e<pqe<pqGCD(p1,q1)GCD(p1,q1)是很小的,而p,qp,q有着几乎相同的位数,该算法最多可以找到约为模数四分之一位长度的密钥。

有一些方法可以对抗这种攻击。若e>(pq)1.5e>(pq)1.5,那么连分数算法就不能保证对任意位数的私钥都有效。并且,人们可能会选择GCD(p1,q1)GCD(p1,q1)大的情况,因为可以找到的密钥大小与GCD(p1,q1)GCD(p1,q1)的大小成反比。然而,这样同样也会导致一些问题。

这里讨论了几种连分数攻击的改进方法。然而,它们只是在可以用多项式时间找到的密钥最大位数商增加了几个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 @   01am  阅读(849)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示
主题色彩