由于最近有很多关于Diffie-Hellman的问题,我今天早上在想:Diffie-Hellman中的$ g $是否必须是生成器?

回想一下Diffie-Hellman的数学:

给出公共参数$ p $(大质数)和$ g $(始终称为$ \ mathbb {Z} ^ * _ p $的生成器)。


爱丽丝随机选择$ a $,然后向鲍勃发送$ A \ gets g ^ a \ mod {p} $。 p} $给Alice。
Alice计算$ S \ gets B ^ a \ mod {p} $
Bob计算$ S \ gets A ^ b \ mod {p} $

从上面的数学中,我看不到任何需要$ g $成为生成器的东西,因此即使$ g $不是生成器,数学也应该可以工作。

安全性很明显,最好让$ g $作为生成器,因为当$ g $确实是生成器时,$ | g | $(或$ g $的顺序)将最大。这是选择$ g $作为生成器的唯一原因吗?

#1 楼

首先,我们讨论的是乘法,因此我们使用$ \ mathbb {Z} _p ^ * $而不是$ \ mathbb {Z} _p $。

按定义,任何整数$ g \ in \ mathbb {Z} _p ^ * $是...的生成器,该子组由$ g $生成,即所有整数值$ k $的$ g ^ k \ mod p $的集合。 $ g $的顺序是最小的$ k \ geq 1 $,因此$ g ^ k = 1 \ mod p $。为了稳健起见(Alice和Bob最终使用相同的共享密钥) ,任何$ g $都可以。

为了安全起见,我们需要$ g $的阶数必须是足够大的素数的倍数,通常表示为$ q $。 $ g $不必生成整个$ \ mathbb {Z} _p ^ * $。如果Diffie-Hellman的目标安全级别为“ $ t $位”,则$ g $的顺序不必完全是$ q $。至少要花$ 2 ^ t $来完成计算),然后$ p $必须足够大(请参阅此网站以获取估计值,但大致来说,对于$ t = 80 $,您需要一个1024位整数),并且$ q的大小$必须至少为$ 2t $位。另外,DH私钥($ a $和$ b $)必须是随机且统一生成的整数,其大小至少为$ 2t $位。不必在模$ q $的整数之间统一生成$ a $和$ b $,只需要在足够大的范围内生成整数即可(这与DSA不同,在DSA中,我们需要一个随机的$ k $在$ [1,q-1] $范围内统一生成)。

评论


$ \ begingroup $
以上所有内容均暗示“根据当前的密码分析”。上面的参数是(1)我们当前的计算模型和(2)我们当前的知识状态的函数。
$ \ endgroup $
–固定
2011-09-28 15:47

$ \ begingroup $
@Fixee:是的-一台量子计算机,如果有一天存在,将完全杀死Diffie-Hellman(包括椭圆曲线变体)。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011-09-28 15:49

$ \ begingroup $
@Thomas:改进的攻击也可以杀死DH(或要求调整参数)。我猜想我想提倡密码内容的作者不要再说“例如,分解大整数是不可能的”,而是说“常规计算机上没有众所周知的有效分解算法”。尽管我认为一段时间后它会变得很烦。尽管如此,我在教学时要非常小心地说后者。
$ \ endgroup $
–固定
2011-09-28 15:58

$ \ begingroup $
$ k $位不足以容纳$ a $和$ b $吗?
$ \ endgroup $
– kelalaka
18/12/27在21:38

#2 楼

g不仅不需要成为整个组的生成器,而且通常的做法不是。

正如Thomas所提到的,$ g $的阶是最小的$ k \ ge 1 $使得$ g ^ k = 1 \ mod p $。

让$ q $为我们使用的值$ g $的顺序。如果$ g $是整个组的生成器,则$ q = p-1 $,如果不是,则它是$ p-1 $的适当除数。

如果$ q $是复合的,并且有$ r $的因子,因此中间的人可以从$ O $的公共值$ A $中确定值$ a \ mod r $(其中$ a $是私有指数)。 sqrt r)$步骤。一种实现方法:


计算值$ A ^ {q / r} $
确定值$ k $使得$(A ^ {q / r })^ k = g ^ {q / r} \ mod p $,这是订单$ r $的子组上的离散对数问题

因此,如果$ q $的影响较小,本质上是在向攻击者提供一些私有指数。而且,如果$ g $是一个生成器,则$ q $将始终是合成的(因为它是偶数)。这不必致命。如果$ q $只有几个小因素,则双方都可以增加私有指数的大小来进行补偿。但是,没有什么理由让攻击者获得这种优势。

相反,常见的做法是选择一个具有大素数阶的值$ g $。因此,上述观察结果无关紧要。

#3 楼


就安全性而言,显然,使g成为生成器是最好的,因为当$ g $实际上是生成器时,$ | g | $(或$ g $的
阶)将是最大的。是唯一选择$ g $作为生成器的唯一原因吗?


是唯一选择生成器并保持组足够大的唯一原因。