04.12.2006 14:18:20Получение дескриптора криптопровайдера Ответов: 9
Волков
Пытаюсь получить дескриптор криптопровайдера следующим образом:
if (!CryptAcquireContext(
&hProv,
NULL,
NULL,
71,
CRYPT_VERIFYCONTEXT))
{
dwStatus = GetLastError();
printf("CryptAcquireContext failed: %d\n", dwStatus);
if (dwStatus==ERROR_INVALID_PARAMETER)
ShowMessage("ERROR_INVALID_PARAMETER");

fclose(hFile);
return dwStatus;
}
Во время выполнения программы происходит ошибка ERROR_INVALID_PARAMETER. В чём дело?
 
Ответы:
04.12.2006 14:24:27Василий
КриптоПро CSP вообще установлен (если да - какой сборки)? Нет ли ошибок в журналах Win при перезагрузке?
04.12.2006 14:51:43Волкво
CryptoPRO 2.0 установлен сборки 2049. Ошибок нету.
04.12.2006 15:09:59Василий
Пришлите экспортированный в файл раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults
05.12.2006 11:06:32AleKo
Кажется нужно указать название криптопровайдера, иначе по умолчанию.
05.12.2006 11:19:46AleKo
pszProvider
[in] A null-terminated string that specifies the name of the CSP to be used.

If this parameter is NULL, the user default provider is used.

В Вашем случае нужно использовать криптопровайдер
"Crypto-Pro GOST R 34.10-94 Cryptographic Service Provider" именно он поддерживает 71 тип."GOST GOST R 34.10-94 Signature with Diffie-Hellman Key Exchange"
05.12.2006 11:28:03Василий
Мой комментарий. Если имя CSP - NULL, то используется параметр реестра Name из раздела
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type NNN,
в данном случае HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type 071
05.12.2006 11:33:48AleKo
Спасибо за информацию, будем знать.
05.12.2006 11:39:07AleKo
Может его нужно получить ручками из реестра и подставить?
Есть специальная функция которая делает выбранный криптопровайдер действующим по умрлчанию.
А с помощью этого CryptGetDefaultProvider получаем контекст провайдера по умолчанию.
05.12.2006 12:08:53Василий
Для каждого типа CSP есть CSP по умолчанию (ставится либо при установке этого CSP либо потом ф-ей CryptSetProvider). Поэтому можно использовать NULL (если, конечно, руками в реестре не править...)