2010-03-18 3 views
2

현재 클라이언트가 서버가 제공하는 다양한 서비스를 시작하고 중지 할 수있는 몇 가지 명령을 보낼 수있는 소켓 서버를 구현하려고합니다. 클라이언트와 서버 사이의 통신을 확보하고 클라이언트가 보내는 명령에 응답하도록 서버를 가져 왔습니다. 다음 단계는 클라이언트와 서버 간의 통신을 암호화하는 것입니다. RSACryptoServiceProvider를 사용하여이 작업을 수행하려고합니다.C#에서 RSA와 소켓 통신 암호화하기

내가 데이터 enrypt하는 데 사용을 Heres 코드 : 내 명령을 해독하는 데 사용

CspParameters parameter = new CspParameters(); 
parameter.KeyContainerName = "keycontainer"; 
rsaProvider = new RSACryptoServiceProvider(parameter); 
StreamReader r = new StreamReader(@"C:\tmp\rsakey.xml"); 
rsaProvider.FromXmlString(r.ReadToEnd()); 
string command = "server reply goes here"; 
ASCIIEncoding bc = new ASCIIEncoding(); 
byte[] cmd = rsaProvider.Encrypt(bc.GetBytes(command), false); 
handler.Send(cmd); 

그리고 heres는 코드를

rsaProvider = new RSACryptoServiceProvider(parameter); 
StreamReader r = new StreamReader(@"C:\tmp\rsakey.xml"); 
string xml = r.ReadToEnd(); 
rsaProvider.FromXmlString(xml); 
ASCIIEncoding bc = new ASCIIEncoding(); 
string test = bc.GetString(state.buffer); 
byte[] tmp = rsaProvider.Decrypt(bc.GetBytes(test), false); 

나는 노력 직접 내가 그들을 암호화 된 후 내 문자열을 해독하고, 그것은 작동합니다. 그러나 클라이언트에서 서버 또는 그 역으로의 전송은 작동하지 않고 Decrypt 함수는 해독 할 데이터가 모듈의 최대 값을 초과한다는 예외를 throw합니다.

클라이언트와 서버 간의 트래픽을 암호화하는 올바른 방법은 무엇입니까?

+0

올바른 방법은 SSL을 사용하는 것입니다. –

답변

2

비대칭 암호화 (예 : RSA 사용)는 짧은 메시지에만 적합합니다. 1024 비트 RSA 키 (일반 크기)의 경우 최대 입력 메시지 크기는 117 바이트입니다.

"정상적인"설정은 임의의 비밀 키를 선택하는 것 (즉, 랜덤 비트의 무리), RSA와 함께 그 키를 암호화하고, 메시지의 나머지 부분을 암호화 대칭 (즉, 예컨대 AES와 같은 대칭 암호로) 해당 키를 사용하여. 대칭 암호는 이러한 크기 제한이 없으며 어쨌든 비대칭 암호화보다 훨씬 빠릅니다.

이제는 이론이 단순 해 보일지라도 코드가 인 것처럼 보이도록 구현하는 데 많은 어려움이있을 수 있습니다.이 열리는 동안 제대로 실행됩니다. 공격 (그리고 암호 사용의 요지는 공격에 저항하는 것입니다). 그래서 올바른 방법은 그 세부 사항을 이미 다루고있는 기존의 프로토콜과 그것을 위해 설계되고 조정 된 구현을 사용하는 것입니다. 가장 일반적인 프로토콜은 TLS (SSL이라고도 함)입니다. C#/.NET은 아마도 당신이 원하는 것일 수있는 System.Net.Security.SslStream 클래스를 가지고있는 것으로 보입니다.

+0

고마워요, 제가 살펴 보겠습니다. –

관련 문제