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


Функция CryptDeriveKey (wincrypt.h)

Важные этот API не рекомендуется. Новое и существующее программное обеспечение должно начинаться с API следующего поколения шифрования. Корпорация Майкрософт может удалить этот API в будущих выпусках.
 
Функция CryptDeriveKey создает ключи сеансов криптографических , производные от значения базовых данных. Эта функция гарантирует, что если используются те же поставщик криптографических служб (CSP) и алгоритмы, ключи, созданные из одних и того же базового данных, идентичны. Базовые данные могут быть паролем или другими пользовательскими данными.

Эта функция аналогична CryptGenKey, за исключением того, что созданные ключи сеансов,, являются производными от базовых данных, а не случайными. CryptDeriveKey можно использовать только для создания ключей сеансов. Не удается создать пары открытых и закрытых ключей .

Дескриптор ключа сеанса возвращается в параметре phKey. Этот дескриптор можно использовать с любой функцией CryptoAPI, требующей дескриптора ключа.

Синтаксис

BOOL CryptDeriveKey(
  [in]      HCRYPTPROV hProv,
  [in]      ALG_ID     Algid,
  [in]      HCRYPTHASH hBaseData,
  [in]      DWORD      dwFlags,
  [in, out] HCRYPTKEY  *phKey
);

Параметры

[in] hProv

Дескриптор HCRYPTPROV CSP, созданный вызовом CryptAcquireContext.

[in] Algid

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

Дополнительные сведения об ALG_ID значениях, используемых с поставщиком шифрования Microsoft Base, см. в алгоритмов базовых поставщиков. Дополнительные сведения о значениях ALG_ID, используемых с поставщиком шифрования Microsoft Strong или поставщиком расширенного шифрования Майкрософт, см. в расширенных алгоритмов поставщиков.

[in] hBaseData

Дескриптор хэш-объекта , который был предоставлен точным базовым данным.

Чтобы получить этот дескриптор, приложение должно сначала создать хэш-объект с CryptCreateHash, а затем добавить базовые данные в хэш-объект с CryptHashData. Этот процесс подробно описан в хэши и цифровые подписи.

[in] dwFlags

Указывает тип созданного ключа.

Размеры ключа сеанса можно задать при создании ключа. Размер ключа, представляющий длину модуля ключа в битах, устанавливается с верхними 16 битами этого параметра. Таким образом, если создается 128-разрядный - сеансовый ключ, значение 0x00800000 объединяется с любым другим dwFlags предопределенным значением с побитовойИЛИ операцией. Из-за изменения ограничений управления экспортом длина ключа по умолчанию и CSP по умолчанию могут меняться между выпусками операционной системы. Важно, чтобы шифрование и расшифровка использовали один И тот же CSP и что длина ключа должна быть явно задана с помощью параметра dwFlags для обеспечения взаимодействия на разных платформах операционной системы.

Ниже 16 бит этого параметра может быть равно нулю, или можно указать один или несколько следующих флагов с помощью побитового оператораOR для объединения их.

Ценность Значение
CRYPT_CREATE_SALT
Как правило, при создании ключа сеанса из значения хэ ша хэша есть несколько оставшихся битов. Например, если хэш-значение равно 128 битам, а ключ сеанса равен 40 битам, осталось 88 битов.

Если этот флаг задан, то ключ назначается значение соли на основе неиспользуемых битов хэш-значений. Эту значение соли можно получить с помощью функции CryptGetKeyParam с параметром dwParam dwParam, равным KP_SALT.

Если этот флаг не задан, ключ получает значение соли в нуле.

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

CRYPT_EXPORTABLE
Если этот флаг задан, ключ сеанса можно передать из CSP в ключ BLOB через функцию CryptExportKey. Так как ключи обычно должны быть экспортируемыми, этот флаг обычно должен быть установлен.

Если этот флаг не задан, ключ сеанса не экспортируется. Это означает, что ключ доступен только в текущем сеансе, и только созданное приложение может использовать его.

Этот флаг не применяется к парам открытых и закрытых ключей .

CRYPT_NO_SALT
Этот флаг указывает, что значение соли не выделяется для 40-разрядного симметричного ключа. Дополнительные сведения см. в функциональных возможностяхзначений соли.
CRYPT_UPDATE_KEY
Некоторые поставщики СЛУЖБ используют ключи сеансов, производные от нескольких хэш-значений. В этом случае CryptDeriveKey необходимо вызывать несколько раз.

Если этот флаг задан, новый ключ сеанса не создается. Вместо этого ключ, указанный phKey, изменяется. Точное поведение этого флага зависит от типа создаваемого ключа и конкретного используемого CSP.

Поставщики служб шифрования Майкрософт игнорируют этот флаг.

CRYPT_SERVER
1024 (0x400)
Этот флаг используется только с поставщиками Schannel. Если этот флаг задан, созданный ключ является ключом записи сервера; в противном случае это ключ записи клиента.

[in, out] phKey

Указатель на переменную HCRYPTKEY , чтобы получить адрес дескриптора только что созданного ключа. Завершив использование ключа, отпустите дескриптор, вызвав функцию CryptDekey.

Возвращаемое значение

Если функция выполнена успешно, функция возвращает ненулевое значение (TRUE).

Если функция завершается ошибкой, она возвращает ноль (FALSE). Для получения расширенных сведений об ошибке вызовите GetLastError.

Коды ошибок, предуставленные NTE, создаются конкретным используемым поставщиком служб CSP. Некоторые возможные коды ошибок перечислены в следующей таблице.

Возвращаемый код Описание
ERROR_INVALID_HANDLE
Один из параметров задает недопустимый дескриптор.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_ALGID
Параметр Algid указывает алгоритм, который этот поставщик служб CSP не поддерживает.
NTE_BAD_FLAGS
Параметр dwFlags содержит недопустимое значение.
NTE_BAD_HASH
Параметр hBaseData не содержит допустимый дескриптор хэш-объекта.
NTE_BAD_HASH_STATE
Предпринята попытка добавить данные в хэш-объект, который уже помечен как "завершен".
NTE_BAD_UID
Параметр hProv не содержит допустимый дескриптор контекста.
NTE_FAIL
Функция завершилась сбоем каким-то неожиданным образом.
NTE_SILENT_CONTEXT
Поставщик не мог выполнить действие, так как контекст был получен как молчаливый.

Замечания

Если ключи создаются для симметричныеблочных шифров, ключ по умолчанию настраивается в режиме цепочки блоков шифров (CBC) с вектором инициализации нуля. Этот режим шифра предоставляет хороший метод по умолчанию для массового шифрования данных. Чтобы изменить эти параметры, используйте функцию CryptSetKeyParam.

Функция CryptDeriveKey завершает хэш-. После вызова CryptDeriveKey больше данных не можно добавить в хэш. Сбой дополнительных вызовов CryptHashData или CryptHashSession Key. После завершения работы приложения с хэшем необходимо вызвать CryptDeskHash, чтобы уничтожить хэш-объект.

Чтобы выбрать соответствующую длину ключа , рекомендуется использовать следующие методы.

  • Чтобы перечислить алгоритмы, поддерживаемые CSP, и получить максимальную и минимальную длину ключей для каждого алгоритма, вызовите CryptGetProvParam с PP_ENUMALGS_EX.
  • Используйте минимальную и максимальную длину ключа, чтобы выбрать соответствующую длину ключа. Не всегда рекомендуется выбрать максимальную длину, так как это может привести к проблемам с производительностью.
  • После выбора требуемой длины ключа используйте верхние 16 битов dwFlags, чтобы указать длину ключа.
Позвольте n быть требуемой длиной производного ключа в байтах. Производный ключ — это первый n байт хэша после завершения вычисления хэша CryptDeriveKey. Если хэш не является членом семейства SHA-2, а необходимый ключ предназначен для 3DES или AES, ключ является производным следующим образом:
  1. Создайте буфер 64-байтов, повторяя константу 0x36 64 раза. Позвольте k быть длиной хэш-значения, представленного входным параметром hBaseData. Задайте первый k байт буфера результатом операции XOR первой k байт буфера с хэш-значением, представленным входным параметром hBaseData.
  2. Создайте буфер 64-байтов, повторяя константу 0x5C 64 раза. Задайте первый k байт буфера результатом операции XOR первой k байт буфера с хэш-значением, представленным входным параметром hBaseData.
  3. Хэш результата шага 1 с помощью того же хэш-алгоритма, что и для вычисления хэш-значения, представленного параметром hBaseData.
  4. Хэшировать результат шага 2 с помощью того же хэш-алгоритма, что и для вычисления хэш-значения, представленного параметром hBaseData.
  5. Сцепить результат шага 3 с результатом шага 4.
  6. Используйте первый n байт результата шага 5 в качестве производного ключа.
Поставщик полнофункциональная криптографическая служба RSA по умолчанию — надежный поставщик шифрования Microsoft RSA. По умолчанию поставщик служб шифрования DSS Diffie-Hellman поставщик служб шифрования — это поставщик расширенных служб DSS майкрософт Diffie-Hellman шифрования. Каждая из этих ПОСТАВЩИКОВ по умолчанию имеет 128-разрядную длину симметричного ключа для RC2 и RC4.

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

Поставщик Алгоритмы Минимальная длина ключа Длина ключа по умолчанию Максимальная длина ключа
База MS RC4 и RC2 40 40 56
База MS DES 56 56 56
Расширенный MS RC4 и RC2 40 128 128
Расширенный MS DES 56 56 56
Расширенный MS 3DES 112 112 112 112
Расширенный MS 3DES 168 168 168
MS Strong RC4 и RC2 40 128 128
MS Strong DES 56 56 56
MS Strong 3DES 112 112 112 112
MS Strong 3DES 168 168 168
База DSS/DH RC4 и RC2 40 40 56
База DSS/DH Cylink MEK 40 40 40
База DSS/DH DES 56 56 56
DSS/DH Enh RC4 и RC2 40 128 128
DSS/DH Enh Cylink MEK 40 40 40
DSS/DH Enh DES 56 56 56
DSS/DH Enh 3DES 112 112 112 112
DSS/DH Enh 3DES 168 168 168
 

Примеры

Пример, использующий эту функцию, см. в разделе Пример программы C: извлечение ключа сеанса изпаролей.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка wincrypt.h
библиотеки Advapi32.lib
DLL Advapi32.dll

См. также

CryptAcquireContext

CryptCreateHash

CryptDeskHash

CryptDeskkey

CryptExportKey

CryptGenKey

CryptGetKeyParam

CryptHashData

CryptHashSessionKey

CryptSetKeyParam

функции создания ключей и функций Exchange