原始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:我知道图书馆存在的,但是这是不相关的我的项目。

+0

问题是如何使用C#发送名称列表,所以我会假设它是一个C#问题?我收到服务器的名单,但这本身并不是字符串格式,所以我问我该如何回复我的名字列表(以哪种格式)。希望这个清除:) – Chuck 2010-05-20 09:20:59

嗯,RFC 9页4251种状态:

终止空字符必须不能使用,既不 为个人的名字,也没有为列表作为一个整体。

在命名RFC中也有例子。

+0

你是对的,谢谢。我错过了。刷新Flush()前的最后一行。我仍然不确定如何将数据作为名称列表,尽管 这是服务器列表的外观: http://i46.tinypic.com/11b3dib.png – Chuck 2010-05-20 09:38:33

+1

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

+1

这也符合你的形象。 diffie-hellman之前的序列\ 0 \ 0 \ 0〜是uint32。从ASCII:〜是0x7E,因此后面有126个字节。然后跟着下一个uint32 \ 0 \ 0 \ 0 [框] ...似乎是一个ascii控制字符串0x0F,我假设(因为以下15个字符)。 – 2010-05-20 09:50:26