Сохранение ключей в формате XML



Не всегда возможно передать содержимое объекта ExportParameters  на прямую между двумя приложениями, тем более, если речь идет о разных платформах или хотя бы о разных криптографических библиотеках. Класс ExportParameters специфичен для Microsoft и .NET.

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

Экранная форма приложения изображена на рисунке 2.3.

Пример приложения для сохранения ключей в формате XML почти идентичен предыдущей программе. Главное отличие состоит в том, что для хранения и передачи открытого ключа между методом шифрования и методом дешифрования используется XML вместо объекта ExportParameters. Еще одно отличие заключаете том, что информация о параметрах RSA не отображается, а вместо этого отображается содержимое XML-потока.

 

 


Ради простоты и наглядности используется приложение, объединяющее обе функции на одной экранной форме.

XML-данные будут записываться в файл. Этим имитируется сценарии реального мира, где подобную информацию приходится записывать и передавать при помощи какого-то внешнего носителя или сетевого соединения.

С точки зрения программирования наиболее серьезные изменения по отношению к предыдущей программе заключаются в том, что вызовы методов ExportParameters и ImportParameters класса RSACryptoServiceProvider заменены вызовами метод ToXmlString и FromXmlString, принадлежащих тому же классу. Здесь также используется логический аргумент, указывающий, нужно ли включать в информацию секретный ключ.

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

 

       Таблица  2.2 – Элементы управления

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

 

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

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

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

   byte[] cipherbytes;

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

private void ClearOutputFields()

   {

       textCiphertext.Text = "";

       textCipherbytes.Text = "";

       textRecoveredPlaintext.Text = "";

   }

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

Код фунцкии GenerateNewRSAParams выполняет те же функции, что и в предыдущей программе. Разница состоит в том, что данные сохраняются в двух XML-файлах PublicPrivateKey.xml и PublicOnlyKey.xml. Эти два файла затем используются функциями шифрования и дешифрования.

private void GenerateNewRSAParams()

{

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

RSACryptoServiceProvider rsa =

    new RSACryptoServiceProvider();

 

//получить открытый и секретный ключи RSA

StreamWriter writer = new

StreamWriter("PublicPrivateKey.xml");

string publicPrivateKeyXML =

   rsa.ToXmlString(true);

writer.Write(publicPrivateKeyXML);

writer.Close();

//получить только открытый ключ RSA

writer =

       new StreamWriter("PublicOnlyKey.xml");

string publicOnlyKeyXML =

       rsa.ToXmlString(false);

writer.Write(publicOnlyKeyXML);

writer.Close();

//отобразить оба ключа RSA

textBoxPublicKeyXML.Text = publicPrivateKeyXML;

 

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

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.

private void buttonEncrypt_Click(object sender, EventArgs e)

{

//очистить поля на экранной форме

ClearOutputFields();

 

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

RSACryptoServiceProvider rsa =

   new RSACryptoServiceProvider();

 

//получить только открытый ключ RSA

StreamReader reader =

new StreamReader("PublicOnlyKey.xml");

string publicOnlyKeyXML = reader.ReadToEnd();

rsa.FromXmlString(publicOnlyKeyXML);

reader.Close();

 

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

byte[] plainbytes =

                 Encoding.UTF8.GetBytes(textPlaintext.Text);

cipherbytes =

  rsa.Encrypt(

     plainbytes,

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

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

 

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

textCiphertext.Text =

Encoding.UTF8.GetString(cipherbytes);

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

 //шестнадцатеричном формате

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.

private void buttonDecrypt_Click(object sender, EventArgs e)

{

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

// при помощи ключа из XML файла

RSACryptoServiceProvider rsa =

new RSACryptoServiceProvider();

 

//получить открытый и секретный ключи RSA для     //дешифрировния

StreamReader reader =

new StreamReader("PublicPrivateKey.xml");

string publicPrivateKeyXML = reader.ReadToEnd();

      rsa.FromXmlString(publicPrivateKeyXML);

       reader.Close();

 

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

byte[] plainbytes =

  rsa.Decrypt(

  cipherbytes,

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

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

 

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

textRecoveredPlaintext.Text =

Encoding.UTF8.GetString(plainbytes);

 

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

buttonNewRSAParams.Enabled = true;

buttonDecrypt.Enabled = false;

buttonEncrypt.Enabled = true;

textPlaintext.Enabled = true;

buttonEncrypt.Select();}


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

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






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