| ||||
| ||||
Хочу передать сессионный ключ. Имею сертификат открытого ключа принимающей стороны (в файле *.CER). Делаю так: // получаю контекст CryptAcquireContext(&Prov, NULL, CP_DEF_PROV,PROV_GOST_DH,CRYPT_VERIFYCONTEXT); // открою файл с сертификатом как хранилище hCertStore = CertOpenStore(CERT_STORE_PROV_FILENAME_A,MY_ENCODING,hProv, CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG, fileName); // найду сертификат для subjectName certContext = CertFindCertificateInStore (hCertStore, MY_ENCODING,0,CERT_FIND_SUBJECT_STR,wstrSubject,NULL); //генерю сессионный ключ CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey); //получаю handle долговременного ключа из сертификата CryptGetUserKey (hProv, AT_KEYEXCHANGE, &hXchgKey); // пытаюсь экспортнуть сессионный ключ CryptExportKey(hSessionKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwBlobLen); получаю NTE_BAD_KEY_STATE :-( Что не так? Cпасибо | ||||
Ответы: | ||||
| ||||
Кажется я понял почему это не работает. CryptGetUserKey (hProv, AT_KEYEXCHANGE,&hXchgKey); на самом деле не возвращает handler ключа. Тогда вопрос другой. Как можно получить handler public ключа из сертификата, лежащего в файле *.CER? | ||||
| ||||
Странно, но так: if (CryptAcquireContext(&hProv, NULL, CP_DEF_PROV,PROV_GOST_DH,0)){ //генерю сессионный ключ CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey); //получаю handle долговременного ключа if (!CryptGetUserKey (hProv, AT_KEYEXCHANGE, &hXchgKey)) printf("\n GetLastError=%x", GetLastError()); // пытаюсь экспортнуть сессионный ключ if (!CryptExportKey(hSessionKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwBlobLen)) printf("\n GetLastError=%x", GetLastError()); } тоже получаю NTE_BAD_KEY_STATE при вызове CryptExportKey. Куда смотреть? Спасибо | ||||
| ||||
Экспорт ключа из сертификата и шифрование на сессионном ключе в примере export.c из примеров (http://www.cryptopro.ru/CryptoPro/test/sample.zip) | ||||