- •Для студентов, обучающихся по направлению
- •Введение
- •Глава 1 Средства обеспечения конфиденциальности данных
- •1.1. Классы, реализующие алгоритмы симметричного шифрования
- •1.2. Использование классов библиотеки fcl для шифрования данных
- •Имена объектов программы для элементов управления
- •Имена объектов программ для элементов управления
- •1.3. Непосредственное обращение к криптопровайдерам в приложениях для Microsoft .Net
- •Глава 2 Средства обмена секретными ключами и обеспечения аутентичности и целостности данных
- •2.1. Классы, реализующие алгоритмы асимметричного шифрования
- •2.2. Классы для вычисления и проверки эцп
- •2.3. Использование классов асимметричной криптографии
- •Имена объектов программ для элементов управления
- •Имена объектов программ для элементов управления
- •Глава 3 Средства хеширования и обеспечения целостности данных
- •3.1. Классы алгоритмов хеширования
- •3.2. Классы для вычисления и проверки кодов аутентификации сообщений
- •3.3. Использование средств хеширования и контроля целостности
- •Имена объектов программ для элементов управления
- •Контрольные вопросы
- •Библиографический список
- •Оглавление
- •Глава 1 7
- •Глава 2 40
- •Глава 3 70
Имена объектов программ для элементов управления
Элемент управления окна |
Его имя в программе |
Редактор для ввода сообщения |
PlainText |
Редактор для отображения шифротекста |
CipherText |
Список для выбора длины ключа |
KeyLen |
Кнопка «Зашифровать» |
Encrypt |
Кнопка «Расшифровать» |
Decrypt |
Кнопка «Выход» |
Exit |
Ниже приведен текст программы на языке C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// подключение пространства имен классов криптографии
using System.Security.Cryptography;
// подключение пространства имен для классов работы с памятью
using System.IO;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
// объект класса для криптоалгоритма
AesManaged Aes;
// буфер для случайного секретного ключа
byte[] key;
// длина ключа
int KeyLength;
// объект класса для потока данных в оперативной памяти
MemoryStream msEncrypt;
// объект для криптографического потока данных
CryptoStream csEncrypt;
// буфер для массива байт шифруемой строки
byte[] toEncrypt;
// буфер для массива расшифрованных байт
byte[] encrypted;
// массив данных для списка возможных значений длины ключа
int[] ksizes;
// конструктор класса формы главного окна программы
public Form1()
{
InitializeComponent();
//создание объекта для алгоритма шифрования
Aes = new AesManaged();
// получение случайного начального вектора
Aes.GenerateIV();
// установка режима блочного шифрования
Aes.Mode = CipherMode.CBC;
// массив допустимых значений длины ключа
KeySizes[] ks=Aes.LegalKeySizes;
// получение минимально возможной длины ключа
KeyLength = ks[0].MinSize;
// индексы элемента списка и выделенного элемента
int i=0, isel=0;
// максимальная длина ключа и длина ключа по умолчанию
int ksmax= ks[0]. MaxSize, ksdef= Aes.KeySize;
// создание массива данных для списка
ksizes=new int[3];
// заполнение списка возможных значений длины ключа
do
{
ksizes[i] = KeyLength;
// сохранение индекса для длины ключа по умолчанию
if (KeyLength == ksdef)
isel = i;
// увеличение возможной длины ключа
KeyLength += ks[0].SkipSize;
i++;
}
while (KeyLength <= ksmax);
// связывание списка с массивом данных
KeyLen.DataSource = ksizes;
// выделение элемента списка
KeyLen.SelectedIndex = isel;
}
// обработка нажатия кнопки "Выход"
private void Exit_Click(object sender, EventArgs e)
{
// закрытие главного окна
Close();
}
// обработка изменения открытого текста
private void PlainText_TextChanged(object sender, EventArgs e)
{
/* блокирование кнопки "Зашифровать", если открытый текст не введен */
Encrypt.Enabled = PlainText.Text.Length != 0;
}
// обработка изменения шифротекста
private void CipherText_TextChanged(object sender, EventArgs e)
{
/* блокирование кнопки "Расшифровать", если шифротекст не получен */
Decrypt.Enabled = CipherText.Text.Length != 0;
}
// обработка нажатия кнопки "Зашифровать"
private void Encrypt_Click(object sender, EventArgs e)
{
// очистка редактора с шифротекстом
CipherText.Clear();
// создание объекта для потока данных в оперативной памяти
msEncrypt = new MemoryStream();
// декодирование введенной строки открытого текста
toEncrypt = Encoding.Unicode.GetBytes(PlainText.Text);
// полученние выбранной длины ключа
KeyLength = ksizes[KeyLen.SelectedIndex];
// задание длины секретного ключа
Aes.KeySize = KeyLength;
// создание объекта для генерации случайного ключа
RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
// выделение памяти под случайный ключ
key = new byte[KeyLength/8];
// получение случайного ключа
rand.GetBytes(key);
// задание секретного ключа для шифрования
Aes.Key = key;
// создание объекта для выполнения шифрования потока
ICryptoTransform encryptor = Aes.CreateEncryptor(Aes.Key, Aes.IV);
// создание объекта для криптографического потока
csEncrypt = new CryptoStream(msEncrypt, encryptor,
CryptoStreamMode.Write);
// шифрование открытого текста
csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
// закрытие криптографического потока
csEncrypt.Close();
// получение шифротекста
encrypted = msEncrypt.ToArray();
// отображение шифротекста
CipherText.Text = Encoding.Unicode.GetString(encrypted, 0,
encrypted.Length);
// блокирование кнопки "Зашифровать"
Encrypt.Enabled = false;
// блокирование списка для выбора длины ключа
KeyLen.Enabled = false;
// закрытие потока в памяти
msEncrypt.Close();
}
// обработка нажатия кнопки "Расшифровать"
private void Decrypt_Click(object sender, EventArgs e)
{
// очистка строки с открытым текстом
PlainText.Clear();
// создание объекта для выполнения расшифрования потока
ICryptoTransform decryptor = Aes.CreateDecryptor(Aes.Key, Aes.IV);
// получение шифротекста
encrypted = Encoding.Unicode.GetBytes(CipherText.Text);
// создание объекта для данных в оперативной памяти
msEncrypt = new MemoryStream(encrypted);
// создание объекта для криптографического потока
csEncrypt = new CryptoStream(msEncrypt, decryptor,
CryptoStreamMode.Read);
// выделение памяти для расшифрованногог текста
toEncrypt = new byte[encrypted.Length];
// расшифрование данных
csEncrypt.Read(toEncrypt, 0, encrypted.Length);
// отображение расшифрованного открытого текста
PlainText.Text = Encoding.Unicode.GetString(toEncrypt, 0,
toEncrypt.Length);
// закрытие криптографического потока
csEncrypt.Close();
// блокирование кнопки "Расшифровать"
Decrypt.Enabled = false;
// закрытие потока в памяти
msEncrypt.Close();
}
}
}