【不懂数学没关系】DH算法 | 迪菲-赫尔曼Diffie–Hellman 密钥交换

15 阅读5分钟

哈喽大家好,我是Galaxy不写bug,先问大家一个问题,你们吃饭了吗?如果你还没吃饭,待会可能会有点饿,因为今天要讨论的这两个人,正准备研究一道新的菜式。

密钥怎么交换

蒜老大和油大叔两人开了一家餐馆,但是无奈总是会被隔壁王老板抄袭自己研发的菜式。

于是他们确定好新的菜式一定要有排骨,但是用排骨这事也被隔壁王老板知晓了。

现在因为疫情的原因,蒜老大和油大叔两人不能见面了。可是他们想到了一个妙招,蒜老大在自己家里开始种植大蒜,这个特别的大蒜,只有蒜老大知道怎么种,全球唯独这一家。

巧就巧在油大叔也有一门工艺,就是制作油。油大叔的油只有他自己知道怎么制作出来,不管他用的是什么原料,也不管它是从哪里挤出来的,反正全球独此一家。谁让他这么油腻😄

现在油大叔用自己的油和排骨制作了油炸排骨,因为排骨是他们俩共同确定的食材。蒜老大用蒜和排骨制作了蒜香排骨 。

他们把各自制作好的菜式通过美团外卖送到对方那里,不巧的是,隔壁王老板买通了骑手,并且在他们的外卖里面各夹了一块排骨作为研究。

蒜老大再用自己的大蒜和油炸排骨放在一起炒了一下,得到了蒜香炸排骨;同样的方式,油大叔用自己的油和收到的蒜香排骨,一起炒了一下,也得到了蒜香炸排骨。他们两个最终得到的蒜香炸排骨是一模一样的,只有他们能够制作出来 。隔壁王老板也制作不出一模一样的。

前面说到隔壁王老板偷偷夹了两块排骨,但是王老板既没有蒜老大家里的蒜,也没有油大叔那油腻腻的油,因此他无法仿制出一模一样的蒜香炸排骨。

image.png

DH算法

我现在要恭喜你,因为看到这里,你已经不知不觉明白了DH算法的核心所在!

DH算法的核心就是为了干一件事情,也就是生成一个共享的秘密,这个共享的秘密就是密钥,只有这两个人知道这个密钥,其他人不晓得这个密钥。后期的交流就可以用这个密钥来加密,也不用担心被人窃听了。

有了前面的基础,现在来理解DH密钥交换过程就不难了。


首先两个要沟通的对象需要确定两个参数:参数p和参数g。参数p顾名思义是一个质数,因为p是prime的缩写;而参数g是generator的缩写。这里就不详细解释g的缘由了,因为涉及到一些数学的知识。

这里我选一个简单的数字 23 ,因为23x1=23没有其他整数相乘可以得到23了,而参数g这里选择5。这两个参数是可以公开的,所以黑客知道也没关系。

现在就可以套用公式了,5的随机数次方除以23来求余数

image.png

这个公式也是公开的,黑客知道也没毛病。

现在两边要各自生成一个随机数,蒜老大生成了6,油大叔生成了15。各自生成的随机数套入这个公开的公式,也就是蒜老大进行5的6次方,再除以23得到余数8。油大叔进行5的15次方,再除以23得到余数19。

他们各自把生成的余数发送给对方,对方收到后再次套用第二条公式 :各自收到的余数的随机数次方 除以参数p求出新的余数

image.png

对于蒜老大就是用收到的19进行6次方运算,再除以23得到余数2。这里的数字6就是蒜老大自己生成的随机数,23就是前面定义好的参数p。

对于油大叔来说,就是用收到的8进行15次方运算,除以23得到余数2。这里的数字15就是油大叔自己生成的随机数,23 也是前面定义好的参数p。

image.png

最后可以看到两边得到的余数都是一样的,都是数字2,两边就可以用这个数字2来对后续的对话进行加密了,没人知道 原来他们用这个2来加密后续的对话。

当然了,实际上的随机数和质数其实并没有这么简单,通常都建议字数至少要有2048比特的长度,就是为了防止破解。

但是大家可能有点难理解,为什么这么难破解呢?大家思考一下:

7÷1的余数是0 。如果知道余数零,也是能够轻松知道前面的数字是什么。但是如果把1和0都换成非常大的数字,我们要一下子算出来就比较困难了。

如果再增加一个幂运算,来求出问号里的那个数字是什么,就更加困难了。这其实就是要解决离散对数的问题,而离散对数本来就是出名的数学难题。正向计算简单 逆向计算困难。因此DH算法就很合适用作密钥交换了。

以上就是文章全部的内容了。

原文来自B站UP技术蛋老师的视频 BV1sY4y1p78s

仅作为复习的笔记记录