原文:Twenty Years of Attacks on the RSA Cryptosystem

作者:Dan Boneh@Stanford University([email protected])

译者:Jing Ling@360ESG A-Team([email protected])

1 介绍

由Ron Rivest,Adi Shamir和Len Adleman发明的RSA密码系统首次在1977年8月的"科学美国人"杂志上发表(译者注:本文于1999年2月在美国数学学会的Notices杂志首次发布)。密码系统最常用于提供隐私保护和确保数字数据的真实性。目前,RSA部署在许多商业系统中。Web服务器和浏览器使用它来保护Web流量,它可以用于保障电子邮件的隐私和真实性,还可以用于保护远程登录会话,同时它也是电子信用卡支付系统的核心。简而言之,RSA常用于需要考虑数字数据安全性的应用中。

自最初发布以来,RSA系统已被许多研究人员分析认为是易受攻击的。尽管二十年的研究出了许多引人入胜的攻击,但其中没有一个攻击是毁灭性的。这些攻击主要说明了不当使用RSA的危险,可见安全地实施RSA确实也是一项非常重要的任务。我们的目标是使用基础数学的知识分析其中的一些攻击,在整个分析过程中,我们遵循标准命名约定,使用Alice和Bob表示希望彼此通信的两个正常通信方,使用Marvin来表示希望窃听或篡改Alice和Bob之间通信的恶意攻击者。

我们首先介绍一下RSA加密的简化版本。令是比特位长度相同(位)的两个大素数的乘积。常见的长度大小是=1024位(即:309个十进制数字),质因子=512位。令为满足的两个整数,其中是乘法群的阶数。我们称为RSA模数,为加密指数,为解密指数。为公钥。顾名思义,公钥是公开的,并用于加密消息。称为密钥或私钥,一般情况下只有加密消息的接收者知道,私钥能够解密密文。

消息是一个整数且满足,要加密,计算,要解密密文合法接受者计算。(译者注:下面是译者添加的的证明)

欧拉定理:若为正整数,且互素(即),则

已知,求证

证明:

等式左边为

等式右边为

等式右边等于等式左边,证毕。

定义一个RSA函数,如果已知,很容易使用等式求出,我们称为求解函数的陷门。在本次课题研究在没有陷门的情况下求解RSA函数,更准确的说,给一个三元组,我们知道在不知道的因子想计算根是非常困难的。因为是有限集,因此可以枚举的所有元素直到找到。遗憾的是,这将导致算法具有阶的运行时间,即其输入大小的指数,其为的阶数。我们对运行时间更低的算法感兴趣,即的阶数(其中)或者是一些小的常数(比如说小于5)。实践表明这些算法通常在所讨论的输入情况表现良好,在整篇论文中,我们将此类算法称为高效算法。

此次课题我们主要研究RSA函数而不是RSA密码系统。笼统地说,随机输入上求解RSA函数的应该是非常困难的,也就是意味着给定攻击者无法计算出明文。这还不够,密码系统必须抵御更微妙的攻击。如果给出,想从中计算出任何信息应该是非常难的,这被称为语义安全。我们不讨论这些微妙的攻击,但是必须指出的是如上所述的RSA在语义上是不安全的:给定,可以容易地推导出关于明文的一些信息(例如,可以容易地从推导出上的的雅可比符号)。通过向加密过程添加随机处理流程,可以保障RSA在语义上的安全性。

RSA函数是一个单向陷门函数,正向它可以很容易地计算,但是(据我们所知)除非在特殊情况下,否则在没有陷门的情况下不能有效地反向求解的。单向陷门函数可用于数字签名,数字签名可以保障电子文件的真实性和不可否认性。例如,它们用于签署数字支票或电子采购订单。为了使用RSA对消息进行签名,Alice使用其私钥签名并获得签名。给定之后任何人都可以验证上的Alice签名通过。因为只有Alice可以生成,人们可能会认为攻击者无法伪造Alice的签名。然而事情并非如此简单,为了保障签名的安全还需要一些额外的措施。数字签名是RSA的重要应用,此次课题我们也会研究一些针对RSA数字签名的攻击。

RSA密钥对可以这样生成,选取两个随机位素数并将它们相乘以获得来生成。然后,对于给定的加密指数,使用扩展欧几里德算法计算。由于素数集是足够密集的,因此可以通过重复选择随机位整数并使用概率素性测试对每个素数进行素性测试来快速生成随机位素数。

1.1 大数分解

给了RSA公钥,首先想到的攻击就是分解模数,给了的因子攻击者可以计算得到,从而也可以计算得到解密指数,我们称这种分解模数的方法为针对RSA的暴力攻击。虽然分解算法已经稳步改进,但是在正确使用RSA情况下,当前的技术水平仍远未对RSA的安全性构成威胁。大整数分解是计算数学之美,不过本文研究主题并不是大整数分解。为完整起见,我们顺便提一下,目前普通数字域筛法是效率最高的分解方法。分解位整数需要时间为其中,对RSA进行攻击的方法花费时间超过这个范围就那么吸引人了,比如暴力搜索方法,还有一些RSA发布不久后的旧方法。

我们的目的是研究在不直接分解RSA模数情况下解密消息的攻击方法,值得注意的是,一些RSA模数的稀疏集,可以很容易地被分解,举个例子,如果是乘积的质因子且小于,那么在小于时间内分解

如上所述,如果存在有效的因式分解算法,则RSA是不安全的,反之亦然。这是一个由来已久的公开问题:必须要有一个的因子才能有效地计算的根数?破解RSA和因式分解一样难吗?我们在下面提出了具体的开放性问题。

开放性问题 1

给定满足,定义函数:。是否有多项式时间算法来计算给定的因子以及对于某个求得的一个谕言?

的谕言用于评估在单位时间内任何输入的函数,最近Boneh和Venkatesan提供的证据表明,在比较小的情况下,上述问题的答案可能是否定的。换句话说,在比较小的情况下,可能不存在从分解到破解RSA的多项式时间缩减。他们通过实验表明在某个模型中对小的问题的肯定答案会产生一个有效的因式分解算法。我们注意到,对开放问题1的肯定回答会引起对RSA的"选择密文攻击"。因此,否定的回答可能才是大家喜闻乐见的。

接下来,我们证明公开私钥和分解是等价的。由此可见,对于知道的任何一方来说,隐藏的因式分解是没有意义的。

事实1

为RSA的公钥,给定私钥可以有效地分解模数。相反地,给定的因式分解,可以有效地算出私钥

证明

的因式分解得到,因为已知的,那么可以算出,反之亦然。我们现在证明给定可以分解。给定,计算。根据的定义我们知道的倍数。由于是偶数,其中为奇数且。对于每个都有,因此是单位模的平方根。根据中国剩余定理,1有四个平方根模。其中两个平方根是,另外两个是,其中满足。用这最后两个平方根中的任意一个,通过计算来揭示的因式分解。一个直截了当的论证表明,如果从中随机选择,那么序列中的一个元素,...,是统一平方根的概率至少为1/2,从而揭示了的分解,序列中的所有元素可以在时间内有效地计算,其中

2 基本攻击

我们首先描述一些老的基本攻击,这些攻击说明了RSA的公然滥用情况。虽然存在许多这样的攻击,但我们仅举两个例子。

2.1 共模

为了避免为每个用户生成不同的模数,人们可能希望一劳永逸地固定使用一个,所有用户都使用相同的。可信的中央机构可以向用户提供唯一的一对,用户从其中生成公钥和私钥

乍一看,这似乎行得通:为Alice准备的密文无法由Bob解密,因为Bob不知道。但是,这是不正确的,由此产生的系统是不安全的。事实上,Bob可以使用他自己的指数来分解。一旦被分解,Bob就可以从她的公钥中计算出Alice的私钥。Simmons的这一观察结果表明,RSA模不应被一个以上的实体使用。

2.2 盲化

是Bob的私钥,而是他相应的公钥。假设攻击者Marvin想要Bob在消息上签名。当然Bob不是傻瓜,他拒绝签署。但是Marvin可以尝试以下方法:他随机选择一个并设。然后他让Bob在随机消息上签名。Bob可能愿意在看上去没什么问题的上签名,但是回想一下,Marvin现在简单地计算就得到Bob在初始上的签名

这种称为盲化的技术使Marvin能够在他选择的消息上获得有效的签名,方法是让Bob在随机的"盲化"消息上签名。Bob不知道他实际在签名的是什么消息。由于大多数签名方案在签名之前对消息应用"单向散列"算法,因此此种攻击倒不是一个严重的问题。尽管我们将盲化描述为一种攻击,但它实际上是实现匿名数字现金所需的一个有用属性(可以用来购买商品的现金,但不会透露购买者的身份)。

3 低私钥指数

为了减少加密时间(或签名生成时间),人们可能希望使用小值而不是随机。由于模幂运算需要花费线性时间为,所以小可以使性能提高至少10倍(对于1024位模数而言)。不幸的是,由M.Wiener发现的一种巧妙的攻击表明,一个小的会导致密码系统完全被攻破。

定理2(M. Wiener)

,给定且满足,攻击者可以有效计算出

证明

证明基于使用连分数的逼近,由于,那么存在一个满足。所以,

因此,的逼近,尽管Marvin不知道,但是他可能会使用去近似。因为(译者注:),(译者注:因为,所以,所以),我们有

使用替换,我们得到:

现在,,因为,我们知道(译者注:可以得到)。因此我们得到:

这是一个经典的逼近关系,分数约束内非常逼近。实际上,所有类似这样的分数都是的连分数展开的收敛。因此我们首要做的便是计算的连分数的收敛,其中一个连分数就等于。因为,我们有,因此是一个最简分数。这是可以算出密钥的线性时间算法。

由于通常都是1024位,因此必须至少256位长才能避免这种攻击。这对于诸如"智能卡"之类的低功耗设备来说是不幸的,因为小就能节省大量能耗。 然而,并不是毫无办法。Wiener提出了许多能够实现快速解密并且不易受其攻击影响的技术:

使用大 假设不是减小,而是使用作为公钥,其中对于某些大

显然,可以代替用于消息加密,当使用大的值时,上述证明中的不再小。一个简单的计算表明,如果,那么无论多小,都无法实施上述攻击。然而,大的值将导致加密时间的增加。

使用CRT:

另一种方法是使用中国剩余定理(CRT)。假设选择使得都很小,比如都是128位。则可以进行如下密文的快速解密:首先计算

然后使用CRT计算满足的唯一值.

得到的满足等式。关键点在于虽然很小,但是的值可以很大,大约在的数量级上。因此,定理2的攻击不再适用。我们注意到,如果给定了,则存在一种攻击能够使攻击者能够在时间内对进行因子分解。因此,不能太小。

我们不知道这些方法中是否都安全。我们所知道的是,Wiener攻击对它们无效。最近由Boneh和Durfee改进的定理2证明了只要,攻击者就可以从中有效地算出。这些结果表明Wiener的界限并不固定。正确的界限可能是。截至撰写本文时,还是一个尚未解决的问题。

开放性问题2

,如果Marvin知道关系,他能有效算出吗?

4 低公钥指数

为了减少加密或签名验证时间,通常会使用一个小的公钥指数的最小可能值为3,但为防止某些攻击,建议使用。当使用值时,签名验证需要17次乘法,而使用随机的时则需要大约1000次乘法。与上一节的攻击不同,当使用一个小时,针对的攻击不只是攻破而已。

4.1 Coppersmith定理

针对RSA低公钥指数最有力的攻击基于Copper-smith的一个定理,Coppersmith定理有很多应用,这里我们只讨论其中的一些应用,证明使用LLL格基约化算法如下。

定理3(Coppersmith)为一个整数,次的一元多项式,设其中,在给定之后Marvin能够有效找到所有满足的整数,运行时间由在维数且的格上运行LLL算法所需的时间决定。

该定理为有效地求的所有小于的根提供了一种算法,当越小,算法的运行时间越短。这个定理的强大之处在于它能够找到多项式的小根。当模数为素数时,就目前而言,找不到比使用Coppersmith定理更好的求根算法了,没有理由不使用Coppersmith定理。

我们概述了Coppersmith定理证明背后的主要思想,我们采用由Howgrave-Graham提出的简化方法,给定一个多项式,定义,证明依赖于下面的观察。

引理4

次多项式,为正整数,假设,如果满足,那么成立。

证明 从Schwarz不等式观察到:

因为,我们得出结论

引理指出,如果是一个低范数多项式,则的所有小根也是在整数上的根。引理表明,要找到的一个小根,我们需要寻找另一个与有相同根的低范数多项式,这样就能容易找到在整数上的根。为此,我们可以寻找一个多项式,使得具有低范数,即范数小于。这相当于寻找具有低范数多项式的整数线性组合。不过,大多数情况下,并不存在具有足够小的范数的非平凡线性组合。

Coppersmith找到了解决这个问题的窍门:如果成立,那么对于任意则有。更一般地,定义以下多项式:

对于一些预定义的,则的一个根,其中。要使用引理4,我们必须找到多项式的一个整数线性组合,使得的范数小于 (回想一下是满足上界)。由于范数(是而不是)的松弛上界,我们可以证明,对于足够大的,总是存在一个线性组合满足所要求的界。一旦被找到,引理4就意味着它有作为整数的根,因此,可以很容易地找到

如何有效地找到还有待证明,要做到这一点,我们必须说明一些关于格的基本事实。 设是线性独立的向量。由构成的(满秩)格的所有整数线性组合的集合。的行列式定义为方阵的行列式,它的行列式是向量

在我们的例子中,我们把多项式看作向量,并研究了它们所构成的格。设,则格的维数。例如,当是二次一元多项式且时,得到的格由以下矩阵的行构成:

元对应于我们忽略其值的多项式的系数,所有空元为零。由于矩阵是三角形的,它的行列式是对角线上元素的乘积(如上所示),我们的目标是在这个格中找到短向量。

Hermite的一个经典结论表明:任意维数为的格包含一个非零向量,它的范数满足,其中是只依赖于的常数。Hermite的界可以用来证明,对于足够大的,我们的格包含需求小于的范数向量。问题是我们能否有效地在中构造长度小于Hermite界的短向量。LLL算法是一种有效的算法,恰好可以做到。

事实5(LLL)

是由所构成的格。当作为输入时,LLL算法输出一个向量满足:

LLL算法的运行时间是输入长度的四分之一。

LLL算法(以其发明者L. Lovasz、A. Lenstra和H. Lenstra Jr的名字命名)在计算数论和密码学中有许多应用。它在1982年的发现为整数上多项式的因式分解提供了一种有效的算法,更广泛地说,为数环上的多项式的因式分解提供了一种有效的算法。LLL算法经常被用来攻击各种密码系统,例如,许多基于"背包问题"的密码系统都是使用LLL算法破解的。

利用LLL算法,我们可以完成Coppersmith定理的证明。为了保证LLL算法产生的向量满足引理4的界,我们需要满足:

其中的维数。常规计算表明,对于足够大的,能满足约束条件。实际上,当时,取就足够了。因此,运行时间主要由在维数为的格上运行LLL算法所决定。

一个自然而然的问题,Coppersmith定理能否应用于二元和多元多项式。如果有根且有适当的界,Marvin能有效地找到吗?尽管相同的技术似乎适用于某些二元多项式,但目前还是一个有待证明的开放性问题。随着越来越多的结果依赖于Coppersmith定理的二元扩张,所以严密的算法将会非常有用。

开放性问题3

找出Coppersmith定理可以推广到二元多项式的一般条件。

4.2 Hastad广播攻击

作为Coppersmith定理第一个应用,我们对由Hastad提出的旧攻击进行了改进。假设Bob希望将加密消息发送给多方。每一方都有自己的RSA密钥。我们假定比所有都小。Bob为了发送,天真地使用每个公共密钥对其进行加密,并将第个密文发送给。攻击者Marvin可以窃听Bob对外的连接,并收集传输的个密文。

为了简单起见,假设所有公钥指数为3。一个简单的论证表明,当时,Marvin可以计算出。实际上,Marvin得到,其中:

对于所有的,我们可以假设,否则Marvin可以因式分解一些。因此,将中国剩余定理(CRT)应用于,给出的满足。由于小于所有的,我们有,那么在整数上成立,因此,Marvin可以通过计算的实数立方根来得到。更一般的情况是,如果所有的公钥指数都等于,则只要,Marvin就可以计算出。不过这种攻击只有使用较小的值时才是可行的。

Hastad提出了一种更强的攻击方法。为了抵御Hastad的攻击,考虑一下对上述攻击做一下天真防御。Bob可能在加密之前"填充"消息,而不是广播加密的。例如,如果位长的,Bob可以将发送给。由于Marvin获得了不同消息的加密,他无法发起攻击。然而,Hastad证明了这种线性填充是不安全的,事实上,他证明了在加密之前对消息应用任何固定多项式都不能阻止攻击。

假设对于每个参与者,Bob有一个固定的公用多项式。为了广播消息,Bob将的加密发送给。Marvin通过窃听知道了,其中。Hastad表明,如果有足够的参与方,Marvin可以从所有的密文中计算出明文。下面的定理是Hastad原始结论的一个更强的版本。

定理6 (Hastad)是成对的相对素数,集合。设次多项式。假设存在唯一的满足:

假设,给定,我们可以有效地找到的

证明,我们假定所有的都是一元的。(实际上,对于某些的首项系数在中是不可逆的,那么的因式分解就会显现出来。通过将每个乘以的适当幂,假定它们都有次。构造多项式:

其中是整数,被称为中国剩余系数。那么一定是一元的,因为它首项模了所有的,且次数为。此外,我们还知道。定理6现在便可由定理3推导而来,因为

该定理表明,如果提供了足够多的方程,可以有效地求解以相对素数复合模的一元方程组。令,我们可以知道,当参与方数至少为时,Marvin可以从给定的密文中计算出,其中在所有上的最大值。特别地,如果所有的都等于,并且Bob发送线性相关的消息,那么Marvin只要就可以算出明文。

Hastad的原始定理比上述定理更弱。与次多项式不同,Hastad定理需要次多项式。Hastad定理的证明类似于上一节中提到的Coppersmith定理证明。由于Hastad定理没有在格中使用的幂,从而得到了一个较弱的界。

总结这一节,我们注意到,要正确地防御上述广播攻击,必须使用随机填充方法,而不是使用固定填充方法。

4.3 Franklin-Reiter相关消息攻击

当Bob用相同的模数发送与Alice相关的加密消息时,Franklin和Reiter发现了一种聪明的攻击。是爱丽丝的公钥,假设是两个不同的消息,对于某些已知的多项式满足。为了将发送给Alice,Bob可能会天真地对消息进行加密,并传输得到的密文。我们通过证明可以知道,在给定的情况下,Marvin可以很容易地计算出。虽然攻击对任意小都有效,但为了简化证明,我们给出了的引理。

引理7(FR)

为RSA公钥。设对于的线性多项式满足。然后,给定,Marvin可以在的平方时间内计算出

证明

为了保证这部分证明的一般性,我们使用任意来表示它(而不是限制为)。由于,我们知道是多项式的根。同样,也是的根。线性因子是两个多项式的除法。因此,Marvin可以使用欧几里德算法来计算的最大公约数(Greatest Common Divisor, GCD)。如果GCD是线性的,则可以找到。GCD可以在的平方时间内算出。

我们证明了当时,GCD一定是线性的。多项式因子将都模成一个线性因子和一个不可约二次因子(因为,所以中只有一个根)。因为不能整除,所以GCD一定是线性的。对于情况,GCD几乎总是线性的。然而,对于一些罕见的,有可能得到一个非线性的GCD,在这种情况下攻击会失败。

对于情况,攻击所需时间是的平方时间。因此,只有在使用小的公钥指数时才能应用这种攻击。对于大型电子计算机来说,计算GCD的工作令人望而却步。一个有趣的问题(尽管可能很难),为任意的设计这样的攻击,尤其是能否在的多项式时间中找到上述的GCD?

4.4 Coppersmith短填充攻击

Franklin-Reiter的攻击可能看起来有点人为。毕竟,为什么Bob要给Alice发送相关消息的加密呢?Coppersmith加强了攻击,并证明了一个关于填充攻击的重要的结论。

随机填充算法可以通过将一些随机位附加到其中一个端来填充明文,但是以下攻击指出了这种简单填充的危险。假设Bob向Alice发送了正确填充的加密。攻击者Marvin拦截密文并阻止其到达目的地。Bob注意到Alice没有回复他的消息,并决定将重新发送给Alice。他随机填充并传输生成的密文。Marvin现在有两个密文,对应于使用两种不同随机填充对同一消息的两次加密。以下定理表明,虽然他不知道使用的填充算法,但Marvin仍能够算出明文。

定理8

为RSA公钥,其中的长度为是位。令集合。设是长度最长为位的消息。定义,其中是分别为的整数。如果Marvin知道了的加密(但不知道),则他可以有效地计算出M。

证明

定义,我们知道当时,这些多项式有相同的根。换句话说,是结式的根。的次数最多是。此外有,因此的一个小根,而Marvin可以利用Coppersmith定理(定理3)有效地求出这个根。一旦已知,便可以使用上一节的Franklin-Reiter攻击算出,从而得到

时,只要填充长度小于消息长度的,就可以进行攻击。这是一个重要的结论。注意,对于建议值,对于标准的模数大小来说,这种攻击是无用的。

4.5 部分密钥泄露攻击

为RSA私钥,假设Marvin通过某种方式知道了的一部分,比如说四分之一。他能得到剩下的部分吗?当相应的公钥指数很小时,答案是肯定的,令人惊讶吧。最近,Boneh,Durfee和Frankel证明了只要,就有可能从它的一小部分位算出的所有部分。可见结论说明了保护整个RSA私钥的重要性。

定理9 (BDF)

为RSA私钥,其中长度为位.。给定最小有效位,Marvin可以在的线性时间算出

证明依赖于另一个完美精妙的Coppersmith定理。

定理10 (Coppersmith)

是一个位RSA模。然后,给定最小有效位或最有效位,可以有效地将分解。

定理9很容易从定理10推理出来,事实上,根据的定义,存在一个整数,使得:

由于,我们必有。对方程模进行约化,设,得到:

由于Marvin知道了最小有效位,他知道的值,因此,他得到了一个关于的方程。对于的每一个的可能值,Marvin求解的二次方程,并能得到了的一些候选值。对于这些候选值,他运用定理10尝试去分解。可以证明的候选值的总数最多为,因此,在最多次尝试之后,将被分解。

定理9被称为部分密钥泄露攻击,对于更大的值,只要,也存在类似的攻击,不过,要实现此种攻击的技术有点复杂。有趣的是,基于离散日志的密码系统,如ELGamal公钥系统,似乎不容易受到部分密钥泄漏攻击的影响。事实上,如果给出的常数部分,则没有已知的多项式时间算法来计算的其余部分。

为了总结这一节,我们将证明当加密指数很小时,RSA系统会泄漏相应私钥一半的最高有效位。要了解这一点,再考虑一个方程,其中的整数。给定,Marvin可以很容易地计算出:

之后:

因此,的很好的近似值。该界表明,对于大多数中一半的最高有效位与相同。由于只有个可能的值,因此Marvin可以构造一个大小的小集合,使得集合中的一个元素等于的一半最高有效位的。的情况特别有趣,在这种情况下,可以知道,系统完全泄漏了的一半最高有效位。

5 执行攻击

我们将注意力转向另一类完全不同的攻击。这些攻击不是攻击RSA函数的底层结构,而是专注于RSA的实现。

5.1 时序攻击

想一下存储RSA私钥的智能卡,由于卡是防篡改的,攻击者Marvin可能无法审阅其内容并使其泄露出密钥。然而,Kocher的一个巧妙攻击表明,通过精确测量智能卡执行RSA解密(或签名)所需的时间,可以快速发现私有解密指数

我们将解释如何使用"重复平方算法"对一个简单的RSA实现进行攻击。设的二进制表示(即)。基于的观察基础,我们可以知道用重复平方算法来计算最多使用次模乘,算法是如下工作的:

等于等于1,对于,执行以下步骤:

(1)如果,令等于

(2)令等于

最后,有值为

时,变量遍历值的集合,变量在集合中"收集"适当幂以获得

为了发起攻击,Marvin要求智能卡在大量随机消息上生成签名,并测量每个签名生成所需的时间

攻击从最低有效位开始一次一个地算出的比特位。我们知道是奇数,因此。考虑第二次迭代。最初。如果,则智能卡会计算乘积,否则,它是不会计算的。设是智能卡计算所花费的时间。由于计算的时间取决于的值,因此彼此不同(简单模约化算法需要不同的时间,取决于所减少的值)。一旦Marvin获得智能卡的物理规格,之后他便会测量得到(在发起攻击之前)。

Kocher观察到当时,两个集合是相关的。例如,如果,对于某些比预期的要大得多,那么也可能大于预期。另一方面,如果,则两个集合表现为独立的随机变量。通过测量相关性,Marvin可以确定是0还是1。继续使用这个方法,他可以很快得到。注意,当使用低公钥指数时,上一节的部分密钥泄露攻击表明,使用Kocher的时序攻击,只需要知道的四分之一的位就行。

有两种方法可以抵御攻击。最简单的是添加适当的延迟,以使模幂运算总是要花费一定的时间。第二种方法是由Rivest提出的基于盲化的方法。在解密M之前,智能卡选择一个随机的并计算,然后将应用于上并获得,最后,令。通过这种方法,将应用于Marvin不知道的随机消息上,这样的话,Marvin就不能发起攻击了。

Kocher最近在这些线路上发现了另一种叫做功率密码分析的攻击。 Kocher表明,通过在签名生成过程中精确测量智能卡的功耗,Marvin通常可以轻松发现密钥。事实证明,在多精度乘法期间,卡的功耗高于正常值。通过测量高消耗周期的长度,Marvin可以很容易地确定在给定的迭代中卡是执行一次还是两次乘法,从而暴露出的比特位。

Kocher最近发现了另一种类似的攻击,称为能量分析攻击。Kocher指出通过精确测量智能卡在签名生成过程中的功耗,Marvin通常可以很容易地得到秘密密钥。结果表明,在多精度乘法过程中卡的功耗会高于正常值,通过测量高消耗周期的长度,Marvin可以很容易地确定在给定的迭代中卡是否执行一次或两次乘法,从而得到的比特位。

5.2 随机故障

RSA的解密和签名的实现经常使用中国剩余定理来加速的计算,签名者Bob为了替换模的工作,先计算签名模的结果,然后利用中国剩余定理将结果结合起来。更准确地说,Bob首先计算:

其中。然后,他得到签名通过令:

其中:

两个指数相比,CRT最后一步的运行时间可以忽略不计。注意的一半长,然后由于乘法的简单实现需要平方时间,所以模的乘法速度是模的4倍,而且,的一半长,计算的速度是计算的8倍,因此,整个签名时间减少了四倍,许多实现都使用这种方法来提高性能。

Boneh,DeMillo和Lipton观察到使用CRT方法有内在的危险。假设在生成签名时,Bob的计算机上的一个小故障导致它在一条指令中错误计算。例如,在将寄存器中的值从一个位置复制到另一个位置时,其中一个比特位被翻转了。(故障可能是由环境电磁干扰引起的,也可能是由于罕见的硬件缺陷造成的,比如早期版本的奔腾芯片。)

Marvin得到了无效的签名给定之后可以很容易地对Bob的模数进行分解。

正如A. K. Lenstra所说,我们发现了一个新的攻击。假设在Bob生成签名时发生单个错误,那么,中将有一个被错误地计算。如果说是正确的,那么就会不正确,得到的签名为。一旦Marvin获取到了,通过计算,他就知道这是一个错误的签名。然而注意到:

因此,便是的一个非平凡因子。

要使攻击奏效,Marvin必须对有充分的了解。也就是说,我们假设Bob不使用任何随机填充方法,签名前的随机填充可以防御此种攻击,对于Bob来说,一个更简单的防御方法是在将生成的签名发送给全世界之前检查生成的签名。当使用CRT加速方法时,检查是特别重要的。随机故障攻击对许多密码系统都是有害的,许多系统,包括RSA的非CRT实现,都可以使用随机故障进行攻击。不过,这些结论更多的是理论性的。

5.3 Bleichenbacher对PKCS 1的攻击

位RSA模,位消息,其中。在应用RSA加密之前,一般会通过向其添加随机位,将消息填充到位。公钥加密标准1(Public Key Cryptography Standard 1, PKCS 1)的旧版标准就是使用的这种方法。填充后,消息如下所示:


02 随机位 00 M


生成的消息长度为位,并直接使用RSA加密。包含"02"的初始块长度为16位,从上图可看出已在消息中添加了随机填充。

当运行在Bob的机器上应用程序(例如,Web浏览器)接收到消息时,会对其进行解密,检查初始块,并去掉随机填充。但是,一些应用程序会检查"02"初始块,如果不存在,就会返回一条错误消息,说明"无效的密文"。Bleichenbacher表示这个错误消息可能导致灾难性的后果:攻击者Marvin可以使用错误消息解密他所选择的密文。

假设Marvin截获了一个针对Bob的密文,并希望对其进行解密。为了发动攻击,Marvin随机挑选了一个,计算,并将发送到Bob的机器。运行在Bob的机器上的应用程序接收并尝试解密它。它要么用错误消息进行响应,要么根本不响应(如果的格式正确的话)。因此,Marvin知道解密过程中16位最高有效位是否等于02。实际上,Marvin有这样的谕言,对于他选择的任何,他都可以测试解密的16位最高有效位是否等于02。Bleichenbacher证明了这样的谕言足以解密

6 结论

对RSA系统进行了20年的研究以来,产生了一些有见地的攻击,但还没有发现破坏性的攻击。到目前为止发现的攻击主要说明了在实现RSA时需要避免的陷阱,目前看来,可以信任正确的RSA密码系统实施来提供数字世界中的安全性。我们将针对RSA的攻击分为四类:(1)利用系统公然误用的基本攻击;(2)低私钥指数攻击,此种攻击非常严重,绝不能使用低私钥指数;(3)低公钥指数攻击;(4)对RSA系统执行时的攻击。这些持续不断的攻击说明,我们对基本数学结构的研究还是不够的。另外,Desmedt和Odlyzko、Joye和Quisquater以及DeJonge和Chaum还提出了一些额外的攻击。在整篇论文中,我们观察到通过在加密或签名之前正确填充消息可以防御许多攻击。

致谢

我要感谢Susan Landau鼓励我撰写调查问卷,感谢Tony Knapp帮忙编辑手稿。我还要感谢在早些时候Mihir Bellare、Igor Shparlinski和R. Venkatesan对草案发表的评论。


源链接

Hacking more

...