Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.11.2008(UTC) Сообщений: 31 Откуда: Ryazan
|
Стоит задача шифрования блока данных, сохранение зашифрованных данных (вместе с сессионным ключом) и последующая дешифрация. В качестве основы использован пример RSACert из Windows SDK. Вкратце там делается след. образом: 1. CertFindCertificateInStore() -- Находим нужный сертификат 2. CryptAcquireContext() -- Получение контекста контейнера 3. CryptImportPublicKeyInfo(hRSAKey) -- Получение открытого ключа из сертификата 4. CryptGenKey(hSessionKey) -- Генерация сессионного ключа 5. CryptExportKey(hSessionKey, hRSAKey, .... ) -- Экспорт сессионного ключа в бинарный блок 6. Шифрация сообщения и запись в файл.
С сертификатами, выписанными с использование криптопровайдера от MS - все ок. При попытке использования сертификата КроптоПро получаю ошибку NTE_BAD_KEY_STATE на 5 шаге. При этом для сертификатов от MS по-прежнему работает. Похоже что с КриптоПрошными сертификатами так нельзя. А как можно? Просмотрел массу примеров из вашего SDK. Там есть несколько примеров, в которых встречается CryptExportKey, но во всех из них используются 2 сертификата (отправитель\получатель). В моем же случае - один. Два сертификата в случае с КриптоПро это неизбежность или есть пути?
И заодно... в примере от MS для получения открытого ключа используется CryptImportPublicKeyInfo, а во всех ваших примерах - CryptGetUserKey. Я так понимаю это синонимы. А в чем их нюансы? Я так понимаю CryptImportPublicKeyInfo возвращает открытый ключ для сертификата, контекст которого мы в нее передаем. А CryptGetUserKey ищет соответствующий по криптопровайдеру (первый аргумент) и имени пользователя. Т.е. чтобы CryptGetUserKey что-то вернула нужно иметь сертификат с именем совпадающим с именем пользователя. Так?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Там есть несколько примеров, в которых встречается CryptExportKey, но во всех из них используются 2 сертификата (отправитель\получатель). В моем же случае - один. Два сертификата в случае с КриптоПро это неизбежность или есть пути? Это неизбежность схемы Diffie-Helmana. В том случае, если Вы не хотите использовать сертификат отправителя, Вы можете использовать эфемеральную пару (CryptGenKey(..,CALG_DH_EPHEM, ..)). Цитата:в примере от MS для получения открытого ключа используется CryptImportPublicKeyInfo, а во всех ваших примерах - CryptGetUserKey. Я так понимаю это синонимы. Нет. CryptImportPublicKeyInfo работает именно так, как Вы описали, а CryptGetUserKey получает открытый ключ (вернее ключевую пару) из существующего контейнера с секретным ключем, сертификат к этому отношения не имеет. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.11.2008(UTC) Сообщений: 31 Откуда: Ryazan
|
В ваших примерах упоминания такой константы (CALG_DH_EPHEM) не обнаружилось и на форуме тоже. Насколько я понял надо сделать как у вас в примерах, только вместо открытого ключа из сертификата отправителя использовать ключ сгенерированный при помощи CryptGenKey(..,CALG_DH_EPHEM, ..)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 163 Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Добрый день Также интересует данный вопрос. Нужно шифрование/дешифрование блока данных. Попробовал использовать CryptGenKey(..,CALG_DH_EPHEM,..), но всегда получаю ошибку: An internal error occurred. (0x80090020) Последовательность следующая: 1. Получаем хэндл криптопровайдера: prov = CryptAcquireContext(null, null, PROV_GOST_2001_DH, 0); или даже prov = CryptAcquireContext("MyContainer", null, PROV_GOST_2001_DH, CRYPT_NEWKEYSET); 2. Пытаемся сгенерировать эфемеральную пару: CryptGenKey(hProv, CALG_DH_EPHEM, 512 << 16 | CRYPT_EXPORTABLE); или CryptGenKey(hProv, CALG_DH_EPHEM, 0); Неизбежно получаем (0x80090020) Что я делаю не так? Можно ли схематичный пример, как сделать шифрование на публичном ключе (имея сертификат) и дешифрование на секретном (имея контейнер с секретным ключем)? Update Так, похоже эфемеральную пару сгенерировал, используя константу CALG_DH_EL_EPHEM. Как теперь правильно выполнить шифрование и дешифрование? Неправильно делать научился, но результат дешифрования не совпадает с исходными данными (исходник чуть позже будет). Отредактировано пользователем 16 августа 2013 г. 0:33:48(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,718 Сказал «Спасибо»: 500 раз Поблагодарили: 2053 раз в 1593 постах
|
Предлагаю открыть руководство разработчика на сайте, там есть пример. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 163 Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Автор: Андрей * Предлагаю открыть руководство разработчика на сайте, там есть пример. Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
Автор: Роман кислухин Автор: Андрей * Предлагаю открыть руководство разработчика на сайте, там есть пример. Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть. Видимо вопрос уже настолько частый, что его занесли прямо в FAQ: http://www.cryptopro.ru/faq/eksport-sessionnogo-klyuchaКстати и правильно сделали что занесли. |
С уважением, Юрий Строжевский |
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,718 Сказал «Спасибо»: 500 раз Поблагодарили: 2053 раз в 1593 постах
|
Автор: Юрий Автор: Роман кислухин Автор: Андрей * Предлагаю открыть руководство разработчика на сайте, там есть пример. Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть. Видимо вопрос уже настолько частый, что его занесли прямо в FAQ: http://www.cryptopro.ru/faq/eksport-sessionnogo-klyuchaКстати и правильно сделали что занесли. И взято было из старого форумаЦитата:Ответ: 05.01.2001 11:20:55 |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 163 Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Автор: Андрей * Автор: Юрий Автор: Роман кислухин Автор: Андрей * Предлагаю открыть руководство разработчика на сайте, там есть пример. Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть. Видимо вопрос уже настолько частый, что его занесли прямо в FAQ: http://www.cryptopro.ru/faq/eksport-sessionnogo-klyuchaКстати и правильно сделали что занесли. И взято было из старого форумаЦитата:Ответ: 05.01.2001 11:20:55 Спасибо. Страницу старого форума я и так поиском нашел, оттуда и была взята константа, которая не работает. И пример написан для двух ключевых пар, а примера с эфемерным ключем нет. Да и само описание не очень понятное (если честно, совсем непонятное для случая с эфемерными ключами), причесать бы его.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close