当前位置: 首页 > article >正文

Diffie-Hellman 加密协议介绍 (DH,DHE,ECDHE)

Diffie-Hellman 协议是由 Whitfield Diffie 和 Martin Hellman 在 1976 年提出的一种非对称加密协议。
音标:/ˈdɪ.fi ˈhɛl.mən/


Diffie-Hellman(DH)

DH的工作流程

假设 小博 和 小民 想要通过不安全的网络协商出一个共享的秘密值,具体步骤如下:
(1)约定公开参数
双方事先约定两个公开参数。
一个大素数 p(作为模数)
一个生成元 g(满足 1 < g < p)。
这些参数可以公开传输,不会影响安全性。

(2)生成私钥和计算公钥
小博:
随机选择一个私钥 a(1 < a < p-1)。
根据公式计算自己的公钥:A = g^a mod p
小民:
随机选择一个私钥 b(1 < b < p-1)。
根据公式计算自己的公钥:B = g^b mod p

(3)交换公钥
小博 将自己的公钥 A 发送给 小民。
小民 将自己的公钥 B 发送给 小博。
公钥可以在不安全的信道中传输,因为它们本身并不直接暴露秘密值。

(4)计算共享的秘密值
小博:
使用自己的私钥 a 和 小民 的公钥 B 计算共享的秘密值:Shared Secret = B^a mod p = (g^b mod p)^a mod p = (g^b)^a mod p
小民:
使用自己的私钥 b 和 小博 的公钥 A 计算共享的秘密值:Shared Secret = A^b mod p = (g^a mod p)^b mod p = (g^a)^b mod p
由于模幂运算的性质(g^b)^a mod p = (g^a)^b mod p,所以 小博 和 小民 计算出的共享秘密值是相同的:

如果计算的Shared Secret不一致怎么办?
共享的秘密值计算完成后,会进一步使用主密钥派生出会话密钥(Session Keys),并用这些会话密钥加密后续的通信数据。如果密钥不一致,后续加解密会出问题,从而检测到问题。

遇到问题

虽然 Diffie-Hellman(DH)协议能够安全地协商出共享的秘密值,但它本身并不提供身份验证机制。如果通信双方无法确认对方的身份,就可能遭受中间人攻击(Man-in-the-Middle Attack, MITM)。因为pg为公开参数,且 小博 和 小民 的公钥 AB 是公开的。坏人就可以夹在 小博和小民中间,充当中间人,进行冒充了(小博 — 坏人 — 小民)。

如何避免 Diffie-Hellman 中间人攻击?

使用数字证书进行身份验证
1、服务器生成一个公钥和私钥对。将公钥嵌入到数字证书中,并由受信任的证书颁发机构(CA)签名。
2、客户端在与服务器进行 Diffie-Hellman 密钥交换之前,先验证服务器的数字证书。
验证内容包括:证书是否由可信 CA 签发、证书是否过期、证书中的公钥是否与服务器提供的公钥匹配等。
3、验证成功后,客户端和服务端继续完成 Diffie-Hellman 密钥交换。

哪里避免 Diffie-Hellman 中间人攻击?
此方案里,客户端获取到的服务器的公钥是百分百正确的,客户端的私钥和服务器的公钥计算得到的百分百正确的共享的秘密值。服务端秘钥只能和正确的客户端公钥才能算出与之相等的秘密值,如果不相等就说明存在中间人攻击。

使用预共享密钥(Pre-Shared Key, PSK)
1、如果通信双方事先共享了一个秘密密钥(PSK)。
2、在 Diffie-Hellman 密钥交换完成后,客户端和服务端将协商出的共享秘密值 S 和预共享密钥 K 结合起来,生成一个最终的会话密钥 SK。
2、双方分别使用生成的会话密钥 SK 来加密或签名一条消息,并发送给对方。对方收到消息后,使用自己的会话密钥 SK 验证消息的真实性。如果验证成功,则确认对方的身份合法。
优点:不依赖于外部证书颁发机构(CA)。实现简单,适合小型网络或封闭系统。
缺点:如果预共享密钥泄露,整个系统的安全性将受到影响。

哪里避免 Diffie-Hellman 中间人攻击?
如果存在中间人,她无法知道预共享密钥 K,因此无法正确生成会话密钥 SK。当 客户端或 服务端 收到 中间人 发送的消息时,验证会失败,从而检测到攻击。

使用签名算法验证公钥
1、客户端和服务器双方分别生成自己的非对称密钥对(公钥和私钥)。
2、客户端和服务器双方分别生成自己的 Diffie-Hellman 公钥。
3、发送方使用自己的非对称私钥对 Diffie-Hellman 公钥进行签名。
4、发送方将 Diffie-Hellman 公钥及其对应的签名一起发送给接收方。
5、接收方收到 Diffie-Hellman 公钥和签名后,使用发送方的非对称公钥验证签名的有效性。
6、如果签名验证成功,接收方确认发送方的身份合法。双方继续完成 Diffie-Hellman 密钥交换,协商出共享的秘密值。
7、双方使用协商出的共享秘密值生成会话密钥。会话密钥可以用于后续的加密通信。

哪里避免 Diffie-Hellman 中间人攻击?
签名可以保证准确的拿到对方的公钥,准确的公钥和自己私钥就可以准确的生成共享的秘密值。


DHE(Diffie-Hellman Ephemeral)

静态 Diffie-Hellman
使用固定的长期密钥对(公钥和私钥)进行密钥交换。
特点:如果攻击者获取了服务器的私钥,可以解密所有历史会话。

DHE(Diffie-Hellman Ephemeral)
每次通信时生成临时的密钥对(公钥和私钥),仅用于当前会话。临时密钥对在会话结束后被销毁,无法再次使用。
特点:提供前向安全性(Forward Secrecy),即使长期密钥泄露,也无法解密之前的会话。

前向安全性(Forward Secrecy) 啥意思?
前向安全性(Forward Secrecy,简称 FS)是一种加密通信的安全属性,确保即使长期密钥(如服务器的私钥)在未来被泄露,也无法解密之前已截获的通信内容。换句话说,前向安全性保护了过去的会话免受未来密钥泄露的影响。

DHE 的工作流程

(1)初始化连接
双方(如客户端和服务器)通过某种方式(如 TLS 握手)建立连接。双方约定一组公共参数(如大素数 ( p ) 和生成元 ( g ))。
(2)生成临时密钥对
服务器端:生成一个随机的私钥 ( x ),计算对应的公钥 ( X = g^x mod p )。
客户端:生成一个随机的私钥 ( y ),计算对应的公钥 ( Y = g^y mod p )。
(3)交换公钥
服务器将生成的公钥 ( X ) 发送给客户端。
客户端将生成的公钥 ( Y ) 发送给服务器。
(4)计算共享秘密值
服务器端:使用客户端的公钥 ( Y ) 和自己的私钥 ( x ),计算共享秘密值 ( S = Y^x mod p )。
客户端:使用服务器的公钥 ( X ) 和自己的私钥 ( y ),计算共享秘密值 ( S = X^y mod p )。
由于数学性质,( S = (g^y)^x mod p = (g^x)^y mod p ),因此双方计算出的共享秘密值相同。
(5)生成会话密钥
双方使用共享秘密值 ( S ) 生成会话密钥(Session Key)。会话密钥用于后续的加密通信。
(6)销毁临时密钥对
临时密钥对(私钥 ( x ) 和 ( y ))在会话结束后被销毁,无法再次使用。

DHE 的优势

(1)前向安全性(Forward Secrecy)
DHE 使用临时密钥对,确保每次会话都生成独立的共享秘密值。即使长期密钥(如服务器的私钥)在未来被泄露,也无法解密之前的会话内容。
(2)防止中间人攻击
在实际应用中,DHE 通常结合数字证书使用,以验证通信双方的身份。

DHE 的局限性

(1)计算开销较大
尽管 DHE 的计算效率较高,但相比其他密钥交换算法(如 RSA),它仍然需要更多的计算资源。
特别是在处理大量并发连接时,可能会对服务器的性能产生影响。
(2)依赖公共参数的安全性
DHE 的安全性依赖于公共参数的选择(如大素数 ( p ) 和生成元 ( g ))。
如果这些参数选择不当,可能会导致安全性降低。
(3)需要额外的身份验证机制
DHE 本身只负责密钥交换,无法验证通信双方的身份。
因此,通常需要结合数字证书或其他身份验证机制来确保通信的安全性。


ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)

(1)椭圆曲线密码学(ECC)
椭圆曲线密码学是一种非对称加密技术,基于椭圆曲线上的点运算。
它提供与传统 RSA 或 DH 相同的安全性,但使用更短的密钥长度,从而提高计算效率和性能。

(2)临时密钥对(Ephemeral Keys)
每次通信时生成独立的临时密钥对,仅用于当前会话。临时密钥对在会话结束后被销毁,无法再次使用。
这就保证了前向安全性(Forward Secrecy),即使长期密钥泄露,也无法解密之前的会话。


ECDHE 结合数字证书 的工作原理与 SSL/TLS 协议的核心步骤高度一致,因为 ECDHE 是 SSL/TLS 中常用的密钥交换算法之一。

ECDHE结合数字证书的工作流程

(1) 初始化连接
客户端向服务器发送 ClientHello 消息,表示希望建立安全连接,并提供支持的加密套件列表。
服务器响应 ServerHello 消息,选择一个加密套件(如 ECDHE),并附带自己的数字证书。

(2) 验证服务器身份
参考 如何使用数字证书验证服务器身份

(3) 生成临时椭圆曲线密钥对
服务器和客户端分别生成临时的椭圆曲线密钥对(公钥和私钥)。
服务器:随机选择一个私钥 (d_A),计算对应的公钥 (Q_A)
客户端:随机选择一个私钥 (d_B),计算对应的公钥 (Q_B)。

(4) 交换椭圆曲线公钥
服务器将生成的公钥 (Q_A) 发送给客户端。
客户端将生成的公钥 (Q_B) 发送给服务器。

(5) 验证椭圆曲线公钥
为了防止中间人攻击,服务器需要对发送的椭圆曲线公钥进行签名。
客户端收到椭圆曲线公钥及其签名后,使用服务器数字证书中的公钥验证签名的有效性。

(6)协商共享秘密值
双方使用各自的临时椭圆曲线私钥对方的椭圆曲线公钥,计算出相同的共享秘密值。

(7)生成会话密钥
双方使用协商出的共享秘密值,结合其他参数(如随机数、哈希函数等),生成最终的会话密钥。用于后续的加密通信。

(8)完成握手
双方分别发送 Finished 消息,表示握手完成。从此时起,所有通信都将使用生成的会话密钥进行加密和解密。

ECDHE 的特点
使用临时密钥对(Ephemeral Keys),确保每次会话的独立性。因此保证前向安全性(Forward Secrecy),即使长期密钥泄露,也无法解密之前的会话。

结合的优势
ECDHE 提供高效的密钥交换前向安全性
数字证书验证服务器的身份,确保椭圆曲线公钥是由合法的服务器提供的。提供全局信任机制,避免中间人攻击。


http://www.kler.cn/a/591215.html

相关文章:

  • 路由器安全研究|D- Link DIR-823G v1.02 B05 复现与利用思路
  • Git:速查手册
  • K8S学习之前站五:清理docker的overlay2 目录
  • 解决vscode连接失败问题--ssh试图写入的管道不存在
  • svn-1.7.22安装
  • 涨薪技术|Kubernetes(k8s)之认识Pod
  • 前端(vue)学习笔记(CLASS 4):组件组成部分与通信
  • Qt 读取数据库
  • 每日一题:动态规划
  • 第17章-用6050走直线和转90度功能 平衡车入门---MPU6050陀螺仪的使用 超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)
  • Oracle 启用 Sql 跟踪的方式
  • 微软OneNote无法同步解决方案
  • 记一次ElasticSearch参数调优
  • Bash环境定制git分支提示符暨JDK版本切换脚本
  • C 语言格式化输入输出详解
  • 译:《Converting a Hugging Face Model to a GGUF Model》转化HuggingFace原生模型为GGUF格式
  • autosar功能安全文档解析
  • 【极光 Orbit·STC8AH】04. 深度探索 GPIO 底层逻辑
  • Redis之单线程与多线程
  • 【leetcode hot 100 124】二叉树中的最大路径和