Пример использования класса RSACryptoServiceProvider для шифрования и дешифрирования сообщений



Работу класса RSACryptoServiceProvider рассмотрим на примере приложения, выполняющего следующие действия:

· Формирование секретного и открытого ключей;

· Шифрование сообщения;

· Дешифрирование сообщения.

Экранная форма приложения изображена на рисунке 2.2. В таблице 2.1 приведено описание используемых в приложении элементов управления.

           

       Таблица 2.1 Элементы управления, используемые в приложении

Элемент управления Класс Описание
groupBox1 GroupBox Панель группировки «Параметры алгоритма RSA»
groupBox2 GroupBox Панель группировки «Исходный текст»
groupBox3 GroupBox Панель группировки «Зашифрованный текст в виде текстовой строки»
groupBox4 GroupBox Панель группировки «Зашифрованный текст как массив байтов»
groupBox5 GroupBox Панель группировки «Дешифрированный текст»
textBoxP TextBox Случайное число P
textBoxQ TextBox Случайное число Q
textBoxE TextBox Открытый ключ E
textBoxD TextBox Секретный ключ D
textPlaintext TextBox Исходное сообщение
textCiphertext TextBox Зашифрованный текст в виде строки
textCipherbytes TextBox Зашифрованный текст в виде массива байт
textRecoveredPlaintext TextBox Дешифрированный текст
buttonNewRSAParams Button Командная кнопка «Новые параметры RSA»
buttonEncrypt Button Командная кнопка «Шифрование»
buttonDecrypt Button Командная кнопка «Дешифрирование»

 

 

 

 


 По щелчку на кнопке «Новые параметры RSA»  формируются:

· P и Q – два больших целых числа;

· E – открытый ключ;

· D – секретный ключ.

Последовательность  программирования приложения:

1. Определение глобальных переменных. В данном примере глобальные переменные связывают процесс шифрования и дешифрирования:

//открытые параметры, используемые для шифрования

   RSAParameters rsaParamsExcludePrivate;

 

//секретные и открытые RSA параметры,

//используемые для дешифрирования

   RSAParameters rsaParamsIncludePrivate;

//переменная для передачи шифрованного текста

   byte[] cipherbytes;

2. Ввод вспомогательной функции ClearOutputFields для очистки полей вывода

   private void ClearOutputFields()

   {

       textCiphertext.Text = "";

       textCipherbytes.Text = "";

       textRecoveredPlaintext.Text = "";

   }

3. Ввод вспомогательной функции GenerateNewRSAParams для генерации новых параметров RSA

Впервые параметры RSA генерируются при запуске программы, вы­зовом метода GenerateNewRSAParams внутри метода Form1_Load. Также метод GenerateNewRSAParams вызывается при каждом щелчке на кнопке «Параметры алгоритма RSA» (эти щелчки обрабатываются ме­тодом buttonNewRSAParams).

Метод GenerateNewRSAParams создает объ­ект класса RSACryptoServiceProvider, извлекает его внешние и внутрен­ние параметры при помощи метода ExportParameters класса RSA, и отображает данные параметры в пользовательском интерфейсе. Фактически, эти параметры хранятся в полях типа RSAParameters.

Поле этого типа с именем rsaParamsExcludePrivate содержит значения открытых парамет­ров RSA, которые необходимы для шиф­рования, выполняемого методом buttonEncrypt_Click.

Другое поле типа RSAParameters с именем rsaParamsIncludePrivate получает набор откры­тых и секретных параметров, которые необходимы для дешифрования (метод buttonDecrypt_Click).

Рассмотрим функцию GenerateNewRSAParams. В данной функции метод ExportParameters  вызы­вается дважды. Первый раз методу задается аргумент True, а во второй - False.

Значение True указывает методу, что в информацию необходимо включить все, в том числе секретный ключ. При вызове с аргументом False метод экспортирует только информацию, относящуюся к открытому ключу.

Ключевая информация в данной функции разделяется затем, чтобы проил­люстрировать и подчеркнуть тот факт, что для шифрования используется только открытая информация, в то время как дешифрование требует, од­новременно, открытого и секретного ключей. Этот момент чрезвычайно важен для понимания асимметричной криптографии. Лучше было бы вообще разбить задачу на два отдельных приложения. Но в данном примере единственное приложение сделано максимально простым.

Когда мы создаем экземпляр класса RSACryptoServiceProvider, то получаем, фактически, реализацию RSA, предоставляемую провайдером услуг криптографии (CSP). Этот класс напрямую производится из класса RSA.

Два поля, в которых сохраняется информация о параметрах RSA при вызове метода ExportParameters, объявлены, как поля типа RSAParameters. Поле rsaParamsExcludePrivate используется при шифровании, а поле rsaParamsIncludePrivate - при дешифровании.

 

private void GenerateNewRSAParams()

{

//установить асимметричный алгоритм RSA

RSACryptoServiceProvider rsa =

new RSACryptoServiceProvider();

 

//извлечь открытые и секретные параметры RSA

rsaParamsIncludePrivate =

rsa.ExportParameters(true);

 

//извлечь только открытые параметры RSA

rsaParamsExcludePrivate =

rsa.ExportParameters(false);

 

//вывести RSA параметры в шестнадцатеричном виде

StringBuilder sb = new StringBuilder();

for (int i = 0;

    i < rsaParamsIncludePrivate.P.Length; i++)

{

   sb.Append(String.Format("{0,2:X2} ",

             rsaParamsIncludePrivate.P[i]));

}

textBoxP.Text = sb.ToString();

sb = new StringBuilder();

for (int i = 0;

    i < rsaParamsIncludePrivate.Q.Length; i++)

{

    sb.Append(String.Format("{0,2:X2} ",

               rsaParamsIncludePrivate.Q[i]));

}

textBoxQ.Text = sb.ToString();

sb = new StringBuilder();

for (int i = 0;

       i<rsaParamsIncludePrivate.Exponent.Length;

           i++)

{

   sb.Append(String.Format("{0,2:X2} ",

               rsaParamsIncludePrivate.Exponent[i]));

}

textBoxE.Text = sb.ToString();

sb = new StringBuilder();

for (int i = 0;

       i < rsaParamsIncludePrivate.D.Length; i++)

{

  sb.Append(String.Format("{0,2:X2} ",

            rsaParamsIncludePrivate.D[i]));

}

textBoxD.Text = sb.ToString();

buttonEncrypt.Enabled = true;

}       

4. Программирование события  Load  формы Form1

private void Form1_Load(object sender, EventArgs e)

{

   GenerateNewRSAParams();

}

 

5. Программирование события Click кнопки buttonNewRSAParams_Click

private void NewRSAParams_Click(object sender, EventArgs e)

{

  GenerateNewRSAParams();

}

6. Программирование события Click кнопки buttonEncrypt_Click.

В методе buttonEncrypt_Click создается новый экземпляр класса RSACryptoServiceProvider и инициализируется сохраненной информацией открытого ключа при помощи метода ImportParameters объекта RSA (при этом в качестве аргумента используя поле rsaParamsExclude­Private).

Далее получается открытый текст в виде байтового массива с именем plainbytes.

Затем, выполняется главное действие при вызове метода Encrypt объекта RSA. Этот вызов возвращает байтовый массив с именем cipherbytes. Это не локальная переменная, а свойство конкрет­ного экземпляра объекта, поскольку этот мас­сив потребуется передать методу, выполняющему дешифрование.

private void buttonEncrypt_Click(object sender, EventArgs e)

{

//Работа с пользовательским интерфейсом

   ClearOutputFields();

//установить асимметричный алгоритм RSA

   RSACryptoServiceProvider rsa =

         new RSACryptoServiceProvider();

 //извлечь только открытые параметры RSA

//для шифрования

    rsa.ImportParameters(rsaParamsExcludePrivate);

 

//прочитать открытый текст и зашифровать его

    byte[] plainbytes =

   Encoding.UTF8.GetBytes(textPlaintext.Text);

    cipherbytes =

       rsa.Encrypt(plainbytes,

false); //использование fOAEP требует

// пакета шифрования

//отобразить зашифрованный текст как строку

       textCiphertext.Text =

           Encoding.UTF8.GetString(cipherbytes);

 

// отобразить зашифрованный текст как

//массив байтов (в 16-ричном виде)

     StringBuilder sb = new StringBuilder();

     for (int i = 0; i < cipherbytes.Length; i++)

       {

           sb.Append(String.Format("{0,2:X2} ",

cipherbytes[i]));

}

textCipherbytes.Text = sb.ToString();

//обработка пользовательского интерфейса

buttonNewRSAParams.Enabled = false;

buttonEncrypt.Enabled = false;

buttonDecrypt.Enabled = true;

textPlaintext.Enabled = false;

buttonDecrypt.Select();

 }

7. Программирование события Click кнопки buttonDencrypt_Click.

Создается объект RSA. Информа­ция в этот объект загружается при помощи его метода Import Parameters, однако на этот раз аргументом служит поле rsaParamsIncludePrivate, по­скольку для дешифрования необходим как открытый, так и секретный ключи. Открытый текст получается обращением к методу Decrypt объ­екта RSA.

Поскольку для шифрования и дешифрования использовались ключи RSA, принадлежащие к одной паре, результирующий дешифро­ванный текст в точности совпадет с исходным.

private void buttonDecrypt_Click(object sender, EventArgs e)

 {

//установить асимметричный алгоритм RSA

RSACryptoServiceProvider rsa =

   new RSACryptoServiceProvider();

//импортировать открытый и секретный ключи

rsa.ImportParameters(rsaParamsIncludePrivate);

//прочитать шифрованный текст и дешифрировать его

byte[] plainbytes =rsa.Decrypt(

           cipherbytes, false);

//отобразить полученный открытый текст

textRecoveredPlaintext.Text =

      Encoding.UTF8.GetString(plainbytes);

 

//работа с интерфейсом пользователя

buttonNewRSAParams.Enabled = true;

buttonDecrypt.Enabled = false;

textPlaintext.Enabled = true;

buttonEncrypt.Select();

 }

 


Дата добавления: 2018-08-06; просмотров: 309; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!