サンプルプログラムの実装


https://github.com/haruyama/ssh_client_sample/blob...

  private def exchangeNewkeys(transportManager: TransportManager) {
    // SSH_MSG_NEWKEYS メッセージを交換する
    // 新しい鍵になったことを知らせあう(当然ながら鍵自体は送らない)

    // SSH_MSG_NEWKEYS を送信する
    transportManager.sendMessage(TransportMessageBuilder.buildNewkeys)

    // SSH_MSG_NEWKEYS を受信する
    val serverNewkeys = transportManager.recvMessage().asInstanceOf[Newkeys]
  }

解説

SSH_MSG_NEWKEYS メッセージの交換


これより後のやりとりで 新しいアルゴリズムと鍵を利用することを示す, SSH_MSG_NEWKEYS メッセージを交換します. この交換のメッセージは暗号化などはされません.

SSH_MSG_NEWKEYS はメッセージ番号のみからなるメッセージです.

byte      SSH_MSG_NEWKEYS

鍵とIVの生成


上述のコード断片では紹介していませんが, 鍵交換 でクライアントとサーバの間で交換した 交換ハッシュ H と 共有の秘密 K を用いて以下を生成します.

  • 暗号化
    • クライアントからサーバ方向の初期IV
    • サーバからクライアント方向の初期IV
    • クライアントからサーバ方向の暗号鍵
    • サーバからクライアント方向の暗号鍵
  • MAC
    • クライアントからサーバ方向のMAC鍵
    • サーバからクライアント方向のMAC鍵

これより後のやりとりは, これらを用いて暗号化, MACの付与が行なわれます. 場合によっては圧縮も行なわれます. サンプルプログラムでは, 圧縮は利用していません.

メンバーのみ編集できます