Сохранение ключей в формате 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!