Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 163.docx
Скачиваний:
34
Добавлен:
30.04.2022
Размер:
293.01 Кб
Скачать

Лабораторная работа №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, вычислить и вывести на экран хеш-значение данных, хранящихся в файле.

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

Перечень категорий вопросов при защите результатов лабораторной работы:

  1. Схема взаимодействия криптографических функций при вычислении хеш-значения.

  2. Описание и назначение криптографического типа данных HCRYPTPROV.

  3. Описание и назначение криптографического типа данных ALG_ID.

  4. Описание и назначение криптографического типа данных HCRYPTHASH.

  5. Описание функции CryptCreateHash и её параметров.

  6. Описание функции CryptHashData и её параметров.

  7. Описание функции CryptDuplicateHashи её параметров.

  8. Описание функции CryptGetHashParam и её п араметров.

  9. Описание функции CryptDestroyHashи её параметров.

  10. Прочие вопросы, связанные с особенностями применения языков программирования C/C++ при работе с CryptoAPI.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]