Ключи DSS
Создание и получение ключей DSS
Ключи DSS можно создать путем вызова функции CryptGenKey . Вызов CryptGenKey требует, чтобы AT_SIGNATURE или CALG_DSS_SIGN передаваться в аргументе Algid . Этот вызов создаст значения P (основной модуль), Q (prime), G (генератор), X (показатель секрета) и Y (открытый ключ) с нуля и сохранит их в ключевом BLOB-объекте в локальном хранилище.
Создание пары ключей сигнатуры DSS
- Вызовите функцию CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
- Вызовите CryptGenKey для создания ключей. Для аргумента Algid необходимо передать AT_SIGNATURE или CALG_DSS_SIGN, а для верхних 16 бит аргумента dwFlags необходимо задать нужный размер ключа. Если верхние 16 бит равны нулю, будет использоваться размер ключа по умолчанию в 1024 бита. Дескриптор HCRYPTKEY возвращается в аргументе hKey .
Получение указателя на ранее созданные ключи подписи
- Вызовите CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
- Вызовите функцию CryptGetUserKey с аргументом dwKeySpec , равным AT_SIGNATURE или CALG_DSS_SIGN.
Получение значений P, Q и G
- Вызовите CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
- Вызовите CryptGetUserKey с аргументом dwKeySpec , равным AT_SIGNATURE или CALG_DSS_SIGN.
- Вызовите CryptGetKeyParam с аргументом hKey , заданным для указателя, полученного на предыдущем шаге. Аргументу dwParam необходимо задать нужный флаг; KP_P, KP_Q или KP_G. Значение возвращается в аргументе pbData , а длина данных возвращается в аргументе pdwDataLen . Значение возвращается без сведений о заголовке и в формате с небольшим байтом .
Создание подписей DSS
Данные, которые необходимо подписать, сначала необходимо хэшировать с помощью алгоритма SHA . После хэширования данных создается сигнатура DSS путем вызова функции CryptSignHash .
Создание подписи DSS
- Вызовите CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
- Вызовите CryptCreateHash с аргументом Algid , для которого задано значение CALG_SHA, чтобы получить дескриптор хэш-объекта SHA.
- Вызовите CryptHashData с аргументом hHash , заданным для дескриптора, полученного на предыдущем шаге. При этом создается хэш данных и возвращается дескриптор хэша в аргументе phHash вызова функции CryptCreateHash .
- Вызовите CryptSignHash с аргументом hHash , заданным для дескриптора, полученного на предыдущем шаге. В параметре dwKeySpec можно передать AT_SIGNATURE или CALG_DSS_SIGN. Подпись возвращается по адресу, указанному в аргументе pbSignature , а длина подписи возвращается на адрес, указанный в аргументе pdwSigLen . В аргументе pbSignature может быть передан указатель NULL, и в этом случае подпись не создается, но длина подписи возвращается на адрес, указанный в параметре pdwSigLen.
Проверка подписи DSS
Чтобы проверить подпись DSS, необходимо импортировать открытый ключ DSS подписывателя, хэшировать подписанные данные , а затем проверить подпись.
Проверка подписи DSS
Вызовите CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
Вызовите CryptImportKey , чтобы импортировать открытый ключ DSS подписывателя.
Вызовите CryptCreateHash с аргументом Algid , для которого задано значение CALG_SHA, чтобы получить дескриптор хэш-объекта SHA.
Вызовите CryptHashData с аргументом hHash, заданным для дескриптора, полученного на предыдущем шаге, и с параметром pbData, указывающим на подписанные данные. При этом создается хэш данных и возвращается дескриптор хэша в аргументе phHash вызова функции CryptCreateHash .
Вызовите CryptVerifySignature со следующими параметрами:
Для hHash задается дескриптор хэша, выполненного на предыдущем шаге.
pbSignature указывает на проверяемую подпись.
DwSigLen имеет длину подписи.
Для hPubKey задан дескриптор открытого ключа, импортированного на шаге 2.
DwFlags имеет нулевое значение.
Экспорт ключей DSS
Когда вы отправляете подписанные данные пользователю, где подпись должна быть проверена получателем, открытый ключ подписывателя должен быть предоставлен получателю и обычно отправляется вместе с подписанными данными. Поэтому необходимо иметь возможность экспортировать ключи DSS в формате большого двоичного объекта ключа .
Экспорт открытого ключа DSS
- Вызовите CryptAcquireContext , чтобы получить дескриптор поставщика шифрования Microsoft DSS.
- Вызовите CryptGetUserKey с аргументом dwKeySpec , равным AT_SIGNATURE или CALG_DSS_SIGN.
- Вызовите CryptExportKey с параметром hKey , установленным для дескриптора, полученного на предыдущем шаге, dwBlobType — значение PUBLICKEYBLOB, а dwFlags — равным нулю. Большой двоичный объект открытого ключа DSS возвращается в pbData, а длина ключа — в pdwDataLen. В pbData может быть передан указатель NULL, и в этом случае возвращается только длина большого двоичного объекта ключа DSS. Большой двоичный объект, возвращаемый при вызове CryptExportKey , имеет формат, описанный в разделе Blob-объекты ключа поставщика DSS.
Экспорт закрытого ключа DSS
- Выполните ту же процедуру, что и для экспорта открытого ключа DSS, за исключением того, что при вызове CryptExportKeyдля параметра dwBlobType задано значение PRIVATEKEYBLOB. Большой двоичный объект, возвращаемый при вызове CryptExportKey , имеет формат, описанный в разделе Blob-объекты ключа поставщика DSS.