我一直在研究使用 RSA 进行加密的缺点,我反复发现 RSA 解密速度很慢,但我还没有看到关于为什么会这样的解释。谁能解释为什么会这样?
为什么RSA解密很慢?
与加密相比,RSA 解密速度较慢,因为 d 私有指数必须很大,而(正确使用 RSA)没有理由不能选择像 65537(甚至 3)这样小的公共指数。
RSA 加密通过 生成密文m^e mod N
,其中 (N, e) 是您的公钥,解密通过c^d mod N
其中 (N, d) 是私钥,当您知道 p 和 q 大素数时,可以有效地计算。
这是我刚刚生成的密钥的示例。为了使示例更简单,我只使用了 256 位 RSA(弱),实际上您现在至少应该使用 2048 位 RSA,在这种情况下,p、q、N 和 d 将各有八倍的数字位数。(与此同时,即使使用 2048 位 RSA,e 也将保持 65537。)
p = 255972651020913583852708738755558492779
q = 315961372360286283221530569994994089667
N = 80877470103268491690225776687889776985485516372419877405296906209811698014593
e = 65537
d = 62101042930507606982857645825838676738862341745400679479964616076341592694761
您可以检查是否满足 RSA 条件,p和q是素数,N == p*q
并且e*d % ((p-1)*(q-1)) == 1
(最后一个条件是允许 RSA 解密通过欧拉定理工作的原因)。您还可以测试加密是否有效——对于消息 m = 12345678901234567890,然后c = m^e mod N
是c = 37526865766319703630750491158429044860161927049301804846356525193422406944367
,然后c^d mod N
是12345678901234567890
(没有 wolframalpha 链接——对于免费版本来说输入太长)。这是一个ipython 笔记本,演示了所有步骤——python中的注释pow(x, y, N)
是x^y mod N
.
由此看来很明显,计算的时间m^e mod N
将比计算快得多c^d mod N
。对于加密,通过重复平方乘以 65537 的幂将需要平方和取模 16 次,再加上一次乘法为 m 65537 = m * m 2 16(其 16 次平方为 x 2 n = (x 2 ) 2 n-1)。对于使用 RSA-256 解密,d 取幂将需要平方 256 次和大约 128 次(二进制中 d 中的 1 的数量,不包括第一个 1)与 RSA-256 的其他乘法,并且对于每个平方,您还需要计算模数N. 应该注意的是,这些大数的模乘不是恒定时间运算,而是取决于数字的位长。请注意,如果您选择d
像这样小,e
那么您的私钥可能会被暴力破解(使用公钥加密消息,然后尝试每个小的 d 值,直到它正确解密)。即使d太大而无法以这种微不足道的方式进行暴力破解,攻击小d(意味着d < N 1/4 /3),那么还有更复杂的攻击 这将允许攻击者发现私有指数。
(是的,我忽略了一些现实世界的 RSA 事实。您可以通过使用 p 和 q 作为私钥的一部分来使用中国剩余定理来加速解密。另外,您没有在实际消息上使用 RSA,您需要使用安全填充(OAEP),然后只加密一个随机对称密钥,然后用于加密实际消息)。
RSA 涉及对非常大的数字进行计算,特别是解密是将大量数字计算到巨大的功率。如果您知道私钥的因素,有一些捷径,但它仍然很慢。
经典(即对称)密码系统主要通过大量重复非常简单的位操作(可以很好地并行化)来工作,但最终做的工作要少得多。
使用 RSA 的推荐方法是随机选择一个对称密钥,用 RSA 加密,用该随机密钥加密消息,附加加密,然后以他们的快乐方式发送。显然,拥有一个强大的加密随机数生成器是至关重要的......
首先,您需要考虑“RSA 解密速度慢”是什么意思。比什么慢?事实证明,从某种意义上说,RSA 加密速度很慢,我们发现寻找替代方案是值得的。
RSA 解密比不使用任何加密要慢。显然,使用加密的好处是可以对数据保密,所以有时速度慢是值得付出的代价。
RSA 解密比 AES 解密慢。更一般地说,对于同等级别的安全性(即通过蛮力破解加密有多难),非对称密码术明显慢于对称密码术。据我所知,没有基本的数学原因会这样,只是已知的算法具有这个属性。非对称密码学可以对称使用(通过共享私钥),因此非对称密码学与对称密码学一样快。
由于 RSA 加密和解密速度较慢,因此通常用作混合密码系统的一部分。为了加密消息,而不是使用 RSA 密钥对来加密和解密它,我们生成一个唯一的对称密钥(通常是 AES 密钥),我们使用 RSA 加密对称密钥,然后使用 AES 加密消息。这种方式 RSA 仅用于加密几百位的单个块。
RSA 加密通常比基于椭圆曲线的加密方案慢,因为它具有相同的安全级别(这需要更小的 ECC 密钥)。ECC 比 RSA 更新,并且正在慢慢得到更多采用。
附注:通常使用的 RSA 解密比加密慢。RSA 解密的昂贵操作是取幂:C = P^d (mod n)。相应的加密操作非常相似——P = C^e (mod n)。速度差异来自这样一个事实,即我们可以并且确实选择公共指数 e 以使计算更快。求幂需要对指数的每一位进行一次乘法,对设置为 1 的每一位进行一次乘法运算。私有指数 d 必须是随机的,因此无法猜测,而 e 可以很小(3 和 2 16 +1是最常见的选择)。