| ||||
| ||||
Что я делаю не так? Интересует именно правильность действий, корректности кода я пока не касаюсь. Задача шифрование данных и передача их получателю. 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 Как советовали форум читал, примеры смотрел, но там используются сертификаты. Помогите пожалуйста | ||||
Ответы: | ||||
| ||||
Уже было обсуждение этого вопроса много и много раз. В том числе и 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); | ||||