我想知道RFC 3526中定义用于Diffie-Hellman的素数是否比生成自己的素数更值得信赖,尤其是考虑到最近的Arjen Lenstra论文(Ron是错误的,Whit是正确的)批评了在公共密钥和互联网上的质数。是我最好生成自己的安全素数,还是最好使用RFC 3526中定义的素数?

#1 楼

为Diffie-Hellman建立自己的团队并不困难。但是它有点昂贵(取决于上下文,但是25 MHz的ARM设备不希望经常这样做),并且它并不是真正需要的:DH(和DSA)的优点是可以共享组参数

对于普通Diffie-Hellman,您需要的是$ p $,$ q $和$ g $,例如:


$ p $是一个足够大的素数(如今2048位已经足够了);
$ q $较小,但仍然足够大(例如256位),除以$ p-1 $的素值;
$ g $是子模$ p $的生成器,其阶次是$ q $的倍数。

DSA标准(FIPS 186-3)包括一个相当详细的过程,用于生成足够的组参数(请参阅附件A),这对于DH也同样适用。

问题还有另一方面。尽管随机选择$ p $,$ q $和$ g $对于DH来说具有很高的概率,但是可以特意制作$ p $,$ q $和$ g $值以使离散对数取模$ p $(使用生成器$ g $)将很容易(或至少更容易)。如果您的应用程序需要产生DH组参数并使其他人将其用于自己的密钥对,则可能会出现问题。如果您生成组参数但不告诉您如何生成它们(以可验证的方式),那么其他人可能会怀疑您故意使它们变弱。对于不受此类怀疑影响的完全可用的组参数,您需要“无所畏惧”的数字。 FIPS 186-3的附件A精确地详细描述了生成过程,以便可以对其进行验证。出于相同的原因,RFC 3526使用$ \ pi $。

因此,重用已发布的组参数是一个好主意,既可以提高性能(无需自己进行生成,也可以节省CPU并节省代码大小),也可以信任其他人可以置入结果中。

评论


$ \ begingroup $
您能推荐一些关于故意弱化$ p $,$ q $,$ g $集的材料吗?
$ \ endgroup $
– CodesInChaos
2012年12月22日在21:08

$ \ begingroup $
我建议阅读此答案的任何人都应研究最近对Diffie-Hellman交易所进行的Logjam攻击。每个使用较小全局列表中众所周知的素数的人都可能容易受到计算前攻击。
$ \ endgroup $
–杰里米·莱克曼(Jeremy Lakeman)
2015年6月7日在6:30

$ \ begingroup $
Logjam适用于任何规模较小的DH组;共享/全局只会增加收益。他们认为1024可能不安全,建议使用2048,但不要批评1536,而这是rfc3526中的最小值。
$ \ endgroup $
–dave_thompson_085
2015年6月10日在8:59

#2 楼

只要您知道自己在做什么,就可以为DH生成素数没有错。

另一方面,如果您对数论的理解有些微弱(或者很高兴有人否则,其他工作就完成了,并进行了仔细检查),RFC 3526中的模数和生成器也没有错。在实践中产生的一个常见实现缺陷是缺乏熵。虽然对RSA不利(因为RSA的整个安全性都假定无法猜测密钥),但对于DH而言却是无关紧要的,因为我们将告诉所有人我们正在使用的DH组。

实际上,RFC 3526中的DH组根本没有熵。它们都是以下形式:

$ p = 2 ^ n-2 ^ {n-64}-1 + 2 ^ {64} \ cdot(\ lfloor 2 ^ {n-130} \ pi \ rfloor + i)$

其中$ n $是模数内的位数(1436、2048等),而$ i $是使两个$ p $都最小的最小非负整数和$(p-1)/ 2 $质数。当然,在实际执行DH操作时,熵是至关重要的,但是无论您选择哪个组,这都是事实。

#3 楼

对于Diffie-Hellman或Elgamal或DSA之类的任何变体,最好使用已建立的素数。实际上,只要使用了素数就没关系。

标准素数已经有人向他们点头了。如果您生成自己的素数,但有问题(例如,这不是真正的素数),那么您就一个人,我们都会嘲笑您。 DH的非素数是个坏消息,因为您最终会陷入分组,而其他问题则意味着您没有安全感。 ,它们不是安全参数(即秘密)。那是不使用自己的素数的更好理由。

我们做的素数测试是概率性的。不能真正保证数字是质数。但是,如果您发现一个数字,通常所说的一堆素数测试说的是素数而不是素数,那么即使没有助理教授职位,也应该是一篇论文。

对于RSA,重要的是,您生成的两个数字比它们的质数更重要。甚至还有RSA的三个主要变体。那篇论文的问题在于它们不是秘密,而不是它们不是素数。

我们在本文中学到的真正教训是在使用RNG之前先对其进行加热。具有讽刺意味的是,如果RNG播种不好的人抛出了诸如time(0)之类的熵很低的东西,那么我们就不会遇到这个问题,因为没有简单的方法可以通过简单的测试找到他们的垃圾素数就像GCD。

评论


$ \ begingroup $
谢谢!我想知道-RFC中定义的质数是否不同于从Pi派生的其他方式?他们还接受了其他测试吗?如果是这样,是什么使它们更安全或更值得研究?
$ \ endgroup $
– kaepora
2012年6月6日在2:16



$ \ begingroup $
实际上,“使用什么素数并不重要”;某些素数(例如,$ p-1 $平滑的素数)是一个非常糟糕的主意。另外,生成$ p $是个好习惯,这样您就可以知道很大的质因数$ q $,以便可以为该大小的子组生成一个生成器。
$ \ endgroup $
–雨披
2012年3月6日,下午2:26

$ \ begingroup $
谢谢您的澄清,雨披。我试图不深入细节,而是要点。但是你是正确的,我本来应该更疲倦。
$ \ endgroup $
–乔恩·卡拉斯(Jon Callas)
2012年3月14日下午3:01

$ \ begingroup $
@JonCallas:RSA一般不会完全失败(即生成互为补码的公共和私有“密钥”),如果应该是质数,不是吗? RSA密钥对的构造要求人们知道模数的素因数分解。它不必精确地有两个素数,但必须知道其中的所有素数。从理论上讲,虽然可能会找到一对不是质数但会生成加密/解密对的数字,但我认为偶然发生的几率实质上为零。
$ \ endgroup $
–超级猫
2014年12月18日在18:33

#4 楼

与RSA中使用的素数不同,DH中使用的素数不必是秘密,因此从这个角度来看,使用众所周知的素数不是问题。

另一方面打破dh的工作是按素数而不是按dh会话进行的。这不会改变中断第一个会话的成本,但会改变中断一个会话的平均成本。

这对于1024位DH尤其重要。当前的估计表明,打破1024位DH素数可能非常昂贵,但并非完全不可行。怀疑NSA可能破解了一个或多个最常见的1024位素数。 https://weakdh.org/

因此,对于给定的素数长度,使用您自己的素数更安全。另一方面,较短的自定义素数通常比较长的众所周知的素数更差。

如果可能的话,至少应上移2048位,但是如果固定在1024位,则使用自生的素数比使用众所周知的素数之一更安全。

评论


$ \ begingroup $
这是一个古老的问题,早在创建WeakDH咨询之前就被问到并回答,但是我认为这个答案值得更多关注。重要的是此答案的要点-最常见的1024位素数可能已经损坏,而您应该至少使用2048位素数。
$ \ endgroup $
– CBHacking
18-6-28在22:20