2010-05-20 6 views
6

jako mały (duży) projekt hobbistyczny, który przygotowałem, aby zrobić (bardzo prymitywnego) klienta ssh-2.0 w języku C#. Ma to na celu zbadanie i lepsze zrozumienie DH i pomaga rozwijać moje familiarities szyfrowania :)prymitywne połączenie ssh (lowlevel)

zgodnie z RFC 4253, Zacząłem połączenia początkowego takiego:

(pomijając nieistotne nastawa od Vars itd.)

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(); 
    } 
} 

Jak widać na stronie 16 dokumentu RFC 4253, spodziewam się podać 10 list z nazwiskami. Czy są to po prostu ciągi lub jak zaznaczyć początek/koniec każdej listy (po prostu przez znak nowej linii \ n)? Czy jestem na dobrej drodze? (pamiętaj, że zajmę się DH i szyfrowaniem po tym punkcie.) Moje pytanie dotyczy wyłącznie pierwszego kontaktu.

Każda pomoc lub komentarze są mile widziane i doceniane,

PS: Jestem istnieją biblioteki świadomi, ale to nie jest istotne dla mojego projektu.

+0

Pytanie, w jaki sposób wysyłać listy nazw za pomocą C#, więc zakładam, że jest to pytanie C#? Dostaję listy nazw serwerów, ale nie jest to format ciągów jako takich, więc pytam, jak mam przypisać mi przysługę i odpowiedzieć MY Nową listą (w jakim formacie). Mam nadzieję, że to oczyszcza :) – Chuck

Odpowiedz

2

Cóż, jak RFC 4251 stanów na stronie 9:

Zakończenie znaki puste nie mogą być używane, ani dla poszczególnych nazw, ani na liście jako całości.

Istnieją również przykłady w nazwanym dokumencie RFC.

+0

Masz rację, dzięki. Tęsknie za tym. Drapanie ostatniej linii przed Flush(). Nadal nie jestem pewien, jak utworzyć dane jako listę nazw, ale Oto, jak wygląda lista serwerów: http://i46.tinypic.com/11b3dib.png – Chuck

+1

RFC 4251 również odpowiada na to pytanie: Pierwszy musisz wysłać uint32 zawierający długość bajtu na liście nazw. Sama lista zawiera tylko znaki. Tak więc na przykład zlib, żadna nie będzie: 00 00 00 09 09 7a 6c 69 62 2c 6e 6f 6e 65. Gdzie 00 00 00 09 jest liczbą 32, które podążają za 9 bajtami. –

+1

Jest to również zgodne z Twoim obrazem. Sekwencja \ 0 \ 0 \ 0 ~ przed diffie-hellman ... jest uint32. Z ASCII: ~ ma wartość 0x7E, dlatego następujące 126 bajtów. Następnie następuje kolejne uint32 \ 0 \ 0 \ 0 [box] ... wydaje się być ciągiem kontrolnym ascii 0x0F, zakładam (z powodu następujących 15 znaków). –