Материал: Методические указания к выполнению лабораторных работ по дисциплине «Методы программирования» для студентов специальности «Компьютерная безопасность». Куликов С.С

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторная работа №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.

Лабораторная работа №4 Шифрование и дешифрование

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

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

  • рассмотреть особенности симметричного и асимметричного шифрования;

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

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

  • написать программу, реализующую шифрование по симметричной схеме;

  • написать программу, реализующую дешифрование по симметричной схеме;

  • написать программу, реализующую шифрование по гибридной схеме;

  • написать программу, реализующую дешифрование по гибридной схеме.

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

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

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

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

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

Однако в CryptoAPI эта задача решается с помощью, так называемой, гибридной криптографии. В процессе шифрования с помощью функции CryptGenKey создается одноразовый (сеансовый) ключ. Это симметричный ключ, то есть один и тот же ключ используется и для шифрования, и для дешифрования. Одноразовым или сеансовым он называется потому, что используется для шифрования/дешифрования только одного сообщения. На сеансовом ключе с помощью функции CryptEncrypt исходные данные, представленные в виде массива типа BYTE, шифруются. Затем сам сеансовый ключ зашифровывается по асимметричному алгоритму на открытом (публичном) ключе с помощью функции экспорта ключа CryptExportKey. Поскольку ключ шифрования представляет собой сравнительно небольшой объем данных, шифрование такого ключа не занимает много времени. Таким образом, основное требование к процессу шифрования по асимметричному алгоритму – чтобы к закрытому ключу обмена никто не имел доступа, кроме владельца этого ключа – соблюдается. Обобщенная схема взаимодействия криптографических функций, реализующих шифрование согласно гибридной схеме, представлена на рис. 6.

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

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

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

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

  1. Используя функции хеширования, CryptDeriveKey, CryptEncrypt и иные необходимые функции, реализовать шифрование по симметричной схеме.

  2. Используя функции хеширования, CryptDeriveKey, CryptDecrypt и иные необходимые функции, реализовать дешифрование по симметричной схеме.

  3. Используя функции CryptGetUserKey, CryptEncrypt, CryptExportKey и иные необходимые функции, реализовать шифрование по гибридной схеме.

  4. Используя функции CryptGetUserKey, CryptImportKey, CryptDecrypt и иные необходимые функции, реализовать дешифрование по гибридной схеме.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник: https://studfile.net/preview/16567454/