Deffie-Hellman 算法

news2024/11/17 23:50:02

Deffie-Hellman 算法简介

Deffie-Hellman(简称 DH) 密钥交换是最早的密钥交换算法之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。 Whitfield Diffie 和 Martin Hellman 于 1976 提出该算法,之后被应用于安全领域,比如 Https 协议的 TSL(Transport Layer Security) 和 IPsec 协议的 IKE(Internet Key Exchange) 均以 DH 算法作为密钥交换算法。


数论知识

理解 DH 算法前,先介绍一些必要的数论领域知识,分别是离散对数问题和一个求模公式。

离散对数问题

假定 a, p 均是素数,下面两个集合相等,证明过程请参考 Cryptography and Network Security 第八章:

{ a^1 mod p, a^2 mod p, ..., a^(p-1) mod p } = {1, 2, ... , p-1 }   {} 表示集合

上述式子可概括成以下三点,对于 1 <= x,y <= p - 1,有:

  • a^x mod p 一定属于 {1, 2, …, p -1 }

  • 如果 x != y,则 a^x mod p != a^y mod p

  • 对于 1 <= b <= p - 1,一定存在唯一的 1 <= x <= p-1,使得 b = a^x mod p

第三点在求解上有这么一个特点:已知 x 求 b 非常容易,已知 b 求 x 非常困难,特别当 p 很大时,求解的复杂度非常高,所以它又被称为离散对数问题 (Discrete logarithm),它是 DH 算法能够安全交换密钥的基础!

求模公式

假设 q 为素数,对于正整数 a,x,y,有:

(a^x mod p)^y mod p = a^(xy) mod p

证明如下:

令 a^x = mp + n, 其中 m, n 为自然数, 0 <= n < p,则有
C = (a^x mod p)^y mod p
  = ((mp + n) mod p)^y mod p
  = n^y mod p
  = (mp +n)^y mod p
  = a^(xy) mod p

Deffie-Hellman 算法原理

本文参考 Cryptography and Network Security 一书,介绍 DH 算法原理,在掌握上节数论知识的基础上,理解 DH 算法原理非常容易。

假设 A, B 两方进行通信前需要交换密钥,首先 A, B 共同选取 p 和 a 两个素数,其中 p 和 a 均公开。之后 A 选择一个自然数 Xa,计算出 Ya,Xa 保密,Ya 公开;同理,B 选择 Xb 并计算出 Yb,其中 Xb 保密,Yb 公开。之后 A 用 Yb 和 Xa 计算出密钥 K,而 B 用 Ya 和 Xb 计算密钥 K,流程如下:

+-------------------------------------------------------------------+
|                    Global Pulic Elements                          |
|                                                                   |
|       p                               prime number                |
|       a                               prime number, a < p         |
+-------------------------------------------------------------------+
+-------------------------------------------------------------------+
|                    User A Key Generation                          |
|                                                                   |
|       Select private Xa               Xa < p                      |
|       Calculate public Ya             Ya = a^Xa mod p             |
+-------------------------------------------------------------------+
+-------------------------------------------------------------------+
|                    User B Key Generation                          |
|                                                                   |
|       Select private Xb               Xb < p                      |
|       Calculate public Yb             Yb = a^Xb mod p             |
+-------------------------------------------------------------------+
+-------------------------------------------------------------------+
|               Calculation of Secret Key by User A                 |
|                                                                   |
|       Secret Key K                    K = Yb^Xa mod p             |
+-------------------------------------------------------------------+
+-------------------------------------------------------------------+
|               Calculation of Secret Key by User B                 |
|                                                                   |
|       Secret Key K                    K = Ya^Xb mod p             |
+-------------------------------------------------------------------+

下面证明,A 和 B 计算出来的密钥 K 相同。

K = Yb^Xa mod p
  = (a^Xb mod p)^Xa mod p
  = a^(Xa * Xb) mod p          根据上述求模公式
  = (a^Xa mod p)^Xb mod p
  = Ya^Xb mod p

上面一共出现了 a, p, Xa, Ya, Xb, Yb, K 共 7 个数,其中:

  • 公开的数:a, p, Ya, Yb

  • 非公开数:Xa, Xb, K

通常情况下,a 一般为 2 或 5,而 p 的取值非常大,至少几百位,Xa 和 Xb 的取值也非常大,其复杂度至少为 O(p^0.5)。对于攻击者来说,已知 Ya,Xa 的求解非常困难,同理 Xb 的求解也很困难,所以攻击者难以求出 K,所以 DH 能够保证通信双方在透明的信道中安全的交换密钥。下图非常形象的描述密钥交换流程:

可参考:

1、再谈Diffie-Hellman算法 | skypacer的博客

2、http://wsfdl.com/algorithm/2016/02/04/理解Diffie-Hellman密钥交换算法.html

3、https://zh.wikipedia.org/wiki/迪菲-赫爾曼密鑰交換

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指令周期的数据流

5.2 指令周期的数据流 指令周期 机器周期/CPU周期 CPU时钟周期/节拍 取指周期 间址周期 执行周期 中断周期 标志触发器FE IND EX INT 数据流 取指周期 根据PC中的内容取出指令代码并存放在IR中 间址周…

Acrelcloud-9500 智能电瓶车充电桩收费云平台

1. 概述 电动车火灾事故频频发生&#xff0c;毫不起眼的电动车屡次引发夺命大火&#xff0c;电动车已然成为火灾“重灾区”。为预防和遏制电动自行车火灾事故发生&#xff0c;三令五申各种政策&#xff0c;为此安委会曾出台《电动自行车集中停放和充电治理方案》。 大部分充电过…

Linux - 进阶 NFS 服务器 工作原理,安装,主文件分析

NFS工作原理 : 示例图 &#xff1a; 我们在上篇文章也讲过&#xff0c; 要实现 NFS 服务的搭建&#xff0c;最起码得 两个 服务 &#xff08; NFS 服务&#xff0c;RPC 服务&#xff09; 涉及 三方 &#xff1a; 服务端 &#xff08; 房源 &#xff09; 客户端 &…

如何将mov转换成mp4?这篇文章教会你如何转换

MP4格式是一种通用的视频格式&#xff0c;几乎所有的播放器都能够支持它&#xff0c;包括电视、智能手机、平板电脑等等。而mov格式则主要被苹果设备所使用&#xff0c;其他设备可能会出现无法播放的情况。由于MP4格式的广泛兼容性&#xff0c;可以更方便地分享视频给其他人观看…

linux入门之进程控制(下)进程程序替换,shell运行原理,手写一个mini-shell

文章目录 一、进程程序替换 1.替换原理 2.替换函数 3.函数解释 4.命名理解 二、手写一个mini Shell 一、进程程序替换 创建子进程的目的就是为了让子进程执行特定的任务&#xff0c;比如&#xff1a;1.让子进程执行父进程的一部分代码&#xff1b;2.让子进程指向一个全新的程序…

java项目之高校二手交易平台(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校二手交易平台。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架…

建站教程:阿里云轻量应用服务器搭建网站流程

阿里云轻量应用服务器怎么使用&#xff1f;阿里云百科分享轻量应用服务器从选配、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程&#xff1a; 阿里云轻量应用服务器使用教程 轻量应用服务器很火爆因为成本足够低&#xff0c;阿里云2核2G3M带宽轻量服务…

基于Linux下的C语言项目实战--本地账号管理系统

C语言开发项目实战&#xff1a; C语言是一门通用计算机编程语言&#xff0c;广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能&#xff…

SpringBoot中间件—封装超时熔断器

需求背景 如果一个服务中有很多涉及需要服务间熔断的地方&#xff0c;就会出现N多下述代码&#xff1a; 1.N个fegnClient接口 FeignClient(name "hello-world-service", fallback HelloWorldFallback.class) public interface HelloWorldService {GetMapping(&q…

U盘写保护怎样去掉?分享3种简单方法!

不知道为什么我的u盘突然就显示被写保护了呢&#xff0c;大家有没有遇到过类似的情况呀&#xff1f;有什么比较好的解决方法可以推荐一下吗&#xff1f; 很多朋友可能对u盘写保护没有什么概念&#xff0c;实际上&#xff0c;u盘写保护可能会阻止我们对其中的文件进行修改或者添…

含生僻字中文校验方式优化

项目姓名校验原本一直是通过utf8正则进行校验&#xff0c;但近期出现的客户生僻字包含双码字&#xff0c;原有校验方式无法实现。需要修改扩大校验范围。 知识点回顾&#xff1a; Unicode是Unicode Standard&#xff08;Unicode标准&#xff09;的简写&#xff1b;Unicode为每…

HNU-操作系统OS-学习感悟

初次接触如此底层的计算机基础课程&#xff0c;我还是很不适应的。 教材用的这本书&#xff0c;实验用的清华大学的ucore实验 好在应试水平没有丢。最后总评94/100。 下面仅从应试角度谈一谈学习的理解 总领 HNU的OS课程平时分给的比较模糊&#xff0c;大致由 作业实验验…

先导式比例溢流阀放大器

EDBW10PL350XY/224、EDBW20PL210XY/724、EDBW30PL105XY/224、EDBW10PL055XY/224先导式比例溢流阀&#xff0c;板式安装&#xff0c;由主阀芯和先导级阀beuec比例放大器组成:先导级阀为比例溢流阀&#xff0c;主阀阅芯可独立调节压力作为安全限压压力&#xff0c;比例先导阀压力…

selenium怎么使用代理IP

什么是selenium Selenium 是一个自动化测试框架&#xff0c;用于测试 Web 应用程序的功能性。它支持多个编程语言&#xff08;如Java&#xff0c;Python&#xff0c;C#等&#xff09;并且可以在操作系统和不同浏览器上运行测试。Selenium 可以模拟用户在浏览器中的操作&#x…

PC端实现滚动分页懒加载

思路 监听列表元素的滚动事件&#xff0c;滚动到底部的时候&#xff0c;加载下一页的数据监听数据加载&#xff0c;判断是否已全部加载结束 实现 监听滚动事件 为列表元素 listBox 绑定 scroll 事件进行监听 <div class"listBox" scroll"watchScroll&qu…

Github点赞120k的Spring全家桶笔记,吃透Offer拿到手软!

Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。它包SpringMVC、SpringBoot、Spring Cloud、Spring Data等解决方案。 很多研发人员把spring看作心目中最好的java项目&#xff0c;没有之一。Spring系列包含非常多的项目&…

【LLM】DeepSpeed分布式训练框架

文章目录 一、DeepSpeed介绍1. 分布式背景介绍2. deepspeed介绍 二、deepspeedtransformer代码实战1. 预处理和Json文件2. 训练代码 三、deepspeed加速Bloom lora微调1. 配置文件2. 训练代码 Reference 一、DeepSpeed介绍 1. 分布式背景介绍 分布式计算环境中&#xff0c;主节…

进程间通信方法——命名管道

命名管道 匿名管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文件来做这项工作&#xff0c;它经常被称为命名管道。&#xff08;命名管道是有文件名的&#xff0…

Vs窗口布局移动窗口vs直接卡死2

(1条消息) Vs窗口布局移动窗口vs直接卡死_vs拖动窗口布局卡死_Ma_Hong_Kai的博客-CSDN博客 由于莫名其妙的更新导致又卡死了&#xff0c;导致最近一年多无法拖动vs的框挺折磨 前一段时间看到一个有意思的命令 搞了搞了 可以拖动了&#xff08;目测应该是微软自己发现这个问…

【图像识别】openCV基础知识

图像处理基础 一、使用OpenCV前要准备的工作1.先导入需要用到的库2.自定义&#xff0c;图片展示函数 二、开始学习常用函数1.生成随机整数①. 函数说明②.代码a. 二维灰度图b. 三维彩色图 ③.代码现象a. 二维灰度图b. 三维彩色图 2.通道的分离与合并①先导入一张图片② 将其RGB…