Пример программирования с использованием симметричных алгоритмов



В качестве примера рассмотрим приложение, выполняющее шифрование (дешифрирование) данных при помощи каждого из четырех про­изводных от SymmetricAlgorithm классов. На рисунке 1.2 изображено окно программы, шифрующей и дешифрующей текстовое сообщение.

 


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

 

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

Элемент управления Класс Описание
1 2 3
groupBoxSum-metricAlgorithm GroupBox Панель группировки «Криптоалгоритм»
groupBoxMode GroupBox Панель группировки «Режим»
groupBoxPadding GroupBox Панель группировки «Заполнитель»
groupBox1 GroupBox Панель группировки «Исходный текст»

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

1 2 3
groupBox2 GroupBox Панель группировки «Зашифрованный текст в в виде строки»
groupBox3 GroupBox Панель группировки «Зашифрованный текст в в виде массива байт»
groupBox4 GroupBox Панель группировки «Дешифрированный текст в»
textBoxKey TextBox Новый случайный ключ
textBoxIV TextBox Новый вектор инициализации
textPlaintext TextBox Исходный текст
textCiphertext TextBox Зашифрованный текст в виде строки
textRecoveredPlaintext TextBox Дешифрированный текст
radioButtonDES RadioButton Выбор криптоалгоритма DES
radioButtonTripleDES RadioButton Выбор криптоалгоритма TripleDES
radioButtonRijndael RadioButton Выбор криптоалгоритма Rijndael
radioButtonAES RadioButton Выбор криптоалгоритма AES
radioButtonRC2 RadioButton Выбор криптоалгоритма RC2
radioButtonECB RadioButton Выбор режима шифрования ECB
radioButtonCBC RadioButton Выбор режима шифрования CBC
radioButtonCFB RadioButton Выбор режима шифрования CFB
radioButtonOFB RadioButton Выбор режима шифрования OFB
radioButtonCTS RadioButton Выбор режима шифрования CTS
radioButtonPKCS7 RadioButton Выбор заполнителя  PKCS7
radioButtonZeros RadioButton Выбор заполнителя  Zeros
radioButtonNone RadioButton Выбор заполнителя  None
buttonKeyGen Button Командная кнопка «Новый случайный ключ»
buttonGenIV Button Командная кнопка «Новый вектор инициализации»
buttonEncrypt Button Командная кнопка «Шифрование»
buttonDecrypt Button Командная кнопка «Дешифрирование»

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

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

using System.Security.Cryptography;

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

using System.IO;

Пространство имен System.IO предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает при создании объектов FileStream.

 

3 Определение глобальных переменных. В данном примере глобальные переменные связывают процесс шифрования и дешифрирования:

// глобальные переменные, связывающие процесс шифрования и дешифрирования

   byte[] Key;

   byte[] IV;

   CipherMode Mode;

   PaddingMode padding;

   byte[] cipherbytes;    

 

4 Описание вспомогательных методов

4.1.Создание объекта «симметричный алгоритм»

Метод CreateSymmetricAlgorithm.Этот метод создает и возвращает производный от SymmetricAlgorithmобъект, руководствуясь положением переключателя на форме. В зависимости от положения переключателя вызывается соот­ветствующий статический метод Create.

 

SymmetricAlgorithm CreateSymmetricAlgorithm()

   {

   

       if (radioButtonRC2.Checked == true)

           return RC2.Create();

       if (radioButtonRijndael.Checked == true)

           return Rijndael.Create();

       if (radioButtonDES.Checked == true)

           return DES.Create();

          if (radioButtonTripleDES.Checked == true)

           return TripleDES.Create();

    if (radioButtonAES.Checked == true)

           return Aes.Create();

 

       return null;

   }

4.2.   Генерация нового случайного ключа

private void GenKey()

   {

       //Генерация нового случайного ключа

       SymmetricAlgorithm sa =

           CreateSymmetricAlgorithm();

       sa.GenerateKey();

       Key = sa.Key;

 

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

       UpdateKeyTextBox();

       ClearOutputFields();

}

4.3. Генерация нового начального вектора

private void GenIV()

   {

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

       SymmetricAlgorithm sa =

           CreateSymmetricAlgorithm();

       sa.GenerateIV();

       IV = sa.IV;

 

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

       UpdateIVTextBox();

       ClearOutputFields();

   }

4.4. Определение вида заполнителя

void EstablishPadding()

   {

       //Определение вида заполнителя

       if (radioButtonPKCS7.Checked == true)

           padding = PaddingMode.PKCS7;

       if (radioButtonZeros.Checked == true)

              padding = PaddingMode.Zeros;

       if (radioButtonNone.Checked == true)

           padding = PaddingMode.None;

   }

4.5. Определение режима шифрования

void EstablishMode()

   {

       //Определение режима шифрования

        if (radioButtonECB.Checked == true)

           Mode = CipherMode.ECB;

       if (radioButtonCBC.Checked == true)

           Mode = CipherMode.CBC;

       if (radioButtonCFB.Checked == true)

           Mode = CipherMode.CFB;

       if (radioButtonOFB.Checked == true)

           Mode = CipherMode.OFB;

       if (radioButtonCTS.Checked == true)

           Mode = CipherMode.CTS;

   }

4.6. Очистка полей вывода

   private void ClearOutputFields()

   {

       textCiphertext.Text = "";

       textCipherbytes.Text = "";

       textRecoveredPlaintext.Text = "";

   }

4.7. Вывод нового случайного ключа

private void UpdateKeyTextBox()

   {

       StringBuilder sb = new StringBuilder();

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

       {

           sb.Append(

               String.Format("{0:X2} ", Key[i]));

       }

       textBoxKey.Text = sb.ToString();

   }

4.8. Вывод нового вектора

private void UpdateIVTextBox()

   {

       StringBuilder sb = new StringBuilder();

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

       {

           sb.Append(

               String.Format("{0:X2} ", IV[i]));

       }

       textBoxIV.Text = sb.ToString();

   }

5 Событие Form1_Load

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

private void Form1_Load(object sender, EventArgs e)

   {

       radioButtonDES.Checked = true;

       radioButtonECB.Checked = true;

       radioButtonZeros.Checked = true;

        GenIV();

       GenKey();

       EstablishMode();

       EstablishPadding();

   }

6 Событие Click кнопки ButtonEncrypt

private void buttonEncrypt_Click(object sender, EventArgs e)

   {

//обслуживание пользовательского интекфейса       ClearOutputFields();

     //задать симметричный алгоритм

       SymmetricAlgorithm sa =

           CreateSymmetricAlgorithm();

 

   //использовать текущие ключ и вектор

       sa.Key = Key;

       sa.IV = IV;

 

//использовать текущие операционный режим

   // и режим дополнения           

sa.Mode = Mode;

        sa.Padding = padding;

 

       //задать поток шифрования

       MemoryStream ms = new MemoryStream();

       CryptoStream cs = new CryptoStream(

           ms,

           sa.CreateEncryptor(),

           CryptoStreamMode.Write);

 

       //записать байты открытого текста в поток шифрования

       byte[] plainbytes =

           Encoding.UTF8.GetBytes(textPlaintext.Text);

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

       cs.Close();

       cipherbytes = ms.ToArray();

       ms.Close();

 

      //отобразить зашифрованный текст в виде строки символов

       textCiphertext.Text =

           Encoding.UTF8.GetString(cipherbytes);

 

//отобразить зашифрованный текст в виде массива байтов

      StringBuilder sb = new StringBuilder();

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

       {

           sb.Append(String.Format("{0:X2} ", cipherbytes[i]));

       }

       textCipherbytes.Text = sb.ToString();

 

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

       buttonEncrypt.Enabled = false;

       buttonDecrypt.Enabled = true;

       buttonGenKey.Enabled = false;

       buttonGenIV.Enabled = false;

       radioButtonDES.Enabled = false;

       radioButtonTripleDES.Enabled = false;

       radioButtonRijndael.Enabled = false;

       radioButtonRC2.Enabled = false;

       radioButtonECB.Enabled = false;

       radioButtonCBC.Enabled = false;

       radioButtonCFB.Enabled = false;

       radioButtonOFB.Enabled = false;

       radioButtonCTS.Enabled = false;

       radioButtonPKCS7.Enabled = false;

       radioButtonZeros.Enabled = false;

       radioButtonNone.Enabled = false;

       textPlaintext.Enabled = false;

       buttonDecrypt.Select();

   }

7 Событие Click кнопки ButtonDecrypt

private void buttonDecrypt_Click(object sender, EventArgs e)

   {

       //задать симметричный алгоритм

       SymmetricAlgorithm sa =

           CreateSymmetricAlgorithm();

 

       //использовать текущие ключ и вектор

       sa.Key = Key;

       sa.IV = IV;

 

//использовать текущие операционный режим

   // и режим дополнения                   sa.Mode = Mode;

       sa.Padding = padding;

 

       //задать поток шифрования

       MemoryStream ms = new MemoryStream(cipherbytes);

       CryptoStream cs = new CryptoStream(

           ms,

           sa.CreateDecryptor(),

           CryptoStreamMode.Read);

       //читать шифрованные байты из потока

       byte[] plainbytes =

           new Byte[cipherbytes.Length];

       cs.Read(plainbytes, 0, cipherbytes.Length);

       cs.Close();

       ms.Close();

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

       textRecoveredPlaintext.Text =

           Encoding.UTF8.GetString(plainbytes);

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

       buttonDecrypt.Enabled = false;

       buttonEncrypt.Enabled = true;

       buttonGenKey.Enabled = true;

       buttonGenIV.Enabled = true;

          radioButtonDES.Enabled = true;

       radioButtonTripleDES.Enabled = true;

       radioButtonRijndael.Enabled = true;

       radioButtonRC2.Enabled = true;

       radioButtonECB.Enabled = true;

       radioButtonCBC.Enabled = true;

       radioButtonCFB.Enabled = true;

       radioButtonOFB.Enabled = true;

       radioButtonCTS.Enabled = true;

       radioButtonPKCS7.Enabled = true;

       radioButtonZeros.Enabled = true;

       radioButtonNone.Enabled = true;

       textPlaintext.Enabled = true;

       buttonEncrypt.Select();

   }

8 Событие Click кнопки ButtonGenKey

private void buttonGenKey_Click(object sender, EventArgs e)

   {

       GenKey();

   }

Вызов метода GenKey().

 

9 Событие Click кнопки ButtonGenIV

private void buttonGenIV_Click(object sender, EventArgs e)

   {

       GenIV();

   }

Вызов метода GenIV

10 Событие TextChanged окна textPalainText

private void textPlaintext_TextChanged(object sender, EventArgs e)

   {

       ClearOutputFields();

   }

 


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

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






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