Цель лабораторной работы заключается в изучении методов формирования и проверки цифровой подписи.
Задачи лабораторной работы:
рассмотреть понятия цифровой подписи;
изучить описание и исследовать возможности группы функций интерфейса CryptoAPI, реализующих создание и проверку цифровой подписи;
написать программу, осуществляющую вычисление цифровой подписи;
написать программу, осуществляющую проверку цифровой подписи.
Теоретические сведения
Дополнительное преимущество от использования криптосистем с открытым ключом состоит в том, что они предоставляют возможность создания цифровых подписей (ЦП). Цифровая подпись позволяет получателю информации убедиться в достоверности источника информации, а также проверить, соответствует ли полученная информация переданной и не изменилась ли она при передаче. Таким образом, ЦП является средством аутентификации и контроля целостности данных. Кроме того, ЦП несёт принцип невозможности отказа от авторства, который означает, что отправитель, подписавший исходные данные, не может отказаться от факта своего авторства подписанной им информации.
Вычисление ЦП фактически представляет собой асимметричное шифрование хеша исходных подписываемых данных (файла). При этом подписывающая сторона использует секретный, известный только ей, ключ ключевой пары AT_SIGNATURE. Таким образом, процесс формирования ЦП начинается с вычисления хеш-значения подписываемых данных, представленных в виде массива типа BYTE. На следующем шаге необходимо получить дескриптор секретно ключа, соответствующего выбранному криптопровайдеру и алгоритму формирования ЦП. Затем дескриптор хеш-объекта и дескриптор ключа передаются в функцию CryptSignHash, которая непосредственно вычисляет ЦП и записывает её в указанный массив типа BYTE.
Поскольку смысл ЦП – подтверждение подлинности и целостности подписываемых данных, то вполне очевидно, что сторона, проверяющая ЦП, должна обладать такими данными и непосредственно самим значением ЦП. Проверка ЦП начинается с вычисления хеша проверяемых данных. После извлечения открытого ключа, соответствующего секретному ключу, с помощью которого ЦП была получена, дескриптор полученного хеш-объекта и дескриптор открытого ключа передаются в функцию CryptVerifySignature, которая проверяет соответствие ЦП полученным данным. В процессе своего исполнения функция CryptVerifySignature фактически расшифровывает ЦП, получает хеш-значение, которое гарантированно принадлежит подписанным данным, и сверяет его с хешем от полученных данных. Если оба хеша совпадают, то цифровая подпись верна, а полученные данные полностью соответствуют отправленным.
Обобщенная схема взаимодействия криптографических функций, реализующий вычисление и проверку ЦП представлена на рис. 8.
Рис. 8. Схема взаимодействия криптографических функций при вычислении и проверке цифровой подписи
Задание и контрольные вопросы
Используя функции хеширования, CryptGetUserKey, CryptSignHash и иные необходимые функции, реализовать вычисление цифровой подписи для файла любого формата.
Используя функции хеширования, CryptGetUserKey, CryptVerifySignature и иные необходимые функции, реализовать проверку цифровой подписи.
При защите результатов лабораторной работы необходимо представить содержащий их отчет и продемонстрировать свои теоретические знания и практические навыки согласно выполненному заданию.
Перечень категорий вопросов при защите результатов лабораторной работы:
Схема взаимодействия криптографических функций при вычислении и проверке цифровой подписи.
Описание и назначение криптографического типа данных HCRYPTPROV.
Описание и назначение криптографического типа данных ALG_ID.
Описание и назначение криптографического типа данных HCRYPTKEY.
Описание и назначение криптографического типа данных HCRYPTHASH.
Описание функции CryptCreateHash и её параметров.
Описание функции CryptHashDataи её параметров.
Описание функции CryptGetUserKey и её параметров.
Описание функции CryptSignHash и её параметров.
Описание функции CryptVerifySignature и её параметров.
Прочие вопросы, связанные с особенностями применения языков программирования C/C++ при работе с CryptoAPI.
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; |
Таблица.П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 |
могут быть различными |
могут быть различными |
Таблица П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 |