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

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

Базовый поставщик шифрования Майкрософт не разрешает задавать значения для ключей обмена ключами или ключей подписи; однако пользовательские поставщики могут определять значения, которые можно задать для его ключей.

Синтаксис

BOOL CryptSetKeyParam(
  [in] HCRYPTKEY  hKey,
  [in] DWORD      dwParam,
  [in] const BYTE *pbData,
  [in] DWORD      dwFlags
);

Параметры

[in] hKey

Дескриптор ключа, для которого необходимо задать значения.

[in] dwParam

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

Для всех типов ключей этот параметр может содержать одно из следующих значений.

Значение Значение
KP_ALGID
pbData указывает на соответствующий ALG_ID. Это используется при обмене ключами сеанса с microsoft Base Digital Signature Standard (DSS), Diffie-Hellman поставщиком шифрования или совместимыми CSP. После согласования ключа с функцией CryptImportKey ключ сеанса включается для использования, задав тип алгоритма.
KP_CERTIFICATE
pbData — это адрес буфера, содержащего сертификат X.509, закодированный с помощью Distinguished Encoding Rules (DER). Открытый ключ в сертификате должен соответствовать соответствующей подписи или ключу обмена.
KP_PERMISSIONS
pbData указывает на значение DWORD , указывающее ноль или более флагов разрешений. Описание этих флагов см. в разделе CryptGetKeyParam.
KP_SALT
pbData указывает на массив BYTE , указывающий новое значение соли , которое будет сделано частью ключа сеанса. Размер значения соли зависит от используемого CSP. Прежде чем задать это значение, определите размер значения соли, вызвав функцию CryptGetKeyParam . Значения salt используются, чтобы сделать ключи сеанса более уникальными, что усложняет атаки по словарю. Значение соли по умолчанию равно нулю для базового поставщика шифрования Майкрософт.
KP_SALT_EX
pbData указывает на CRYPT_INTEGER_BLOB структуру, содержащую соль. Дополнительные сведения см. в разделе Указание значения соли.
 

Если ключ стандарта цифровой подписи (DSS) указан параметром hKey , для значения dwParam также можно задать одно из следующих значений.

Значение Значение
KP_G
pbData указывает на генератор G из BLOB-объекта ключа DSS. Данные имеют форму структуры CRYPT_INTEGER_BLOB , где элемент pbData — это значение, а член cbData — это длина значения. Ожидается, что значение не содержит сведений о заголовке и имеет конечную форму.
KP_P
pbData указывает на основной модуль P большого двоичного объекта ключа DSS. Данные в виде структуры CRYPT_INTEGER_BLOB . Элемент pbData — это значение, а член cbData — это длина значения. Ожидается, что значение не содержит сведений о заголовке и имеет конечную форму.
KP_Q
pbData указывает на основной Q большого двоичного объекта ключа DSS. Данные имеют форму структуры CRYPT_INTEGER_BLOB , где элемент pbData — это значение, а член cbData — это длина значения. Ожидается, что значение не содержит сведений о заголовке и имеет конечную форму.
KP_X
После установки значений P, Q и G функцию CryptSetKeyParam можно выполнить вызов, указывающий значение KP_X для dwParam и NULL для параметра pbData. Это приводит к созданию значений X и Y.
 

Если ключ алгоритма Диффи-Хелмана или алгоритма цифровой подписи (DSA) указан с помощью hKey, для значения dwParam также можно задать одно из следующих значений.

Значение Значение
KP_CMS_DH_KEY_INFO
Задает сведения для импортированного ключа Diffie-Hellman . Параметр pbData — это адрес структуры CMS_DH_KEY_INFO , содержащей задающиеся ключевые сведения.
KP_PUB_PARAMS
Задает открытые параметры (P, Q, G и т. д.) ключа DSS или Diffie-Hellman. Дескриптор ключа для этого ключа должен находиться в состоянии PREGEN, созданном с помощью флага CRYPT_PREGEN. Параметр pbData должен быть указателем на структуру DATA_BLOB , где данные в этой структуре являются DHPUBKEY_VER3 или DSSPUBKEY_VER3 BLOB. Функция копирует открытые параметры из этой структуры CRYPT_INTEGER_BLOB в дескриптор ключа. После выполнения этого вызова значение параметра KP_X следует использовать с CryptSetKeyParam для создания фактического закрытого ключа. Параметр KP_PUB_PARAMS используется как один вызов, а не несколько вызовов со значениями параметров KP_P, KP_Q и KP_G.
 

Если ключ сеансаблочного шифра указан параметром hKey, для значения dwParam также можно задать одно из следующих значений.

Значение Значение
KP_EFFECTIVE_KEYLEN
Этот тип значения можно использовать только с ключами RC2 и добавлен из-за реализации функции CryptSetKeyParam в поставщике расширенного шифрования Майкрософт до Windows 2000. В предыдущей реализации ключи RC2 в расширенном поставщике имели длину 128 бит, но эффективная длина ключа, используемая для расширения ключей в таблицу ключей, составляла всего 40 бит. Это уменьшило прочность алгоритма до 40 бит. Для обеспечения обратной совместимости предыдущая реализация останется прежней. Однако эффективная длина ключа может быть больше 40 бит с помощью KP_EFFECTIVE_KEYLEN в вызове CryptSetKeyParam . Эффективная длина ключа передается в параметре pbData в качестве указателя на значение DWORD с эффективным значением длины ключа. Минимальная эффективная длина ключа в базовом поставщике шифрования Майкрософт составляет один, а максимальная — 40. В поставщике расширенного шифрования Майкрософт минимальное значение равно 1, а максимальное — 1024. Длина ключа должна быть задана перед шифрованием или расшифровкой с помощью ключа.
KP_HIGHEST_VERSION
Задает максимально допустимую версию TLS. Это свойство применяется только к ключам SSL и TLS. Параметр pbData — это адрес переменной DWORD , содержащей самый высокий поддерживаемый номер версии TLS.
KP_IV
pbData указывает на массив BYTE , указывающий вектор инициализации. Этот массив должен содержать элементы BlockLength/8. Например, если длина блока составляет 64 бита, вектор инициализации состоит из 8 байт.

Вектор инициализации по умолчанию равен нулю для базового поставщика шифрования Майкрософт.

KP_KEYVAL
Задайте значение ключа для стандартного ключа шифрования данных (DES). Параметр pbData — это адрес буфера, содержащего ключ. Длина этого буфера должна совпадать с длиной ключа. Это свойство применяется только к ключам DES.
KP_PADDING
Установите режим заполнения. Параметр pbData является указателем на значение DWORD , которое получает числовой идентификатор, идентифицирующий метод заполнения , используемый шифром. Это может быть одно из следующих значений.
PKCS5_PADDING
Указывает метод заполнения PKCS 5 (сек 6.2).
RANDOM_PADDING
Заполнение использует случайное число. Этот метод заполнения не поддерживается поставщиками служб конфигурации, предоставленными Корпорацией Майкрософт.
ZERO_PADDING
Заполнение использует нули. Этот метод заполнения не поддерживается поставщиками служб конфигурации, предоставленными Корпорацией Майкрософт.
KP_MODE
pbData указывает на значение DWORD , указывающее используемый режим шифра . Список определенных режимов шифра см. в разделе CryptGetKeyParam. Режим шифра по умолчанию CRYPT_MODE_CBC для базового поставщика шифрования Майкрософт.
KP_MODE_BITS
pbData указывает на значение DWORD , указывающее количество битов, обработанных в цикле при использовании режима шифрования обратной связи на выходе (OFB) или cipher Feedback (CFB). Число битов, обрабатываемых в цикле, по умолчанию равно 8 для базового поставщика служб шифрования Майкрософт.
 

Если ключ RSA указан в параметре hKey , значение параметра dwParam может быть следующим.

Значение Значение
KP_OAEP_PARAMS
Задайте параметры Оптимальное заполнение асимметричного шифрования (OAEP) (PKCS #1 версии 2) для ключа. Параметр pbData — это адрес структуры CRYPT_DATA_BLOB , содержащей метку OAEP. Это свойство применяется только к ключам RSA.
 

Обратите внимание, что следующие значения не используются:

  • KP_ADMIN_PIN
  • KP_CMS_KEY_INFO
  • KP_INFO
  • KP_KEYEXCHANGE_PIN
  • KP_PRECOMP_MD5
  • KP_PRECOMP_SHA
  • KP_PREHASH
  • KP_PUB_EX_LEN
  • KP_PUB_EX_VAL
  • KP_RA
  • KP_RB
  • KP_ROUNDS
  • KP_RP
  • KP_SIGNATURE_PIN
  • KP_Y

[in] pbData

Указатель на буфер, инициализированный со значением, которое необходимо задать перед вызовом CryptSetKeyParam. Форма этих данных зависит от значения dwParam.

[in] dwFlags

Используется только при KP_ALGID dwParam . Параметр dwFlags используется для передачи значений флагов для включенного ключа. Параметр dwFlags может содержать такие значения, как размер ключа и другие значения флагов, допустимые при создании ключа того же типа с помощью CryptGenKey. Сведения о допустимых значениях флагов см. в разделе CryptGenKey.

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

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

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

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

Код возврата Описание
ERROR_BUSY
Контекст CSP в настоящее время используется другим процессом.
ERROR_INVALID_HANDLE
Один из параметров указывает недопустимый дескриптор.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_FLAGS
Параметр dwFlags не равен нулю, или буфер pbData содержит недопустимое значение.
NTE_BAD_TYPE
Параметр dwParam указывает неизвестный параметр.
NTE_BAD_UID
Не удается найти контекст CSP, указанный при создании ключа hKey .
NTE_FAIL
Сбой функции каким-то непредвиденным образом.
NTE_FIXEDPARAMETER
Некоторые CSP имеют жестко заданные значения P, Q и G. В этом случае эта ошибка возникает при использовании KP_P, KP_Q и KP_G для значения dwParam .

Комментарии

Если параметры KP_Q, KP_P или KP_X заданы для ключа PREGEN Diffie-Hellman или DSS, длина ключа должна быть совместима с длиной ключа , заданной с помощью верхних 16 бит параметра dwFlags при создании ключа с помощью CryptGenKey. Если длина ключа не задана в CryptGenKey, используется длина ключа по умолчанию. Это приведет к ошибке, если для задания P, Q или X используется длина ключа, не являющегося по умолчанию.

Примеры

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

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header wincrypt.h
Библиотека Advapi32.lib
DLL Advapi32.dll

См. также раздел

ALG_ID

CryptGenKey

CryptGetKeyParam

CryptImportKey

Функции создания ключей и обмена