跳到主要内容

8. Diffie-Hellman Key Exchange (Diffie-Hellman 密钥交换)

8. Diffie-Hellman Key Exchange (Diffie-Hellman 密钥交换)

Diffie-Hellman (DH) 密钥交换提供了一个任何一方单独都无法确定的共享密钥。密钥交换与主机密钥的签名相结合以提供主机认证。此密钥交换方法提供第 7 节中定义的显式服务器认证。

以下步骤用于交换密钥。在此过程中, C 是客户端, S 是服务器, p 是一个大的安全素数, g 是 GF(p) 的一个子群的生成元, q 是子群的阶, V_S 是 S 的标识字符串, V_C 是 C 的标识字符串, K_S 是 S 的公共主机密钥, I_C 是 C 的 SSH_MSG_KEXINIT 消息, I_S 是 S 的 SSH_MSG_KEXINIT 消息, 这些消息在此部分开始之前已经交换。

  1. C 生成一个随机数 x (1 < x < q) 并计算 e = g^x mod p。C 将 e 发送给 S。

  2. S 生成一个随机数 y (0 < y < q) 并计算 f = g^y mod p。S 接收 e。它计算 K = e^y mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K) (这些元素根据其类型进行编码, 见下文), 以及使用其私有主机密钥对 H 的签名 s。S 将 (K_S || f || s) 发送给 C。签名操作可能涉及第二次散列操作。

  3. C 验证 K_S 确实是 S 的主机密钥 (例如, 使用证书或本地数据库)。C 也被允许在不验证的情况下接受密钥, 但是这样做会使协议对主动攻击不安全 (但在许多环境中, 出于实际原因, 在短期内可能是可取的)。然后 C 计算 K = f^x mod p, H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K), 并验证 H 上的签名 s。

不在范围 [1, p-1] 内的 'e' 或 'f' 值不得由任何一方发送或接受。如果违反此条件, 密钥交换将失败。

这是通过以下消息实现的。用于计算交换散列的散列算法由方法名称定义, 称为 HASH。用于签名的公钥算法通过 SSH_MSG_KEXINIT 消息协商。

首先, 客户端发送以下内容:

      byte      SSH_MSG_KEXDH_INIT
mpint e

然后服务器响应以下内容:

      byte      SSH_MSG_KEXDH_REPLY
string server public host key and certificates (K_S)
mpint f
string signature of H

散列 H 计算为以下内容串联的 HASH 散列:

      string    V_C, the client's identification string (CR and LF
excluded)
string V_S, the server's identification string (CR and LF
excluded)
string I_C, the payload of the client's SSH_MSG_KEXINIT
string I_S, the payload of the server's SSH_MSG_KEXINIT
string K_S, the host key
mpint e, exchange value sent by the client
mpint f, exchange value sent by the server
mpint K, the shared secret

此值称为交换散列, 用于验证密钥交换。交换散列应该保密。

签名算法必须应用于 H, 而不是原始数据。大多数签名算法包括散列和附加填充 (例如, "ssh-dss" 指定 SHA-1 散列)。在这种情况下, 数据首先使用 HASH 散列以计算 H, 然后在签名操作过程中使用 SHA-1 对 H 进行散列。

8.1. diffie-hellman-group1-sha1

"diffie-hellman-group1-sha1" 方法指定使用 SHA-1 作为 HASH 的 Diffie-Hellman 密钥交换, 以及 Oakley Group 2 [RFC2409] (1024 位 MODP 组)。为了互操作性, 必须支持此方法, 因为所有已知的实现目前都支持它。请注意, 此方法使用短语 "group1" 命名, 尽管它指定使用 Oakley Group 2。

8.2. diffie-hellman-group14-sha1

"diffie-hellman-group14-sha1" 方法指定使用 SHA-1 作为 HASH 的 Diffie-Hellman 密钥交换和 Oakley Group 14 [RFC3526] (2048 位 MODP 组), 并且也必须支持。