在我的项目中,我使用了4451h的公共指数值。在开始使用一个商业RSA加密库之前,我认为这是安全的。如果我在该库中使用此指数,它将引发异常。

我联系了该库的开发人员,并得到以下答复:“此功能是为了防止对RSA密钥的某些攻击。其结果是指数值限制为{3、5、17、257或65537}。由于风险可能很大,因此仍在研究停用此检查。“

这是我一生中第一次{3、5、17、257或65537}以外的其他值用于破坏RSA。我只知道使用3填充不当很容易受到攻击。

真的是这样吗?当然,我可以使用另一个库,但是在做出这样的回答后,我担心我的解决方案的安全性。

#1 楼

只要RSA的公共指数是“正确的”(即除模数的所有素数p相对于p-1都是质数),对于RSA的短期或长期公共指数都没有已知的弱点。 >如果使用小的指数,并且不使用任何填充进行加密,并且使用几个不同的公钥对完全相同的消息进行加密,那么您的消息将处于危险之中:如果e = 3,并且使用公钥n1对消息m进行加密,n2和n3,那么对于i = 1到3,您具有ci = m3 mod ni。根据中国剩余定理,您可以重建m3 mod n1n2n3,结果是m3(无任何模),因为
n1n2n3是一个较大的整数。然后(非模块化)立方根提取就足以提取m。

这里的弱点不是小指数;而是使用了不正确的填充(即完全没有填充)进行加密。无论是加密还是签名,填充对于RSA的安全性都非常重要。如果您没有使用适当的填充(例如PKCS#1中描述的填充),那么您将有很多弱点,而上一段概述的弱点并不是最大的弱点。然而,每当有人提到指数大小相关的弱点时,他或多或少都会直接提及这种情况。这是一些古老而错误的知识,有时会转化成对大指数的禁止(因为这是一个神话,相反的神话也是一个神话,不再-而且也不少-得到了证实);我相信这就是您在这里观察到的内容。

但是,可以找到一些避免大型公共指数的理由:


小型公共指数的推广效率(用于公钥操作)。
拥有较小的私有指数存在安全问题;当私有指数长度不超过公共指数长度的29%时,将描述密钥恢复攻击。当您想强制私有指数较短(例如加快私有密钥操作)时,您或多或少必须使用较大的公共指数(与模数一样大);要求公共指数短的方法可能被认为是一种间接对策。
一些广泛部署的RSA实现对大型RSA公共指数感到窒息。例如。 Windows中的RSA代码(Internet Explorer用于HTTPS的CryptoAPI)坚持在单个32位字中编码公共指数;它仍然无法处理具有更大公共指数的公钥。

仍然,“风险可能很大”看起来像是通用的理由(“这是一个安全问题”是通常的说法,“我们做了没有实现它,但我们不想承认任何懒惰”。

评论


说得好。 IIRC在其许多版本中的某个时刻,PGP曾经在密钥生成过程中生成随机的16位公共指数。

–总统James K. Polk
2011年3月2日,0:59



在一个惊人的发展中,这篇文章现在被用来证明使用1作为公共指数github.com/saltstack/salt/commit/…。

–布鲁诺·罗埃(BrunoRohée)
13年7月9日在15:48

为了后代。使用较小的私有指数(或较大的公共指数)时适用的密钥恢复攻击称为维纳攻击。

– rlf
17-10-19在12:54

#2 楼

开发人员是完全错误的。指数0x4451(十进制17489)没有问题;

很久以前,人们曾经认为小指数是个问题,因为托马斯·珀金(Thomas Pornin)向多位接收者发送了相同的消息,对此进行了解释。但是今天我们知道,指数与之无关。问题是填充不当。通过适当使用填充可以防止这些攻击。任何有价值的加密库最好使用适当的填充(否则会遇到更糟糕的问题)。

因此,没有充分的理由让加密库断然禁止使用该指数。

也就是说,从性能的角度来看,指数越小,性能越好。最佳选择是e = 3,因为这样可以提供最佳性能,并且没有已知的安全问题。 (实际上,e = 2甚至更好。它也称为Rabin加密。但是,该方案并不为人所知,并且需要略有不同的代码,因此并未得到广泛使用。)

评论


您确定“ e = 2甚至更好”适用于RSA吗?对于e = 2,因为phi(N)是偶数,所以没有反函数。

–易凡
15年3月15日在22:28

@Yifan,您可以先阅读en.wikipedia.org/wiki/Rabin_cryptosystem。

– D.W.
15年3月16日在1:18

对于Rabin,解密为:m = sqrt(c)mod N,给定c = m ^ 2 modN。对于RSA,解密为:m = c ^ d mod N,给定c = m ^ e modN。的e = 2时,没有逆mod phi(N)(因为2和phi(N)都不是质数),因此您找不到e * d = 1 mod phi(N)的广告。

–易凡
2015年3月16日在6:02



@Yifan,是的,我了解所有这些。我不确定你要去哪里。我是说e = 2的Rabin甚至比e = 3的RSA还要好。否,e = 2的Rabin与RSA不同,但区别是细节超出了此特定问题的范围。

– D.W.
15年3月16日在7:28

好的,这就是我想要的说明。对于未经培训的人,您的答案意味着您可以为RSA选择e = 2。

–易凡
15年3月16日在17:19

#3 楼

这五个数字是费马素数。

因为它们的形式为2k + 1,所以加密为me =
m·((m2)2 ... k次...)2 ,它比一般情况下具有相似大小的指数的幂运算更简单和更快。

由于它们是质数,所以检验e与(p − 1)(q − 1)共质数只是e不能对它进行除法的测试。

所以这更可能是关于速度或约定而不是安全性。并不是说效率有什么问题。但是可以肯定的是,请参考其他建议的答案。

另请参阅此帖子。

#4 楼

我不知道为什么RSA密钥的公共指数只能位于集合{3,5,17,257,65537}中的任何原因。如您所述,使用3或5之类的小指数具有较高的风险,因为实现错误的负面影响(例如填充不当)可能更大。 NIST仅允许大于2 ^ 16的公共指数,但我不知道其决定的原因。
使用的库开发人员给出的答案不应该让您满意要求具体参考。事实证明,有些纸张经常被误解。例如,我可以想象有些开发人员阅读了Phong Nguyen撰写的论文“我们可以信任加密软件吗?GNU Privacy Guard v1.2.3中的加密缺陷”的第4节,得出了不正确的结论,例如上面的一个。本文注意到,当GnuPG生成的公钥变成某个异常值(例如65539)时,攻击者就会学到一些有关密钥的信息。
结论是,可以改进GnuPG的密钥生成算法。 ,但不是说65539是错误的公钥。

#5 楼

我找不到任何引用说明公共指数的其他值容易受到攻击。根据RSA.com关于RSA算法的指南,出于性能方面的考虑,建议严格使用接近2的幂的公共指数

根据Wikipedia,NIST不允许使用小于2的幂的公共指数65537,因为如果未正确填充较小的指数,将是一个问题。

评论


事实证明,这个答案的最后一段是完全错误的。 (维基百科是错误的;想像这样!)问题与小指数无关。如果您没有使用正确的填充,那么您就太费力了(无论您使用什么指数,这都是正确的)。如果您使用适当的填充,则小指数与大指数一样好。因此,误以为这与指数的大小有关,而不是与是否存在适当的填充有关。

– D.W.
2011年3月2日在6:13

如我所说,要有足够的填充空间。但是我检查了维基百科声明的来源,这是部分错误的。根据SP 800-78 -3(csrc.nist.gov/publications/nistpubs/800-78-3/sp800-78-3.pdf),第6页:“此规范还限制了可能规范的实现必须选择一个指数,该指数是一个大于或等于65,537且小于2 256的奇数正整数,如表3-2中所指定。因此,仅适用于根据FIPS 201的PIV密钥(个人身份验证)。

–安德烈亚斯·阿诺德(Andreas Arnold)
2011年3月2日在6:30



#6 楼

引用Don Coppersmith在1997年发表的论文《多项式方程的小解和低指数RSA漏洞》:


如果对手知道消息的三分之二,则使用指数3的RSA加密很容易受到攻击。


虽然使用RSA-OAEP填充方案可能不会成为问题,但是PKCS#1填充方案(在下面的答案中作为适当的填充方案给出)很容易受到攻击如果使用公共指数3。

评论


这不是一个答案。您仅解决一个指数问题,而在您的问题解决方案发布几年之前,还发布了其他一些答案,这些答案似乎已经更详细地解决了这个问题。否决票不一定表示您错了。否决票只能表示您的答案“无用”(根据工具提示),在这种情况下,我会同意。

– schroeder♦
19年5月13日在8:58

先前的答案指出“对于RSA的任何短期或长期公共指数都没有已知的弱点”,这实际上是错误的。这就是我的答案试图指出的。

– FaST4
19年5月14日在12:33



那么,这是对另一个答案的回应吗?

– schroeder♦
19年5月14日在13:01

如果您认为接受的答案是错误的,请对此答案发表评论。我确信Pornin足够专家来评估。

– schroeder♦
19年5月14日在13:08