对于Diffie-Hellman(DH)密钥交换(TLS),服务器会生成一个质数p和一个生成器g,这是原始的根模p。

使用SSL / TLS设置Web服务器时(例如nginx)可以使用指令ssl_dhparam dhparam4096.pem
可以使用dhparam4096.pem生成openssl dhparam -out dhparam4096.pem 4096文件

这些DH参数的确切用途是什么?
它们可以公开吗? (即我可以发布我的dhparam4096.pem文件吗?)

这是我dhparam4096.pem文件的内容:
这似乎是4096位整数的十六进制表示,对吗?

-----BEGIN DH PARAMETERS-----
MIICCAKCAgEAsb8mBiOtYJZ3XR7f/rCXQwpAAnUPXf7l9pwjYxxy30A7rIzMTrsz
bXuhhEmzroJcDqKbu2nIzOBNO6HuyQ3n9x/ZbY5kiEt6q7UrB5jC9LwyPASZhd/F
6xLC7yqFs9sdCaXzuyMS4Ep5sPH6lOvftdsuGZZF9HriTepv/lpD1cPtab+3vHZX
IELVc2WBwVzvNRGd/SQB8RJ+NNF8IseCV/pb/tb67O1p7sn+JsD5xgNB7Lte/XjD
QBXv86aNuI2Z6zAuCiQsQ4rJuWcdnyAz0+zW9DRHz0osB1+IfHYcf4tNmvMKbC8E
u/vI+Q2WsMXkbTyhWibV2zH8cXdfsj5xpIgtbxm4G1ELGFgqyX9LD0IddXE7Md86
qwoKSTBNOyCIEZwwNfKDXY0b7zzObv7b3//J7gM323bAcm9g3uVaYBxF7ITd/jGm
AxpnF55mfhAOYemPZtNinnPAdvqf6BhZe29wfVC1yCIhg7ec9spRaFn2GgW0eL3d
q/+Ux8DJBtzKE10YyLa7bh1Dhml/xtA7rpqLL4+jg5c6lLEvSGmAZtm879NYS0za
33/2LN0/KB4z46Ro5hwqq3UIIe8oDsxdlNGb0mb9F0lKw5//J24PK/t11qMt8yuG
oKUE7TkDfwXlEBxd/ynW2/kLIjhG1JG55Vz8GWet8+ZGzfl/VQeUb9MCAQI=
-----END DH PARAMETERS-----


评论

答案涵盖了目的。就表示形式而言,所有(OpenSSL)PEM文件都是ASN.1 DER(或很少BER)结构的base64(非十六进制)编码。这里的ASN.1结构是DH参数,除了ASN.1的TLV开销外,它还包含较大的质数p(此处为4096位)和生成器g(通常较小,此处为2)。您可以在openssl asn1parse
但是当我查找TLS 1.3握手阶段时。开始发送带有key_share扩展名的第一个握手请求是客户端的工作。如果p,g来自服务器,那么客户端如何在没有p,g的情况下生成A?

#1 楼


这些DH参数的确切用途是什么?

这些参数定义OpenSSL如何执行Diffie-Hellman(DH)密钥交换。如您所言,它们包括一个字段素数p和一个生成器g。定制这些参数的可用性的目的是允许每个人为此使用他/她自己的参数。这可以用来防止受到Logjam攻击的影响(这实际上不适用于4096位素数)。
那么它们的定义是什么?
Diffie-Hellman密钥交换的操作如下(对于TLS 1.2及更低版本1):
服务器Bob使用这些参数来计算B=g^b mod p。他将(B,g,p)发送给客户端Alice,后者与A=g^a mod p一起自己计算K=B^a mod p。她将A发送给Bob,然后他计算K=A^b mod p。当A^b=g^(a*b)=g^(b*a)=B^a mod p持有时,双方将就共享密钥达成一致。参数pg定义此密钥交换的安全性。较大的p会使查找共享秘密K变得更加困难,从而防御被动攻击者。
为什么要预先计算它们呢?
找到主要的p意味着要为p找到一个值p=2q+1成立,其中q是质数。 p被称为安全素数。
发现这样的素数实际上是计算密集型的,无法在每个连接上提供,因此它们是预先计算的。

它们可以公开吗?

是的,发布它们没有风险。实际上,对于涉及某些Diffie-Hellman(DH)密钥交换的每个密钥交换,它们都被发送出去。例如,甚至在RFC 5114中甚至标准化了几个这样的参数。发布的唯一可能问题可能是强大的攻击者可能对对其执行一些计算感兴趣,从而使他能够执行Logjam攻击。但是,由于您的参数使用4096位字段素数p,所以这没有风险。
为了解释为什么发布它们没有风险,您可能需要看一下上面的密钥交换说明,并注意,这些参数仅用作计算的基础,但是所有秘密(a,b)都与g,p完全独立。

1:对于TLS 1.3,客户端首先从标准化集中猜测服务器的参数。然后,对服务器的所有这些参数执行A,然后服务器使用自己的B进行响应以及选择参数集,或者使用实际支持的参数列表进行响应-这可能包括自定义生成的参数,此问与答就是全部关于。

评论


很久以后很高兴见到鲍勃,爱丽丝和特伦特。

– Dojo
19年1月18日在11:01

谢谢你的解释。那么为什么dhparam需要真正的随机性?似乎我们只需要一个非秘密数字,它可以是伪随机数。他们在鸽舍说明中提到,我们需要dhparam的真实随机性源。

–量子物理学家
19年8月7日在20:36



@TheQuantumPhysicist的真正随机性可帮助您避免意外生成与其他人相同的参数。

– SEJPM
19年8月8日在8:04

我了解@SEJPM,但这不是秘密。对?如果这不是秘密,那么如果我生成与其他人相同的密钥,那为什么重要呢?

–量子物理学家
19年8月8日在16:02

@TheQuantumPhysicist确实,这些参数不是秘密,如果您使用与其他参数相同的参数,也不会立即造成伤害。因此,没有加密的理由强制使用强大的随机数生成器来生成DH参数。但是,您仍然不希望每个人都使用相同的参数集,因为Logjam之类的东西将来可能会毁了您的一天。我认为鸽派开发人员只是为他们提供了最简单的解决方案,那就是在问题上抛出强大的RNG。

– SEJPM
19年8月8日在18:14

#2 楼

在Diffie Hellman密钥交换的openssl Wiki页面上:

如果爱丽丝和鲍勃希望彼此通信,他们首先要在他们之间商定一个大质数p和一个生成器(或基数)g (其中0 Alice选择一个秘密整数a(她的私钥),然后计算g ^ a mod p(这是她的公钥)。鲍勃选择自己的私钥b,并以相同的方式计算自己的公钥。

因此,爱丽丝将始终具有相同的私钥,但是对于每组DH参数g和p,她都会得到一个不同的相应公钥。

在该页面的下一页上说:

由于参数生成可能是一个昂贵的过程,因此通常需要提前执行一次,然后再进行一组相同的参数

在Diffie Hellman Parameters的openssl Wiki页面上,它说:

要使用完善的前向保密密码套件,必须设置Diffie- Hellman参数(在服务器端)

使用静态Diffie Hellman(DH)(与Ephemeral Diffie Hellman(EDH)相对)时,DH参数是为服务器设置的,实际上可以嵌入其中证书,因此他们是公众看到此答案的人。保密性来自Alice和Bob的私钥。

#3 楼

DH参数的目的是交换一个秘密(属于素数顺序组的大素数整数),该密码将用于加密会话中消息的副本。

星表DH提供前向安全性,这意味着在会话终止时会删除会话密钥(在会话开始时交换)。因此,攻击者无法检索到超过最后一个会话的两方之间交换的消息(因为每个会话都具有不同的密钥,该密钥始终在终止时被删除)。

评论


会话密钥未交换。否则,所有的DH资料都将毫无意义。它由双方独立计算。

–user207421
17年3月21日在4:11

各方如何使用它,因为每个人都必须了解它?

– Sebi
17年3月21日在13:38

@ user207421涉及的算法称为“ Diffie-Hellman密钥交换”。的确,会话密钥从不发送,但“交换”是行话。 Sebi:会话密钥是由双方独立计算的,但是要确保他们双方都计算出相同的结果(user207421使用的是“交流”的一种更为“普通的英语”含义)。

–马丁·邦纳(Martin Bonner)支持莫妮卡(Monica)
19 Mar 4 '19 at 11:22