我打算用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回复
总之,一切都很顺利,直到我发起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请求(由于它期望加密或其他原因)?
非常感谢任何帮助,谢谢 :)