迪菲.赫尔曼(Diffie–Hellman)密钥交换算法

迪菲.赫尔曼算法是通信线路不安全情况下,交换密钥的一个算法,应用于TLS协议中

首先说一下生成密钥的流程,我们有这样一种计算叫做求摸运算 mod,

比如:27 mod 17 = 10,也就是求余数的运算。

现在有两个通信者A和B,我们使用一种计算 假如我们这里选用

3 ^ x mod 17,A和B分别生成一个随机的整数,这个整数即为x,比如A是2,B是3,那么A使用2计算:

3^2 mod 17 = 9 ①

B使用3计算:

3^3 mode 17 = 10 ②

然后A将9发送给B,B将10发送给A。当然这里的9和10是可以被任何人看到。

A收到B的10之后做这样的计算:

10^2 mod 17 = 15 ③

B收到A的9后做这样的计算:

9^3 mod 17 = 15 ④

这样15就可以作为两人通信加密的密钥了。

突然一看还有点不明白,为什么这样的计算就能计算出相同的数字15?

mod运算的性质 性质如下:

就像普通运算一样,他是可交换的、可结合的、可分配的,可以表示为

(a+b)mod n=((a mod n)+(b mod n))mod n

(a?b)mod n=((a mod n)?(b mod n))mod n

(a× b)mod n=((a mod n)×(b mod n))mod n

(a× (b+c))mod n=(((a× b)mod n)+((a× c)mod n)))mod n

A:在做③计算的时候使用的10是由②计算来的,也就是:

(3^3 mode 17)^2 mod 17 = 15 ⑤

B:做的④计算的时候使用的9是由①计算来的,也就是:

(3^2 mod 17)^3 mod 17 = 15 ⑥

那么接下来就证明为什么⑤和⑥会相等

(3^3 mode 17)^2 mod 17 == (3^2 mod 17)^3 mod 17

其实证明只是用到上面mod计算性质的第三条

计算⑤等于以下的分解

=((3 * 3 * 3) mod 17)^2 mod 17

=(((3 mod 17) * (3 mod 17) * (3 mod 17)) mod 17)^2 mod 17

= ((((3 mod 17) * (3 mod 17) * (3 mod 17)) mod 17) * (((3 mod 17) * (3 mod 17) * (3 mod 17)) mod 17)) mod 17

=((3 mod 17) * (3 mod 17) * (3 mod 17) * (3 mod 17) * (3 mod 17) * (3 mod 17)) mod 17

= (3 mod 17)^6 mod 17

同理分解⑥ 也可得这个结果

= (3 mod 17)^6 mod 17

⑤⑥是相等的得证。

在这个通信过程中可以看到A和B分别生成了一个随机数2和3,只要2和3不泄露,那么其他人即使知道3 mod 17、9、10这些信息也得不出15的这个结果。

本文转自:https://blog.csdn.net/wangbaolongaa/article/details/49468187

原文地址:https://www.cnblogs.com/wjq310/p/8642053.html

时间: 2024-10-13 15:04:05

迪菲.赫尔曼(Diffie–Hellman)密钥交换算法的相关文章

DiffieHellman(迪菲-赫尔曼)密钥交换算法原理及其实现

本文参考来源https://segmentfault.com/a/1190000010917737与https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4  及其 https://www.cnblogs.com/DarkValkyrie/p/10962231.html (大佬的这篇文章的基础公式帮了大忙) 什么是Diffie-Hellman密钥交换算法? Diffie-Hellman:一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一个组成

迪菲-赫尔曼算法的简单数学证明

今天老师给我们讲了迪菲-赫尔曼算法,大概意思是通信双方不需要知道对方是谁都能通信. 以下的图片来自维基百科 只要Alice的K等于Bob的K双方就可以通信了,现在问题来了,我用了几组数据去做测试,都能得到相同的结果,为什么经过上面的数学的换算的结果是想等的?于是激起了我这个数学白痴的求知欲,证明可能吧严谨甚至有错,希望路过的大神们指教指教. 问题转换为: 证明 (A^a mod B)^m mod B=A^am mod B 恒成立 令X=A^a, (X mod B)^m mod B=X^m mod

赫尔曼算法及应用

借鉴的博客: http://baike.sogou.com/v111784.htm http://blog.csdn.net/cqnuztq/article/details/8919204 http://blog.csdn.net/pony_maggie/article/details/41620389 http://blog.csdn.net/JavaAlpha/article/details/4222845 实现代码: 1 #include <iostream> 2 #define MAX

DH 密钥交换算法

1.引言 CSDN搞什么短信验证,7年的账号居然登陆不了,真心抓狂,WTF!!!! DH,全称为"Diffie-Hellman",这是一种确保共享KEY安全穿越不安全网络的方法,换句话说就是密钥一致协议,由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想. 简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的.可以共享的密钥.也就是由甲方产出一对密钥(公钥.私钥),乙方依照甲方公钥产生乙方密钥对(公钥.私钥).它可以让双方在完全没有对方任

php 二叉树 与赫夫曼树

在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下.涵盖内容不详细但是挺广,覆盖多种主流数据库 言归正传,以前知道折半查找,二叉树的概念也是感觉挺有意思,二叉树的实现有一个案例很不错,代码如下 class BiNode{ public $data; public $lchild; public $rchild; public function __constr

13.赫夫曼树及其应用

一.赫夫曼树定义与原理 1.路径长度:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度; 2.树的路径长度:即从树根到每一结点的路径长度之和; 3.结点的带权的路径长度:即从该结点从到树根之间的路径长度与结点上权的乘积; 4.树的带权路径长度:为树中所有叶子结点的带权路径长度之和; 5.赫夫曼树定义:假设有n个权值{w1,w2,....,wn},构造一颗有n个叶子结点的二叉树,每个叶子结点带权wk,每个叶子的路径长度为lk,则其中带权路径长度WPL最小的

DH密钥交换(Diffie–Hellman key exchange)算法笔记

注意:只是笔记,可能有不正确的地方 ?下文中^代表乘方运算,例如2^3=2*2*2=6,参考:http://zh.wikipedia.org/wiki/%E5%86%AA %代表模运算,例如5%3=2,参考:http://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4? DH密钥交换算法的作用是使通信双方可以在不安全的通道中建立一个相同的密钥,用于加密通信. 基本原理示例: 1.通信方A和通信方B约定一个初始数g,g是公开的,如g=5 2.A生成一个随机数a,a

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做