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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Dima_Sun  
#1 Оставлено : 7 апреля 2009 г. 15:51:38(UTC)
Dima_Sun

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

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

Получаю такое сообщение в трассе (ну и соответственно дальше уже не работает...):
cpcspi:!0x6b0:!:2788!ImportKeyMaterial!IMIT mismatch!0x0(0)!
cpcspi:!0x6b0:!:3472!CPImportKey!ImportKey fail ret obj!0x80090005(-2146893819)!


Делаю следующее:
Приложение №1 - шифрует блок данных и сохраняет в файл. (в основе кода пример EncryptFile из SDK КриптоПро)
Приложение №2 - зачитывает и расшифровывает. Данные не удаляются из файла до тех пор, пока очередная порция не будет расшифрована и обработана. Соответственно в случае появления вышеуказанной ошибки сообщение, на котором появилась ошибка не удаляется. После перезапуска приложения №2 "застрявшее" сообщение с высокой долей вероятности успешно расшифровывается. Соответственно, я делаю вывод, что проблема не в корректности сообщения, а в чем-то еще. Подскажите куда смотреть и что это может быть.

ЗЫ. Все это выполняется на одной машине. Использую КриптоПро 3.0
Offline Dima_Sun  
#2 Оставлено : 7 апреля 2009 г. 18:12:22(UTC)
Dima_Sun

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

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

Прошу прощения - немного наврал.
Если возникла проблема с расшифровкой сообщения, то расшифровать его уже не получается.
И тем не менее проблема продолжает появляться, правда зависимостей для ее появления не выявлено.
Насколько я понимаю процесс шифрования/дешифрования с использованием КриптоПро, то выглядит это примерно следующим образом (правильно ли я понимаю?) :
Для шифрования:
1. Получаем закрытый ключ из сертификата отправителя.
2. Получаем открытый ключ из сертификата получателя.
3. Генерируем ключ согласования с их использованием.
4. Генерируем сессионный ключ с использованием ключа согласования (указав алгоритм CALG_G28147).
5. Шифруем сообщение сессионным ключом.
6. Укладываем в бинарный блок экспортированный сессионный ключ, вектор инициализации сессионного ключа и зашифрованное сообщение.

Для расшифровывания:
1. Получаем закрытый ключ из сертификата получателя.
2. Получаем открытый ключ из сертификата отправителя.
3. Генерируем ключ согласования с их использованием.
4. Импортируем из бинарного блока сессионный ключ с использованием ключа согласования.
5. Применяем вектор инициализации.
6. Расшифровываем сообщение сессионным ключом.

Насколько я понимаю шаги 1-3 достаточно выполнить 1 раз, а сессионный ключ генерить на каждое сообщение. Я так по-началу и сделал. Возникло подозрение, что проблема связана с тем, что инициализация (пункты 1-3) приложения №2 каким-то образом воздействует на работу приложения №1. Воздействует в плане того, что оба приложения получают доступ к одному и тому же криптопровайдеру, сертификатам и не знаю чему еще.
После того, как я сделал выполнение ВСЕХ шагов на каждое сообщение проблема пропала (ну или пока не воспроизвелась). Вопрос: не может ли быть связана проблема с этим?
Offline Dima_Sun  
#3 Оставлено : 9 апреля 2009 г. 17:37:32(UTC)
Dima_Sun

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

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

Уточню вопрос.
1. Генерируем ключ согласования на отправляющей стороне и на принимающей.
2. Шифруем сообщение (перед шифрацией каждого сообщения генерируем сессионный ключ).
3. Передаем шифрованное сообщение
4. Получаем сессионный ключ из сообщения и при помощи него расшифровываем на принимающей стороне.
Все ок до тех пор, пока на отправляющей стороне не будет сгенерирован новый ключ согласования. После этого принимающая сторона уже не может расшифровать сообщение до тех пор пока не сгенерирует заново ключ согласования.
Это нормально?
Так и должно быть?
А какой подход в принципе должен быть, неужели ключ согласования должен получаться перед дешифрацией каждого сообщения?
Offline Максим Коллегин  
#4 Оставлено : 9 апреля 2009 г. 20:55:09(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
А сколько итераций нужно до получения ошибки?
Знания в базе знаний, поддержка в техподдержке
Offline Dima_Sun  
#5 Оставлено : 9 апреля 2009 г. 21:10:50(UTC)
Dima_Sun

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

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

Выглядит это примерно так:

Encoder.Init()
Decoder.Init()
Bin1 = Encoder.Encode(msg)
Decoder.Decode(Bin1) -- success
Encoder.Init()
Bin2 = Encoder.Encode(msg)
Decoder.Decode(Bin1) -- success
Decoder.Decode(Bin2) -- error
Offline Максим Коллегин  
#6 Оставлено : 9 апреля 2009 г. 21:13:03(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Лучше получать ключ согласования перед каждым экспортом/ипортом. Более подробно специалист ответит позже. Есть вариант поточной работы, но для этого нужно будет устанавливать дополнительные параметры.
Знания в базе знаний, поддержка в техподдержке
Offline Dima_Sun  
#7 Оставлено : 9 апреля 2009 г. 21:28:58(UTC)
Dima_Sun

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

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

maxdm написал:
Лучше получать ключ согласования перед каждым экспортом/ипортом.

Во-первых, не хотелось бы лишних накладных расходов, если это возможно (если не возможно, то и речи об этом нет).
Во-вторых, ни что нам не гарантирует, что между двумя соседними строчками кода Decoder.Init()+Decoder.Decode(Bin)
не произойдет вызовов Encoder.Init()+Encoder.Encode(msg) на отправляющей стороне. И это приводит нас в исходную точку.

maxdm написал:
Есть вариант поточной работы, но для этого нужно будет устанавливать дополнительные параметры.

Отличная мысль, ибо в нашем случае трафик может передаваться весьма существенный. Может отправите в какой-либо пример из SDK?
Offline Dima_Sun  
#8 Оставлено : 13 апреля 2009 г. 20:33:23(UTC)
Dima_Sun

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

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

Граждане, будьте любезны, уделите квант вашего внимания моей проблеме.
Продолжал исследовать проблему. В одном из ваших примеров нашел, что вектор инициализации (ВИ) может применяться (или должен применяться Think ) не только к сессионному ключу, но и к ключу согласования (в примере EncryptFile/DecryptFile используется только один вектор). Добавил коду. Теперь отправляющая сторона генерит сессионный ключ, получает ВИ для ключа согласования и сессионного ключа. Все это упаковывается вместе с зашифрованным сообщением. На принимающей стороне ВИ применяются к соотв. ключам и пытаемся расшифровать. Ничего не изменилось. Все работает ровно до тех пор, пока на отправляющей стороне на случится генерация нового ключа согласования. Скажите, подход не должен работать в принципе или что-то не так и все должно работать?
Обнаружился забавный эффект. Если на обеих сторонах к ключу согласования применять один и тот же ВИ (зашитый в программе), то все работает. Так и должно быть? На сколько такая инициализация ключа согласования нарушает степень безопасности (если так и оставить, хотя не хотелось бы... уж больно какое-то заплаточное решение)?
Offline Dima_Sun  
#9 Оставлено : 14 апреля 2009 г. 20:53:49(UTC)
Dima_Sun

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

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

Еще вопрос.
Имеет ли смысл при таком шифровании использовать подпись хеша сообщения. Насколько я понимаю, если злоумышленник смог подделать сообщение, зашифровать его ключом передающей стороны и выдать его за оригинальное, то значит он обладает ключами отправляющей стороны. И соответственно, может с легкостью сгенерировать хеш и подписать его. Я так понимаю подписанный хеш используется в случае передачи сообщения в открытом виде, а если мы шифруем сообщение, то его неизменность нам и так будет гарантирована. Прав ли я?
Offline Dima_Sun  
#10 Оставлено : 17 апреля 2009 г. 17:39:02(UTC)
Dima_Sun

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

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

Еще вопрос.
Взялся реализовывать подпись. Поскольку у меня уже была парочка сертификатов (для клиентской/серверной идентификации) хотел использовать один из них для этой цели. Не получилось. Пришлось сгенерить еще один - с типом "code signing". Заработало. Только остался вопрос: возможно использование одного сертификата? Вэб интерфейс, через который я их выписываю позволяет выбрать только одно использование(комбик). Существуют ли пути для генерации сертификата с несколькими типами использования?

ЗЫ. Все предыдущие вопросы в силе. Надеюсь на ответы.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.