Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Dima_Sun  
#1 Оставлено : 16 марта 2009 г. 19:11:24(UTC)
Dima_Sun

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 что-то вернула нужно иметь сертификат с именем совпадающим с именем пользователя. Так?



Offline Kirill Sobolev  
#2 Оставлено : 16 марта 2009 г. 19:24:51(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Там есть несколько примеров, в которых встречается CryptExportKey, но во всех из них используются 2 сертификата (отправитель\получатель). В моем же случае - один. Два сертификата в случае с КриптоПро это неизбежность или есть пути?

Это неизбежность схемы Diffie-Helmana. В том случае, если Вы не хотите использовать сертификат отправителя, Вы можете использовать эфемеральную пару (CryptGenKey(..,CALG_DH_EPHEM, ..)).
Цитата:
в примере от MS для получения открытого ключа используется CryptImportPublicKeyInfo, а во всех ваших примерах - CryptGetUserKey. Я так понимаю это синонимы.
Нет. CryptImportPublicKeyInfo работает именно так, как Вы описали, а CryptGetUserKey получает открытый ключ (вернее ключевую пару) из существующего контейнера с секретным ключем, сертификат к этому отношения не имеет.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dima_Sun  
#3 Оставлено : 16 марта 2009 г. 19:57:08(UTC)
Dima_Sun

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.11.2008(UTC)
Сообщений: 31
Откуда: Ryazan

В ваших примерах упоминания такой константы (CALG_DH_EPHEM) не обнаружилось и на форуме тоже.
Насколько я понял надо сделать как у вас в примерах, только вместо открытого ключа из сертификата отправителя использовать ключ сгенерированный при помощи CryptGenKey(..,CALG_DH_EPHEM, ..)

Offline Kirill Sobolev  
#4 Оставлено : 16 марта 2009 г. 20:25:37(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
У нас форум переезжал :) Вот тут эта тема обсуждается http://www.cryptopro.ru/...topro/forum/view.asp?q=4
Да, для примера используется несколько упрощенная ситуация, поэтому и эфемеральные ключи не создаются.
Техническую поддержку оказываем тут
Наша база знаний
Offline Роман кислухин  
#5 Оставлено : 15 августа 2013 г. 23:46:05(UTC)
Роман кислухин

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Андрей Писарев  
#6 Оставлено : 16 августа 2013 г. 0:00:25(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Предлагаю открыть руководство разработчика на сайте, там есть пример.
Техническую поддержку оказываем тут
Наша база знаний
Offline Роман кислухин  
#7 Оставлено : 16 августа 2013 г. 0:37:24(UTC)
Роман кислухин

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2011(UTC)
Сообщений: 163
Мужчина
Откуда: Москва

Сказал «Спасибо»: 8 раз
Поблагодарили: 3 раз в 3 постах
Автор: Андрей * Перейти к цитате
Предлагаю открыть руководство разработчика на сайте, там есть пример.


Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть.
Offline Юрий  
#8 Оставлено : 16 августа 2013 г. 5:38:08(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Автор: Роман кислухин Перейти к цитате
Автор: Андрей * Перейти к цитате
Предлагаю открыть руководство разработчика на сайте, там есть пример.


Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть.

Видимо вопрос уже настолько частый, что его занесли прямо в FAQ: http://www.cryptopro.ru/faq/eksport-sessionnogo-klyucha
Кстати и правильно сделали что занесли.
С уважением,
Юрий Строжевский
Offline Андрей Писарев  
#9 Оставлено : 16 августа 2013 г. 8:25:55(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: Юрий Перейти к цитате
Автор: Роман кислухин Перейти к цитате
Автор: Андрей * Перейти к цитате
Предлагаю открыть руководство разработчика на сайте, там есть пример.


Где конкретно? Нашел только описание функций CryptEncrypt/CryptDecrypt, но это и в MSDN есть.

Видимо вопрос уже настолько частый, что его занесли прямо в FAQ: http://www.cryptopro.ru/faq/eksport-sessionnogo-klyucha
Кстати и правильно сделали что занесли.


И взято было из старого форума
Цитата:
Ответ:
05.01.2001 11:20:55


Техническую поддержку оказываем тут
Наша база знаний
Offline Роман кислухин  
#10 Оставлено : 16 августа 2013 г. 11:18:38(UTC)
Роман кислухин

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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




Спасибо.

Страницу старого форума я и так поиском нашел, оттуда и была взята константа, которая не работает. И пример написан для двух ключевых пар, а примера с эфемерным ключем нет. Да и само описание не очень понятное (если честно, совсем непонятное для случая с эфемерными ключами), причесать бы его.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.