2010-05-20 4 views
6

작은 (큰) 취미 프로젝트로 C#에서 (매우 원시적 인) ssh-2.0 클라이언트를 만들기 위해 준비했습니다.원시 ssh 연결 (낮은 수준)

(등 바르 밖으로 떠나는 무관 사전 설정) : 이 탐구하고 더 나은 DH를 이해하고 내 암호화 familiarities :

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으로 간단하게) \ n 표시하는 방법은 무엇입니까? 내가 올바른 길을 걷고 있니? (DH와 암호화는이 시점을 지나서 처리 할 것임을 염두에 두라. 나의 질문은 전적으로 초기 접촉을 기반으로한다.)

어떤 도움이나 의견은 환영하고 감사합니다,

PS : 나는 알고 라이브러리가 존재 해요,하지만 내 프로젝트와 관련이 없습니다.

+0

질문은 C#을 사용하여 이름 목록을 보내는 방법입니다. 따라서 C# 질문이라고 생각합니다. 나는 서버 이름 목록을 받는다. 그러나 이것은 문자열 형식이 아니기 때문에, MY namelist (어떤 형식인지)를 사용하여 호의와 답을 어떻게 반환 할 것인지 묻는다. 희망이 그것을 정리 : – Chuck

답변

2

음, RFC 4251 개 9 페이지의 상태 등 : null 문자를 종료

사용해서는 안된다, 어느 개인 이름 ,도 전체 목록.

명명 된 RFC에도 예제가 있습니다.

+0

네가 맞아, 고마워. 나는 그것을 놓쳤다. Flush() 전에 마지막 행을 긁습니다. 나는 여전히 데이터를 이름 목록으로 묶는 방법을 여전히 확신 할 수 없다. 이것은 서버의 목록이다. http://i46.tinypic.com/11b3dib.png – Chuck

+1

RFC 4251도이 질문에 답한다. name-list의 바이트 길이를 포함하는 uint32를 보내야합니다. 목록 자체에는 문자 만 들어 있습니다. 예를 들어 zlib의 경우는 다음과 같습니다. 00 00 00 09 7a 6c 69 62 2c 6e 6f 6e 65. 00 00 00 09는 uint32이며 9 바이트가옵니다. –

+1

이것은 또한 사용자의 이미지를 따르고 있습니다. diffie-hellman ... 앞에 시퀀스 \ 0 \ 0 \ 0 ~은 uint32입니다. ASCII에서 ~는 0x7E이므로 126 바이트가옵니다. 그렇다면 다음 uint32 \ 0 \ 0 \ 0 [상자]를 따르십시오 ... ascii 제어 문자열 0x0F 인 것 같습니다 (다음 15 개의 문자 때문에). –

관련 문제