ФГБОУ ВПО «Воронежский государственный технический университет»
Кафедра систем информационной безопасности
к выполнению лабораторных работ по дисциплине «Методы программирования» для студентов специальности 090301 «Компьютерная безопасность» очной формы обучения
Воронеж 2013
Составитель С.С. Куликов
УДК 004.056.5: 004.42
Методические указания к выполнению лабораторных работ по дисциплине «Методы программирования» для студентов специальности 090301 «Компьютерная безопасность» очной формы обучения / ФГБОУ ВПО «Воронежский государственный технический университет»; сост. С.С. Куликов. Воронеж, 2013. 42 с.
Методические указания посвящены исследованию функций программного интерфейса CryptoAPI для взаимодействия с криптографической подсистемой операционных систем Windows XP и Windows 7.
Методические указания подготовлены в электронном виде в текстовом редакторе MW-2007 и содержатся в файле CryptoAPI.docx.
Табл. 6. Ил. 8. Библиогр.: 4 назв.
Рецензент д-р техн. наук, проф. А.Г. Остапенко
Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. А.Г. Остапенко
Издается по решению редакционно-издательского совета Воронежского государственного технического университета
© ФГБОУ ВПО «Воронежский государственный технический
университет», 2013
Цель лабораторной работы заключается в исследовании базовых объектов криптографической системы Windows - криптопровайдеров.
Задачи лабораторной работы:
понять концепцию интерфейса Crypto API;
рассмотреть понятие криптопровайдера и особенности работы с ним;
рассмотреть понятие и назначение дескриптора криптопровайдера;
изучить описание и исследовать возможности функции интерфейса Crypto API, инициализирующей дескриптор криптопровайдера;
написать программу генерации последовательности случайных чисел.
Теоретические сведения
Концепция Crypto API (The Cryptographic Application Programming Interface, CAPI) подразумевает сокрытие от программиста всех тонкостей и нюансов процесса шифрования данных. В Crypto API эта задача решена с помощью вывода реализации всех криптографических алгоритмов (шифрования, цифровой подписи и т.п.) из состава самого Crypto API в отдельные, независимые динамические библиотеки – криптопровайдеры (Cryptographic Service Provider, CSP).
Криптопровайдером называется независимый модуль, реализующий определенные криптографические алгоритмы и позволяющий осуществлять криптографические операции в операционных системах Windows, управление которым происходит с помощью функций Crypto API.
Каждый криптопровайдер должен обеспечивать:
реализацию стандартного интерфейса криптопровайдера;
работу с ключами шифрования, предназначенными для обеспечения работы алгоритмов, специфичных для данного криптопровайдера;
невозможность вмешательства третьих лиц в схему работы алгоритмов.
Криптопровайдеры реализуются в виде динамически загружаемых библиотек (DLL) и должны экспортировать набор обязательных функций, которые формируют системный программный интерфейс Crypto SPI (The Cryptographic System Programming Interface), при этом каждая из этих функций соответствует определенной функции Crypto API (рис. 1). Минимальный состав криптопровайдера – одна DLL, хранящаяся обычно в папке \WINDOWS\system32\. Кроме стандартных функций Crypto API, криптопровайдер может поддерживать набор собственных функций. Если собственные функции не реализованы, то DLL действует, по сути, как промежуточный слой между операционной системой и исполнителем криптографических операций.
Рис. 1. Структура криптографической системы Windows
Приложения, выполняемые в операционной системе, не работают напрямую с криптопровайдером. Вместо этого они вызывают функции Crypto API из библиотек Advapi32.dll и Crypt32.dll. Операционная система фильтрует вызовы этих функций и вызывает соответствующие им функции Crypto SPI, которые уже непосредственно и работают с криптопровайдером.
Так же у криптопровайдера отсутствуют параметры, изменением которых можно было бы управлять его работой. С помощью этой особенности решается задача обеспечения целостности алгоритмов криптопровайдера. А поскольку все компоненты криптосистемы Windows должны иметь цифровую подпись, то становится практически невозможным изменение алгоритма, реализованного в криптопровайдере – при проверке цифровой подписи это будет сразу обнаружено.
Сведения об установленных в операционной системе криптопровайдерах содержатся в ветке реестра SOFTWARE\\Microsoft\\Cryptography\\Defaults раздела HKEY_LOCAL_MACHINE.
В Crypto API криптопровайдеры принято группировать по их названиям (строковые величины), а также по номерам их типов. Тип криптопровайдера, в общем случае, не сообщает ни какой информации обычному пользователю и служит лишь для вспомогательной группировки провайдеров. Исключение составляет тип PROV_RSA_FULL (номер 1), который присваивают себе только те криптопровайдеры, которые полностью поддерживают работу со стандартом RSA. Перечни идентификаторов имен и идентификаторов типов базовых криптопровайдеров приведены в соответствующих приложениях.
Для получения информации о доступных криптопровайдерах используется функция CryptEnumProviders, а для перечисления типов криптопровайдеров, установленных в системе, можно использовать функцию CryptEnumProviderTypes. Прототипы этих и всех остальных криптографических функций содержатся в заголовочном файле Wincrypt.h.
«Вызов» криптопровайдера для использования его криптографических алгоритмов выполняется через специальный идентификатор, так называемый дескриптор криптопровайдера. Инициализация дескриптора конкретного криптопровайдера осуществляется с помощью функции CryptAcquireContext. В качестве параметров этой функции можно указать тип и/или имя запрашиваемого криптопровайдера, в случае если криптопровайдер с таким типом и именем доступен, то функция CryptAcquireContext создаст его дескриптор. Если имя криптопровайдера не указано, то будет вызван криптопровайдер «по-умолчанию» для указанного типа.
Получив только лишь дескриптор криптопровайдера можно воспользоваться единственной криптографической функцией – функцией генерации последовательности случайных чисел CryptGenRandom. Эта функция имеет всего три параметра, первый из которых – дескриптор криптопровайдера, с помощью алгоритмов которого будет сгенерирована последовательность случайных чисел, два других, второй - кличество байт случайных данных, которые будут сгенерированы, а третий – указатель на массив для размещения сгенерированных случайных данных.
После завершения работы с криптопровайдером созданный дескриптор необходимо удалить с помощью функцию CryptReleaseContext.
Обобщенная схема взаимодействия криптографических функций при генерации последовательности случайных чисел представлена на рис. 2.
Рис. 2. Схема взаимодействия криптографических функций при генерации последовательности случайных чисел
Задание и контрольные вопросы
Используя функции CryptEnumProvidersи CryptEnumProviderTypes необходимо вывести на экран сведения (имя, тип, название типа) обо всех криптопровайдерах, установленных в операционной системе. Допускается реализация каждой функции в отдельном приложении.
При защите результатов лабораторной работы необходимо представить содержащий их отчет и продемонстрировать свои теоретические знания и практические навыки согласно выполненному заданию.
Перечень категорий вопросов при защите результатов лабораторной работы:
Строение и возможности криптографической системы Windows.
Схема взаимодействия криптографических функций при генерации последовательности случайных чисел.
Описание и назначение криптографического типа данных HCRYPTPROV.
Описание функции CryptEnumProviders и её параметров.
Описание функции CryptEnumProviderTypes и её параметров.
Описание функции CryptAcquireContext и её параметров.
Описание функции CryptReleaseContext и её параметров.
Описание функции CryptGenRandom и её параметров.
Прочие вопросы, связанные с особенностями применения языков программирования C/C++ при работе с CryptoAPI.
Цель лабораторной работы заключается в исследовании возможностей и изучении способов применения криптографических хеш-функций.
Задачи лабораторной работы:
рассмотреть понятия хеш-функции и хеш-значения;
определить область применения криптографических хеш-функций;
изучить описание и исследовать возможности группы хеш-функций интерфейса CryptoAPI;
написать программу, осуществляющую хеширование исходных данных.
Теоретические сведения
Хеширование – однозначное преобразование по определённому алгоритму входного массива данных (прообраза) произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хеш-функциями или функциями свёртки, а их результат называется хешем, хеш-значением, хеш-кодом, сводкой сообщения или дайджестом.
В общем случае однозначного соответствия между исходными данными и хеш-значением нет в силу того, что количество значений хеш-функций меньше, чем вариантов входного массива. Существует множество массивов данных с разным содержимым, но дающих при их хешировании одинаковый результат – такие случаи называются коллизиями.
Криптографической хеш-функцией называется всякая хеш-функция, являющаяся криптографически стойкой, то есть, удовлетворяющая ряду требований специфичных для криптографических приложений.
Для того, чтобы хеш-функция H считалась криптографически стойкой, она должна удовлетворять трем основным требованиям, на которых основано большинство применений хеш-функций в криптографии:
необратимость или стойкость к восстановлению прообраза: для заданного значения хеш-функции m должно быть вычислительно невозможно найти блок данных Х, для которого H(X)=m;
стойкость к коллизиям первого рода или восстановлению вторых прообразов: для заданного сообщения M должно быть вычислительно невозможно подобрать другое сообщение N, для которого H(N)=H(M);
стойкость к коллизиям второго рода: должно быть вычислительно невозможно подобрать пару сообщений (M1,M2), имеющих одинаковые хеш-значения.
Данные требования не являются независимыми – обратимая функция нестойка к коллизиям первого и второго рода, а функция, нестойкая к коллизиям первого рода, нестойка к коллизиям второго рода, однако обратное неверно.
Следует так же отметить, что не доказано существование необратимых хеш-функций, для которых вычисление какого-либо прообраза заданного значения хеш-функции теоретически невозможно. Обычно нахождение обратного значения является лишь вычислительно сложной задачей.
Применение хеширования:
контроль целостности данных при их хранении и передаче;
хранение паролей в системах аутентификации;
формирование дайджеста данных при создании цифровой подписи.
В Crypto API для манипуляций с хеш-значениями используется специальный тип данных HCRYPTHASH, описание которого приведено в соответствующем приложении. Создается такой объект с помощью функции CryptCreateHash, принимающей в качестве параметров ранее полученные дескриптор криптопровайдера и идентификатор алгоритма хеширования данных. Непосредственно хеширование исходного массива данных осуществляет функция CryptHashData, самым важным параметром которой является ссылка на хешируемые данные. Получить параметры (информацию об алгоритме хеширования, размер и значения хеша) сформированного хеш-объекта можно с помощью функции CryptGetHashParam. Вызов функции CryptGetHashParam завершает процедуру создания хеш-значения и закрывает работу с хеш-объектом, а дальнейшие вызовы функции CryptHashData будут возвращать ошибку. Для освобождения дескриптора хеш-объекта (по аналогии с функцией CryptReleaseContext для дескриптора криптопровайдера) используется функция CryptDestroyHash. В некоторых прикладных задачах требуется создание копии хеш-объекта. Такую возможность можно реализовать, вызвав функцию CryptDuplicateHash и передав ей соответствующие параметры. В случае вызова функции CryptDuplicateHash, функция CryptDestroyHash должна быть вызвана для уничтожения каждого хеш-объекта, созданного функцией CryptDuplicateHash, в отдельности. Уничтожение исходного хеш-объекта не влечет за собой уничтожение дублированного. Обобщенная схема взаимодействия криптографических функций при вычислении хеш-значения представлена на рис. 3.
Рис. 3. Схема взаимодействия криптографических функций при вычислении хеш-значения
Задание и контрольные вопросы
Используя функции CryptCreateHash, CryptHashData, CryptDuplicateHash, CryptGetHashParam и CryptDestroyHash и алгоритм хеширования md5, вычислить и вывести на экран хеш-значение данных, хранящихся в файле.
При защите результатов лабораторной работы необходимо представить содержащий их отчет и продемонстрировать свои теоретические знания и практические навыки согласно выполненному заданию.
Перечень категорий вопросов при защите результатов лабораторной работы:
Схема взаимодействия криптографических функций при вычислении хеш-значения.
Описание и назначение криптографического типа данных HCRYPTPROV.
Описание и назначение криптографического типа данных ALG_ID.
Описание и назначение криптографического типа данных HCRYPTHASH.
Описание функции CryptCreateHash и её параметров.
Описание функции CryptHashData и её параметров.
Описание функции CryptDuplicateHashи её параметров.
Описание функции CryptGetHashParam и её п араметров.
Описание функции CryptDestroyHashи её параметров.
Прочие вопросы, связанные с особенностями применения языков программирования C/C++ при работе с CryptoAPI.