Создание ссылки на контейнер ключей

Тема в разделе "WASM.CRYPTO", создана пользователем MiDi, 12 сен 2005.

  1. MiDi

    MiDi New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2005
    Сообщения:
    6
    Адрес:
    Russia
    Уважаемые участники форума, помогите разобраться в следующем вопросе:

    необходимо шифровать и расшифровывать данные с использованием CryptoApi 2.0 и некоторого CSP.

    Имеется сертификат и контейнер ключей, к примеру на дискете, сертификат не зарегистрирован в хранилище, и не связан с контейнером ключей, необходимо расшифровать данные, делаю следующим образом:

    1. Читаю сертификат из файла и формирую структуру PCCERT_CONTEXT

    2. Вызываю функцию CryptAcquireCertificatePrivateKey

    для получения контекста используемого криптопровайдера и ссылки на контейнер ключей, вот в этом месте и происходит проблема, т.к. ссылка на контейнер не создавалась и сертификат не регистрировался в хранилище, то видимо функция возвращает false и далее использование функции CryptDecryptMessage не позволяет расшифровать сообщение.

    Как програмно установить ссылку на контейнер ключей, без использования средств предоставляемых CSP и не пользуясь хранилищами сертификатов? Или может у меня не правильный подхол и есть др. пути решения?
     
  2. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    в моем случае вот так:


    Код (Text):
    1.  
    2. BOOL __fastcall TCAPI::CAPIAddPrivateKeyLink(PCCERT_CONTEXT pCertContext, bool skipProvNameRecursive)
    3. {
    4.     CRYPT_KEY_PROV_INFO provInfo;
    5.     char pszCNString[MAX_ID];
    6.  
    7.     // получаем полное имя подписчика
    8.     pszCNString[0] = 0;
    9.     pCertGetNameString(pCertContext, CERT_NAME_ATTR_TYPE, 0, szOID_COMMON_NAME,
    10.         pszCNString, MAX_ID);
    11.     AnsiString fullName = pszCNString;
    12.  
    13.     // получаем ID подписчика
    14.     pszCNString[0] = 0;
    15.     pCertGetNameString(pCertContext, CERT_NAME_ATTR_TYPE, 0, USER_ID,
    16.         pszCNString, MAX_ID);
    17.     AnsiString shortName = pszCNString;
    18.  
    19.     // имя контейнера - если есть файл то на него, иначе на карточку
    20.     AnsiString contName;
    21.  
    22.     AnsiString userIdNm = shortName.Trim() + " - " + fullName.Trim();
    23.     if( DSS && FileExists(DSS->KEYSDIR.UpperCase() + userIdNm + ".dka") )
    24.         contName = DSS->KEYSDIR.UpperCase() + userIdNm;
    25.     else
    26.         contName = userIdNm;
    27.  
    28.     AnsiString provName = NULL;
    29.     if (skipProvNameRecursive == false)
    30.         provName = CAPIGetProvName(pCertContext);
    31.     WideString wpName, wcName;
    32.     wcName = WideString(contName);
    33.     if( provName != NULL )
    34.         wpName = WideString(provName);
    35.     else
    36.         wpName = WideString("Dekart RSA Cryptographic Provider v1.0").c_bstr();
    37.     provInfo.pwszProvName = wpName.c_bstr();
    38.     provInfo.pwszContainerName = wcName.c_bstr();
    39.     provInfo.dwProvType = PROV_RSA_FULL;
    40.     provInfo.dwFlags = 0;
    41.     provInfo.cProvParam = 0;
    42.     provInfo.rgProvParam = NULL;
    43.     provInfo.dwKeySpec = AT_KEYEXCHANGE;
    44.     return pCertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &provInfo);
    45. }
    46.  
     
  3. MiDi

    MiDi New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2005
    Сообщения:
    6
    Адрес:
    Russia
    to infern0:

    Спасибо за помощь, идея понятна...