Diffie-Hellman密钥交换是公钥加密最重要的发展之一,它仍然经常在当今一系列不同的安全协议中实施。
它允许以前没有见过面的双方安全地建立一个密钥,他们可以使用该密钥来保护他们的通信。在本文中,我们将解释它的用途,它如何逐步工作,其不同的变化,以及为了安全实施它而需要注意的安全考虑因素。
什么是Diffie-Hellman密钥交换?
Diffie-Hellman密钥交换是第一个在不安全通道上安全开发和交换密钥的广泛使用的方法。
在上述术语中,它可能看起来不那么令人兴奋或具有开创性,所以让我们举一个例子来解释为什么Diffie-Hellman密钥交换是密码学世界中的一个重要里程碑,以及为什么它今天仍然如此频繁使用。
假设你是一个绝密间谍,你需要向你的总部发送一些重要信息。你会如何防止你的敌人获得消息?
最常见的解决方案是用代码加密消息。最简单的方法是预先安排您计划使用的任何类型的代码和密钥,或者通过安全的通信渠道进行。
假设你是一个特别糟糕的间谍,你和你的总部决定使用弱移位密码来编码你的信息。在这个代码中,每个“a”变成“b”,每个“b”变成“c”,每个“c”变成“d”,以斯意为,一直到“z”变成“a”。
在这个转移密码下,“让我们吃晚饭”的信息变成了“Mfu’t hfu ejoofs”。谢天谢地,在我们的假设情况下,你的对手和你一样无能,无法破解如此简单的代码,这使他们无法访问消息的内容。
但是,如果您无法事先与收件人安排代码,会发生什么?
假设你想与来自你从未见过的盟国的间谍沟通。你没有一个安全的渠道来与他们交谈。如果您不加密消息,那么任何拦截消息的对手都将能够读取内容。如果您在不告诉盟友代码的情况下对其进行加密,那么敌人将无法读取它,但盟友也无法读取。
直到20世纪70年代,这个问题一直是密码学中最大的难题之一:
如果您没有机会提前共享密钥,您如何安全地与某人交换信息?
Diffie-Hellman密钥交换是第一个公开使用的解决这个问题的机制。该算法允许那些以前从未见过面的人安全地创建共享密钥,即使是在对手可能监控的不安全通道上。
Diffie-Hellman密钥交换的历史
Diffie-Hellman密钥交换的根源可以追溯到20世纪70年代。虽然密码学领域在整个二十世纪初有了显著发展,但这些进步主要集中在对称密钥密码学领域。
直到1976年,公钥算法才出现在公共领域,当时Whitfield Diffie和Martin Hellman发表了他们的论文《密码学的新方向》。合作概述了新系统背后的机制,该系统将被称为Diffie-Hellman密钥交换。
这项工作的部分灵感来自拉尔夫·默克尔的早期发展。所谓的Merkle's Puzzles涉及一方创建并向另一方发送一些加密谜题。解决这些谜题需要适量的计算资源。
收件人会随机选择一个谜题来解决,然后花费必要的精力来完成它。谜题解决后,向收件人显示标识符和会话密钥。然后,收件人将标识符传输回给原始发件人,这让发件人知道哪个谜题已经解决。
由于原始发件人创建了谜题,标识符让他们知道收件人发现了哪个会话密钥,双方可以使用此密钥进行更安全的通信。如果攻击者正在监听交互,他们将可以访问所有谜题,以及收件人传输回原始发件人的标识符。
标识符不会告诉攻击者正在使用哪个会话密钥,因此解密信息的最佳方法是解决所有谜题以发现正确的会话密钥。由于攻击者平均必须解决一半的谜题,最终他们发现钥匙比收件人难得多。
这种方法提供了更多的安全性,但它远非一个完美的解决方案。Diffie-Hellman密钥交换采用了其中一些想法,并使它们变得更加复杂,以创建一种安全的公钥加密方法。
虽然它被称为Diffie-Hellman密钥交换,但Martin Hellman提议将该算法命名为Diffie-Hellman-Merkle密钥交换,以反映Ralph Merkle对公钥加密所做的工作。
人们公开认为,Merkle、Hellman和Diffie是第一批开发公钥密码学的人,直到1997年,英国政府解密了James Ellis、Clifford Cox和Malcolm Williamson在20世纪70年代初所做的工作。
事实证明,这三人在1969年至1973年期间提出了第一个公钥加密方案,但他们的工作被分类了二十年。它是在英国情报机构政府通信总部(GCHQ)下进行的。
他们的发现实际上是RSA算法,因此Diffie、Hellman和Merkle仍然是第一个开发Diffie-Hellman密钥交换的人,但不再是公钥加密的第一批发明者。
在哪里使用Diffie-Hellman密钥交换?
Diffie-Hellman密钥交换的主要目的是安全地开发可用于获取密钥的共享秘密。然后,这些密钥可以与对称密钥算法一起使用,以受保护的方式传输信息。对称算法往往用于加密大部分数据,因为它们比公钥算法更有效。
从技术上讲,Diffie-Hellman密钥交换可用于建立公钥和私钥。然而,在实践中,往往会使用RSA。这是因为RSA算法也能够签署公钥证书,而Diffie-Hellman密钥交换则不能。
在PGP中大量使用的ElGamal算法基于Diffie-Hellman密钥交换,因此任何使用它的协议都在有效地实现一种Diffie-Hellman。
作为安全分发密钥的最常见方法之一,Diffie-Hellman密钥交换经常在TLS、IPsec、SSH、PGP等安全协议中实现。这使得它成为我们安全通信的一个组成部分。
作为这些协议的一部分,Diffie-Hellman密钥交换通常用于帮助保护您与网站的连接,远程访问另一台计算机,以及发送加密电子邮件
Diffie-Hellman密钥交换如何运作?
Diffie-Hellman密钥交换很复杂,你很难理解它的工作原理。它使用非常大的数字和大量的数学,这是我们许多人在那些漫长而无聊的高中课程中仍然害怕的。
为了使事情更容易理解,我们将首先用一个类比来解释Diffie-Hellman密钥交换。一旦您了解了它的工作原理,我们将对基础流程进行更技术性的描述。
Diffie-Hellman方案的最佳类比是想到两个人混合油漆。让我们使用密码学标准,并说他们的名字是Alice和Bob。他们俩一开始都同意一种随机的颜色。假设他们互相发送消息,并决定将黄色作为他们的共同颜色,就像下面的图表一样:
他们设定了自己的颜色。他们不会告诉对方他们的选择。假设爱丽丝选择红色,而鲍勃选择略带绿色的蓝色。
下一步是爱丽丝和鲍勃将他们的秘密颜色(爱丽丝为红色,鲍勃为绿蓝色)与他们共同商定的黄色混合。根据图表,爱丽丝最终得到了一个猩猩混合,而鲍勃的结果是更深的蓝色。
一旦他们完成混音,他们就会将结果发送给对方。爱丽丝收到了更深的蓝色,而鲍勃收到了橙色的油漆。
一旦他们从伴侣那里收到混合结果,他们就会将他们的秘密颜色添加到其中。爱丽丝取了更深的蓝色,并添加了她秘密的红色油漆,而鲍勃将他秘密的绿蓝色添加到他刚刚收到的橙色混合物中。
结果?它们的颜色都一样,在这种情况下是令人作呕的棕色。它可能不是你想粉刷客厅的那种颜色,但它仍然是一种共享的颜色。这种共享颜色被称为共同秘密。
Diffie-Hellman密钥交换的关键部分是,双方最终都获得了相同的结果,而无需通过通信渠道发送整个共同秘密。选择一种共同的颜色,他们自己的秘密颜色,交换混合,然后再次添加他们自己的颜色,让双方都有一个方法来达到相同的共同的秘密,而不必发送整个事情。
如果攻击者正在收听交换,他们只能访问Alice和Bob开始时常见的黄色,以及交换的混合颜色。由于这确实是用大量的数字而不是油漆完成的,这些信息不足以让攻击识别初始秘密颜色或共同秘密(从技术上讲,可以从这些信息中计算共同秘密,但在Diffie-Hellman密钥交换的安全实现中,这样做需要不可行的时间和计算资源)。
Diffie-Hellman密钥交换的这种结构使它如此有用。它允许双方通过潜在危险的连接进行通信,并且仍然可以想出一个共享秘密,他们可以使用该秘密为未来的通信制作加密密钥。是否有攻击者正在监听并不重要,因为完整的共享秘密永远不会通过连接发送。
Diffie-Hellman密钥交换的技术细节
是时候做数学了......
别担心,我们会慢慢来,尽量让整个过程尽可能容易理解。它遵循与上述类比类似的前提,但Diffie-Hellman方案不是混合和发送颜色,而是根据超大的素数进行计算,然后发送它们。
为了确保安全性,建议素数(p)至少为2048位**,这是大约这个大小的十进制数的二进制等价物:
415368757628736598425938247569865827634879128375827365928736 84273684728938572983759283475934875934875928475928739587249587 29873958729835792875982795837529876348273685729843579348795827 938579287395487723975928375924785938670459867923847378267352673547623568734869386945673456827659498063849024875809603947902 7945982730187439759284620950293759287049502938058920983945872 0948602984912837502948019371092480193581037995810937501938507913 95710937597019385089103951073058710393701934701938091803984091803984091804 98109190340198319034019830918095180
为了防止任何人的头爆炸,我们将用小得多的数字来解释这个解释。请注意,如果Diffie-Hellman密钥交换使用与我们示例中的数字一样小,则不安全。我们只用这么小的数字来以更简单的方式演示这个概念。
在Diffie-Hellman密钥交换的最基本形式中,Alice和Bob首先相互决定从两个数字开始,而不是上面示例中的单一通用油漆。这些是模量(p)和基数(g)。**
在实际使用中,模量(p)是一个非常大的素数,而基数(g)相对较小,以简化计算。基数(g)来自一个循环群(G),该循环群通常在其他步骤发生之前就生成。
举例来说,假设模量(p)为17,而基数(g)为4。
一旦他们相互决定了这些号码,爱丽丝为自己确定了一个秘密号码(a),而鲍勃则选择自己的秘密号码(b)。假设他们选择:
**a = 3
**b = 6
然后,爱丽丝执行以下计算,给她将发送给鲍勃的号码:
*A = ga *mod p
在上述计算中,mod表示模操作。这些本质上是在将左侧除以右侧后计算余数的计算。举个例子:
15 mod 4 = 3
如果您了解模操作的工作原理,您可以在以下计算中自己完成,否则您可以使用在线计算器。
因此,让我们把我们的数字放入公式中:
*A *= 43 mod 17
*A *= 64 mod 17
*A *= 13
当我们为鲍勃做同样的事情时,我们会得到:
*B *= 46 mod 17
*B *= 4096 mod 17
*B *= 16
然后,爱丽丝把她的结果(A)发给鲍勃,而鲍勃把他的数字(B)发给爱丽丝。然后,爱丽丝使用她从鲍勃(B)那里收到的数字和她的秘密号码(a)来计算共享秘密(s),使用以下公式:
*s *= Ba mod p
*s *= 163 mod 17
*s *= 4,096 mod 17
*s *= 16
然后,鲍勃执行本质上相同的计算,但使用爱丽丝发给他的数字(A)以及他自己的秘密号码(b):
*s *= Ab mod p
*s *= 136 mod 17
*s *= 4,826,809 mod 17
*s *= 16
如您所见,双方最终都获得了s,16的相同结果。这是共同的秘密,只有爱丽丝和鲍勃知道。然后,他们可以用它来设置对称加密的密钥,允许他们以只有他们才能访问的方式在自己之间安全地发送信息。
请注意,尽管****B****和****s****在上面的例子中是相同的,但这只是基于为本插图选择的小数字的巧合。通常,在Diffie-Hellman密钥交换的实际实现中,这些值将不同。
尽管上述大部分数据以明文(p、g、A和B)通过通道发送,并且可以被潜在的攻击者读取,但共享密钥(s)永远不会传输。对于攻击者来说,从以明文发送的信息中计算共享秘密(s)或秘密数字(a和b)是不切实际的。
当然,这假设Diffie-Hellman密钥交换已正确实现,并使用了足够大的数字。只要遵守这些规定,Diffie-Hellman密钥交换就被认为是建立共享秘密的安全方法,可用于确保未来的通信。
在多方之间建立共享密钥
Diffie-Hellman密钥交换也可用于与更多参与者设置共享密钥。它以相同的方式工作,除了需要进一步的计算,各方需要添加他们的秘密号码,并最终获得相同的共享秘密。
就像在Diffie-Hellman密钥交换的两方版本中一样,部分信息通过不安全的渠道发送,但不足以让攻击者计算共享密钥。
为什么Diffie-Hellman密钥交换是安全的?
在数学层面上,Diffie-Hellman密钥交换依赖于单向函数作为其安全性的基础。这些计算单向简单,但更难反向计算。
更具体地说,它依赖于Diffie-Hellman问题,该问题假设在正确的参数下,从g、ga和gb的单独值中计算gab是不可行的。目前没有公开已知的方法从其他值中轻松找到gab,这就是为什么Diffie-Hellman密钥交换被认为是安全的,尽管攻击者可以拦截值p、g、A和B。
身份验证和Diffie-Hellman密钥交换
在现实世界中,Diffie-Hellman密钥交换很少单独使用。这背后的主要原因是它不提供身份验证,这使得用户容易受到中间人攻击。
当Diffie-Hellman密钥交换自行实施时,这些攻击可能会发生,因为它无法验证连接的另一方是否真的是他们所说的那个人。如果没有任何形式的身份验证,当用户认为他们正在与受信任方通信时,他们实际上可能正在与攻击者联系。
因此,Diffie-Hellman密钥交换通常与一些身份验证方式一起实现。这通常涉及使用数字证书和公钥算法(如RSA)来验证各方的身份。
Diffie-Hellman密钥交换的变体
Diffie-Hellman密钥交换可以通过多种不同方式实现,它还为其他几种算法提供了基础。其中一些实现提供授权,而另一些则具有各种加密功能,如完美的前向保密。
椭圆曲线Diffie-Hellman
椭圆曲线Diffie-Hellman利用椭圆曲线的代数结构,使其实现以较小的键大小实现类似的安全性。224位椭圆曲线密钥提供与2048位RSA密钥相同的安全性。这可以提高交换效率,并减少存储需求。
除了较小的键长度以及它依赖于椭圆曲线的性质外,椭圆曲线Diffie-Hellman的运作方式与标准的Diffie-Hellman键交换类似。
TLS
TLS是一种用于保护大部分互联网的协议,可以通过三种不同的方式使用Diffie-Hellman交换:匿名、静态和短暂的。在实践中,只应该实施短暂的Diffie-Hellman,因为其他选项存在安全问题。
- 匿名Diffie-Hellman-此版本的Diffie-Hellman密钥交换不使用任何身份验证,使其容易受到中间人攻击。它不应该被使用或实施。
- **Static Diffie-Hellman **– Static Diffie-Hellman使用证书对服务器进行身份验证。默认情况下,它不验证客户端,也不提供前向保密。
- 短暂的Diffie-Hellman-这被认为是最安全的实现,因为它提供了完美的前向保密。它通常与DSA或RSA等算法相结合,以验证连接中的一方或双方。短暂的Diffie-Hellman每次运行协议时都使用不同的密钥对。这为连接提供了完美的前向保密性,因为即使密钥将来被盗,它也不能用于解密所有过去的消息。
ElGamal
ElGamal是一种建立在Diffie-Hellman密钥交换之上的公钥算法。与Diffie-Hellman一样,它本身不包含身份验证条款,通常为此目的与其他机制相结合。
ElGamal主要用于PGP、GNU Privacy Guard和其他系统,因为它的主要竞争对手RSA获得了专利。RSA的专利于2000年到期,允许在该日期之后自由实施。从那时起,ElGamal就不再经常实施了。
STS
站点到站点(STS)协议也基于Diffie-Hellman密钥交换。这是另一个关键的协议计划,但它提供了防止中间人攻击的保护,以及完美的前方保密性。
它要求连接中的双方已经有一个密钥对,用于验证每一方。如果双方还不认识对方,那么证书可用于验证双方的身份。
Diffie-Hellman密钥交换和RSA
正如我们之前所讨论的,Diffie-Hellman密钥交换通常与RSA或其他算法一起实现,为连接提供身份验证。如果您熟悉RSA,您可能想知道为什么有人也会费心使用Diffie-Hellman密钥交换,因为RSA使以前从未见过面的各方能够安全地通信。
RSA允许其用户使用其通讯员的公钥加密消息,因此它们只能由匹配的私钥解密。然而,在实践中,RSA不用于加密整个通信——这将太低效了。
相反,RSA通常仅用作验证双方身份验证的手段。它使用各方的数字证书来做到这一点,该证书将由证书颁发机构验证,以证明证书所有者确实是他们所说的人,并且证书上的公钥实际上属于他们。
为了相互身份验证,各方将使用他们的私钥签署一条消息,然后将其发送给他们的通信合作伙伴。然后,每个收件人可以通过对照其通信合作伙伴数字证书上的公钥检查签名消息来验证另一方的身份(有关其工作原理的更多详细信息,请参阅上述关于RSA的文章,特别是签名消息部分)。
现在双方都已通过身份验证,从技术上讲,继续使用RSA在它们之间安全地发送加密消息是可能的,但最终效率太低。
为了解决这种低效率问题,许多安全协议使用Diffie-Hellman密钥交换等算法来提出一个共同的秘密,可用于建立共享的对称密钥。****然后,该对称密钥用于对称密钥算法,如AES,以加密双方打算在它们之间安全发送的数据。
它可能看起来像一个复杂而复杂的过程,但与在整个交换中使用公钥算法相比,它最终会更快,对资源的要求也低得多。这是因为对称密钥加密比公钥加密效率高出几个数量级。
除了我们刚才提到的低效率外,还有其他一些缺点会来自单独使用RSA。RSA需要填充才能使其安全,因此需要与之一起适当地实施额外的算法才能使其安全。
RSA也没有提供完美的前向保密,与短暂的Diffie-Hellman密钥交换相比,这是另一个缺点。总的来说,这些原因是,在许多情况下,最好只将RSA与Diffie-Hellman密钥交换一起应用。
或者,Diffie-Hellman密钥交换可以与数字签名标准(DSS)等算法相结合,以提供身份验证、密钥交换、保密性并检查数据的完整性。在这种情况下,RSA不是保护连接所必需的。
Diffie-Hellman密钥交换的安全问题
Diffie-Hellman密钥交换的安全性取决于其实现方式,以及为它选择的数字。如上所述,它没有办法单独认证另一方,但在实践中,使用其他机制来确保另一方不是冒名顶替者。
数字选择的参数
如果Diffie-Hellman密钥交换的实际实现使用的数字与我们示例中的数字一样小,这将使攻击者破解的交换过程变得微不足道。但重要的不仅仅是数字的大小——数字也需要足够随机。如果随机数生成器产生可预测的输出,它可能会完全破坏Diffie-Hellman密钥交换的安全性。
数字p应该有2048位长,以确保安全。基数g可以是一个相对较小的数字,如2**,但它需要来自具有大素因子的G阶
Logjam攻击
Diffie-Hellman密钥交换是在离散对数问题难以解决的基础上设计的。最有效的已知找到解决方案的机制是数场筛算法。
在设计Diffie-Hellman密钥交换时,考虑了该算法的功能。到1992年,众所周知,对于给定组G,算法所涉及的四个步骤中的三个可能会事先计算出来。如果保存了这一进展,可以在相对较短的时间内计算出最后一步。
在意识到很大一部分互联网流量使用1024位或更小的相同组之前,这并不太令人担忧。2015年,一个学术团队对TLS中Diffie-Hellman密钥交换使用的最常见的512位素数进行了计算。
他们还能够降级80%支持DHE-EXPORT的TLS服务器,以便接受512位导出级Diffie-Hellman密钥交换的连接。这意味着这些服务器中的每一个都容易受到资源充足对手的攻击。
研究人员继续推断他们的结果,估计一个民族国家可以打破1024位质数。****通过打破最常用的1024位素数,学术团队估计,对手可以监控100万个最受欢迎的HTTPS网站中的18%。
他们接着说,第二个素数将使对手能够解密66%的VPN服务器和26%的SSH服务器的连接。在报告的后面,学者们建议,国家安全局可能已经拥有这些能力。
“对已公布的NSA泄密的仔细阅读表明,该机构对VPN的攻击与实现这种突破是一致的。”
尽管存在此漏洞,但如果正确实施,Diffie-Hellman密钥交换仍然可以安全。只要使用2048位密钥,Logjam攻击就不起作用。更新的浏览器也免受这种攻击。
Diffie-Hellman钥匙交换安全吗?
虽然Diffie-Hellman密钥交换可能看起来很复杂,但它是在线安全交换数据的基本部分。只要它与适当的身份验证方法一起实现,并且正确选择数字,它就不会被视为容易受到攻击。
Diffie-Hellman密钥交换是在20世纪70年代开发时帮助两个未知方安全沟通的创新方法。虽然我们现在使用更大的密钥实现较新版本,以抵御现代技术,但协议本身看起来将继续安全,直到量子计算的到来和随其带来的高级攻击。
量子计算将如何影响Diffie-Hellman密钥交换?
量子计算是计算的一个新兴分支,它继续取得突破。量子计算机如何工作的具体细节很复杂,超出了本文的范围,但该技术确实给密码学领域带来了重大问题。
简单的解释是,量子计算机有望解决目前对经典计算机不可行的某些问题。这将打开许多大门,带来新的可能性。足够强大的量子计算机将能够运行量子算法,从而更有效地解决各种数学问题。
虽然这听起来可能很棒,但我们当前许多加密机制的安全性依赖于这些问题难以解决。如果这些数学问题变得更容易计算,那么打破这些加密机制也会变得更容易。
这些量子算法之一是格罗弗的算法。当量子计算机变得足够强大时,它将加快对AES等对称密钥密码的攻击。然而,它可以很容易地通过加倍密钥大小来缓解。
最大的担忧是Shor的算法将如何影响公钥加密。这是因为大多数常见的公钥算法的安全性依赖于解决这三种计算之一的巨大困难:
每个人的细节并不重要,但如果您想了解更多信息,您可以点击链接。重要的是,一旦足够强大的量子计算机到来,使用Shor的算法解决这些问题将变得更加实用。随着这些问题变得更容易解决,依赖它们的加密系统将变得不那么安全。
公钥加密在保护我们的通信方面发挥着根本性作用,这就是为什么量子计算对密码学家来说是一个巨大的挑战。
在Diffie-Hellman密钥交换的情况下,其安全性依赖于能够用当前技术和资源解决离散对数问题的不切实际性。然而,随着量子计算的每一次进步,来自Shor算法的威胁越来越近。
很难想出一个粗略的时间表来了解量子计算何时会严重威胁迪菲-赫尔曼密钥交换,因为一些研究人员比其他研究人员更乐观。尽管如此,正在开发Diffie-Hellman密钥交换和其他公钥算法的替代品,以确保我们在时机到来时做好准备。
Diffie-Hellman密钥交换的潜在替代品
量子计算机的危险不是立竿见影的,因此密码学界尚未确定Diffie-Hellman密钥交换的特定替代方案。然而,许多道路正在被追求。这些包括:
我们仍然不知道后量子世界将如何寻找密码学,但安全界正在积极解决问题,并跟上量子计算世界的进步。虽然未来会有很大的变化,但普通人不需要害怕——当任何变化发生时,你甚至可能不会注意到。
参考
What is the Diffie–Hellman key exchange and how does it work?