- •Методические указания
- •Лабораторная работа №1 Инициализация дескриптора криптопровайдера
- •Лабораторная работа №2 Хеширование
- •Лабораторная работа №3 Создание контейнеров и генерация ключей
- •Лабораторная работа №4 Шифрование и дешифрование
- •Лабораторная работа №5 Создание и проверка цифровой подписи
- •Приложения Приложение 1. Криптографические типы данных
- •Приложение 2. Идентификаторы типов криптопровайдеров
- •Приложение 3. Идентификаторы имен криптопровайдеров
- •Приложение 4. Идентификаторы алгоритмов шифрования
- •Приложение 5. Идентификаторы алгоритмов цифровой подписи
- •Приложение 6. Идентификаторы алгоритмов хеширования
- •Приложение 7. Идентификаторы алгоритмов обмена ключами
- •Библиографический список
- •Содержание
- •Методические указания
- •394026 Воронеж, Московский просп., 14
Лабораторная работа №2 Хеширование
Цель лабораторной работы заключается в исследовании возможностей и изучении способов применения криптографических хеш-функций.
Задачи лабораторной работы:
рассмотреть понятия хеш-функции и хеш-значения;
определить область применения криптографических хеш-функций;
изучить описание и исследовать возможности группы хеш-функций интерфейса 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.