原始ssh连接(低级)
作为一个小型(大型)爱好项目,我已经着手在C#中创建一个(非常原始的)ssh-2.0客户端。 这是探索和更好地了解DH和帮助我的繁荣加密熟悉度:)原始ssh连接(低级)
按照RFC 4253,我已经开始喜欢这个初始连接:
(离开了瓦尔的等无关紧要的预置)
Random cookie_gen = new Random();
while ((ssh_response = unsecure_reader.ReadLine()) != null)
{
MessageBox.Show(ssh_response);
if (ssh_response.StartsWith("SSH-2.0-")
{
// you told me your name, now I'll tell you mine
ssh_writer.Write("SSH-2.0-MYSSHCLIENT\r\n");
ssh_writer.Flush();
// now I should write up my supported (which I'll keep to the required as per rfc 4253)
ssh_writer.Write(0x20); // SSH_MSG_KEXINIT
byte[] cookie = new byte[16];
for (int i = 0; i < 16; i++)
cookie[i] = Convert.ToByte(cookie_gen.Next(0, 10));
ssh_writer.Write(cookie); // cookie
// and now for the name-list
// This is where I'm troubled
// "Footer"
ssh_writer.Write(0x00); // first_kex_packet_follows
ssh_writer.Write(0x00); // 0
ssh_writer.Flush();
}
}
正如您在RFC 4253的第16页上看到的,我期望给出10个名单。这些简单地假设为字符串,或者我如何标记每个列表的开始/结束(仅通过换行符\ n)?我是否在正确的轨道上? (请记住,我将处理DH和加密过去这一点。我的问题完全基于迄今为止的初始联系)。
任何帮助或意见,欢迎和赞赏,
PS:我知道图书馆存在的,但是这是不相关的我的项目。
嗯,RFC 9页4251种状态:
终止空字符必须不能使用,既不 为个人的名字,也没有为列表作为一个整体。
在命名RFC中也有例子。
你是对的,谢谢。我错过了。刷新Flush()前的最后一行。我仍然不确定如何将数据作为名称列表,尽管 这是服务器列表的外观: http://i46.tinypic.com/11b3dib.png – Chuck 2010-05-20 09:38:33
RFC 4251也回答了此问题:First您必须发送一个包含名称列表字节长度的uint32。该列表本身只包含字符。因此,例如zlib,没有一个会是:00 00 00 09 7a 6c 69 62 2c 6e 6f 6e 65.其中00 00 00 09是uint32说明,接下来是9个字节。 – 2010-05-20 09:44:27
这也符合你的形象。 diffie-hellman之前的序列\ 0 \ 0 \ 0〜是uint32。从ASCII:〜是0x7E,因此后面有126个字节。然后跟着下一个uint32 \ 0 \ 0 \ 0 [框] ...似乎是一个ascii控制字符串0x0F,我假设(因为以下15个字符)。 – 2010-05-20 09:50:26
问题是如何使用C#发送名称列表,所以我会假设它是一个C#问题?我收到服务器的名单,但这本身并不是字符串格式,所以我问我该如何回复我的名字列表(以哪种格式)。希望这个清除:) – Chuck 2010-05-20 09:20:59