RSA加密算法的安全性如何?

20

我正在使用RSA进行加密和解密。我听说它容易受到攻击,这是真的吗?使用它有多安全?


2
你可能会在crypto.stackexchange.com上获得更好的答案来回答这个问题。 - Jason Braucht
1
请搜索“RSA时序攻击”和“RSA选择密文攻击”。 - Hunter McMillen
2
@SLaks:这是一个想学习的人合理的问题,没有必要居高临下。 - noMAD
1
RSA是一种基于因数分解的算法,计算能力不断增长,全世界的人们都在努力破解RSA分解。RSA-1024可能是最广泛使用的位强度/数字,因为它用于SSL,所以被认为足够安全,可以保护通过互联网传输的大部分敏感数据。虽然很快就会到来一个时代(可能很快),RSA-2048将成为默认使用的加密方式,因为破解RSA-1024正在变得更加真实。 - wkl
3
@noMAD,SLaks的问题很合理,可以帮助我们更加聚焦问题。正如Angelo在他的回答中所指出的那样,了解你要防御的对象是非常重要的。 - Michael Petrotta
显示剩余4条评论
3个回答

35
通常对RSA的攻击涉及到分解一个由两个非常大的质数相乘而成的大数。这背后的基本想法是,找到质数相当容易,将它们相乘得到单个大数也很容易,但如果你只有那个大数,找到因子就会变得非常难。

早些年当RSA Data Security Inc.还是一家独立公司时,他们曾经主办过一个分解比赛,最后几个奖项都被来自RSA DSI团队的队伍获得了。这些团队使用了广义数域筛法(GNFS)进行了分解。典型实现使用大量工作站数个月左右来构建“因子库”。然后(最难的部分)将其馈送给一台带有海量内存(以TB为起点)的单台计算机,并让其在数周内完成因数分解。

这表明对RSA的最常见攻击具有非常高的初始成本(即需要像Cray超级计算机这样的东西才能开始)。然而,老实说,我认为目前没有任何一台计算机可以拥有足够的内存来开始攻击诸如1024位RSA密钥(更不用说某些偏执狂坚持使用的2048位或甚至4096位密钥)

当然,还有其他的分解方法不需要那么大的机器,但它们效率要低得多,即使在最好的情况下,你也需要数年的工作才能破解RSA标准下相对较小的密钥 - 例如512位。

实际上,在设计使用RSA的系统时,RSA本身的安全性通常是您最不用担心的。事实上,这几乎适用于所有合理现代的加密算法。当某个东西被攻破时,基本算法实际上永远不会被真正攻破-而是通过发现密钥分配中的弱点、“社会工程学”攻击等方式攻击。尽管这通常适用于加密,但与大多数其他加密算法相比,对于RSA来说更为一致。这仅是因为RSA的正常用例相对复杂。特别是,您通常不希望使用RSA加密大量原始数据流。 RSA足够慢,通常不希望使用它来加密大量数据。相反,您通常与一些对称密钥(又名私钥)加密算法(如AES)结合使用RSA。

在一起使用时,您首先获取要发送某些数据的人的公钥。然后生成一个正确大小的随机数,用作您选择的对称算法的密钥。使用RSA加密您的随机数,并将其发送到目标。然后,您使用该数字作为对称算法的密钥,并使用该对称算法加密实际数据。

这意味着在实际使用中,RSA具有一些弱点,这些弱点不一定适用于大多数对称加密算法。仅举个明显的例子,如果选择对称算法的“随机”键的方法不完全随机,则攻击者可能能够找到该键并解密数据,而不必攻击RSA加密本身(是的,在真正发布的软件中,这就是真正漏洞的源头)。

还要注意,我上面描述的基本上是RSA通常被使用的最简单的方式。真正的系统通常还要更加复杂,以提供诸如“完美的前向保密性”之类的东西。这样的系统中的RSA仍然是完全正常的RSA,但是使用它的系统仍然要复杂得多。

总结:如果要使用RSA加密,则RSA本身的安全性可能是您最不用担心的事情。从“RSA”到“安全通信系统”的路线有点像希腊神话和基督教圣经的扭曲组合物:一个有一千个错误转弯的迷宫,每个转弯都导致看起来完全相同的地方 - 但任何错误的转弯都会使你永远受到折磨和煎熬的判决。


1“完美前向保密”意味着即使攻击者在将来获取了私钥,他们也无法解密之前的通信。

不,我现在不会试图对此进行描述,但我确信在Crypto.SE上搜索会得到一些相关结果。然而,需要说明的是,尽管RSA可以用于提供PFS的系统中,但在实践中它相当不常见。

8
假设考虑到所有实际需要,RSA对你来说是安全的。但是这当然取决于你做什么、如何做以及你想要防御谁。如果你想要保护你的连接并遵循通常推荐的东西,那么RSA就足够安全了。如果你想在NSA的鼻子底下进行隐秘操作,那么你已经输了,因为你不得不问这样的问题。PS:您可能想查看StackExchange这里的IT-Security网站以获取此类内容。

8
你仍然没有回答提问者的问题。与其谈论NSA、秘密行动等,你本可以直接给出答案。 - Ashwin
1
@Ashwin 这个问题太模糊了,简短回答是无法回答的。我想通过我的回答表明,这个问题的范围太大了,无法用一句话来回答。如果提问者澄清他想要做什么,我一定会编辑答案以更准确地回答。 - Angelo Fuchs
@Ashwin 但我已经编辑了答案,将相关部分放在前面了。 - Angelo Fuchs
@Angelo Neuschitzer 我正在运行一个Web应用程序。我已经使用了HTML和JSP页面作为客户端,Java Servlets作为服务器端。我在它们之间使用了HTTPS连接。因此,在安全方面,如果我想让这个HTTPS连接更安全,我应该怎么做? - suraj
@suraj,很可能Https会满足您的需求(即使银行也在使用它,而且他们非常谨慎)。您必须确保非常好地保护您的服务器端证书/密钥(这通常是最薄弱的环节)。您可能想在我提供的IT安全网站上提出一个最佳实践问题。 - Angelo Fuchs
显示剩余2条评论

6

如果你正确实现了数据通道的加密(例如,使用一个已存在的库来为你完成这项工作),那么你的数据通道是安全的。但是,请记住,加密的目的只是让数据通道不成为整个系统中最薄弱的环节。RSA可以做到这一点,但你仍然需要担心其他部分的安全性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接