Пример программирования с использованием симметричных алгоритмов
В качестве примера рассмотрим приложение, выполняющее шифрование (дешифрирование) данных при помощи каждого из четырех производных от SymmetricAlgorithm классов. На рисунке 1.2 изображено окно программы, шифрующей и дешифрующей текстовое сообщение.
В таблице 1.3 приведено описание используемых в приложении элементов управления
Таблица 1.3 - Элементы управления
Элемент управления | Класс | Описание |
1 | 2 | 3 |
groupBoxSum-metricAlgorithm | GroupBox | Панель группировки «Криптоалгоритм» |
groupBoxMode | GroupBox | Панель группировки «Режим» |
groupBoxPadding | GroupBox | Панель группировки «Заполнитель» |
продолжение таблицы 1.3
groupBox1 | GroupBox | Панель группировки «Исходный текст» |
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; просмотров: 331; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!