2010-05-20 20 views
6

como un pequeño (gran) proyecto de hobby Me he propuesto hacer un cliente (muy primitivo) ssh-2.0 en C#. Se trata de explorar y entender mejor DH y ayudar a florecer mis familiaridades cifrado :)primitiva conexión ssh (nivel bajo)

según RFC 4253, he comenzado la conexión inicial de esta manera:

(dejando fuera irrelevante preajuste de VARs, etc.)

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

Como se puede ver en la página 16 de la RFC 4253, me esperan para dar 10 nombres de listas. ¿Se supone que estos simplemente son cadenas, o cómo marco el inicio/final de cada lista (simplemente por nueva línea \ n)? ¿Estoy incluso en el camino correcto aquí? (Tenga en cuenta que manejaré el DH y el cifrado después de este punto. Mi pregunta se basa únicamente en el contacto inicial hasta el momento).

Cualquier ayuda o comentarios son bienvenidos y apreciados,

PS: Estoy existen bibliotecas conscientes, pero esto no es relevante para mi proyecto.

+0

La pregunta es cómo enviar las listas de nombres usando C#, así que supongo que es una pregunta C# Recibo las listas de nombres de los servidores, pero esto no está en un formato de cadena per se, así que estoy preguntando cómo se supone que debo devolver el favor y responder con MI lista de nombres (en qué formato). Espero que esto lo aclare :) – Chuck

Respuesta

2

Bueno, como RFC 4251 estados en la página 9:

Terminación de caracteres nulos no deben utilizarse, ni de los nombres individuales, ni para la lista en su conjunto.

También hay ejemplos en el RFC nombrado.

+0

Tienes razón, gracias. Me lo perdí. Raspando la última línea antes de Flush(). Todavía no estoy seguro de cómo armar los datos como lista de nombres Así es como se ve la lista del servidor: http://i46.tinypic.com/11b3dib.png – Chuck

+1

RFC 4251 también responde a esta pregunta: Primero debe enviar un uint32 que contenga el byte de longitud de la lista de nombres. La lista en sí contiene solo caracteres. Entonces, por ejemplo zlib, ninguno sería: 00 00 00 09 7a 6c 69 62 2c 6e 6f 6e 65. Donde 00 00 00 09 es el uint32 que indica, que siguen 9 bytes. –

+1

Esto también cumple con su imagen. La secuencia \ 0 \ 0 \ 0 ~ antes diffie-hellman ... es el uint32. Desde ASCII: ~ es 0x7E, por lo tanto, están 126 bytes. Luego sigue el siguiente uint32 \ 0 \ 0 \ 0 [box] ... parece ser una cadena de control ascii 0x0F, supongo (debido a los siguientes 15 caracteres). –