好记性不如铅笔头

编程

TLS简单笔记-DH算法简单介绍

参考链接
https://blog.csdn.net/mrpre/article/details/52608867 》
《 https://blog.csdn.net/qq_40870418/article/details/78829769
《 https://blog.csdn.net/jerry81333/article/details/52856081
《 https://baike.baidu.com/item/%E8%BF%AA%E8%8F%B2%EF%BC%8D%E8%B5%AB%E5%B0%94%E6%9B%BC%E5%AF%86%E9%92%A5%E4%BA%A4%E6%8D%A2/10159042?fr=aladdin

DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为密钥协商协议而RSA算法是密钥交换算法
简单场景&简单的密钥协商
先从一个应用场景说起:
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值再复杂点怎么样?
所以怎么要让中间人难以从Pa或者Pb中分解得到Alice或Bob的随机数,而Alice和Bob又能轻松的通过P和随机数计算得到Pa和Pb,就成了设计这个算法的关键。从上面的例子可以看出,简单的乘法运算是不行的。
一般来说上述所说的全世界都知道的值P称之为公钥,为Alice和Bob的随机数称之为私钥。

发表评论

9 + 18 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据