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,需要计算
文章插图
其实该算法的原理和上一部分中简单乘法及其类似,只是获取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
看起来还是协商成功了,那问题在哪?
推荐阅读
- 网络是怎样连接的 -- 探索网络设备:集线器、交换机、路由器
- 高主频还是多核心?CPU选购指南
- 宁静是在自心
- 心安 白水也是茶
- 茶是浓的好还是淡的好
- 时间长了路由器为什么要重启一下 路由器每天重启还是每周重启
- 洗脸皂放在起泡网里可以吗 手工皂用起泡网好还是不用好
- 解决了redis的这些问题,你就是redis高手
- 铸铁锅干烧太久怎么办 铁锅干烧了很久怎么办
- 一次性薄膜手套是医疗垃圾吗 医用薄膜手套干净吗