Diffie-Hellman SSH密钥交换

3
我打算用C#编写一个原始的SSH客户端;你可能会记得我之前发布过primitive ssh connection (lowlevel)等帖子。
总之,一切都很顺利,直到我发起DH密钥交换为止。我已经比较了建立ssh连接时(从openssh客户端到openssh服务器),与我的客户端连接到同一openssh服务器时的流量。
OpenSSH客户端-> OpenSSH服务器(S表示服务器,C表示客户端): S:SSH-2.0-OpenSSH_5.1p1 Debian-6ubuntu2\r(表示问候) C:SSH-2.0-OpenSSH_5.2\r(自我介绍) C:密钥交换初始化(0x14 = 20) S:密钥交换初始化 C:Diffie-Hellman GEX请求(0x22 = 34)(附带DH GEX最小值、位数和最大值) S:Diffie-Hellman密钥交换回复(含P、G等) C:Diffie-Hellman GEX初始化 S:Diffie-Hellman GEX回复

我的客户端 -> OpenSSH服务器: S: SSH-2.0-OpenSSH_5.1p1 Debian-6ubuntu2\r(表示问候) C: SSH-2.0-Some_Name\r(自我介绍) C: 密钥交换请求(0x14 = 20) S: 密钥交换请求 C: Diffie-Hellman GEX 请求(0x22 = 34)(带有DH GEX最小值、位数和最大值)

然后是一个虚假的TCP数据包作为回复(可能是在GEX请求后/同时服务器连接已经被终止了)。

我还没有使用AES128(我认为这是选择的加密方式,但我不确定如何验证...),我仍然以非压缩格式发送,希望获取P、G等值以进行DH计算。

所以我现在困在这里: RFC 4419第3页 http://www.ietf.org/rfc/rfc4419.txt 我发送了SSH_MSG_KEY_DH_GEX_REQUEST,但服务器没有响应SSH_MSG_KEX_DH_GEX_GROUP。

有人能给我一点关于这里我不理解的建议吗?服务器是否无法理解我的GEX请求(由于它期望加密或其他原因)?

非常感谢任何帮助,谢谢 :)

2个回答

0
我相信问题在于密钥交换初始化后,密钥没有被正确使用。

0

我的最佳猜测是密钥交换是互斥的,即openssh服务器没有客户端正在寻找的算法或者客户端没有与openssh服务器交换的算法。您可以通过在putty到openssh服务器上运行wireshark并监视交换并将其与您自己的客户端进行比较来验证它。

我猜测这就是putty的工作方式,如果交换失败,在“查询openssh服务器”使用的算法后回退到另一个算法...由于putty是开源的,因此查看代码以了解putty如何实现可能值得您的时间。


算法在双方都存在,但没有被正确应用。 - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接