您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

DH算法原理

时间:2019-10-22 11:43:12  来源:  作者:

DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。

本篇分为几个部分,第一个部分介绍一下密钥交换的场景;第二部分介绍一下DH算法的的步骤,以及由该算法引出的一些问题;第三部分开始讲数学原理。数学原理可能涉及到数论、抽象代数,本篇尽量在每个公式后面证明该公式的正确性。

简单场景&简单的密钥协商

先从一个应用场景说起:

Alice 和Bob想要在一个不安全的信道共享一个密钥,该密钥可被用来进行后续的其他的操作,并且仅被Alice和Bob所知,第三方无法得知。

一个简单的方法就是,现在全世界都是知道一个值 P=100。Alice生成随机值5,然后乘上P,接着发送Pa = 500给Bob;通样Bob生成随机值6,然后乘上P,接着发送Pb = 600给Alice。

这样,Alice 有 100,5 ,600,Bob有100,6,500。

Alice计算: 随机值5(自己私钥) * 600(对端的公钥) = 3000 等式1

Bob计算 : 随机值6(自己私钥) * 500(对端的公钥) = 3000 等式2

这样 Alice就和Bob共享了一个值3000,还有谁知道3000这个值呢?我们知道Alice明文的将500发送到不安全信道,Bob明文的将600发送到不安全信道,这也就意味着第三方仅仅知道500 和 600,想要计算获得共享密钥,第三方要么获取到Alice的随机值然后拿它乘上600,要么获取到Bob的随机值然后拿它乘上500,这样才能获取到Alice和Bob的共享密钥。

问题来了,如何获取到Alice的随机值呢?

第三方知道,Alice发送的500是由P乘上Alice的随机值得到的,所以问题变成了求方程 x*100 = 500的解。一眼就能看出来,Alice的随机值是5。

上述方法很容易被破解的原因是P太简单了。P值再复杂点怎么样?

例如P = 0x123456781234567812345678

Pa = 0xAD77D73E0BFC0E3E0BFC0E3D5E84370

Pb = 0x4EF81E05A6A0F385A6A0F38557A8D58

显然,你不能一眼就求出方程 x*P = Pa 的解

其实 Alice的随机数为 0x98765432, Bob的随机数为0x45681265。

但是这一切对于计算机来说还是太简单了。例如OpenSSL、Mbedtls等众多的开源库都提供了大数运算的API,计算Pa/P可能就几毫秒甚至几微秒的事情。

所以怎么要让中间人难以从Pa或者Pb中分解得到Alice或Bob的随机数,而Alice和Bob又能轻松的通过P和随机数计算得到Pa和Pb,就成了设计这个算法的关键。从上面的例子可以看出,简单的乘法运算是不行的。

一般来说上述所说的全世界都知道的值P称之为公钥,为Alice和Bob的随机数称之为私钥。

DH算法的一个例子

这里举例一个DH算法的例子。

例1:

设有这么一个二元组 (q, p) = (3, 7)

我们定义Alice和Bob这么一个运算:

(1)Alice 选择一个范围在[1, p-1]的随机数,为da= 5

(2)Alice 计算Pa = q^da mod p = 3^5 mod 7 = 5

(3)Bob选择一个范围在[1, p-1]的随机数,为db = 6

(4)Bob计算Pb = q^db mod p = 3^6 mod 7 = 1

(5)Alice和Bob交换Pa和Pb

(6)Alice计算共享密钥S = Pb ^da mod p = 1^5 mod 7 = 1

(7)Bob计算共享密钥S = Pa ^db mod p = 5^6 m 7 = 1

至此,Alice和Bob能够共享一个密钥为1。中间人由于只得到了Pa=5和Pb=1,如果也想要得到S,要么获取da然后执行步骤6中的等式计算得到结果、要么获取db然后执行步骤7中的等式得到结果。而要知道da或者db,需要计算

DH算法原理

 

其实该算法的原理和上一部分中简单乘法及其类似,只是获取da或者db不是简单的方程式了,而是涉及到对数运算。对数运算被认为是“难”的,这个难建立在目前为止没有找到一个快速计算对数的算法,数学上没有证明这个算法是否存在。

看到这肯定有一个问题,随便一个二元组(q, p)都可以参与运算吗?显然不行。

我们来看看如果随便一个(q, p)参与运算,会出现什么情况。

例2:

假设(q, p) = (7,15),我们让Alice和Bob再来协商一遍

(1)Alice 选择一个范围在[1, p-1]的随机数,为da= 3

(2)Alice 计算Pa = q^da mod p =7^3 mod 15 = 13

(3)Bob选择一个范围在[1, p-1]的随机数,为db = 2

(4)Bob计算Pb = q^db mod p = 7^2 mod 15 = 4

(5)Alice和Bob交换Pa和Pb

(6)Alice计算共享密钥S = Pb ^da mod p = 4^3 mod 15 = 4

(7)Bob计算共享密钥S = Pa ^db mod p = 13^2 mod 15 = 4

看起来还是协商成功了,那问题在哪?

7^x mod 15:

7^1 mod 15 = 7

7^2 mod 15 = 4

7^3 mod 15 = 13

7^4 mod 15 = 1

7^5 mod 15 = 7

7^6 mod 15 = 4

7^7 mod 15 = 13

7^7 mod 15 = 1

......

看到规律了吗?7^x mod 15的结果一共才4种,并且周期循环。

这也就意味着中间人获取到了Pb = 4,中间人不一定需要知道Alice原始的随机值(私钥)是什么,只要在[1 , 14]中随便选择一个满足7^x mod 15 = 13的值进行计算S = 4^7 mod 15 = 4^11 mod 15 = 4 都能正确计算共享密钥。换句话说,中间人不需要暴力遍历[1 , 14]中的所有数就能计算共享密钥。

所以我们选择(b, p)的原则就是,G = b^x mod p,

当x遍历[1, p -1]时,G也遍历了一遍[1, p -1],这样中间人即使暴力破解,在P很大的时候,暴力破解是非常难的。

DH背后的数学&DH算法证明

设 已知 二元组(q, p)

Alice 生成随机值a,计算q^a mod p = Ga

Bob 生成随机值b, 计算q^b mod p = Gb

Alice 计算Sa =Gb^a mod p

Bob 计算Sb = Ga^b mod p

我们需要证明Sa=Sb

Sa = Gb^a mod p

= (q^b mod p)^a mod p

令q^b mod p = T,则q^b = kp + T,也即T = q^b - kp

Sa = (q^b mod p)^a mod p

= (T)^a mod p

=(q^b - kp)^a mod p

由于对 (q^b - kp)^a展开,除了第一项为q^(ab)以及最后一项为(kp)^a,其余每一

项均存在p,所以计算(q^b - kp)^a mod p之后,只保留了第一项,即Sa = q^(ab) mod p

同理可正Sb = q^(ba) mod p = Sa

原根

我们在上一节例二中讲到,我们选择的(q, p)尽可能的使得当x遍历[1, p -1]时,

b^x mod p也遍历了一遍[1, p -1]。我们就来介绍一下原根。

定义1:

当 m > 1, gcd(a, m) = 1,则使得 a^e mod m = 1成立的最小正整数e称作整数a

对模m的阶(或指数、乘法周期),记做ord(a)。若a的阶

DH算法原理

 

,

a称作为模m的原根。

例二中,7模15的阶是4。

那15有原根吗? 显然,根据定义,找出所有和15互素的数,然后计算他们的

阶,阶无一例外均不是,故15不存在原根。

现在我们来看看原根的另一个定理,这个定理对于我们找打合适的(q, p)很重要。

定理1:

设m>1,gcd(a,m) = 1,则

a^0, a^1, a^2, ... a^ord(a)-1 模m两两不同余。

证明:反证法

如若存在K,L(L<K<ord(a)) 使得

a^K = a^L mod m

由于gcd (a , m)=1,即存在a的逆a^-1,故等式两边乘上a^(-L)

a^(k-l) = 1 mod m

即存在k-l,使得a^(k-l) = 1 mod m等式成立,而k-l < ord(a),与阶的定义矛盾。故假设不成立。

定理1中a和m的关系,我们就可以用来当做DH算法中的(q,p)。

RFC 3526 中给出了推荐的DH参数。



Tags:DH算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。本篇分...【详细内容】
2019-10-22  Tags: DH算法  点击:(217)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条