· парольную фразу, длину случайной примеси и количество итераций при генерации ключа из парольной фразы.
Класс Rfc2898DeriveBytes содержит методы GetBytes и Reset, аналогичные соответствующим методам класса PasswordDeriveBytes.
При генерации ключа шифрования из парольной фразы не потребуется его сохранение (ключ расшифрования будет заново генерироваться из парольной фразы). Этот вариант управления ключами имеет больше недостатков из-за трудности обеспечения реальной секретности парольной фразы и необходимости ограничивать ее минимальную длину и сложность (обязательное включение символов из разных групп – строчных и прописных букв, цифр и специальных знаков).
Для получения случайного ключа шифрования потребуется использовать абстрактный базовый класс библиотеки FCL RandomNumberGenerator и его наследник RNGCryptoServiceProvider. Класс RNGCryptoServiceProvider из пространства имен System. Security. Cryptography имеет конструктор без параметров, а также конструктор с параметрами, передаваемыми криптопровайдеру Windows (объектом класса CspParameters).
Основные методы класса RNGCryptoServiceProvider:
· void GetBytes(byte[] data) – заполнение буфера data массивом случайных чисел;
· void GetNonZeroBytes(byte[] data) – заполнение буфера data массивом случайных ненулевых значений.
При использовании случайного ключа шифрования необходимо позаботиться о его безопасном распространении между отправителем (создателем) и получателем (пользователем) конфиденциальной информации. Это может быть выполнено с помощью методов CreateKeyExchange и DecryptKeyExchange классов для обмена секретными ключами симметричного шифрования RSAOAEPKeyExchangeFormatter и RSAOAEPKeyExchangeDeformatter или RSAPKCS1KeyExchangeFormatter и RSAPKCS1KeyExchangeDeformatter.
Класс RSAOAEPKeyExchangeFormatter из пространства имен System. Security. Cryptography имеет свойство RandomNumberGenerator Rng, определяющее объект для генерации случайной числовой последовательности.
Класс RSAOAEPKeyExchangeFormatter включает конструктор без параметров и конструктор с параметром типа AsymmetricAlgorithm, содержащим объект с реализацией алгоритма асимметричного шифрования. Этот объект предоставляет открытый ключ, на котором будет зашифрован случайный секретный ключ.
Методы класса RSAOAEPKeyExchangeFormatter:
· byte[] CreateKeyExchange(byte[] rgbData) – получение секретного ключа rgbData, зашифрованного открытым ключом получателя конфиденциальной информации с помощью асимметричного алгоритма;
· void SetKey(AsymmetricAlgorithm key) – задание алгоритма асимметричного шифрования key, предоставляющего открытый ключ.
Класс RSAOAEPKeyExchangeDeformatter из пространства имен System. Security. Cryptography имеет конструктор без параметров и конструктор с параметром AsymmetricAlgorithm, содержащим объект с реализацией алгоритма асимметричного шифрования. Этот объект предоставляет закрытый (личный) ключ, с помощью которого будет расшифрован случайный секретный ключ.
Методы класса RSAOAEPKeyExchangeDeformatter:
· byte[] DecryptKeyExchange(byte[] rgbData) – восстановление секретного ключа из зашифрованного блока rgbData закрытым ключом получателя конфиденциальной информации с помощью асимметричного алгоритма;
· void SetKey(AsymmetricAlgorithm key) – задание алгоритма асимметричного шифрования key, предоставляющего закрытый ключ.
Классы RSAPKCS1KeyExchangeFormatter и RSAPKCS1KeyExchangeDeformatter из пространства имен System. Security. Cryptography аналогичны классам RSAOAEPKeyExchangeFormatter и RSAOAEPKeyExchangeDeformatter, но реализуют другой вариант криптографической асимметричной системы RSA для обмена секретными ключами симметричного шифрования.
Рассмотрим примеры использования криптографических классов библиотеки FCL для обеспечения конфиденциальности данных с помощью алгоритмов симметричного шифрования.
1.2. Использование классов библиотеки FCL для шифрования данных
В первом примере рассмотрим шифрование файла по алгоритму RC2 на ключе, генерируемом из парольной фразы, имеющей длину не менее 8 знаков и состоящей из строчных и прописных букв, цифр и математических знаков. При генерации ключа будет также использована случайная примесь длиной 8 байт, которая сохраняется в начале зашифрованного файла.
На рис. 1 приведено главное окно нашего приложения.
Элементам управления окна на рис. 1 соответствуют объекты программы с именами (значениями свойства Name), указанными в табл. 1.
В примере используются и другие классы библиотеки FCL. Класс OpenFileDialog из пространства имен System. Windows. Forms предоставляет доступ к стандартному диалогу Windows открытия файла. Его основные свойства:
· string Filter – строка фильтров (пар вида описание фильтра | фильтр), используемых для выбора отображаемых в окне диалога имен файлов;
· bool CheckFileExists – признак проверки существования файла с введенным пользователем именем до закрытия диалогового окна;
· bool RestoreDirectory – признак восстановления текущей папки после закрытия диалогового окна;
· string FileName – строка с именем выбранного пользователем файла (по умолчанию пустая строка);
· string InitialDirectory – строка, содержащая путь к папке, содержимое которой будет отображаться при создании диалогового овна.

Рис. 1. Шифрование файлов на парольной фразе
Таблица 1
Имена объектов программы для элементов управления
Элемент управления окна | Его имя в программе |
Редактор для ввода (выбора) имени исходного файла | InputFName |
Кнопка для выбора имени исходного файла | Browse |
Выключатель для жима удаления исходного файла | DelInputFile |
Редактор для отображения имени результирующего файла | OutputFName |
Редактор для ввода парольной фразы | PassFrase1 |
Редактор для ввода подтверждения парольной фразы | PassFrase2 |
Элемент для выбора длины ключа | KeyLen |
Кнопка «Зашифровать» | Encrypt |
Кнопка «Расшифровать» | Decrypt |
Кнопка «Выход» | Exit |
Конструктор этого класса параметров не содержит. Основным методом класса OpenFileDialog является
DialogResult ShowDialog() – отображение диалогового окна и возвращение значения DialogResult. OK, если пользователь подтвердил выбор файла.
Класс Encoding из пространства имен System. Text используется для кодирования и декодирования текстовых строк. Его статическое свойство Unicode типа Encoding содержит строку в кодировке UTF-16, а статический метод
byte[] GetBytes(string s)
возвращает массив байт с результатом кодирования строки s.
При проверке сложности введенной пользователем парольной фразы используются следующие статические методы класса Char:
· bool IsDigit(char c) – проверка, является ли c цифрой;
· bool IsLower(char c) – проверка, является ли c строчной буквой;
· bool IsUpper(char c) – проверка, является ли c прописной буквой;
· bool IsSymbol(char c) – проверка, является ли c математическим символом.
Для вывода сообщений в программе используется класс MessageBox из пространства имен System. Windows. Forms и его статический метод
DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) – вывод сообщения с текстом text в окне с заголовком caption, кнопками buttons и пиктограммой icon).
Для получения пути к текущей папке в программе используется статический метод
string GetCurrentDirectory()
класса Directory из пространства имен System. IO.
Для удаления файла используется статический метод
void Delete(string path)
класса File из пространства имен System. IO (path – полный путь к удаляемому файлу).
Ниже приведен текст программы на языке C#:
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
// подключение пространства имен криптографических классов
using System. Security. Cryptography;
// подключение пространства имен классов ввода-вывода
using System. IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
// объект класса алгоритма шифрования RC2
RC2CryptoServiceProvider rc2CSP;
// буфер для начального вектора по умолчанию
byte[] IV;
// объект класса для генерации секретного ключа из парольной фразы
PasswordDeriveBytes pdb;
// буфер для случайной примеси
byte[] randBytes;
// объекты для входного и выходного файловых потоков
FileStream finStream, foutStream;
// объект для потока шифрования-расшифрования
CryptoStream CrStream;
// буфер для ввода-вывода данных из файла
byte[] bytes;
// длина буфера ввода-вывода
int numBytesToRead;
// объект класса исключения
ArgumentException ex;
// конструктор класса формы (главного окна приложения)
public Form1()
{
InitializeComponent();
// создание объекта для криптоалгоритма
rc2CSP = new RC2CryptoServiceProvider();
// сохранение значения начального вектора по умолчанию
IV = rc2CSP. IV;
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |


