Классы, производные от SymmetricAlgorithm



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

__________________________________________________________

ФИЛИАЛ ГОСУДАРСТВЕННОГО ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ

ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)»

В г. Смоленске

И.В. МАЛАШЕНКОВА, Е.А. ПАНКРАТОВА

КРИПТОГРАФИЯ И БЕЗОПАСНОСТЬ КОМПЬЮТЕРНЫХ СЕТЕЙ

Методические указания к лабораторным работам

по курсу «Защита информации»

Смоленск                                                                    2016
УДК ……………

 М ………..

    Допущено учебно-методическим Советом филиала ГОУ ВО «МЭИ (ТУ)» в г.Смоленске в качестве методического пособия для студентов, обучающихся в филиале ГОУ ВО «МЭИ (ТУ)» в г. Смоленске по направлению подготовки специалистов «Информатика и вычислительная техника».

 

Подготовлено на кафедре «Вычислительной техники»

 

Рецензент

кандидат технических наук Окунев Б.В.

 

 

Малашенкова И.В. Криптография и безопасность компьютерных  сетей/ И.В. Малашенкова, Е.А. Панкратова. – Смоленск:  филиал ГОУ ВО «МЭИ (ТУ)» в г.Смоленске, 2016. - ……… с.

 

В настоящем методическом пособии  рассматриваются вопросы реализации на платформе .NET симметричной и асимметричной криптографии, хэширования, формирования электронно-цифровой подписи и безопасного распределения ключей в компьютерных сетях.

 Предназначено для студентов, обучающихся по направлению подготовки специалистов «Информатика и вычислительная техника».


ВВЕДЕНИЕ

 

Данные методические указания разработаны в соответствии с учебно-методическим комплексом по курсу «Защите информации» для студентов специальностей «Вычислительные машины, комплексы, системы и сети», «Автоматизированные системы управления» и «программное обеспечение вычислительных сетей».

Безопасная работа требует рассмотрения нескольких ключевых аспектов. Одним из них является  обеспечение конфиденциальности передаваемой по сети информации. Для обеспечения конфиденциальности информации требуется шифровать передаваемых по сети данных с помощью симметричных и асимметричных алгоритмов шифрования.

Другим аспектом безопасности является обеспечение целостности информации. Здесь важную роль играет формирование электронной цифровой подписи (ЭЦП).

Для обеспечения надежного шифрования и формирования ЭЦП необходимо обеспечить безопасное распределение ключей.

    Исходя из всего вышесказанного, в методических указаниях рассматриваются следующие вопросы:

· симметричная криптография;

· асимметричная криптография;

· хэширование информации и формирование ЭЦВ;

· безопасное распределение ключей между пользователями компьютерной сети.


ЛАБОРАТОРНАЯ РАБОТА № 1. СИММЕТРИЧНАЯ КРИПТОГРАФИЯ

Цель работы;

1. Изучение принципов работы симметричных криптосистем, многие из которых являются национальными или ведомственными стандартами;

2. Изучение реализаций симметричной криптографии в среде  .NET Framework

3. Программная реализация существующих симметричных криптоалгоритмов.

 

Теоретическое введение

Основные криптографические классы

К вопросам безопасности данных корпорация Microsoft впервые обратилась в 1996-м году, анонсировав программный интерфейс Win32 (Win64) Cryptography API (CryptoAPI) в системе Windows NT. Хотя интерфейс CryptoAPI обеспе­чивал полную и всестороннюю поддержку задач криптографии, пользовать­ся им было очень трудно. Для того чтобы понимать смысл множества параметров во множестве криптографических функций данного API, необхо­димо было хорошо разбираться в криптографии. К тому же интерфейс не являлся объектно-ориентированным, поскольку написан он был на обыч­ном С, и для решения даже простейших задач необходимо было вызвать множество функций. Реализация концепций симметричной криптографии в среде .NET (.NET Security Framework) упрощает работу программиста, сводя все к одному, набору классов в пространстве имен System.Security.Cryptography.

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

· System.Security.Cryptography.SymmetricAlgorithm – симметричная криптография. Классы, производные от SymmetricAlgorithm, инкапсулируют симметричные алгоритмы, такие как DES или Rijndael;

· System.Security.Cryptography.AsymmetricAlgorithm – асимметричная криптография. Классы, производные от AsymmetricAlgorithm, инкапсулируют асимметричные алгоритмы, такие как RSA и DSA;

·  System.Security.Cryptography.CryptoStreamсоединяет потоки исходных данных с криптографи­ческим алгоритмом;

· System.Security.Cryptography.CspParametersинкапсулирует параметры, специфичные для алго­ритма, которые можно сохранить или загрузить посредством по­ставщика услуг криптографии (CSP);

· System.Security.Cryptography.HashAlgorithmпредставляет базовый класс, из которого произво­дятся все алгоритмы, связанные с хешами;

· System.Security.Cryptography.RandomNumberGeneratorпредставляет базовый класс для получе­ния программных генераторов псевдослучайных чисел (PRNG);

· System.Security.Cryptography.ToBase64Transformи System.Security.Cryptography..FromBase64Transformиспользуются для шифрования и дешифрирования по методу Base64:

· System.Security.Cryptography.CryptographicExceptionинкапсулирует информацию об ошибках, возникающих при выполнении криптографических операций.

Так как все эти классы содержатся в пространстве имен System.Security.Cryptography,необходимо объявлять это пространство при помо­щи оператора usingв программе.

Класс SymmetricAlgorithm

Классы .NET Framework, реализующие симметричные алгоритмы, являются производными от класса SymmetricAlgorithm.Этот абстрактный класс обладает несколькими защищенными полями, которые напрямую недоступны для методов не производных классов. Тем не менее, эти за­щищенные поля доступны посредством виртуальных свойств, реали­зованных в конкретном производном классе.

Например, защищенное int-поле BlockSizeValueдоступно посредством виртуального свойства BlockSize(способ доступа зависит от способа использования конкретного производного класса).

Таким образом, попытка присвоить свойству зна­чение, которое запрещено для конкретного используемого симметрично­го алгоритма, вызовет исключение CryptographicException,зависящее от этого алгоритма (т. е. от используемого производного класса).

В любом случае защищенное поле и соответствующее ему видимое (public) виртуальное свойство относятся к одному типу данных, а их имена отличаются только суффиксом Value.

Видимые (public) виртуальные свойства, определенные в классе SymmetricAlgorithm, приведены в таблице 1.1.

Класс SymmetricAlgorithmснабжен только одним видимым конструктором, не требующим параметров. Этот конструктор инициализирует создаваемый экземпляр класса случайно выбранным секретным ключом.

Конечно класс SymmetricAlgorithm поддерживает стандартные методы Equals, Finalize, GetHashCode, ToString, GetType и MemberwiseClone, определенные в базовом классе Object. В добавление к этому SymmetricAlgorithm поддерживает видимые (public) методы, описание которых приведе­но в таблице 1.2.

Таблица 1.1. Видимые (public) виртуальные свойства класса SymmetricAlgorithm

Видимое (public) свойство Описание
1 2
BlockSize Возвращает или задает размер блока в битах для алгоритма, что соответствует количеству данных, подвергающихся шифрованию или дешифрованию за одну операцию. Сообщения, размер которых превышает это значение, разбиваются на несколько блоков. Последний блок при этом должен быть дополнен до достижения этого размера. Разрешенные варианты размера блока определяются свойством LegalBlockSizes для каждого из симметричных алгоритмов в отдельности. Значение этого свойства относится к данным типа int
FeedBackSize Возвращает или задает размер данных обратной связи в битах для алгоритма. Это количество данных, возвращаемых в обратной связи при операциях шифрования и дешифрования. Обратная связь требуется для работы в операционных режимах OFB и CFB. Разрешенные размеры данных обратной связи зависят от конкретного алгоритма, однако не могут превышать размер блока. Это свойство относится к типу int
IV Возвращает или задает вектор инициализации для симметричного алгоритма, что требуется в операционном режиме СВС. Значение этого свойства представляет собой массив значений типа byte
Key Возвращает или задает секретный ключ для использования симметричным алгоритмом при шифровании или дешифровании. Значение этого свойства представляет собой массив значений типа byte
KeySize Возвращает или задает размер секретного ключа в битах для использования симметричным алгоритмом при шифровании или дешифровании. Разрешенные варианты размера блока определяются свойством LegalKeySizes для каждого из симметричных алгоритмов в отдельности. Это свойство относится к типу int

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

LegalBlockSizes Возвращает варианты размера блоков, поддерживаемые симметричным алгоритмом. Это свойство, доступное только для чтения, представляет собой массив значений типа KeySizes (отдельного типа BlockSizes не существует). Только такой размер блока, который совпадает с одним из элементов этого массива, допустим для данного алгоритма
LegalKeySizes Возвращает варианты размера ключа, поддерживаемые симметричным алгоритмом. Это свойство, доступное только для чтения, представляет собой массив значений типа KeySizes. Для алгоритма допустим только такой размер ключа, который совпадает с одним из элементов этого массива
Mode Возвращает или задает операционный режим для симметричного алгоритма. Это свойство относится к типу CipherMode и допускает значения ЕСВ (каждый блок обрабатывается отдельно), СВС (вводится обратная связь между блоками), а также CFB или OFB (используется сдвиговый регистр, позволяющий обрабатывать порции данных размером меньше блока). Наконец, режим CTS является вариацией режима СВС
Padding Возвращает или задает режим дополнения блоков для симметричного алгоритма, которое необходимо для расширения последнего, неполного блока данных до стандартного размера. Это свойство относится к типу PaddingMode и может принимать одно из трех значений: · PKCS7 соответствует байтам дополнения, каждый из которых равен общему числу таких байтов, · Zeros соответствует дополнению нулями · None обозначает отсутствие дополнения (алгоритм шифрования при этом использует специальную схему дополнения, игнорируя данное свойство)

 

Таблица 1.2. Видимые (public) методы класса SymmetricAlgorithm

Видимый (public) метод Описание
1 2
Clear Этот метод вызывает метод Dispose, освобождая ресурсы, ранее занятые симметричным алгоритмом. Возвращает значение void

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

1 2
Create Этот перегруженный статический метод используется для создания объекта, производного от SymmetricAlgorithm, который выполняет шифрование и дешифрование. Метод возвращает ссылку на объект типа SymmetricAlgorithm
CreateDecryptor Этот перегруженный статический метод используется для создания объекта decryptor, используя при этом заданный ключ и явно или неявно заданный вектор инициализации. Метод возвращает ссылку на интерфейс ICryptoTransform, который можно использовать для трансформации блоков данных
CreateEncryptor Этот перегруженный статический метод используется для создания объекта encryptor, используя при этом заданный ключ и явно или неявно заданный вектор инициализации. Метод возвращает ссылку на интерфейс ICryptoTransform, который можно использовать для трансформации блоков данных
Equals Перегруженный виртуальный метод, наследуемый от Object и используемый для сравнения на равенство двух объектов, производных от SymmetricAlgorithm. Метод возвращает значение типа bool
GeneratedIV Абстрактный метод, который, будучи переопределен в производном классе, генерирует случайный вектор инициализации. Вызов метода возвращает void, однако, сгенерированный при этом вектор становится значением IV по умолчанию для объекта, производного от SymmetricAlgorithm
GeneratedKey Абстрактный метод, который будучи переопределен в производном классе, генерирует случайный ключ. Вызов метода возвращает void, однако, сгенерированный при этом ключ становится ключом по умолчанию для объекта, производного от SymmetricAlgorithm
GethashCode Метод, наследуемый от Object. Создает значение хеша для объекта, производного от SymmetricAlgorithm. Возвращает значение типа int
GetType Метод, наследуемый от Object. Возвращает тип объекта, производного от SymmetricAlgorithm. Возвращает значение типа Туре
ToString Виртуальный метод, наследуемый от Object. Возвращает объект String, представляющий объект, производный от SymmetricAlgorithm
1 2
ValidKeySize Метод определяет, является ли допустимым заданный размер ключа для текущего алгоритма. Возвращает значение типа bool

  

Классы, производные от SymmetricAlgorithm

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

 

 

 


Из рисунка видно, что перечисленные ниже классы являются произ­водными от SymmetricAlgorithm:

· DES - абстрактный класс, инкапсулирующий симметричный алго­ритм DES.

· TripleDES - абстрактный класс, инкапсулирующий симметричный алгоритм TripleDES, который обладает обратной совместимостью с DES, и значительно превосходит его по криптографической стойкости.

· Rijndael - абстрактный класс, инкапсулирующий симметричный алгоритм Rijndael, являющийся новым стандартом, пришедшим на смену DES.

· RC2- абстрактный класс, инкапсулирующий симметричный алгоритм RC2, разработанный Рональдом Ривестом в качестве потен­циальной замены для DES.

Из всех этих абстрактных классов далее производятся конкретные клас­сы, реализующие все поддерживаемые симметричные алгоритмы. Плат­форма .NET Framework обеспечивает по одному конкретному классу на каждый алгоритм, тем не менее, провайдеры криптографических служб мо­гут реализовать собственные классы для реализации собственных, частных расширений. В каждом случае реализуются публичные свойства, и, конеч­но, публичные методы, описанные для класса SymmetricAlgorithm.

По соображениям безопасности каждый конкретный класс «запеча­тан», то есть, иными словами, наследование из него запрещено. В стан­дартной поставке предусмотрено четыре конкретных класса:

· TripleDESCryptoServiceProvider - класс-оболочка, предоставляю­щий доступ к стандартной реализации поставщика услуг криптог­рафии по алгоритму Triple DES, которая является частью Win32 (Win64) CryptoAPI.

· RC2CryptoServiceProvider - класс-оболочка, предоставляющий до­ступ к стандартной реализации поставщика услуг криптографии по алгоритму RC2, которая является частью Win32 (Win64) CryptoAPI.

· DESCryptoServiceProvider — класс-оболочка, предоставляющий до­ступ к нижележащей стандартной реализации поставщика услуг криптографии по алгоритму DES, которая является частью Win32 (Win64) Crypto API.

· RijndaelManaged - управляемый класс, реализующий алгоритм Rijndael. Этот класс не является оболочкой CryptoAPI.

Классы с именами, оканчивающимися на CryptoServiceProvider, представляют собой оболочки, использующие для своей реализации Win32 (Win64) CryptoAPI. Как правило, это от­носится к старым алгоритмам. Классы с именами, оканчивающимися на Managed, явля­ются полностью новыми реализациями, написанными на управляемом коде. Как правило, такие имена относятся к новым алгоритмам, хотя старые алгоритмы также мо­гут быть реализованы в двух вариантах.

 

Выбор надежных ключей

В классах DES и TripleDES имеется публичный статический метод IsWeakKey, который, получив на входе байтовый массив, представляющий со­бой ключ, возвращает булево значение. Данный метод проверяет ключ на возможную криптографическую слабость.

Под «слабым» ключом понимается такой ключ, при котором раскрытие шифра будет облегчено. Слабый ключ опознается по следующему признаку: если зашифровать открытый текст сла­бым ключом, то повторное шифрование уже зашифрованного текста тем же ключом даст в результате открытый текст. Поскольку 3DES полностью осно­вывается на DES, то слабый ключ DES приводит также к слабости ключа 3DES. В алгоритмах Rijndael и RC2 понятие слабого ключа отсутствует, поэ­тому для классов Rijndael и RC2 необходимости в методе IsWeakKey нет.

Было обнаружено четыре слабых ключа DES, и, очевидно, использования этих ключей следует избегать. Однако, важность проблемы сла­бых ключей не стоит преувеличивать. Для 56-битового ключа DES возможно 256 вариантов, в то время как известных слабых ключей всего 4, то есть 22. Таким образом, вероятность получить слабый ключ при слу­чайном его выборе составляет 254, а это крайне ничтожная величина.

Известны также 12 ключей, считающихся «полуслабыми», но вероят­ность случайно «набрести» на такой ключ также пренебрежимо мала.

В любом случае большинство программ используют секретный ключ, который сгенерирован случайно конструктором того объекта, который реализует используемый симметричный алгоритм. При этом слабый ключ сгенерирован заведомо не будет.

Если ключ создается вызовом метода GenerateKey, то пользователи гарантированы от получения слабого ключа. В тех случаях, когда используется ключ, полученным ка­ким-то иным образом, например, ключом от провайдера или иного внешнего источника, классы DES и TripleDES все равно сгенерируют исключение CryptographicException при попытке шифрования слабым ключом.

Лишь для тех, кто любит все проверять сам, предусмотрен ме­тод IsWeakKey, позволяющий проверить ключ на «слабость».

 

Криптографические потоки

Среда выполнения CLR поддерживает криптографические функции, ори­ентированные на потоки. Класс, инкапсулирующий криптографический поток называется CryptoStream. Любую крип­тографическую операцию, создающую объект CryptoStream, можно со­единить с другими объектами CryptoStream.

Чтобы выстроить цепочку из криптографических потоков, можно подключать выход одного объек­та к входу другого и так далее, при этом не потребуется какого-либо про­межуточного хранения данных.

CryptoStream - это класс, позволяющий читать и записывать данные через криптографический по­ток точно таким же образом, как если бы это был файл или сокет.

Со­здать экземпляр класса CryptoStream можно для шифрования (режим записи) или для дешифрования (режим чтения).

Рассмотрим использование класса CryptoStream  для шифрования и дешифриро­вания данных, представленных в виде массива байтов в памяти.

Для обеспечения операций ввода-вывода в отношении этих байтов используется класс МеmoryStream. Конструктор объекта CryptoStream имеет вид:

public CryptoStream(

Stream stream,

ICryptoTransform transform,

CryptoStreamMode mode };

В качестве входных параметров передается вновь созданный объект Stream и объект ICryptoTrans­form, ассоциированный с нужным симметричным алгоритмом, а также значение CryptoStreamMode.Write, задающее направление ввода-вывода. В результате создается объект CryptoStream, который будет шифровать все записываемые в него данные.

ПРИМЕР

Шифрование:

MemoryStream ms = new MemoryStream();

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

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

cs.Close();

В объект CryptoStream, записываются бай­ты, которые будут автоматически шифроваться объектом ICryptoTrans­form и записываться в ассоциированный с ним объект Stream, который в данном примере представлен объектом MemoryStream, хотя это мог бы быть файл или сокет.

 

Дешифрирование:

MemoryStream ms = new MemoryStream(cipherbytes);

CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);

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

cs.Close();

Задав ввод объекта CryptoStream, можно считывать байты из объ­екта Stream, которые будут автоматически расшифровываться ICryptoTransform и помещаться в байтовый массив.


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

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






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