На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

CryptDeriveKey



[New - Windows NT]

[New - Windows 95, OEM Service Release 2]
The CryptDeriveKey function generates cryptographic keys derived from base data. This function guarantees that all keys generated from the same base data will be identical, provided the same CSP and algorithms are used. The base data can be a password or any other user data.
This function is the same as CryptGenKey, except that the generated session keys are derived from base data instead of being random. Another difference is that the CryptDeriveKey function cannot be used to generate public/private key pairs.

A handle to the session key is returned in phKey. This handle can then be used as needed with any of the other CryptoAPI functions that require key handles.

BOOL CRYPTFUNC CryptDeriveKey(

HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTHASH hBaseData,
DWORD dwFlags,
HCRYPTKEY *phKey
);


Parameters

hProv

[in] A handle to the application's CSP. An application obtains this handle using the CryptAcquireContext function.

Algid

[in] The identifier for the algorithm for which the key is to be generated.
The valid values for this parameter will vary, depending on the CSP that is used. See the "Remarks" section for a list of possible algorithm identifiers.

hBaseData

[in] A handle to a hash object that has been fed exactly the base data.
To obtain this handle, an application must first create a hash object with CryptCreateHash and then add the base data to the hash object with CryptHashData. This process is described in detail in the section Hashes and Digital Signatures.

dwFlags

[in] The flags specifying the type of key generated. This parameter can be zero, or you can specify one or more of the following flags, using the binary OR operator to combine them.

CRYPT_EXPORTABLE

If this flag is set, then the session key can be transferred out of the CSP into a key blob through the CryptExportKey function. Because keys generally must be exportable, this flag should usually be set.
If this flag is not set, then the session key will not be exportable. This means the key will only be available within the current session and only the application that created it will be able to use it.
This flag does not apply to public/private key pairs.

CRYPT_CREATE_SALT

Typically, when a session key is made from a hash value, there are a number of leftover bits. For example, if the hash value is 128 bits and the session key is 40 bits, there will be 88 bits leftover.
If this flag is set, then the key will be assigned a salt value based on the unused hash value bits. You can retrieve this salt value using the CryptGetKeyParam function with the dwParam parameter set to KP_SALT.
If this flag is not set, then the key will be given a salt value of zero.

When keys with nonzero salt values are exported (using CryptExportKey), the salt value must also be obtained and kept with the key blob.

CRYPT_USER_PROTECTED

If this flag is set, then the user will be notified through a dialog box or another method when certain actions are attempted using this key. The precise behavior is specified by the CSP being used.
The Microsoft RSA Base Provider ignores this flag.

CRYPT_UPDATE_KEY

Some CSPs use session keys that are derived from multiple hash values. When this is the case, CryptDeriveKey must be called multiple times.
If this flag is set, a new session key is not generated. Instead, the key specified by phKey is modified. The precise behavior of this flag is dependent on the type of key being generated and on the particular CSP being used.
The Microsoft RSA Base Provider ignores this flag.

phKey

[in/out] The address to which the function copies the handle of the newly generated key.



Remarks

To generate a key for a symmetric encryption algorithm, use the Algid parameter to specify the algorithm. The algorithms available will most likely be different for each CSP. If you are using the Microsoft RSA Base Provider, use one of the following values to specify the algorithm:

· CALG_RC2 ѕ RC2 block cipher
· CALG_RC4 ѕ RC4 stream cipher



When keys are generated for symmetric block ciphers, the key by default will be set up in cipher block chaining (CBC) mode with an initialization vector of zero. This cipher mode provides a good default method for bulk encrypting data. To change these parameters, use the CryptSetKeyParam function.
Once the CryptDeriveKey function has been called, no more data can be added to the hash object. The CryptDestroyHash function should be called at this point to destroy the hash object.

Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To retrieve extended error information, use the GetLastError function.
The following table lists the error codes most commonly returned by the GetLastError function. The error codes prefaced by "NTE" are generated by the particular CSP you are using.

Error Description
ERROR_INVALID_HANDLE One of the parameters specifies an invalid handle.
ERROR_INVALID_PARAMETER One of the parameters contains an invalid value. This is most often an illegal pointer.
NTE_BAD_ALGID The Algid parameter specifies an algorithm that this CSP does not support.
NTE_BAD_FLAGS The dwFlags parameter contains an invalid value.
NTE_BAD_HASH The hBaseData parameter does not contain a valid handle to a hash object.
NTE_BAD_UID The hProv parameter does not contain a valid context handle.
NTE_FAIL The function failed in some unexpected way.


Example

#include

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
CHAR szPassword[ ] = "apple-camshaft";
DWORD dwLength;

// Get handle to user default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}

// Create hash object.
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
printf("Error %x during CryptCreateHash!\n", GetLastError());

goto done;
}

// Hash password string.
dwLength = strlen(szPassword);
if(!CryptHashData(hHash, (BYTE *)szPassword, dwLength, 0)) {
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}

// Create block cipher session key based on hash of the password.
if(!CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey)) {
printf("Error %x during CryptDeriveKey!\n", GetLastError());
goto done;
}

// Use 'hKey' to do something.

...

done:

// Destroy hash object.
if(hHash != 0) CryptDestroyHash(hHash);

// Destroy session key.
if(hKey != 0) CryptDestroyKey(hKey);

// Release provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0);


See Also

CryptAcquireContext, CryptCreateHash, CryptDestroyHash, CryptDestroyKey, CryptExportKey, CryptGenKey, CryptGetKeyParam, CryptHashData, CryptSetKeyParam


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

CryptDeriveKey



[Новый - Windows NT]

[Новый - Окно 95, Выпуск Услуги OEM 2]
Функция CryptDeriveKey генерирует шифровальные клавиши производные от базовых данных. Эта функция гарантирует, что все клавиши сгенерированные из тех же базовых данных будут идентичный, предусмотренный тот же CSP и алгоритмы использованы. Базовые данные могут быть пароль или любые другие данные пользователя.
Эта функция - такой же как и CryptGenKey, кроме того сгенерированные сеансовые клавиши производные от базовых данных вместо произвольного. Другое различие - в том, что функция CryptDeriveKey не может быть использована, чтобы генерировать публику/частные ключевые пары.

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

BOOL CRYPTFUNC CryptDeriveKey(

HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey
);


Параметры

hProv

[in] ручка на прикладной CSP. Приложение получает эту ручку, использовавшую функцию CryptAcquireContext.

Algid

[in] идентификатор для алгоритма для которого клавиша должна быть сгенерирована.
Правильные величины для этого параметра поменяет, в зависимости от CSP, которое использовано. Смотри секцию "Замечаний" для списка возможных идентификаторов алгоритма.

hBaseData

[in] ручка на объект хэша, который питается точно базовые данные.
Чтобы получать эту ручку, приложение должно сначала создавать объект хэша с CryptCreateHash затем добавлять базовые данные к объекту хэша с CryptHashData. Этот процесс описывается подробно в Хэшах секции и Цифровых Подписей.

dwFlags

[in] флаги, определяющие, что тип клавиши генерировал. Этот параметр может быть нулем, или Вы можете определить одно или более из следующего флагов, использовавших двоичный код ИЛИ оператора, чтобы объединять их.

CRYPT_EXPORTABLE

Если этот флаг установлен, тогда сеансовая клавиша может быть передана из CSP в ключевую каплю через функцию CryptExportKey. Поскольку клавиши обычно должны быть переносимыми, этот флаг должен обычно установлен.
Если этот флаг не установлен, тогда сеансовая клавиша не будет переносимой. Это означает, что клавиша только будет доступна в течение текущего сеанса и только приложение, что созданное это будет способным использовать это.
Этот флаг не относится к публике/частные ключевые пары.

CRYPT_CREATE_SALT

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

Когда клавиши с ненулевыми солеными величинами экспортированы (использование CryptExportKey), соленая величина должна также получена и держана ключевой каплей.

CRYPT_USER_PROTECTED

Если этот флаг установлен, тогда пользователь будет извещен через диалогового блока или другого метода когда определенных действий пытаются используя эту клавишу. Точное поведение определено CSP использованное.
Базовый Поставщик Микрософт RSA игнорирует этот флаг.

CRYPT_UPDATE_KEY

Некоторые сеансовые клавиши использования CSPs, которые производные от многочисленных величин хэша. Когда это является причиной, CryptDeriveKey должен быть назван многочисленное время.
Если этот флаг установлен, новая сеансовая клавиша не сгенерирована. Взамен, клавиша определенная phKey модифицирована. Точное поведение этого флага зависимое от типа клавиши, генерированной и на конкретном CSP использованное.
Базовый Поставщик Микрософт RSA игнорирует этот флаг.

phKey

[в/] адрес на котором функция копирует ручку вновь сгенерированной клавиши.



Замечания

Для того, чтобы генерировать клавишу для симметричного шифровального алгоритма, используйте параметр Algid, чтобы определять алгоритм. Доступная воля (завещание) алгоритмов наиболее вероятно, будет другой для каждого CSP. Если Вы используете Базового Поставщика Микрософт RSA, используйте одно из следующего величин, чтобы определять алгоритм:

CALG_RC2 U блочное шифр RC2 CALG_RC4 U шифр потока RC4



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

Обратные Величины

Если функция добивается успеха, обратная величина ненулевая.
Если функция терпит неудачу, обратная величина нулевая. Для того, чтобы извлекать расширенную информацию ошибки, используйте функцию GetLastError.
Следующая таблица включает коды наиболее общей ошибки возвращанные функцией GetLastError. Ошибка кодирует prefaced "NTE" сгенерированы конкретным CSP, которое Вы используете.

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


Пример

#include

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
СИМВОЛ szPassword[ ] = "яблочный-распределительный вал";
DWORD dwLength;

// Получите ручку по умолчанию поставщику пользователя.
если(!CryptAcquireContext(&hProv, НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ, PROV_RSA_FULL, 0)) { printf("Error %x в течение CryptAcquireContext!\n", GetLastError());
goto сделанным;
}

// Создайте объект хэша.
если(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { printf("Error %x В ТЕЧЕНИЕ CryptCreateHash!\n", GetLastError());

goto сделанным;
}

// Строка пароля Хэша.
dwLength = strlen(szPassword);
если(!CryptHashData(hHash, (БАЙТ *)szPassword, dwLength, 0)) { printf("Error %x в течение CryptHashData!\n", GetLastError());
goto сделанным;
}

// Создайте сеансовую клавишу блочного шифра основывался в хэше пароля.
если(!CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey)) { printf("Error %x В ТЕЧЕНИЕ CryptDeriveKey!\n", GetLastError());
goto сделанным;
}

// Использование 'hKey, чтобы делать что-то.

...

сделанным:

// Уничтожьте объект хэша.
если(hHash != 0) CryptDestroyHash(hHash);

// Уничтожьте сеансовую клавишу.
если(hKey != 0) CryptDestroyKey(hKey);

// Ручка поставщика Версии.
если(hProv != 0) CryptReleaseContext(hProv, 0);


Смотри Также

CryptAcquireContext, CryptCreateHash, CryptDestroyHash, CryptDestroyKey, CryptExportKey, CryptGenKey, CryptGetKeyParam, CryptHashData, CryptSetKeyParam


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz