2012-03-23 3 views
1

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

For A, чтобы отправить сообщение для B:

шифрует сообщение с помощью секретного ключа в.

Зашифрует сообщение с использованием открытого ключа B.

A отправляет сообщение.

B получает сообщение.

B расшифровывает сообщение с использованием открытого ключа A.

B расшифровывает сообщение, используя закрытый ключ B.

B читает сообщение.

Вот что я имею в C# с использованием RSA шифрования:

// Alice wants to send a message to Bob: 

String plainText = "Hello, World!"; 
Byte[] plainData = Encoding.Default.GetBytes(plainText); 
Byte[] cipherData = null; 

RSACryptoServiceProvider alice = new RSACryptoServiceProvider(); 
RSACryptoServiceProvider bob = new RSACryptoServiceProvider(); 

var alicePrivateKey = alice.ExportParameters(true); 
var alicePublicKey = alice.ExportParameters(false); 

var bobPrivateKey = bob.ExportParameters(true); 
var bobPublicKey = bob.ExportParameters(false); 

RSACryptoServiceProvider messenger = new RSACryptoServiceProvider(); 

messenger.ImportParameters(alicePrivateKey); 
cipherData = messenger.Encrypt(plainData, true); 

messenger.ImportParameters(bobPublicKey); 
cipherData = messenger.Encrypt(cipherData, true); 

messenger.ImportParameters(alicePublicKey); 
cipherData = messenger.Decrypt(cipherData, true); 

messenger.ImportParameters(bobPrivateKey); 
cipherData = messenger.Decrypt(cipherData, true);    

String result = Encoding.Default.GetString(alice.Decrypt(cipherData, true)); 

Очевидно, что-то не так со следующими строками:

messenger.ImportParameters(bobPublicKey); 
cipherData = messenger.Encrypt(cipherData, true); 

Который бросает System.Security.Cryptography .CryptographyException с сообщением {"Плохая длина"}.

Как я вижу, он не может шифровать данные, используя только общедоступную часть ключа bob.

Может ли кто-нибудь пролить свет на то, как правильно выполнить то, что я хочу сделать в C#?

ответ

1

RSA используется для шифрования данных, которые меньше ключа. Вы используете симметричный ключ для шифрования большого объема данных, а затем используете RSA для обмена симметричным ключом.

Для получения более подробной информации вы можете ссылаться на этот вопрос: how to use RSA to encrypt files (huge data) in C#

+0

Это означает, что я не могу использовать RSA для реализации сценария, который я хочу реализовать. Можете ли вы указать на хороший пример того, как реализовать данный сценарий в C#? –

+0

http://www.obviex.com/samples/Encryption.aspx. Вы также можете использовать SSL. – Manoj

+0

Этот пример предназначен для Symmetric Key Encryption. Я хочу реализовать шифрование Public/Private key. –

4

две проблемы:

A) Ваша конструкция протокола является неправильным.Если вы хотите использовать RSA для обмена сообщений, алгоритм таков:

шифрует сообщение с помощью Б общественных ключа

А посылает сообщение

B расшифровывает сообщение с помощью частных ключа Б

(Б делает обработка)

в шифрует сообщение с использованием в общественного ключ

B посылает сообщение

расшифровывает сообщение с помощью элементов а частного ключа

и так далее. Обратите внимание, что A не знает закрытый ключ B и наоборот. Открытые и закрытые ключи связаны таким образом, что сообщение, зашифрованное открытым ключом (известно каждому), может быть дешифровано только с помощью соответствующего закрытого ключа (известного только для получателя зашифрованного сообщения). На самом деле это суть RSA.

Что касается реализации на C#, это довольно тривиально с классами Crypto, когда вы действительно понимаете базовые понятия. См., Например, here и here.

B) RSA подходит для обмена небольшими объемами данных. Он предназначен для обмена ключами по небезопасному каналу без необходимости использования общей секретности. Для обмена «нормальными» данными используется симметричный алгоритм, такой как AES. Таким образом, идея будет генерировать случайную кодовую фразу и IV из A и отправить ее в B через RSA, как обсуждалось в A; после того, как обе стороны знают кодовую фразу и IV, они могут просто шифровать данные, используя AES с общим ключом.

Это то, что делает SSL, и у вас должна быть действительно веская причина откатить свой собственный, вместо использования стандартного потока SSL.

+0

* «Обратите внимание, что A не знает секретный ключ B и наоборот». * - Я согласен. Но обратите внимание, как A не пытается получить доступ к закрытому ключу B. Шифрует сообщение, использующее 1) открытый ключ B, чтобы B мог расшифровать с использованием его закрытого ключа и 2) закрытый ключ A, чтобы B мог расшифровать с помощью открытого ключа A и убедиться, что он пришел от A. –

+0

Я знаю * SSL *, и я предпочитаю использовать его над любой пользовательской реализацией. Но, в моем случае, я пытаюсь создать рабочий прототип, который работает для безопасной связи IPC. Мой прототип предназначен для одного сценария. –

+0

Но вы говорите: «Шифрует X с помощью закрытого ключа A» - это не так, как он работает. Открытый ключ используется для шифрования, частный для дешифрования. –