Пример использования класса 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;
//секретные и открытые PSA параметры,
//используемые для дешифрирования
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 (при этом в качестве аргумента используя поле rsaParamsExcludePrivate).
Далее получается открытый текст в виде байтового массива с именем 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); //использование fOAEP
//требует пакета шифрования
//отобразить полученный открытый текст
textRecoveredPlaintext.Text =
Encoding.UTF8.GetString(plainbytes);
//работа с интерфейсом пользователя
buttonNewRSAParams.Enabled = true;
buttonDecrypt.Enabled = false;
textPlaintext.Enabled = true;
buttonEncrypt.Select();
}
Дата добавления: 2018-08-06; просмотров: 809; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!
