Пример программной реализации алгорима Диффи-Хеллмана



В качестве примера программной реализации алгоритма Диффи-Хеллмана рассмотрим приложение, изображенное на рисунке 4.1. В таблице 4.3 приведено описание используемых в приложении элементов управления.


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

Элемент управления Класс Описание
groupBox1 GroupBox Панель группировки «Генерация ключей»
groupBox2 GroupBox Панель группировки «Пользователь А»
groupBox3 GroupBox Панель группировки «Пользователь В »
textBox1 TextBox Окно вывода открытого ключа пользователя А
textBox2 TextBox Окно вывода открытого ключа пользователя В
textBox3 TextBox Окно ввода сообщения, передаваемого пользователем А пользователю В
textBox4 TextBox Окно вывода симметричного ключа, сформированного пользователем А
textBox5 TextBox Окно вывода зашифрованного сообщения
textBox6 TextBox Окно вывода полученного пользователем В зашифрованного сообщения
textBox7 TextBox Окно вывода симметричного ключа, сформированного пользователем В
textBox8 TextBox Окно вывода дешифрованного сообщения (полученного пользователем В от пользователя А)

 

    Как видно из рисунка 4.1 пользователи А и В сформировании один и тот же симметричный ключ на основании полученного друг от друга исходного материала.

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

1. Подключение пространства имен System.Security.Cryptography и System.IO:

using System.IO;

using System.Security.Cryptography;

1. Объявление глобальных переменных:

// Глобальные переменные

// Секретный ключ пользователя А

   static CngKey aKey;

    // Секретный ключ пользователя В

   static CngKey bKey;

    // Открытый ключ пользователя А

   static byte[] aPubKeyBlob;

    // Открытый ключ пользователя В

   static byte[] bPubKeyBlob;

   // Передаваемые данные

   byte[] encryptedData;

 

2. Функция формирования ключей пользователей А и В:

private static void CreateKeys()

{

aKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);

bKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);

aPubKeyBlob = aKey.Export(CngKeyBlobFormat.EccPublicBlob);

bPubKeyBlob = bKey.Export(CngKeyBlobFormat.EccPublicBlob);

}

 

3. Событие Click кнопки button1 (Генерировать):

private void button1_Click(object sender, EventArgs e)

{

CreateKeys();

textBox1.Text =Convert.ToBase64String(aPubKeyBlob);

textBox2.Text =Convert.ToBase64String(bPubKeyBlob);

}

 

4. Событие Click кнопки button2 (Передать):

private void button2_Click(object sender, EventArgs e)

{

// Шифруемое сообщение

string message=textBox3.Text;

// Преобразование строки шифруемого текста в

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

byte[] rawData = Encoding.UTF8.GetBytes(message);

encryptedData = null;

// Создание объекта ECDiffieHellmanCng и

// инициализация его с помощью ключей

// пользователя А

ECDiffieHellmanCng aAlgorithm = new ECDiffieHellmanCng(aKey);

using (CngKey bPubKey = CngKey.Import(bPubKeyBlob, CngKeyBlobFormat.EccPublicBlob))

{

 // Пользователь А создает симметричный ключ

// путем импользования своей пары ключей и

// открытого ключа пользователя В, вызывая

// метод DeriveKeyMaterial()

byte[] symmKey = aAlgorithm.DeriveKeyMaterial(bPubKey);

  textBox4.Text = Convert.ToBase64String(symmKey);

// Созданный симметричный ключ используется с

// алгоритмом AES для шифрования сообщения,

// передаваемого пользователю В

  AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

  aes.Key = symmKey;

// Динамическая генерация начального вектора IV

  aes.GenerateIV();

  using (ICryptoTransform encryptor=aes.CreateEncryptor())

  using (MemoryStream ms = new MemoryStream())

  {

     // создается CryptoStream и шифруются

    // подлежащие отправке данные

     CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);

     // Записывается вектор инициализации IV

     //не шифруя

     ms.Write(aes.IV,0, aes.IV.Length);

     cs.Write(rawData,0,rawData.Length);

     cs.Close();

     encryptedData = ms.ToArray();

     textBox5.Text = Convert.ToBase64String(encryptedData);

  }

  aes.Clear();

}

}

5. Событие Click кнопки button3 (Получить):

private void button3_Click(object sender, EventArgs e)

{

textBox6.Text = Convert.ToBase64String(encryptedData);

byte[] rawData = null;

AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

// Свойство BlockSize класса

// AesCryptoServiceProvider возвращает количество

// битов в полученном блоке.

// Количество байтов получается делением на 8

int nBytes = aes.BlockSize >> 3;

// Извлекается вектор инициализации

byte[] iv = new byte[nBytes];

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

     iv[i] = encryptedData[i];

// Создание объекта ECDiffieHellmanCng и

// инициализация его с помощью ключей

// пользователя В
ECDiffieHellmanCng bAlgorithm = new ECDiffieHellmanCng(bKey);

  using (CngKey aPubKey = CngKey.Import(aPubKeyBlob, CngKeyBlobFormat.EccPublicBlob))

  {

 // Пользователь В создает симметричный ключ

// путем импользования своей пары ключей и

// открытого ключа пользователя А, вызывая

// метод DeriveKeyMaterial()

     byte[] symmKey = bAlgorithm.DeriveKeyMaterial(aPubKey);

     textBox7.Text = Convert.ToBase64String(symmKey);

     aes.Key = symmKey;

     aes.IV = iv;

// Дешифрование полученного сообщения с помощью

// симметричного ключа symmKey

     using (ICryptoTransform decryptor=aes.CreateDecryptor())

     using (MemoryStream ms = new MemoryStream())

     {

        CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write);

        cs.Write(encryptedData, nBytes, encryptedData.Length - nBytes);

         cs.Close();

        rawData = ms.ToArray();

        textBox8.Text = Encoding.UTF8.GetString(rawData);

     }

  }

  aes.Clear();

}


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

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






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