我们为什么需要 DH 算法

最近在复习安全的时候就在想，对于 DH 就有两个问题：

既然非对称加密算法可以实现带身份认证的、安全的密钥的交换，为什么还需要没有身份认证的 DH 算法呢？

非对称加密算法体系的身份认证实际上是依靠三方 CA 的权威性实现的，那可不可以构建一套 DH 的 CA 呢？

这篇文章就用来回答这两个问题。

〇、DH 算法概述

对安全算法有所了解的都知道，DH 算法是一个应用非常广的密钥交换算法，经常被用于协商的第一阶段，比如 TLS、IPsec 等。很多人有个误区，认为 DH 算法属于非对称加密算法，但我们应该知道，DH 算法并没有加解密的功能，所以并不能认为是非对称加密算法，它只能用于协商密钥。

一、DH 算法原理

先上 DH 算法原理图，Wikipedia 经典图：

DH 算法的密钥协商过程如下：

Alice 取一个大的随机整数 $x$ 并发送给 Bob：$X = g^x mod p$

Bob 取一个大的随机整数 $y$ 并发送给 Alice：$Y = g^y mod p$

Alice 计算 $k=Y^x mod p = (g^y mod p)^x mod p = g^{xy} mod p$

Alice 计算 $k'=X^y mod p = (g^x mod p)^y mod p = g^{xy} mod p$

在协商过程中，g、p 公开，X、Y 在网络中传输，要想计算 x、y，需要计算离散对数问题

优点

计算简单

动态的，易于生成密钥对，每次协商都会重新生成

容易扩展到多方 $g^{xyz} mod p$

缺点

没有身份认证的能力，所以不能解决中间人攻击的问题

二、与非对称加密算法的对比

非对称加密算法采用公私钥对的方式，公钥加密私钥解密，私钥加密公钥解密。相对于 DH 来说，非对称加密算法的特点有：

公私钥对一旦生成就无法修改

可用于身份认证

可构建身份认证体系 —— 数字证书体系

不具有前向安全性（PFS），私钥一旦泄露，历史所有消息都可被解密

其带有身份认证的属性，所以经常用于密钥交换（信息加密）、数字签名、身份认证。

我们为什么需要 DH

让我们回到问题上：

既然非对称加密算法可以实现带身份认证的、安全的密钥的交换，为什么还需要没有身份认证的 DH 算法呢？

因为非对称加密算法的静态、不具有前向安全性的问题很大，这意味着一旦私钥泄露，历史的所有消息都将会被破解。而 DH 动态的特点可以弥补这一点，使用 DH 算法每隔一段时间进行 rekey，这样通信双方的共享密钥时周期性变更的，即使破解了其中一个密钥，也无法得到完整的通信数据。

但是由于 DH 不具有身份认证的能力，所以经常需要结合数字证书体系来防止中间人攻击。

非对称加密算法体系的身份认证实际上是依靠三方 CA 的权威性实现的，那可不可以构建一套 DH 的 CA 呢？

这个问题还是比较好回答的，根本原因是 DH 不具有身份认证功能。在 PKI 体系中，CA 使用私钥签发证书，用户系统 / 浏览器中保存有 CA 公钥，可以轻易对证书的有效性进行验证。这个验证过程还是基于非对称加密算法的身份认证属性实现的，而 DH 无法做到。

Done!

此文由 Mix Space 同步更新至 xLog
原始链接为 https://www.vikifish.com/posts/security/why-we-need-dh-group