22.07.2003 16:05:10Опять экспорт ключа... Ответов: 1
Андрей Сошин
Что я делаю не так? Интересует именно правильность действий,
корректности кода я пока не касаюсь.
Задача шифрование данных и передача их получателю.

1. Генерю ключевую пару CryptGenKey(phProv, AT_KEYEXCHANGE, 0, &hUserKey)
на стороне получателя.

2. Экспортирую открытый ключ CryptExportKey(hUserKey, 0, PUBLICKEYBLOB, 0, pbTemp, &dwTemp)
затем BLOB пишу в файл и передаю отправителю.

3. Импортирую BLOB на стороне отправителя
CryptImportKey(hProv, pbTemp, dwTemp, 0, 0, &hUserKey)

4. Создаю сессионный ключ
CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey)
алгоритмы пробовал также CALG_DH_EX_EPHEM и CALG_DH_EL_EPHEM

5. Пытаюсь экспортировать сессионный ключ
CryptExportKey(hSessionKey, hUserKey, SIMPLEBLOB, 0, pbData, &dwDataLen)
--на этом этапе программа обламывается с кодом NTE_BAD_KEY_STATE

Как советовали форум читал, примеры смотрел, но там используются
сертификаты.

Помогите пожалуйста
 
Ответы:
23.07.2003 9:48:03Uri
Уже было обсуждение этого вопроса много и много раз. В том числе и
http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=489
Повторяем:
Приведенный Вами вариант в СКЗИ КриптоПро CSP сделать не получиться, эта функциональность специально закрыта. Вам необходимо воспользоваться алгоритмом с приведенным ниже описанием.
Для экспорта сессионного ключа следует выполнить следующие шаги:
· Импорт блоба открытого ключа получателя на своей ключевой паре;
· Экспорт сессионного ключа на ключе парной связи.
CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey);
CPImportKey(hProv, pbRecipentPublicKey, cbRecipentPublicKey, hUserKey, 0, &hExchKey); - здесь у нас будет выработан ключ парной связи Деффи-Хелмана
CPExportKey(hProv, hSessionKey, hExchKey, SIMPLEBLOB, 0, pbSessionKeyForRecipient, &cbSessionKeyForRecipient);

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

CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPImportKey(hProv, pbSenderPublicKey, cbSenderPublicKey, hUserKey, 0, &hExchKey);
CPImportKey(hProv, pbSessionKeyFromSender, &cbSessionKeyFromSender, hExchKey, 0, &hSessionKey);