Уважаемые участники форума, помогите разобраться в следующем вопросе: необходимо шифровать и расшифровывать данные с использованием CryptoApi 2.0 и некоторого CSP. Имеется сертификат и контейнер ключей, к примеру на дискете, сертификат не зарегистрирован в хранилище, и не связан с контейнером ключей, необходимо расшифровать данные, делаю следующим образом: 1. Читаю сертификат из файла и формирую структуру PCCERT_CONTEXT 2. Вызываю функцию CryptAcquireCertificatePrivateKey для получения контекста используемого криптопровайдера и ссылки на контейнер ключей, вот в этом месте и происходит проблема, т.к. ссылка на контейнер не создавалась и сертификат не регистрировался в хранилище, то видимо функция возвращает false и далее использование функции CryptDecryptMessage не позволяет расшифровать сообщение. Как програмно установить ссылку на контейнер ключей, без использования средств предоставляемых CSP и не пользуясь хранилищами сертификатов? Или может у меня не правильный подхол и есть др. пути решения?
в моем случае вот так: Код (Text): BOOL __fastcall TCAPI::CAPIAddPrivateKeyLink(PCCERT_CONTEXT pCertContext, bool skipProvNameRecursive) { CRYPT_KEY_PROV_INFO provInfo; char pszCNString[MAX_ID]; // получаем полное имя подписчика pszCNString[0] = 0; pCertGetNameString(pCertContext, CERT_NAME_ATTR_TYPE, 0, szOID_COMMON_NAME, pszCNString, MAX_ID); AnsiString fullName = pszCNString; // получаем ID подписчика pszCNString[0] = 0; pCertGetNameString(pCertContext, CERT_NAME_ATTR_TYPE, 0, USER_ID, pszCNString, MAX_ID); AnsiString shortName = pszCNString; // имя контейнера - если есть файл то на него, иначе на карточку AnsiString contName; AnsiString userIdNm = shortName.Trim() + " - " + fullName.Trim(); if( DSS && FileExists(DSS->KEYSDIR.UpperCase() + userIdNm + ".dka") ) contName = DSS->KEYSDIR.UpperCase() + userIdNm; else contName = userIdNm; AnsiString provName = NULL; if (skipProvNameRecursive == false) provName = CAPIGetProvName(pCertContext); WideString wpName, wcName; wcName = WideString(contName); if( provName != NULL ) wpName = WideString(provName); else wpName = WideString("Dekart RSA Cryptographic Provider v1.0").c_bstr(); provInfo.pwszProvName = wpName.c_bstr(); provInfo.pwszContainerName = wcName.c_bstr(); provInfo.dwProvType = PROV_RSA_FULL; provInfo.dwFlags = 0; provInfo.cProvParam = 0; provInfo.rgProvParam = NULL; provInfo.dwKeySpec = AT_KEYEXCHANGE; return pCertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &provInfo); }