Функция CryptDeriveKey (wincrypt.h)
Эта функция аналогична
Дескриптор ключа сеанса возвращается в параметре 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, созданный вызовом
[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 предопределенным значением с побитовойИЛИ операцией. Из-за изменения ограничений управления экспортом длина ключа по
Ниже 16 бит этого параметра может быть равно нулю, или можно указать один или несколько следующих флагов с помощью побитового оператораOR для объединения их.
Ценность | Значение |
---|---|
|
Как правило, при создании ключа сеанса из значения хэ ша Если этот флаг задан, то ключ назначается значение соли на основе неиспользуемых битов хэш-значений. Эту Если этот флаг не задан, ключ получает значение соли в нуле. При экспорте ключей с ненулевыми значениями соли (с помощью CryptExportKey), значение соли также должно быть получено и сохранено с ключом BLOB. |
|
Если этот флаг задан, ключ сеанса можно передать из CSP в ключ BLOB через функцию CryptExportKey. Так как ключи обычно должны быть экспортируемыми, этот флаг обычно должен быть установлен.
Если этот флаг не задан, ключ сеанса не экспортируется. Это означает, что ключ доступен только в текущем сеансе, и только созданное приложение может использовать его. Этот флаг не применяется к парам открытых и закрытых ключей |
|
Этот флаг указывает, что значение соли |
|
Некоторые поставщики СЛУЖБ используют ключи сеансов, производные от нескольких хэш-значений. В этом случае CryptDeriveKey необходимо вызывать несколько раз.
Если этот флаг задан, новый ключ сеанса не создается. Вместо этого ключ, указанный phKey, изменяется. Точное поведение этого флага зависит от типа создаваемого ключа и конкретного используемого CSP. Поставщики служб шифрования Майкрософт игнорируют этот флаг. |
|
Этот флаг используется только с поставщиками Schannel. Если этот флаг задан, созданный ключ является ключом записи сервера; в противном случае это ключ записи клиента. |
[in, out] phKey
Указатель на переменную HCRYPTKEY , чтобы получить адрес дескриптора только что созданного ключа. Завершив использование ключа, отпустите дескриптор, вызвав функцию CryptDekey.
Возвращаемое значение
Если функция выполнена успешно, функция возвращает ненулевое значение (TRUE).
Если функция завершается ошибкой, она возвращает ноль (FALSE). Для получения расширенных сведений об ошибке вызовите GetLastError.
Коды ошибок, предуставленные NTE, создаются конкретным используемым поставщиком служб CSP. Некоторые возможные коды ошибок перечислены в следующей таблице.
Возвращаемый код | Описание |
---|---|
|
Один из параметров задает недопустимый дескриптор. |
|
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель. |
|
Параметр Algid указывает алгоритм, который этот поставщик служб CSP не поддерживает. |
|
Параметр dwFlags |
|
Параметр hBaseData не содержит допустимый дескриптор хэш-объекта. |
|
Предпринята попытка добавить данные в хэш-объект, который уже помечен как "завершен". |
|
Параметр hProv не содержит допустимый дескриптор контекста. |
|
Функция завершилась сбоем каким-то неожиданным образом. |
|
Поставщик не мог выполнить действие, так как контекст был получен как молчаливый. |
Замечания
Если ключи создаются для симметричныеблочных шифров, ключ по умолчанию настраивается в режиме цепочки блоков шифров (CBC) с вектором инициализации нуля. Этот режим шифра предоставляет хороший метод по умолчанию для массового шифрования данных. Чтобы изменить эти параметры, используйте функцию CryptSetKeyParam.
Функция
Чтобы выбрать соответствующую длину ключа , рекомендуется использовать следующие методы.
- Чтобы перечислить алгоритмы, поддерживаемые CSP, и получить максимальную и минимальную длину ключей для каждого алгоритма, вызовите CryptGetProvParam с PP_ENUMALGS_EX.
- Используйте минимальную и максимальную длину ключа, чтобы выбрать соответствующую длину ключа. Не всегда рекомендуется выбрать максимальную длину, так как это может привести к проблемам с производительностью.
- После выбора требуемой длины ключа используйте верхние 16 битов dwFlags, чтобы указать длину ключа.
- Создайте буфер 64-байтов, повторяя константу 0x36 64 раза. Позвольте k быть длиной хэш-значения, представленного входным параметром hBaseData. Задайте первый k байт буфера результатом операции XOR первой k байт буфера с хэш-значением, представленным входным параметром hBaseData.
- Создайте буфер 64-байтов, повторяя константу 0x5C 64 раза. Задайте первый k байт буфера результатом операции XOR первой k байт буфера с хэш-значением, представленным входным параметром hBaseData.
- Хэш результата шага 1 с помощью того же хэш-алгоритма, что и для вычисления хэш-значения, представленного параметром hBaseData.
- Хэшировать результат шага 2 с помощью того же хэш-алгоритма, что и для вычисления хэш-значения, представленного параметром hBaseData.
- Сцепить результат шага 3 с результатом шага 4.
- Используйте первый n байт результата шага 5 в качестве производного ключа.
В следующей таблице перечислены минимальные, стандартные и максимальные длины ключей для ключа сеанса по алгоритму и поставщику.
Поставщик | Алгоритмы | Минимальная длина ключа | Длина ключа по умолчанию | Максимальная длина ключа |
---|---|---|---|---|
База 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 |