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