Day 28:Diffie–Hellman演算法

一路到了铁人赛最後阶段,最後写两个完全不同但都蛮有趣的演算法。

我们之前写到SHA家族演算法可以用来为资料加密,今天的演算法也跟加密有关,不过并不是直接用来改变资料内容,而是让通信的双方可以安全地交换金钥(key)。

想像如果A, B两个人要交换机密讯息,他们可以将讯息加密再传递,对方收到再以金钥解开(就像以钥匙开锁),来得到真正的内容。例如双方可以约定金钥为5,当一人收到讯息"d gjqa tjp.",他可以将字母转为数字後加上5,就可以知道真正的讯息是"I love you."

姑且先不论这个金钥是否太简单,A, B双方总要以某种方式先同意金钥为何,但不管是用信件、e-mail、电话、甚至当面用讲的,金钥都还是有被窃取的风险。

上述的方法在加密和解密都是用同一个金钥,所以双方必须沟通决定,而Diffie Hellman演算法中,双方则是各有一组公开金钥(public key)和私人金钥(private key),如此一来可以在没有任何事先资讯的情况下建立密码。它的作法是:

  1. 首先A, B双方先约定好一组数字n(可公开)。
  2. A, B各自以秘密的私人金钥a, b和n做运算,各自得出答案x和y,即为公开金钥。
  3. 双方交换公开金钥x和y。
  4. A, B各自以秘密的私人金钥a, b、n、公共金钥x, y进行运算,得出的数字即为双方共同的秘密。

整个过程中,除了各自的私人金钥a, b之外,一开始约定的数字和中间交换的数字都是可以公开的,也就是以不安全的管道传递也没关系。因为运算的特性,双方最後会得到一样的结果,也就是不需要任何形式的沟通约定,就有共同秘密数字可以作为金钥使用。

数字选择合适的话(关於数字挑选细节可以参考百科),攻击者很难用公开的部分资讯来得出私人金钥以及最终的密码,也就保障了密码系统的安全性。

Diffie Hellman是最早出现的一种公开金钥方式,它的一个缺点是过程并没有身分验证机制,也就是攻击者可以在中间与双方进行假的金钥交换来窃取讯息。不过後续以Diffie Hellman演算法为基础,也出现了许多身分验证的解决方案。

下图是以颜色表达演算法的流程,可以作为参考。过程中两人各自加入了两次只有自己知道的secret colours(用私人金钥作两次运算),最後得到同样的颜色(共同密码)。

图片来源:维基百科


<<:  Day 26:v-if 才做选择,v-show 全都秀

>>:  DAY26 - 展现成果,建立 firestore 动态与复杂的查询

Ruby解题分享-Implement strStr() && Search Insert Position

下雨的周六...偷懒最适合... Implement strStr() 题目连结:https://l...

电子书阅读器上的浏览器 [Day13] 自订工具列

随着开发的功能愈来愈多,工具列的空间已不足以将所有的功能都显示在上面;而且也不是每个功能都是使用者会...

NIST SDLC和RMF(续)

根据FIPS 199,“确定信息系统的安全类别需要进行更多的分析,并且必须考虑驻留在信息系统上的所有...

Day22 如何查看使用 Chrome Devtools 检视请求及回应

大家好,我是乌木白,今天要和大家介绍如何从 Chrome Devotools,来查看 AJAX 的...

介绍影像辨识的处理流程 - Day 10

介绍影像辨识的处理流程 - Day 10 所有影像辨识的问题都会面临以下几个问题:图片中有几个要辨识...