Шифрование сокетной связи с RSA в C # - PullRequest
2 голосов
/ 18 марта 2010

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

Вот код, который я использую для шифрования данных:

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

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

1 Ответ

2 голосов
/ 18 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...