Diffie-Hellman 安全交换秘钥(非对称加密方式之外安全传递秘钥)

博主:爱码叔
个人博客站点: icodebook
著有《漫画设计模式》,博文视点出版,京东有售
公众号:爱码叔漫画软件设计(搜:爱码叔)
专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上,欢迎大家关注访问!
本文个站链接

前面的文章讲到,对称加密 需要传递密钥,秘钥传递过程存在机密性问题。于是,有了 非对称加密。通信双方可以采用非对称加密的方式直接通信,但是由于效率问题,一般在大量信息加密的场景中,并不会选择非对称加密。但是,非对称加密可用来传递对称加密的密钥,后续的通信便可以使用效率更高的对称加密。这种方案确实可以解决对称加密的密钥传递机密性问题。非对称加密还会用到签名证书。那么,还有其他安全传递秘钥的方式吗?当然有!今天,我们来看看之前在《图文彻底搞懂非对称加密》中提到的 Diffie-Hellman 密钥交换。

Diffie-Hellman 原理浅析

Diffie-Hellman 其实是一种机制和算法,目标是让通信双方基于共享的公开信息,以及各自根据共享信息生成的私有信息,分别计算出一样的秘钥。这样就做到了密钥的安全 “交换”,所谓的交换其实是各自计算出相同的秘钥。

那么 Diffie-Hellman 是如何做到 共享的信息+私有信息+算法 计算出相同秘钥呢?我们先看一个简单的例子。

熊小猫:我生成一个数字a,和一个数字N,我把a * N 的值 X ,以及 N的值发给你。然后你生成一个数字b,你把b * N的值 Y 发给我。

兔小白:嗯。。。也就是说现在你手里有a、Y、N,我手里有b、X、N,然后呢?

熊小猫:我用我手里的 a 乘 Y,你用你手里的 b乘X,就能计算出一样的密钥!

兔小白:让我想想……你 a * Y = a * bN,我 b* X = b * aN,结果都是abN!咱们算出的秘钥是一样的!妙哉!

兔小白:等等,好像哪里不太对……

在这里插入图片描述
读者朋友们,你能想到哪里不太对吗?现在,在网络中裸奔的数字有 X、N、Y。如果攻击者截获了 X 和 N,并且知道X是由 a * N 得来的,那么攻击者就能计算出a(a=X/N)。同理,攻击者也可以截获Y,计算出b(b=Y/N)。那么攻击者便可以计算出密钥 abN。

例子的方式,虽然通信双方能够计算出一样的密钥值,但攻击者可以通过公开传递的数字以及算法,推算出未在网络中传递的 a 和 b,然后用 a、b、N 计算出密钥。

这个方法虽然不可行,但其实Diffie-Hellman的基本原理就是如此:

1、通信双方采用一个可以公开的算法 (保密性不应依赖于算法)

2、算法中存在1或者n个共享参数,由任意一方生成,可以公开发送给对方。(例子中的N)

3、通信双方根据 N 分别生成自己的私有随机数(例子中的 a , b)

4、双方各计算出自己的共享数字,共享数字 = 算法+共享参数+自己私有随机数。然后发送共享数字给对方(例子中的 X(aN) 和 Y(bN)。

5、各自用自己的私有随机数 + 对方共享数字,计算出一样的密钥。(例子中的a * bN = b*aN)

这种方式中,只有随机数 a、b 不暴露在网络中。因此,算法要保证不能通过暴露的信息计算出 a 或 b。这个算法一定不能是 X = aN 这样简单的算法。否则,攻击者通过网络中公开传递的信息 X 和 N,可以轻易推算出 a。因此,安全的算法要求是:不能通过 X 和已知参数 N,推算出 a。

Diffie-Hellman 交换密钥过程

上面例子的问题出在 X=a*N,这个算法过于简单,通过X和N,计算 a 轻而易举。那么Diffie-Hellman核心就在于对这个算法的改造。

我们来看看Diffie-Hellman的具体步骤。

(1)熊小猫生成 一个非常大的质数P,然后找到 P 的生成元 G(后面再做解释)。P 和 G 是算法的共享参数,发送给兔小白。

(2)熊小猫同时生成一个随机数a,1<a<P-2,自己保留,不要暴露。为什么 a 是这个范围,后面再做解释

(3)熊小猫计算 X = G^a mod P,然后将X发给兔小白

(4)兔小白收到 P 和 G 后,根据 P,也会生成一个随机数b,1<b<P-2, 自己保留,不要暴露。

(5)兔小白计算 Y = G^b mod P,然后发送Y给熊小猫

我们看看各自手中有哪些数字,熊小猫有a 、Y(G^b mod P)、P,兔小白有 b 、X(G^a mod P)、P 。接下来,双方用自己手中拿到的这些数字计算密钥。

(6)熊小猫计算密钥:Y^a mod P =(G^b mod P)^a mod P = G^(b*a) mod P

(7)兔小白计算密钥:X^b mod P =(G^a mod P)^b mod p = G^(a*b) mod P

在这里插入图片描述
你看,是不是巧了?!熊小猫和兔小白计算出的密钥值是一样的。

这个时候你的问题来了,这个算法能保证安全性吗?

Diffie-Hellman 确保安全的秘密

我们先看看暴露出来的信息有哪些:

(1)P 和 G,这是一对有关系的数字。G是P的生成元。

(2)X 和 Y,也就是 G^a mod P 的值,以及 G^b mod P 的值。

密钥 = G^(a*b) mod P。首先,这个密钥的算法是完全公开的。然后,G和P是公开的的。如果能推算出a和b,那么密钥将会被破解。

我们看看有什么可以使用的信息来破解a、b。暴露的信息还有 X 和 Y。我们来看 X, X = G^a mod P ,这里面只有 a 是未知的!难道有突破口?我们可以通过已知的 X、 P 和 G,反算出 a 吗?答案一定是否定的(迄今为止,非常困难),否则Diffie-Hellman便不再安全。这个问题就是有 限域的离散对数 问题。X = G^a mod P,即使知道X、G、P,也很难反算出 a。

有限域的离散对数计算复杂度决定了 Diffie-Hellman 密钥交换安全。

什么是生成元 G?以及为什么 1 < 随机数 < P-2

给定 G 值,当a取值从遍历 1到P-1,计算 G^a mod P,如果结果能覆盖 1 到 P-1 所有的值,那么 G 称为 P 的生成元。

我们继续理解上面这句话。mod P是对 P 取余,我们举个例子,假如质数 P=13,那么 mod P 后,只可能得到如下结果。

0,1,2,3,4,5,6,7,8,9,10,11,12

也就是说 G^a mod P 的结果一定是在区间 [0,P-1] 。但是随着 a 从 1 增加到的 P-1,G^a mod P 并不一定能覆盖区间 [1,P-1] 的所有整数。我们要找的生成元G,就是能够随着a的变化,满足 G^a mod P 覆盖全 [1,P-1]。

我们看下面的表格,第一行是A的取值,第一列是G的取值,表格中的数据是 G^a mod P 的结果。
在这里插入图片描述

可以看到在 G = 2、6、7、11时,G^a mod P 的结果出现了0-12所有的整数。因此质数13的生成元为2、6、7、11。

可以看出,当 G 为生成元,a取值为 [1,p-1] 时,能够确保 G^a mod P 是 [1,P-1] 中的任一数字。那么为什么随机数 a 的取值范围是 [1,P-2],不是 [1,P-1] 呢?这是因为当 a=P-1 时,G^a mod P 的值一定是1,请看表格中最后一列。 别忘了 X = G^a mod P 的值是暴露的,如果该值是1,那么就能推算出 a=P-1,秘钥会被破解。因此 a 和 b 的取值范围是 [1,P-2]。

总结

Diffie-Hellman 之所以能够安全交换秘钥,依赖的是有限域离散对数的计算复杂度。说到这里,我们可以回想一下RSA算法,保密性是依赖于质因数分解的复杂度。之所以可以公开传递密钥中间计算结果,是因为两者都依赖于数学计算的复杂度。不过一旦人类找到了好的计算方法,或者计算机的性能得到指数级提升,安全性将受到破坏。

与Diffie-Hellman 密钥交换类似的,还有椭圆曲线Diffie-Hellman 密钥交换。密钥交换的过程是一样的,但是利用的数学问题有所区别。椭圆曲线Diffie-Hellman 所利用的数学问题是 “椭圆曲线上的离散对数问题”。

预告:下一篇将会介绍集密码学大成的HTTPS!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值