Diffie Hellman 生成器 2 和 5 有什么区别?

信息安全 openssl diffie-hellman
2021-08-25 05:39:43

在 OpenSSL 中生成 Diffie Hellman 参数可以如下完成:

$ openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time 
[...]

“发电机 2”在那里引起了我的注意。如手册页()所示,我似乎可以在生成器 2 和 5 之间进行选择man dhparam

-2, -5
   The generator to use, either 2 or 5. 2 is the default. If present then the input file
   is ignored and parameters are generated instead.
  • 什么是发电机 2 和 5?
  • 选择 5 而不是 2 对安全性有何影响?
  • 这是特定于 OpenSSL 的吗?
2个回答

Diffie-Hellman在以素数p为模的整数子群中工作也就是说,你有一个生成器g,它是一个传统的整数模p该生成器的阶r是最小的正整数,使得g r = 1 mod p参与 DH 的两个系统分别选择私钥ab作为给定范围内的整数,并且相应的 DH 公钥(它们通过网络交换)是g a mod pg b mod p

DH 是安全的,只要:

  • p是“适当的”:足够大(至少 1024 位),并且没有使用“特殊结构”产生,这使得离散对数变得容易。一个随机生成的大小合适的素数就可以了。
  • 当以“ k位”的安全级别为目标时, r的最大素数除数的大小至少为2k位。基本上,r的最大素数除数应该是大小至少为 160 位的素数整数(按照今天的标准,200 位或更多位是首选)。
  • DH 私钥的生成范围至少为2 2k左右。基本上,ab也应该是2k位整数。

生成器g的确切值无关紧要,只要双方使用相同的值即可。可以证明,如果有人可以相对于生成器g计算离散对数,那么他可以相对于同一子组的任何生成器g'轻松地计算它因此,重要的是子组 order,而不是生成器。您可以使用25,它不会改变安全性。

使用短生成器对性能有一些(轻微的)好处,这就是首选它们的原因。不过,25之间的性能差异可以忽略不计。在某些协议中,生成器是在协议级别上达成一致的,即不通过线路传输;它在两个系统中都是硬编码的。因此,出于历史和传统原因,一些协议要求使用2,而其他协议则希望使用5OpenSSL 作为一个通用库,可以为这两种情况生成参数。

不过有细节确保选择的生成器确实有一个具有足够大素数除数的订单可能会很棘手。默认情况下,openssl dhparam将生成一个所谓的“安全素数”,即它生成随机素数q,直到找到一个使得p = 2q+1也是素数整数。任何gq的阶始终是p-1的除数因此,通过使用安全素数,OpenSSL 可以保证任何生成器g2..p-2范围内(特别是25的顺序r将等于q2q,因此总是q的倍数,这是一个足够大的素数。

如果 OpenSSL 在没有确保它是“安全素数”的情况下生成随机p ,那么g = 25的实际顺序将难以准确计算(这将涉及分解p-1,这很昂贵)。

在某些非 DH 上下文中,即 DSA 签名算法中,必须有一个类似 DH 的子群,使得生成器的阶数正好等于给定的非太大素数q,而不仅仅是q的倍数. 在这种情况下,OpenSSL(带有-dsaparam命令行开关)将首先生成q,然后为t的随机值生成p = qt + 1直到找到素数;生成器将通过取随机sp并计算g = s tp获得(这必然产生1或恰好q阶的整数)。在生成 DSA 参数时,生成器不能轻易(或根本)被强制为特定的小整数,如25对于 DSA,生成器是“大”的。

什么是发电机 2 和 5?

理解这一点需要一定的数学背景。Diffie-Hellmann 对循环群进行操作。这些组都有一个共同点,即至少有一个生成器,即可以用来生成该组的所有其他元素的元素。

让我们看一个例子:

Z_11*:整数 i = 0,1,...,10 的集合,其中 gcd(i,11) = 1。这是乘法模 11 下的阿贝尔群。

生成器:a = 2

a^1  =           2 mod 11,
a^2  =           4 mod 11,
a^3  =           8 mod 11,
a^4  = (  16 =)  5 mod 11, 
a^5  = (  32 =) 10 mod 11,
a^6  = (  64 =)  9 mod 11,
a^7  = ( 128 =)  7 mod 11,
a^8  = ( 256 =)  3 mod 11,
a^9  = ( 512 =)  6 mod 11,
a^10 = (1024 =)  1 mod 11

如您所见,我们生成了整个组,即我们将每个元素作为结果。但是请注意,这适用于所有类型的组,并且不限于以 p 为模的整数的乘法组。

选择 5 而不是 2 对安全性有何影响?

不,Diffie-Hellman 问题是关于循环群的大小,而不是关于生成群的元素所以当两个元素都是一个组的生成器时,它没有任何区别。不过,选择 2 作为生成器有几个优点,因为您可以更有效地实现底层算法。

我个人不会在这里更改默认设置,除非有很好的理由。显然情况并非如此,否则您不必问;)。

这是特定于 OpenSSL 的吗?

不,这是从循环群本身的数学中得出的。