迪菲-赫尔曼密钥交换

2023-10-12 03:50
文章标签 交换 密钥 迪菲 赫尔曼

本文主要是介绍迪菲-赫尔曼密钥交换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇对称加密,非对称加密的博客中,我们提到了使用对称加密的时候加密解密的钥匙容易被他人窃取的安全性问题,为了解决这种问题,我们要不使用非对称加密,要不就要使用混合加密方式。除此之外,我们现在要介绍的另一种方法是使用迪菲-赫尔曼加密方法。

迪菲-赫尔曼密钥

迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

对称加密的问题就是双方使用同一把钥匙加密解密,此钥匙容易让中间人获取从而窃取数据,那么,假设存在下面这样一种可能:
如果A方、B方使用的钥匙有这样一种特点:
1.这把钥匙可以由多把钥匙组合而成:
在这里插入图片描述
2.即使拿到合成之后的钥匙和任意一把合成之前的钥匙也不可能得到另一把合成之前的钥匙:
在这里插入图片描述
3.合成之后的钥匙可以再与另一把钥匙合成:在这里插入图片描述

现在如果有了这样一把钥匙,我们就可以在这把钥匙的基础上构建出安全的密钥交换过程了,至于这样的钥匙怎么生成,下面我们会提到,我们先来看看我们有了这样一种钥匙之后怎么构建一套安全的密钥交换过程:

A方生成了自己的一把钥匙,发送给了B方,这把钥匙是公开的:

在这里插入图片描述
然后,A方和B方又生成了自己各自的钥匙SA和SB,这两把钥匙是私钥,是不能被别人获取的:
在这里插入图片描述
A方B方分别使用自己的私钥和刚才的公钥P进行组合,生成了新的两把钥匙P-SA和P-SB:
在这里插入图片描述
然后互换两把组合钥匙:
在这里插入图片描述
然后,A方和B方再分别用刚才自己的私钥SA和SB与P-SB和P-SA组合成新的两把钥匙,此时我们发现,两把钥匙是相同的,都是P-SA-SB:
在这里插入图片描述
至此,A方和B方获得了相同的钥匙,现在他们可以使用这把共同的钥匙进行对称加密解密了,这就是迪菲-赫尔曼密钥交换。

试想,我们现在想要攻击这个密钥交换系统,现在我们能够拦截的钥匙只有P,P-SB,P-SA,因此,无法靠这几种钥匙合成出想要的P-SA-SB钥匙。

说的好听,但是这种方法是要建立在我们能够研究出这样一个钥匙的基础上的,这一点要感谢Bailey Whitfield Diffie,Martin Edward Hellman和Ralph C. Merkle,他们真的使用数学从无到有地创造出具有这样特性的钥匙出来了。

迪菲-赫尔曼密钥原理

钥匙的数学原理是这样的:
首先,mod运算我们应该都清楚,就是取余运算,例如:5 mod 3 = 2,3 mod 3=0,1 mod 3 = 1。

前文所说的开始的P钥匙指的就是P,G两个数,P是一个非常大的素数,G是从素数P中的被称为起源或者原始根的数字中选择,现在,A方将这两个数发送给了B:
在这里插入图片描述
接下来,A方和B方分别准备了秘密数字X和Y,并且X和Y都要小于P-2:
在这里插入图片描述
接下来A和B分别计算G的X次幂对P取模,G的Y次幂对P取模,这里的X,Y相当于钥匙SA和SB,我们现在做的这一步相当于将P钥匙分别与SA和SB钥匙进行合成:
在这里插入图片描述
A方和B方将计算结果互相发送给对方:
在这里插入图片描述

接下来,A和B分别将得到的计算结果使用自己的私有X,Y值进行幂运算,再进行取模,前面提到幂运算+取模运算相当于合成钥匙,这里也是如此:
在这里插入图片描述

在这里插入图片描述
至此,非常神奇的时,我们突然发现,A方的计算结果和B方的计算结果相同,这个相同的结果,就是我们进行对称加密时使用的钥匙了!而且,在这个结果的产生过程中,攻击人难以拼凑所有的信息来得到这个钥匙,也就实现了我们前文所说的安全性了,这还要感谢三位机智的密码学家。

在学习的过程中,网上对此种算法的描述比较少,百度百科上说,攻击人可以通过对双方进行两次迪菲-赫尔曼密钥交换算法达到欺骗双方实现中间人攻击的目的,这点我还没有查证所以无法讲解,见谅。

  • 参考资料:
    百度百科
    算法动画图解APP(侵删)

这篇关于迪菲-赫尔曼密钥交换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/193042

相关文章

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【数据结构入门】排序算法之交换排序与归并排序

前言         在前一篇博客,我们学习了排序算法中的插入排序和选择排序,接下来我们将继续探索交换排序与归并排序,这两个排序都是重头戏,让我们接着往下看。  一、交换排序 1.1 冒泡排序 冒泡排序是一种简单的排序算法。 1.1.1 基本思想 它的基本思想是通过相邻元素的比较和交换,让较大的元素逐渐向右移动,从而将最大的元素移动到最右边。 动画演示: 1.1.2 具体步

不设临时变量交换a,b的值

常规的做法: int tmp = a; a = b; b = tmp; 不设中间变量的方法: a = a + b; b = a - b; a = a - b;

交换两个变量数值的3种方法

前言:交换两个数值可不是"a = b,b = a"。这样做的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。 下面教给大家3种交换变量数值的方法: 目录 1. 中介法 2. 消和法 3. 异或法 4. 总结 1. 中介法 中介法(又称 临时变量法 或 酱油法),其中心

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),

常见的交换变量的三种方法

常见的交换变量的三种方法     在项目中,两个变量之间交换位置在常见不过了,如进行排序。     下面说下常见的三中变量交换模式。 1、定义中间变量 #include <stdio.h>int main(){int a=9, b=3; //方法一://交换两个变量值的常规做法int tmp=a;a=b;b=tmp;printf("a=%d b=%d\n",a,b);

Leetcode面试经典题-24.两两交换链表中的节点

解法都在代码里,不懂就留言或者私信 这里先写一个递归的解,如果后面有时间,我再写个迭代的 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val =

Beyond Compare4.2.4 64位OS最新密钥

亲测可用,拿来主义 6TTCoWi2N0Pv+o2HGfqUpZfuaMhtf2zX0u1OuNeqTYkKKWh-CKwBWkPUG3+CiAQ2q4MNPbf0t8+gmPdo+Vyw64aU-zuQQt9d7Q6EcJ+T42by0E+kxf+q3QLs40H+RD3h5OLjFGpxClodRnTCNoAM39xsWm2aHZI0Z9KdXzLo1fo1OdNlaptoK17SsxNK-

iOS——方法交换Method Swizzing

什么是方法交换 Method Swizzing是发生在运行时的,主要用于在运行时将两个Method进行交换,我们可以将Method Swizzling代码写到任何地方,但是只有在这段Method Swilzzling代码执行完毕之后互换才起作用。 利用Objective-C Runtimee的动态绑定特性,将一个方法的实现与另一个方法的实现进行交换。交换两个方法的实现一般写在分类的load方法里

java 线程间交换数据的Exchanger

字符串     import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExchangerTest {private static final Exchanger<String>