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 メッセージであり, これらはこの部分が始まる前に交換されています。
-
C は乱数 x (1 < x < q) を生成し, e = g^x mod p を計算します。C は e を S に送信します。
-
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 に送信します。署名操作には 2 回目のハッシュ操作が含まれる場合があります。
-
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 が計算され, その後署名操作の一部として H が SHA-1 でハッシュされます。
8.1. diffie-hellman-group1-sha1
"diffie-hellman-group1-sha1" メソッドは, HASH として SHA-1 を使用する Diffie-Hellman 鍵交換と Oakley Group 2 [RFC2409] (1024 ビット MODP グループ) を指定します。すべての既知の実装が現在これをサポートしているため, 相互運用性のためにこのメソッドをサポートしなければなりません。このメソッドは Oakley Group 2 の使用を指定しているにもかかわらず, "group1" というフレーズを使用して名前が付けられていることに注意してください。
8.2. diffie-hellman-group14-sha1
"diffie-hellman-group14-sha1" メソッドは, HASH として SHA-1 を使用する Diffie-Hellman 鍵交換と Oakley Group 14 [RFC3526] (2048 ビット MODP グループ) を指定し, これもサポートしなければなりません。