RFC 8731 | Curve25519/448 for SSH | February 2020 |
Adamantiadis, et al. | Standards Track | [Page] |
本文档描述了在 Secure Shell (SSH) 协议中使用 Curve25519 和 Curve448 密钥交换方法的规范。¶
这是一份互联网标准跟踪文档。¶
本文档是互联网工程任务组 (IETF) 的产品。 它代表了IETF社区的共识。 它已接受公众审查,并已被互联网工程指导小组 (IESG) 批准发布。 有关互联网标准的更多信息,请参阅 RFC 7841 第 2 节。¶
有关本文档当前状态、任何勘误表以及如何提供反馈的信息,请访问 https://www.rfc-editor.org/info/rfc8731。¶
版权所有 (c) 2020 IETF Trust 和文档作者。 保留所有权利。¶
本文档受本文档发布之日生效的 BCP 78 和 IETF Trust 与 IETF 文件相关的法律规定 (https://trustee.ietf.org/license-info) 的约束。 请仔细阅读这些文件,因为它们描述了您与本文件相关的权利和限制。 从本文档中提取的代码组件必须包括信托法律条款第 4.e 节中所述的简化 BSD 许可文本,并且在提供时不提供简化 BSD 许可中所述的保证。¶
Secure Shell (SSH) [RFC4251] 是一种安全远程登录协议。 [RFC4253] 中描述的密钥交换协议支持一组可扩展的方法。 [RFC5656] defines how elliptic curves are integrated into this extensible SSH framework, and this document reuses the Elliptic Curve Diffie-Hellman (ECDH) key exchange protocol messages defined in Section 7.1 (ECDH Message Numbers) of [RFC5656]. [RFC5656] 的其他部分,例如椭圆曲线 Menezes-Qu-Vanstone (ECMQV) 密钥协议和椭圆曲线数字签名算法 (ECDSA),不在此考虑文档。¶
本文档介绍如何在SSH中基于Curve25519和Curve448[RFC7748]实现密钥交换。 对于具有 SHA-256 [RFC6234][SHS] 的 Curve25519,所描述的算法相当于私有定义的算法算法“curve25519-sha256@libssh.org”,在发布时已在 libssh [libssh] 和 OpenSSH [ 中实现并广泛部署OpenSSH]。 Curve448 密钥交换方法类似,但使用 SHA-512 [RFC6234][SHS]。 ¶
关键字“必须”、“不得”、“必需”、“应当”、“不应"、"应该"、"不应"、"推荐"、"不推荐本文档中的“”、“可以”和“可选0>”应按照 BCP 14 [RFC2119 中的描述进行解释t12>]1> [RFC81744>]3> 当且仅当它们全部大写出现时,如此处所示。¶5>
密钥交换过程类似于 [RFC5656] 的第 4 节 中描述的 ECDH 方法,但用于公共值的线路编码不同以及最后的共同秘密。 公共临时密钥被编码为标准 SSH 字符串进行传输。¶
协议流程、SSH_MSG_KEX_ECDH_INIT 和 SSH_MSG_KEX_ECDH_REPLY 消息以及交换哈希的结构与 [RFC5656] 的第 4 节 相同。¶
本文档注册的方法名称为“curve25519-sha256”和“curve448-sha512”。¶
这些方法基于 Curve25519 和 Curve448 标量乘法,如 [RFC7748] 中所述。 私钥和公钥按照其中所述生成。 Curve25519 的公钥定义为 32 字节的字符串,Curve448 的公钥定义为 56 字节的字符串。¶
密钥协商方案“curve25519-sha256”和“curve448-sha512”分别使用函数 X25519 和 X448 执行 Diffie-Hellman 协议。 实现应该使用[RFC7748]中描述的算法计算这些函数。 当他们这样做时,实现必须检查计算出的 Diffie-Hellman 共享密钥是否为全零值,如果是则中止,如第 6 节中所述[RFC7748]。 这些函数的替代实现 SHOULD 会在客户端或服务器输入将共享秘密强制设置为一小组值之一时终止,如 [RFC7748]的 6 和 7 部分所述。 如果收到的公钥长度不是预期长度,客户端和服务器也必须中止。 用于这些目的的中止被定义为会话的断开连接 (SSH_MSG_DISCONNECT),并且应该使用消息的 SSH_DISCONNECT_KEY_EXCHANGE_FAILED 原因[IANA-REASON]。 除了 [RFC7748] 中描述的内容之外,不需要进一步验证。 使用“curve25519-sha256”时派生的共享密钥为 32 字节,使用“curve448-sha512”时派生的共享密钥为 56 字节。 所有值的编码在[RFC7748]中定义。 “curve25519-sha256”使用的哈希值是 SHA-256,“curve448-sha512”使用的哈希值是 SHA-512。¶
以下步骤与 [RFC5656] 不同,它使用不同的转换。 这并不是为了一般性地修改该文本,而只是为了适用于本文档中描述的机制的范围。¶
共享密钥 K 在 [RFC4253] 和 [RFC5656] 中定义为编码为多精度整数 (mpint)。 Curve25519/448输出一个二进制串X,它是对方公钥与本地私钥标量标量相乘得到的32或56字节点。 通过将八位字节解释为以网络字节顺序编码的无符号固定长度整数,将 X 的 32 或 56 字节转换为 K。¶
然后使用 [RFC4251] 的 Section 5 中描述的过程对 mpint K 进行编码,并按照 [RFC4253] 到密钥交换方法的哈希函数来生成加密密钥。¶
执行 X25519 或 X448 操作时,根据 [RFC7748],通过执行固定长度无符号小端转换,将整数值编码为字节字符串。 只有稍后,当这些字节字符串被传递给 SSH 中的 ECDH 函数时,这些字节才会被重新解释为固定长度的无符号大端整数值 K,然后该 K 值会被编码为可变长度的有符号 " mpint”,然后再馈送到用于密钥生成的哈希算法。 然后将 mpint K 与其他数据一起馈送到密钥交换方法的哈希函数以生成加密密钥。¶
[RFC4251]、[RFC5656] 和 [RFC7748< 的安全注意事项/t5>] 是继承的。¶
采用 SHA-256 的 Curve25519 提供强大的(~128 位)安全性,在各种架构上都很高效,并且与传统椭圆曲线相比,具有允许更好的实现属性的特性。 采用 SHA-512 的 Curve448 可提供更强的(~224 位)安全性,并具有类似的实现属性;然而,它尚未获得与 Curve25519 相同的密码学审查。 它也更慢(更大的密钥材料和更大的安全哈希算法),但它是作为一种对冲来对抗由于安全位数量较多而针对 Curve25519 和 SHA-256 的不可预见的分析进步。¶
派生的 mpint 二进制秘密字符串在散列之前进行编码的方式(即添加或删除零字节进行编码)增加了侧通道攻击的可能性,这可能会确定散列内容的长度。 这将泄漏派生秘密的最高有效位和/或允许检测最高有效字节何时为零。 出于向后兼容性的原因,决定不解决这个潜在问题。¶
本文档提供“curve25519-sha256”作为首选,但建议实施“curve448-sha512”以提供超过 128 位的安全强度(如果这成为要求)。¶
IANA has added "curve25519-sha256" and "curve448-sha512" to the "Key Exchange Method Names" registry for SSH [IANA-KEX] that was created in Section 4.10 of [RFC4250].¶
“curve25519-sha256”密钥交换方法与 Aris Adamantiadis 创建并在 libssh 和 OpenSSH 中实现的“curve25519-sha256@libssh.org”密钥交换方法相同。¶
感谢以下人员的审阅和评论:Denis Bider、Damien Miller、Niels Moeller、Matt Johnston、 埃里克·雷斯科拉、罗恩·弗雷德里克和斯特凡·布勒。¶