2010-05-20 2 views
6

как небольшой (большой) проект хобби. Я решил сделать (очень примитивный) клиент ssh-2.0 на C#. Это исследовать и лучше понять DH и помочь процветать мое шифрование фамильярность :)примитивное соединение ssh (lowlevel)

В соответствии с 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(); 
    } 
} 

Как вы можете видеть на странице 16 RFC 4253, я должен дать 10 списков имен. Являются ли они просто предполагаемыми для строк, или как я могу отметить начало/конец каждого списка (просто с помощью новой строки \ n)? Я даже на правильном пути здесь? (имейте в виду, что я буду обрабатывать DH и шифрование за этот момент. Мой вопрос основан исключительно на первоначальном контакте).

Любая помощь или комментарии приветствуются и оценили,

PS: Я есть осведомленные библиотеки, но это не имеет отношения к моему проекту.

+0

Вопрос в том, как отправить списки имен с помощью C#, поэтому я бы предположил, что это вопрос C#? Я получаю списки серверов, но это не в строковом формате как таковом, поэтому я спрашиваю, как я должен возвращать пользу и отвечать с помощью MY namelist (в каком формате). Надеюсь, это очистит его :) – Chuck

ответ

2

Ну, как RFC 4251 состояний на странице 9:

Нагрузочный нулевые символы не должны использоваться, ни для отдельных имен, ни для списка в целом.

В названном RFC также есть примеры.

+0

Вы правы, спасибо. Я пропустил это. Царапины последней строки перед Flush(). Я до сих пор не уверен, как собрать данные как список имен, хотя Это список серверов выглядит следующим образом: http://i46.tinypic.com/11b3dib.png – Chuck

+1

RFC 4251 также отвечает на этот вопрос: сначала вам нужно отправить uint32, содержащий длину байта списка имен. Сам список содержит только символы. Так, например, zlib, никто не будет: 00 00 00 09 7a 6c 69 62 2c 6e 6f 6e 65. Где 00 00 00 09 - это uint32, указав, что следуют 9 байтов. –

+1

Это также соответствует вашему изображению. Последовательность \ 0 \ 0 \ 0 ~ перед diffie-hellman ... является uint32. Из ASCII: ~ - 0x7E, поэтому следуют 126 байтов. Затем следует следующий uint32 \ 0 \ 0 \ 0 [box] ... кажется, является управляющей строкой ascii 0x0F, я предполагаю (из-за следующих 15 символов). –

Смежные вопросы