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


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

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

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

Синтаксис

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

Параметры

[in] hKey

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

[in] dwParam

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

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

Ценность Значение
KP_ALGID
pbData указывает на соответствующий ALG_ID. Это используется при обмене ключами сеансов с помощью стандарта DSS( Microsoft Base Digital Signature Standard), Diffie-Hellman поставщика шифрования или совместимых поставщиков служб. После согласования ключа с функцией CryptImportKey ключ сеанса можно использовать, задав его тип алгоритма.
KP_CERTIFICATE
pbData — это адрес буфера, который содержит сертификат X.509, который был закодирован с помощью различающихся правил кодирования (DER). Открытый ключ в сертификате должен соответствовать соответствующему сигнатуре или ключу exchange.
KP_PERMISSIONS
pbData указывает на значение DWORD, указывающее ноль или больше флагов разрешений. Описание этих флагов см. в разделе CryptGetKeyParam.
KP_SALT
pbData указывает на массив BYTE, указывающий новое значение соли, которое необходимо сделать частью ключа сеанса. Размер значения соли зависит от используемого CSP. Перед заданием этого значения определите размер значения соли, вызвав функцию CryptGetKeyParam. Значения соли используются для повышения уникальности ключей сеанса, что затрудняет атаки словаря. Значение соли по умолчанию равно нулю для поставщика шифрования Microsoft Base.
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 вызов, указывающий значение KP_X для dwParam и NULL для параметра pbData можно выполнить в функцию CryptSetKeyParam. Это приводит к созданию значений X и Y.
 

Если ключ алгоритма Diffie-Hellman или алгоритма цифровой подписи (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 с эффективным значением длины ключа. Минимальная эффективная длина ключа в поставщике шифрования Microsoft Base — одна, а максимальная — 40. В расширенном поставщике шифрования Майкрософт минимальное значение равно 1, а максимальное — 1024. Длина ключа должна быть задана перед шифрованием или расшифровкой с помощью ключа.
KP_HIGHEST_VERSION
Задает максимальную разрешенную версию (TLS). Это свойство применяется только к ключам SSL и TLS. Параметр pbData — это адрес переменной DWORD , содержащей самый высокий поддерживаемый номер версии TLS.
KP_IV
pbData указывает на массив BYTE, указывающий вектор инициализации. Этот массив должен содержать элементы BlockLength/8. Например, если длина блока составляет 64 бита, вектор инициализации состоит из 8 байт.

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

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

Если ключ 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

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

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

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

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

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

Возвращаемый код Описание
ERROR_BUSY
Контекст CSP в настоящее время используется другим процессом .
ERROR_INVALID_HANDLE
Один из параметров задает недопустимый дескриптор.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_FLAGS
Параметр dwFlags ненулево, или буфер pbData содержит недопустимое значение.
NTE_BAD_TYPE
Параметр dwParam указывает неизвестный параметр.
NTE_BAD_UID
Контекст CSP, указанный при создании ключа hKey hKey, не найден.
NTE_FAIL
Функция завершилась сбоем каким-то неожиданным образом.
NTE_FIXEDPARAMETER
Некоторые csps имеют жестко закодированные значения 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 [только классические приложения]
целевая платформа Виндоус
заголовка wincrypt.h
библиотеки Advapi32.lib
DLL Advapi32.dll

См. также

ALG_ID

CryptGenKey

CryptGetKeyParam

CryptImportKey

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