12.05.2002 21:25:29Экспорт сессионного ключа. Ответов: 3
ak
Хочу передать сессионный ключ. Имею сертификат открытого ключа принимающей стороны (в файле *.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пасибо
 
Ответы:
13.05.2002 14:43:05ak
Кажется я понял почему это не работает.
CryptGetUserKey (hProv, AT_KEYEXCHANGE,&hXchgKey);
на самом деле не возвращает handler ключа.
Тогда вопрос другой. Как можно получить handler public ключа из сертификата, лежащего в файле *.CER?
13.05.2002 15:07:29ak
Странно, но так:
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. Куда смотреть?
Спасибо
13.05.2002 21:31:19kure
Экспорт ключа из сертификата и шифрование на сессионном ключе в примере export.c из примеров (http://www.cryptopro.ru/CryptoPro/test/sample.zip)