为什么不使用2048或4096 RSA密钥大小

我使用了非标准RSA公司密钥大小可能为15年。例如,我的老OpenPGP密钥创建于2002年。对于非标准密钥大小,我的意思是RSA密钥大小不是2048或4096。当我生成OpenPGP/SSH密钥时(使用保密性卫兵具有像这样的智能卡)和PKIX证书(使用GnuTLS公司开放SSL,例如。用于XMPP用于HTTPS). 人们有时会问我为什么。我没有看到任何人谈论这件事,也没有提供与我的观点一致的文章。所以我想写下我的动机,这样我就很容易参考,并希望能激励其他人也这样思考。或者挑起讨论和分歧——没关系,希望我能学到一些东西。

在继续之前,这里有一些上下文:当构建新事物时,通常最好使用椭圆曲线技术算法版本25519而不是RSA。还有ECDSA公司-由于一些原因,它的使用速度相对较慢,这是一种普遍适用的方法,在Ed25519不可用的情况下,它是一种合理的选择。也有后量子算法,但它们更新了,现在采用它们需要仔细的成本效益分析。

首先是一些背景。RSA是一种非对称公钥方案,它依赖于生成不同质数(通常是两个)的乘积的私钥。结果产品的尺寸,称为模量n个,通常以位长度表示,并形成密钥大小。过去,RSA密钥大小通常为几百位,然后将512位设置为常用大小。随着对RSA安全级别的更好理解,通用密钥大小发展到768、1024和2048以后。今天的建议(请参阅keylength.com网站)这表明2048年的长期关键指标(5年以上)处于弱势,因此有跃升至4096年的趋势。RSA私钥操作的性能在4096开始下降,带宽要求在一些协议中引起了问题。如今,2048和4096是最常见的选择。

我对非2048/4096 RSA密钥大小的偏好是基于一个简单而天真的观察,即如果我要构建一个RSA密钥破解器,我可能需要针对特定的密钥大小优化实现,以获得良好的性能。由于2048和4096在今天占据主导地位,而几年前1024占主导地位,因此为这三种关键尺寸构建优化版本可能是可行的。

我的观察结果是一个基于推测和多个层面的推测的保守决策。首先,我假设RSA遭到了一次我们不知道的攻击。然后,我假设对于某些密钥大小,无论是在理论层面,还是在实现层面(针对某些特征优化库),还是在经济/人力层面(决定关注公共密钥大小),这种攻击都不如其他攻击有效。然后我假设,通过避免有效的密钥大小,我可以将难度增加到足够的水平。

在分析这些假设(即使是远程的)是否有意义之前,了解选择不常见的密钥大小会丢失什么是很有用的。这是为了了解权衡的成本。

如果实现不允许选择不寻常的密钥大小,则会有很大的负担。根据我的经验,足够多的常用应用程序支持不常见的密钥大小,例如GnuPG、OpenSSL、OpenSSH、FireFox和Chrome。一些应用程序限制了允许的选择;这似乎很罕见,但我遇到过一旦。一些环境也限制了允许的选择,例如我经历过的让我们加密已经引入了对RSA密钥大小为8的倍数的要求。我注意到了这一点,因为我为我的博客选择了一个大小为3925的RSA密钥,并于2015年12月收到了LetsEncrypt的证书,但在2016年续订期间,它导致了一条关于RSA密钥大小的错误消息。我以前使用过的一些商业CA将RSA密钥大小限制为1024、2048或4096之一。一些智能卡也限制了密钥大小,遗憾的是YubiKey有这个限制。因此,这并不总是可能的,但可能的频率足以让我有价值。

另一个代价是RSA签名操作速度减慢。这是因为指数函数比乘法更快,并且如果RSA密钥的位模式是1后跟几个0,则计算速度更快。我还没有做过基准测试,但我没有经历过这对我来说是一个实际问题。我没有注意到RSA操作与我日常生活中经常涉及的所有其他操作(网络、IO)都有关联。当然,大规模部署此功能可能会产生影响,因此基准测试将非常有趣。

回到让我做出这个选择的猜测。第一个假设是RSA遭到了一次我们不知道的攻击。在我看来,除非有证据证明当前已知的攻击(基于GNFS的攻击)是可以找到的最好的攻击,或者至少有一些启发性的论点认为我们不能比当前的攻击做得更好,否则未知RSA攻击的概率就是100%,尽管听起来很奇怪。

第二个假设是,对于某些密钥大小,未知攻击不如其他密钥大小有效。这句话也可以这样表达:与其他密钥大小相比,某些密钥大小的攻击成本更高。

在实现级别上,可以合理地假设,与关注特定密钥大小相比,为任意密钥大小实现RSA破解程序可能更困难,成本也更高。关注一些关键的大小可以实现优化和不太复杂的代码。

在数学层面上,对于某些类型的RSA密钥大小,攻击成本更高的假设似乎令人怀疑。这取决于未知攻击的算法类型。对于与GNFS攻击类似的攻击,我认为相同的算法同样适用于大小为2048、2730和4096的RSA密钥,并且运行时间主要取决于密钥大小。其他可能破解RSA的算法,例如一些近似算法,似乎也不太可能因使用非标准RSA密钥大小而受到阻碍。但我不是数学家。

从经济或人力的角度来看,如果你能破解95%的钥匙(大小102420484096),那么这就足够了,破解最后5%的钥匙只会降低投资回报。在这里,我正在计算95%的数字。目前,我猜想互联网上95%以上的RSA密钥大小是1024、2048或4096。因此,只要人们的行为与他们所做的一样,这一方面就会一直存在。

最后的假设是,通过使用非标准的密钥大小,我将门槛提高到足够高,使攻击不可能。老实说,这种情况似乎不太可能发生。然而,这可能会使成本增加一到两倍。这可能会让人把目标对准一个悬挂较低的水果。

综合我的论点,我已经1)发现了使用非标准RSA密钥大小的一些缺点,并讨论了它们的成本和影响,2)提到了使用非标密钥大小的某些推测优势。我不知道有任何论据表明我的猜测可能性为0%。看来我的猜测是真的,可能性很小,高于0%。因此,我个人的保守做法是,通过支付使用非标准RSA密钥大小的适度成本来防范这种不太可能但仍然可能发生的攻击场景。当然,我的QA工程师也喜欢通过不做其他人做的事情来破坏事情,所以我以ObXKCD作为结束。

26回复“为什么我不使用2048或4096 RSA密钥大小”

  1. 有多少个长度正好为N位的有效RSA公钥(即,位N-1为1,所有位>=N为0)?

    有多少个长度小于N位的有效RSA公钥?

    作为近似值,考虑有多少个非负整数满足这些大小约束。N位非负整数的数量与<N位整数的数量一样多。

    对于4位整数:有8个4位非负整数(8→15)和8个小于4位的非负整数(0→7)。

    因此,通过避免使用高位设置的值,最多只能使brute-forcer的工作加倍。

    当然,要担心的攻击并不是严格意义上的暴力攻击,有效的RSA公钥并不是均匀分布在所有非负整数上。但我不清楚这在很大程度上是一场胜利。

  2. 如果使用非标准尺寸的钥匙,需要特别注意您的钥匙,该怎么办?🙂

    • 这就是为什么我需要让你们都这样做🙂

      /西蒙

      • 然后这些尺寸成为半标准尺寸,使用“非标准”尺寸的前提不再适用。你不能两全其美。

  3. 如果您的威胁模型中包含一个组织,该组织能够提供破解约4000位RSA密钥所需的资源,那么您就大错特错了。

    这样一个组织——国家级行动者,例如NSA——已经在你运行的软件中通过零天感染了你(肮脏COW等),持续感染(通过修改主板或HDD/SSD固件),可以阻止你在网上购买任何硬件,拥有在未被发现的情况下闯入你的家/办公室等以安装嗅探设备的技能,能够访问有关TEMPEST的机密研究…

    如果NSA是你的威胁模型,而你不是一个国家级的行动者(例如另一个政府),那么你可能选择了错误的战斗。🙁

    • 最终,袭击事件会公开,然后我可能会因为我的方法而稍微安全一些。考虑到成本如此之小,我很乐意支付这笔钱来对冲风险。

      如果国家安全局想要我的钥匙,在下一条评论中发布的XKCD更合适🙂

      /西蒙

  4. 你的论点还有另一个因素,根据最近的发展情况(例如LogJam攻击),它具有一些实际的显著性。如果攻击者需要进行一系列预计算来攻击给定大小的密钥,那么具有异常大小意味着他们必须付出特殊努力才能击中您的密钥。

    更广泛地说,这意味着不应该建议人们使用固定大小的密钥,而应该使用至少是他们的最小目标(例如2048)加上一些随机附加位的密钥,在这个范围内,不会产生太多额外的工作来使用它(例如高达2504)。这将对需要预计算或特定大小的硬件/算法的攻击造成更大的阻碍,因为没有一个精确的大小是主要的。

    • 这是一个好观点。我所写的内容并没有严格涵盖这一点,因此它确实应该成为论点的一部分。在现实环境中,大多数攻击似乎都会有一个巨大的预计算步骤来加快速度。使用不寻常的密钥大小在这里可能会有一些帮助。可能不是一个重要因素,但将其增加一倍或五倍的难度可能值得为使用不寻常的密钥大小付出一点代价。

      谢谢,
      /西蒙

  5. Pingback:为什么我不使用2048或4096 RSA密钥大小https://blog.josefsson.o…|罗伊·谢斯托维茨博士(Roy Schestowitz)

  6. 2000位密钥和以48个零位开始的2048位密钥之间有区别吗?

  7. 您可能错过了一个主要的缺点:密钥破解程序不仅在标准大小上可能更快,而且我们的实现也会进行解密。如果说3333的速度慢到4096,那么3333将是一个非常糟糕的选择。你做基准测试了吗?

    • 你好。事实上,基准是有用的。我在书面报告中讨论了绩效惩罚。RSA签名验证是相同的(非常快),只有RSA签名创建受到影响,是的,速度会较慢。尽管如此,我还没有注意到这需要任何明显的时间。服务器端性能对于重型服务器来说很重要,我敢肯定,但无论如何,您确实需要Ed25519或ECDSA,而不是RSA。

      /西蒙

  8. DJB也略微喜欢NIST P-512曲线。使用它可能是安全的。

    http://blog.cr.yp.to/20140323-ecdsa.html

    “公平地说,我应该提到,有一个标准的NIST曲线使用了一个好素数,即2^521–1;但这个素数的绝对大小使得它比NIST P-256慢得多。”

    就是这个:
    $openssl ecparam-列表曲线
    secp521r1:521位素数域上的NIST/SECG曲线

    将以下内容添加到x509证书中,以强制P-521曲线:

    $openssl ecparam-名称secp521r1
    -–开始EC参数-
    布拉布拉赫
    -–结束EC参数–

  9. NIST还在本文件第92页给出了AES等效强度公式(如果您被要求保密,则至少需要AES192):

    http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIS1402IG.pdf

    $cat密钥大小-NIST.bc
    #!/usr/bin/bc-l
    l=读取()
    比例=14;a=1/3;b=2/3;t=l*l(2);m=l(t)#a^b==e(l(a)*b)
    n=e(l(m)*b);o=e(l(t)*a);p=(1.923*o*n–4.69)/l(2)
    打印“强度:”,p,“\n”

    $echo 2868|/密钥大小-NIST.bc
    强度:128.01675571278223
    $echo 7295 |/密钥大小-NIST.bc
    强度:192.00346260354399
    $echo 14446|/密钥大小-NIST.bc
    强度:256.00032964845911

    $echo 2048|/密钥大小-NIST.bc
    强度:110.11760837749330
    $echo 2127|/密钥大小-NIST.bc
    强度:112.01273358822347

  10. 您可能会认为,由于密钥大小通用,用于生成具有这些参数的密钥的代码已被更多人审查,从而降低了实现中生成完全不安全密钥的错误的可能性。

    • 这是一个值得关注的问题,然而,如果您阅读RSA密钥生成工作原理的代码,那么在大多数地方,对于所有密钥长度,它都是相同的代码。您生成适当大小的随机数,并测试它们是否是素数(通常是miller-rabin)。RSA与椭圆曲线不同,在椭圆曲线中,几乎每个参数都有一个优化的实现。

      /西蒙

  11. 您对支持非PoT密钥大小的端点的实现质量有任何担忧吗?如果你最终走上了某种退路,我完全希望它会被破坏,更少被审计。

    • 你好,拉尔斯。您的担忧似乎与之前对非PoT密钥大小的RSA密钥生成的担忧类似。这是一个合理的担忧,但我怀疑这是由各种ECDSA实现的历史问题引起的,其中一些曲线确实触发了特殊代码,与常用曲线相比,这种代码的详细程度更低。我不认为这对RSA来说是一个很大的风险。端点进行RSA验证。这是一个非常简单和快速的操作,比ECDSA验证快得多。无论密钥大小如何,数学和实现都是相同的。我有时看到有两个RSA实现的实现,一个用于“小密钥”,另一个则用于“大密钥”,但这是针对硬件而不是软件的,原因可能是他们已经有了1024/2048密钥的可信实现,然后为4096添加了一个新实现,而不是重写所有内容。

      这是一个很好的方面,我没有涉及,所以对于我的论点的任何完整的写作,都应该对这个主题进行讨论和分析。

      谢谢,
      /西蒙

  12. 您的博客标题是“为什么我不使用2048或4096 RSA密钥大小”,但您的博客使用2048。我也不明白为什么要使用非标准尺寸,因为每个人都可以看到你的网站使用的尺寸。那么,使用2058而不是2048有什么意义呢?

    • 你好,Jooseppi!我的博客使用2736位密钥大小的RSA密钥。事实上,每个人都可以看到我使用的公钥大小。公钥毕竟是公开的,我的论点不涉及隐藏任何东西。我试图在文章中明确指出使用非标准密钥大小的意义,尤其是最后一段中的包装。

      /西蒙

  13. Pingback:规划新的OpenPGP密钥–Simon Josefsson的博客

  14. Pingback:Nitrokey Start上的OpenPGP主密钥–Simon Josefsson的博客