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

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

Лабораторная работа №5 Создание и проверка цифровой подписи

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

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

  • рассмотреть понятия цифровой подписи;

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

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

  • написать программу, осуществляющую проверку цифровой подписи.

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

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

Вычисление ЦП фактически представляет собой асимметричное шифрование хеша исходных подписываемых данных (файла). При этом подписывающая сторона использует секретный, известный только ей, ключ ключевой пары AT_SIGNATURE. Таким образом, процесс формирования ЦП начинается с вычисления хеш-значения подписываемых данных, представленных в виде массива типа BYTE. На следующем шаге необходимо получить дескриптор секретно ключа, соответствующего выбранному криптопровайдеру и алгоритму формирования ЦП. Затем дескриптор хеш-объекта и дескриптор ключа передаются в функцию CryptSignHash, которая непосредственно вычисляет ЦП и записывает её в указанный массив типа BYTE.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приложения Приложение 1. Криптографические типы данных

  • ALG_ID

Этот тип данных предполагает хранение идентификатора криптографического алгоритма. Большинство функций Crypto API не содержат параметров с таким типом. Тип данных определен в заголовочном файле Wincrypt.h:

typedef unsigned int ALG_ID;

  • HCRYPTHASH

Этот тип данных представляет собой дескриптор хеш-объектов. Он может передаваться криптопровайдеру для выполнения какой-либо конкретной операции с ним. При этом криптопровайдеру не разрешено прямое манипулирование хеш-объектом – вместо него используется дескриптор хеш-объекта. Тип данных определен в заголовочном файле Wincrypt.h:

typedefunsignedlong HCRYPTHASH;

  • HCRYPTKEY

Этот тип данных представляет собой дескриптор объекта ключей. Он может передаваться криптопровайдеру для выполнения какой-либо конкретной операции с ним. При этом криптопровайдеру не разрешено прямое обращение к ключу – вместо этого используется дескриптор ключа. Тип данных определен в заголовочном файле Wincrypt.h:

typedefunsignedlong HCRYPTKEY;

  • HCRYPTPROV

Этот тип данных представляет собой дескриптор криптопровайдера. Он указывает, какой именно криптопровайдер будет вызван для выполнения криптографических функций. Тип данных определен в файле Wincrypt.h:

typedefunsignedlong HCRYPTPROV;

Приложение 2. Идентификаторы типов криптопровайдеров

Таблица.П1

Идентификаторы типов криптопровайдеров

Идентификатор типа криптопровайдера

Алгоритмы обмена ключами

Алгоритмы цифровой подписи

Алгоритмы шифрования

Алгоритмы хеширования

PROV_RSA_FULL

RSA

RSA

RC2, RC4

MD5, SHA

PROV_RSA_AES

RSA

RSA

RC2, RC4, AES

MD5, SHA

PROV_RSA_SIG

нет

RSA

нет

MD5, SHA

PROV_RSA_SCHANNEL

RSA

RSA

RC4, DES, 3DES

MD5, SHA

PROV_DSS

нет

DSS

нет

MD5, SHA

PROV_DH_SCHANNEL

Diffie-Hellman

DSS

DES, 3DES

MD5, SHA

Продолжение табл. П1

Идентификатор типа криптопровайдера

Алгоритмы обмена ключами

Алгоритмы цифровой подписи

Алгоритмы шифрования

Алгоритмы хеширования

PROV_DH_SCHANNEL

Diffie-Hellman

DSS

DES, 3DES

MD5, SHA

PROV_FORTEZZA

KEA

DSS

Skipjack

SHA

PROV_MS_EXCHANGE

RSA

RSA

CAST

MD5

PROV_SSL

RSA

RSA

могут быть различными

могут быть различными

Приложение 3. Идентификаторы имен криптопровайдеров

Таблица П2

Идентификаторы имен криптопровайдеров

Идентификатор имени криптопровайдера

Имя криптопровайдера

Идентификатор типа криптопровайдера

MS_DEF_ PROV

MicrosoftBase

CryptographicProvider

PROV_RSA_FULL

MS_STRONG_PROV

MicrosoftStrong

CryptographicProvider

PROV_RSA_FULL

MS_ENHANCED_PROV

MicrosoftEnhanced

CryptographicProvider

PROV_RSA_FULL

MS_ENH_RSA_AES_PROV

Microsoft AES

CryptographicProvider

PROV_RSA_AES

MS_DEF_DSS_PROV

Microsoft DSS

CryptographicProvider

PROV_DSS

MS_DEF_DSS_DH_PROV

Microsoft Base

DSS and Diffie-Hellman

Cryptographic Provider

PROV_DSS_DH

Продолжение табл. П 1.

Идентификатор имени криптопровайдера

Имя криптопровайдера

Идентификатор типа криптопровайдера

MS_ENH_DSS_DH_PROV

Microsoft Enhanced

DSS and Diffie-Hellman

Cryptographic Provider

PROV_DSS_DH

MS_DEF_DH_SCHANNEL_PROV

Microsoft DSS and Diffie-Hellman/Schannel

Cryptographic Provider

PROV_DH_ SCHANNEL

MS_DEF_RSA_SCHANNEL_PROV

Microsoft RSA/Schannel

Cryptographic Provider

PROV_RSA_ SCHANNEL

MS_DEF_RSA_SIG_PROV

Microsoft RSA Signature

Cryptographic Provider

PROV_RSA_SIG

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