3. 密钥交换方法: sntrup761x25519-sha512 (Key Exchange Method: sntrup761x25519-sha512)
密钥协商由 [RFC8731] 第 3 节 ("Key Exchange Methods") 中描述的 X25519 Diffie-Hellman 协议, 以及 [NTRUPrimePQCS] 中描述的密钥封装方法共同完成.
密钥交换过程复用 [RFC5656] 第 4 节 ("ECDH Key Exchange") 和第 7.1 节 ("ECDH Message Numbers") 中定义的 ECDH 密钥交换.
协议流程以及 SSH_MSG_KEX_ECDH_INIT 和 SSH_MSG_KEX_ECDH_REPLY 消息保持相同, 但如下文所述, 使用不同的临时公有值 Q_C 和 Q_S, 以及不同的共享秘密 K.
只要在线路上的编码完全相同, 实现可以在使用 SSH_MSG_KEX_ECDH_INIT 的位置使用名称 SSH_MSG_KEX_HYBRID_INIT, 并在使用 SSH_MSG_KEX_ECDH_REPLY 的位置使用名称 SSH_MSG_KEX_HYBRID_REPLY. 这些符号名称不会出现在网络传输中; 它们仅在规范中用于指代特定字节值. 为了与定义数据包语法的 [RFC5656] 保持一致, 本文档其余部分使用这些名称.
SSH_MSG_KEX_ECDH_INIT 的值 Q_C 保存客户端的临时公钥, 必须通过拼接 sntrup761 密钥生成器输出的 1158 字节公钥与 32 字节 K_A = X25519(a, 9) 来构造, 如 [NTRUPrimePQCS] 和 [RFC8731] 所述. 因此, Q_C 值为 1190 字节.
SSH_MSG_KEX_ECDH_REPLY 的值 Q_S 保存服务器的临时公钥, 必须通过拼接 sntrup761 密钥封装机制输出的 1039 字节密文与 32 字节 K_B = X25519(b, 9) 来构造, 如 [NTRUPrimePQCS] 和 [RFC8731] 所述. 因此, Q_S 值为 1071 字节.
如果收到的公钥 Q_C 或 Q_S 的长度不是预期长度, 客户端和服务器必须中止. 为此目的, 中止定义为断开会话 (SSH_MSG_DISCONNECT), 并且消息应当使用 SSH_DISCONNECT_KEY_EXCHANGE_FAILED 原因; 参见 [RFC4253] 第 11.1 节 ("Disconnection Message"). 除 [RFC7748], [RFC8731] 和 [NTRUPrimePQCS] 中描述的验证之外, 不需要进一步验证.
SSH_MSG_KEX_ECDH_REPLY 的签名值按照 ECC for SSH [RFC5656] 中的描述计算, 但有如下变更. 共享秘密 K 不再编码为 "mpint", 而是必须编码为 "string". 共享秘密 K 的值必须是 SHA-512 哈希的 64 字节输出八位字节字符串, 其输入为 sntrup761 密钥封装机制输出的 32 字节八位字节字符串密钥, 拼接 X25519(a, X25519(b, 9)) = X25519(b, X25519(a, 9)) 的 32 字节八位字节字符串.
一些较早的实现可能只通过名称 [email protected] 实现此协议; 因此, 推荐公布并接受该名称作为此协议的别名, 以提高成功协商该协议的机会.