2010-03-18 2 views
2

В настоящее время я пытаюсь реализовать сервер сокетов, который позволяет клиентам отправлять некоторые команды для запуска и остановки различных служб, предоставляемых сервером. Я получил связь между клиентом и сервером, и получил сервер для ответа на команды, отправленные клиентами. Следующим шагом будет шифрование связи между клиентом и сервером. Я пытаюсь сделать это с помощью RSACryptoServiceProvider.Шифрование сокетов с RSA в C#

Heres кода я использую, чтобы enrypt данные:

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

И Херес кода я использую, чтобы расшифровать мои команды

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 генерирует исключение, которое говорит мне, что данные для расшифровки превышают максимальный для модуля.

Каков правильный способ шифрования трафика между клиентом и сервером?

+0

Правильный способ использования SSL. –

ответ

2

Асимметричное шифрование (например, с помощью RSA) подходит только для коротких сообщений. При использовании 1024-битного ключа RSA (типичный размер) максимальный размер входного сообщения составляет 117 байт.

«Нормальная» настройка, чтобы выбрать случайный секретный ключ (т.е. кучи случайных бит), шифровать, что ключ RSA, и зашифровать остальную часть сообщения симметрично (т.е. с симметричным шифром, такими как AES), используя этот ключ. Симметричные шифры не имеют таких ограничений размера и намного быстрее, чем асимметричное шифрование.

Теперь случается так, что даже если теория может выглядеть просто, существует множество подробностей, которые могут привести к неправильной реализации, в том числе сделать код , отображаемый, для правильной работы, атаки (и точка использования криптографии - это противодействие атакам). Таким образом, исправить способ использовать существующий протокол, который уже охватывает эти детали, а также реализацию, которая была разработана и настроена для этого. Наиболее распространенным протоколом для этого является TLS (также известный как SSL). C# /. NET, похоже, поставляется с классом System.Net.Security.SslStream, который, вероятно, вы хотите.

+0

Спасибо, я посмотрю. – 2010-03-18 13:15:01

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