Поделиться через


Ключи DSS

Создание и извлечение ключей DSS

Ключи DSS можно создать путем вызова функции CryptGenKey. Вызов CryptGenKey требует, чтобы AT_SIGNATURE или CALG_DSS_SIGN передаваться в аргументе Algid. Этот вызов создаст значения P (prime modulus), Q (prime), G (генератор), X (секрет экспоненции) и Y (открытый ключ) с нуля и сохранит их в ключей BLOB локальному хранилищу.

Создание пары ключей подписи DSS

  1. Вызовите функцию CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.
  2. Вызовите CryptGenKey для создания ключей. Необходимо передать AT_SIGNATURE или CALG_DSS_SIGN для аргумента Algid и верхних 16 битов dwFlags аргумента должны быть заданы требуемый размер ключа. Если верхний 16 бит равен нулю, будет использоваться размер ключа по умолчанию 1024 бита. МаркерHCRYPTKEYвозвращается в аргументе hKey.

Получение указателя на ранее созданные ключи подписи

  1. Вызовите CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.
  2. Вызовите функциюCryptGetUserKey с аргументом dwKeySpec AT_SIGNATURE или CALG_DSS_SIGN.

Получение значений P, Q и G

  1. Вызовите CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.
  2. Вызовите CryptGetUserKey с аргументом dwKeySpec , равным AT_SIGNATURE или CALG_DSS_SIGN.
  3. Вызовите CryptGetKeyParam с аргументом hKey, заданным указателем, извлеченным на предыдущем шаге. Аргумент dwParam должен иметь нужный флаг; KP_P, KP_Q или KP_G. Значение возвращается в аргументе pbData, а длина данных возвращается в аргументе pdwDataLen. Значение возвращается без сведений заголовка и в маленьким формате.

Создание подписей DSS

Данные, подписанные, сначала необходимо хэшировать с помощью алгоритмаSHA. После хэшированных данных создается подпись DSS путем вызова функции CryptSignHash.

Создание подписи DSS

  1. Вызовите CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.
  2. Вызовите CryptCreateHash с аргументом Algid, равным CALG_SHA, чтобы получить дескриптор к хэш-объекту SHA.
  3. Вызовите CryptHashData с аргументом hHash hHash, заданным для дескриптора, полученного на предыдущем шаге. Это создает хэш данных и возвращает дескриптор хэша в аргументе phHash вызова функции CryptCreateH ash.
  4. Вызов CryptSignHash с аргументом hHash hHash, заданным для дескриптора, полученного на предыдущем шаге. В параметре dwKeySpec может передаваться либо AT_SIGNATURE, либо CALG_DSS_SIGN. Подпись возвращается к адресу, указанному в аргументе pbSignature, а длина подписи возвращается адресу, указанному в аргументе pdwSigLen. Указатель NULL может передаваться в аргументе pbSignature и, в данном случае, подпись не создается, но длина подписи возвращается адресу, указанному в параметре pdwSigLen.

Проверка подписи DSS

Чтобы проверить подпись DSS, необходимо импортировать открытый ключ DSS подписи, подписанные данные должны быть хэшированы, а затем можно проверить подпись.

Проверка подписи DSS

  1. Вызовите CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.

  2. Вызовите CryptImportKey для импорта открытого ключа dsS подписи.

  3. Вызовите CryptCreateHash с аргументом Algid, равным CALG_SHA, чтобы получить дескриптор к хэш-объекту SHA.

  4. Вызовите CryptHashData с аргументом hHash hHash, полученный на предыдущем шаге, и с pbData указывая на подписанные данные. Это создает хэш данных и возвращает дескриптор хэша в аргументе phHash вызова функции CryptCreateH ash.

  5. Вызов CryptVerifySignature со следующими параметрами:

    hHash задано для дескриптора хэша, выполняемого на предыдущем шаге.

    pbSignature указывает на проверяемую подпись.

    dwSigLen имеет длину подписи.

    hPubKey устанавливается на дескриптор открытого ключа, импортированного на шаге 2.

    dwFlags равно нулю.

Экспорт ключей DSS

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

Экспорт открытого ключа DSS

  1. Вызовите CryptAcquireContext, чтобы получить дескриптор поставщику шифрования Microsoft DSS.
  2. Вызовите CryptGetUserKey с аргументом dwKeySpec , равным AT_SIGNATURE или CALG_DSS_SIGN.
  3. Вызов CryptExportKey с hKey, заданным для дескриптора, полученного на предыдущем шаге, dwBlobType значение PUBLICKEYBLOB и dwFlags равным нулю. BLOB-объектов с открытым ключом DSS возвращается в pbData, а длинаключа BLOB-объектавозвращается в pdwDataLen. Указатель NULL может передаваться в pbData, и в этом случае будет возвращена только длина BLOB-объекта ключа DSS. BlOB, возвращаемый при вызове CryptExportKey, находится в формате, описанном в BLOB-объектов ключей поставщика DSS.

Экспорт закрытого ключа DSS

  • Выполните ту же процедуру, что и для экспорта открытого ключа DSS, за исключением того, что при вызове CryptExportKeydwBlobType задано значение PRIVATEKEYBLOB. BlOB, возвращаемый при вызове CryptExportKey, находится в формате, описанном в BLOB-объектов ключей поставщика DSS.