2015-08-06 4 views
0

Это продолжение проекта в этом question, но без Bouncy Castle.RSA (шифрование на стороне клиента/расшифровка сервера)

Так что я решил отказаться от Bouncy Castle (жаль, я любил имя)

ИНАЧЕ

У меня есть сервер и клиент. клиенту необходимо отправить сериализованный объект на сервер, тогда сервер обработает этот объект.

Он делает это, однако я бы хотел добавить шифрование в процесс. Но без сохранения файла или чего-либо подобного. процесс должен быть основан на сеансе (в некотором смысле)

Таким образом, клиент запросит ключ с сервера, сервер будет генерировать пару ключей и отправить ключ клиенту.

Клиент затем использует этот ключ для шифрования объекта

string key = ASCIIEncoding.ASCII.GetString(RequestKey(tcpclnt)); 
var RsaClient =new RSACryptoServiceProvider(2048); 
while (key.Length > 0) { 
    RsaClient.FromXmlString(key); 
    var transmit = ASCIIEncoding.ASCII.GetBytes(stringtosend); 
        var encrypted = RsaClient.Encrypt(transmit,false); 

сервер затем получает эти зашифрованные байты и пытается расшифровать их

raw = Receive(clientSocket); 
byte[] r = TrimBytes(ASCIIEncoding.ASCII.GetBytes(raw),256); 
var sdecrypted = ASCIIEncoding.ASCII.GetString(RsaServer.Decrypt(r, false)); 

Но увы, сервер не может это сделать. При расшифровке он выдает ошибку

Key does not exist. 

Итак, мой вопрос: что я делаю неправильно?

Большое спасибо за любую помощь, которую вы можете предложить.

UPDATE

Измененный код на сервере

var RSAKeyInfo = new RSACryptoServiceProvider(2048, new CspParameters(1)).ExportParameters(true); 

Новая ошибка

The parameter is incorrect 
+0

Имеет ли сервер один и тот же ключ ключа rsaclient cryptoservice? – BugFinder

+0

@BugFinder: Я бы предположил, что он загружает xml, который сервер предоставляет var RsaClient = новый RSACryptoServiceProvider (2048); while (ключ.Length> 0) { RsaClient.FromXmlString (ключ); – Darkestlyrics

+1

Кажется, что он не видит, что ключ для его дешифрования – BugFinder

ответ

1

Хотя штраф в качестве упражнения в использовании криптографии, использование основной криптографические алгоритмы для создания собственной системы для безопасного общения - это рецепт для незащищенность. Для каждой слабости, которую вы адресуете в своей собственной системе, вероятнее всего 10 (или больше!), О которых вы даже не подумали.

Мое внушительное предложение - использовать SSL/TLS для защиты ваших сообщений. Это должно обеспечить всю необходимую вам безопасность, в то же время быть простой для интеграции, поскольку .NET Framework SslStream имеет необходимые функции для работы либо как сторона server, либо client.

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

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