Пример приложения с использованием ЭЦП  DSA



Данное приложение демонстрирует, как можно созда­вать и верифицировать сообщения с помощью ЭЦП  DSA. Приложение во многом сходно с приложением, рассмотренным в подразделе 3.2, так как, хотя объекты DSA и RSA реализуют разные алго­ритмы, они используются для решения одной и той же задачи. На рисун­ке 3.6 приведено окно данного приложения.

Пользовательский интерфейс устроен аналогично интерфейсу предыдущего приложения. Пользователь вводит сообщение, создает цифровую под­пись, а затем, изменив сообщение или оставив его неизменным, верифициру­ет подпись. Появившееся окно сообщения укажет на результат проверки (см. рисунок 3.7).

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

 

 

 


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

Элемент управления Класс Описание
1 2 3
groupBox1 GroupBox Панель группировки «Исходное сообщение»

Продолжение таблицы 3.2

1 2 3
groupBox2 GroupBox Панель группировки «Дайджест исходного сообщения в шестнадцатеричной форме (алгоритм SHA1)»
groupBox3 GroupBox Панель группировки «ЭЦП DSA в шестнадцатеричной форме»
groupBox4 GroupBox Панель группировки «Параметры DSA»
label1 label Метка «P»
label2 label Метка «Q»
label3 label Метка «Y»
label4 label Метка «G»
textOriginalMessage TextBox Исходное сообщение
textMessageDigestSHA1 TextBox Дайджест исходного сообщения, полученный с помощью хеш-функции SHA-1
textSignature TextBox ЭЦП исходного сообщения, полученная с помощью алгоритма DSA
textBoxP TextBox Параметр «P» ЭЦП DSA
textBoxQ TextBox Параметр «Q» ЭЦП DSA
textBoxY TextBox Параметр «Y» ЭЦП DSA
textBoxG TextBox Параметр «G» ЭЦП DSA
buttonSign Button Командная кнопка «Получить ЭЦП исходного сообщения»
buttonVerify Button Командная кнопка «Проверка корректности ЭЦП»

 

 

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

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

//Временные переменные для передачи параметров между //двумя процедурами

   DSAParameters dsaparams;

byte[] signaturebytes;


 

 

 


2. Событие Click кнопки buttonSign

Метод buttonSign_CIick, подписывает сообщение

private void buttonSign_Click(object sender, EventArgs e)

 {

//Получить исходное сообщение в виде

//байтового массива

byte[] messagebytes = Encoding.UTF8.GetBytes(

      textOriginalMessage.Text);

 

//Создать дайджест сообщения алгоритмом SHA1

SHA1 sha1 = new SHA1CryptoServiceProvider();

byte[] hashbytes =

      sha1.ComputeHash(messagebytes);

 

//отобразить значение хеша в

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

StringBuilder sb = new StringBuilder();

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

{

    sb.Append(String.Format(

      "{0,2:X2} ", hashbytes[i]));

}

textMessageDigestSHA1.Text = sb.ToString();

 

//создать объект DSA с ключом по умолчанию

DSACryptoServiceProvider dsa =

   new DSACryptoServiceProvider();

 

//подписать хеш при помощи OID для алгоритма SHA1

signaturebytes =

   dsa.SignHash(hashbytes, "1.3.14.3.2.26");

 

//извлечь параметры DSA необходимые для верификации

dsaparams = dsa.ExportParameters(false);

 

// Отобразить значение ЭЦП в

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

sb = new StringBuilder();

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

{

   sb.Append(String.Format(

      "{0,2:X2} ", signaturebytes[i]));

}

textSignature.Text = sb.ToString();

 

//отобразить параметры DSA в

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

sb = new StringBuilder();

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

{

  sb.Append(String.Format(

      "{0,2:X2} ", dsaparams.P[i]));

}

textBoxP.Text = sb.ToString();

 

sb = new StringBuilder();

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

{

    sb.Append(String.Format(

         "{0,2:X2} ", dsaparams.Q[i]));

}

textBoxQ.Text = sb.ToString();

 

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

{

   sb.Append(String.Format(

       "{0,2:X2} ", dsaparams.Y[i]));

}

textBoxY.Text = sb.ToString();

 

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

{

     sb.Append(String.Format(

       "{0,2:X2} ", dsaparams.G[i]));

}

textBoxG.Text = sb.ToString();

 

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

buttonSign.Enabled = false;

buttonVerify.Enabled = true;

buttonVerify.Select();

}

 

3. Событие Click кнопки buttonVerify

Метод buttonVerify_Click выполняет верификацию подписи для за­данного сообщения.

private void buttonVerify_Click(object sender, EventArgs e)

 {

//Получить сообщение, возможно измененное в виде

//байтового массива

byte[] messagebytes = Encoding.UTF8.GetBytes(

    textOriginalMessage.Text);

 

//создать дайджест исходного сообщения

//алгоритмом SHA1

SHA1 sha1 = new SHA1CryptoServiceProvider();

byte[] hashbytes =

    sha1.ComputeHash(messagebytes);

 

//создать объект DSA с импортированными параметрами

DSACryptoServiceProvider dsa =

    new DSACryptoServiceProvider();

dsa.ImportParameters(dsaparams);

 

//Верифицировать хеш, используя идентификатор OID

//для SHA1

bool match = dsa.VerifyHash(

   hashbytes, "1.3.14.3.2.26", signaturebytes);

 

//вывести сообщение с результатом верификации

String strResult;

if (match)

  strResult = "Верификации дала положительный

результат. Исходное сообщение не было

изменено";

else

  strResult = "Верификации дала отрицательный

результат. Исходное сообщение было

изменено";

MessageBox.Show(

  strResult, "Результат верификации",

  MessageBoxButtons.OK,

  MessageBoxIcon.Exclamation);

 

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

buttonSign.Enabled = true;

buttonVerify.Enabled = false;

buttonVerify.Select();

}

 

Выводы

Из примеров, рассмотренных в данной лабораторной работе, видно, что способы работы с цифровой подписью через посредство классов DSACryptoServiceProvider и RSACryptoServiceProvider практически идентичны. И в том, и в другом случаях вызывается метод SignHash, для того чтобы подписать хеш, а затем вызываете метод VerifyHash, чтобы выполнить верификацию, и нет никакой разницы, ра­ботает ли приложение с RSA или с DSA.

Если сообщение было изменено после наложения подписи, то метод VerifyHash этот факт обнаружит. Если секретный ключ, который сгенерировался при вызове SignHash, не соответствует открытому ключу, исполь­зуемому при верификации подписи, метод VerifyHash также обнаружит этот факт. Таким образом, цифровая подпись обеспечивает аутентифика­цию и целостность сообщения.

Из рассмотренных примеров видно, что не предпринимается никаких специальных мер для явной ге­нерации пары ключей и для передачи открытого ключа. Фактически, пара ключей генерируется автоматически в момент создания экземпляра DSACryptoServiceProvider или RSACryptoServiceProvider. Затем откры­тый ключ передается между отправителем и получателем при помощи методов ExportParameters и ImportParameters объектов DSACryptoSer­viceProvider или RSACryptoServiceProvider.

В примерах  рассмотрена лишь одна из нескольких основных техник. Например, вместо явного создания байтового массива для хеша и последующего обращения к методам SignHash и VerifyHash, можно достичь того же результата, вызвав метод SignData, который автоматически со­здает новый хеш и подписывает его (проверить хеш далее можно вызовом VerifyData). Методы SignData и VerifyData не требуют предварительно­го создания хеша в явном виде, и им не нужно указывать идентификатор OID, поскольку они «понимают» простые имена хеш-алгоритмов такие, как «SHA1» или «MD5».

В случае DSA возможен еще один подход, заключающийся в вызове метода CreateSignature, который создает байтовый массив с цифровой подписью напрямую из заданного байтового массива с хешем. В этом слу­чае, обращение к методу VerifySignature, которому необходимо передать в байтовых массивах подпись и оригинальный хеш, вернет логическое значение, указывающее на результат проверки подписи.

Между RSA и DSA есть два небольших отличия:

1. В отличие от класса DSACryptoServiceProvider, класс RSA­CryptoServiceProvider не поддерживает методы CreateSignature и VerifySignature.

2. Второе различие проистекает из того факта, что алгоритм DSA не может использоваться для шифрования данных. По этой причине класс DSACryptoServiceProvider не поддерживает методы Decrypt и En­crypt, которые имеются в классе RSACryptoServiceProvider.

За исключе­нием этих двух различий оба класса обладают идентичными наборами внешних (public) свойств и методов.

 


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

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






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