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

Лабораторная работа №3 Создание контейнеров и генерация ключей

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

Задачи лабораторной работы:

  • рассмотреть понятия криптографического ключа;

  • определить виды криптографических ключей и области их применения;

  • изучить описание и исследовать возможности группы функций интерфейса CryptoAPI, реализующих генерацию ключей и создание специальных контейнеров для их хранения;

  • написать программу, демонстрирующую работу с криптографическими ключами.

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

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

Для современных симметричных алгоритмов основной характеристикой криптостойкости является длина ключа. Шифрование с ключами длиной 128 бит и выше считается сильным, так как для расшифровки информации без ключа требуются годы работы мощных суперкомпьютеров. Для асимметричных алгоритмов, основанных на проблемах теории чисел в силу их особенностей минимальная надёжная длина ключа в настоящее время составляет 1024 бит. Для асимметричных алгоритмов, основанных на использовании теории эллиптических кривых, минимальной надёжной длиной ключа считается 163 бит, но рекомендуются длины от 191 бит и выше.

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

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

Таким образом, криптографические ключи подразделяются на:

    • Симметричные ключи – ключи, используемые в симметричных алгоритмах, то есть для выполнения как прямого, так и обратного криптографического преобразования используется один и тот же ключ.

  • Асимметричные ключи – ключи, используемые в асимметричных алгоритмах, то есть, например, для шифрования используется один ключ, а для дешифрования – другой.

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

  • Закрытый ключ (приватный ключ) – ключ, известный только своему владельцу. Только сохранение пользователем в тайне своего закрытого ключа гарантирует невозможность подделки злоумышленником документа и цифровой подписи от имени заверяющего.

  • Открытый ключ (публичный ключ) – ключ, который может быть опубликован и используется, например, для проверки подлинности подписанного документа. Открытый ключ подписи вычисляется, как значение некоторой функции от закрытого ключа, но знание открытого ключа не дает возможности определить закрытый ключ.

В операционной системе Windows криптографические ключи, относящиеся к одному криптопровайдеру, хранятся в специальной базе данных составленной из так называемых контейнеров ключей – частей базы данных ключей, которые содержат пары ключей (пара ключей для обмена ключами и пара ключей для цифровой подписи), принадлежащих определенному пользователю. Каждый контейнер имеет уникальное имя, которое определяется при вызове функции CryptAcquireContext.

Для работы с ключами в CryptoAPI используется специальный тип данных HCRYPTKEY, описание которого приведено в соответствующем приложении. Для создания симметричного одноразового сессионного ключа можно воспользоваться функциями CryptGenKeyили CryptDeriveKey, передав в них соответствующие параметры. Обе функции генерируют криптографический ключ и помещают его в переменную соответствующего типа. Разница между ними заключается в том, что функция CryptGenKey каждый раз генерирует случайный ключ, а функция CryptDeriveKeyгенерирует значение ключа на основе определенных исходных данных, при этом для одинаковых исходных данных гарантируется генерация одинаковых значений ключей.

Генерации асимметричных ключей предшествует создание специального контейнера для их хранения. Для этого при вызове функции CryptAcquireContext необходимо передать в качестве соответствующих параметров имя контейнера ключей и значение CRYPT_NEWKEYSET. После создания контейнера можно сгенерировать пару ключей с помощью функции CryptGenKey.

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

Рис. 4. Схема взаимодействия криптографических функций при создании контейнера и генерации ключей

Для генерация пары ключей для цифровой подписи на соответствующем шаге необходимо передать в функцию CryptGenRandomзначение параметра AT_SIGNATURE. После завершения работы с объектом ключей, его необходимо удалить, вызвав функцию CryptDestroyKey.

Сгенерированные ключи, как уже отмечалось, хранятся в соответствующем ключевом контейнере, из которых составлена база данных ключей. Извлечь уже созданные ключевые пары можно, вызвав функцию CryptGetUserKey с параметром AT_KEYEXCHANGE для получения пары ключей предназначенной для реализации схем распространения ключей и параметром AT_SIGNATURE для получения пары ключей для создания или проверки цифровой подписи.

Задание и контрольные вопросы

  1. Используя функции CryptAcquireContext,CryptGenKey и CryptDestroyKey, создать контейнер ключей для криптопровайдера с типом PROV_RSA_FULL и сгенерировать пару ключей для обмена ключами и пару ключей для цифровой подписи.

  2. Используя функции CryptGetUserKey, CryptDestroyKey и CryptAcquireContext, извлечь пару ключей для обмена ключами и пару ключей для цифровой подписи из контейнера ключей криптопровайдера с типом PROV_RSA_FULL, после чего удалить полученные ключи и сам контейнер.

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

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

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

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

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

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

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

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

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

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

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

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

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

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