Пример приложения с использованием ЭЦП 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 объектов DSACryptoServiceProvider или RSACryptoServiceProvider.
В примерах рассмотрена лишь одна из нескольких основных техник. Например, вместо явного создания байтового массива для хеша и последующего обращения к методам SignHash и VerifyHash, можно достичь того же результата, вызвав метод SignData, который автоматически создает новый хеш и подписывает его (проверить хеш далее можно вызовом VerifyData). Методы SignData и VerifyData не требуют предварительного создания хеша в явном виде, и им не нужно указывать идентификатор OID, поскольку они «понимают» простые имена хеш-алгоритмов такие, как «SHA1» или «MD5».
В случае DSA возможен еще один подход, заключающийся в вызове метода CreateSignature, который создает байтовый массив с цифровой подписью напрямую из заданного байтового массива с хешем. В этом случае, обращение к методу VerifySignature, которому необходимо передать в байтовых массивах подпись и оригинальный хеш, вернет логическое значение, указывающее на результат проверки подписи.
Между RSA и DSA есть два небольших отличия:
1. В отличие от класса DSACryptoServiceProvider, класс RSACryptoServiceProvider не поддерживает методы CreateSignature и VerifySignature.
2. Второе различие проистекает из того факта, что алгоритм DSA не может использоваться для шифрования данных. По этой причине класс DSACryptoServiceProvider не поддерживает методы Decrypt и Encrypt, которые имеются в классе RSACryptoServiceProvider.
За исключением этих двух различий оба класса обладают идентичными наборами внешних (public) свойств и методов.
Дата добавления: 2018-08-06; просмотров: 577; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!