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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ещё один Сергей  
#1 Оставлено : 7 февраля 2020 г. 19:23:47(UTC)
Ещё один Сергей

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.01.2020(UTC)
Сообщений: 5
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Добрый день.
В конце прошлого года перешли на использование сертификата 2012 госта, но для зашифрования всё ещё использовался сертификат ФСС 2001 госта.
Процесс был отлажен и работал. Сейчас нужно и шифровать сертификатом 2012 госта, так как 2001 больше не используется. С этим возникла проблема.
Попытка просто использовать новые параметры шифрования (указанные в спецификации ФСС) ничего не дала.

Попробовали использовать библиотеку скачанную по ссылке с сайта ФСС (http://www.api-fss.ru/) для зашифрования, с использованием тех же сертификатов.
На сайте ФСС указано что автор библиотеки "Сернов И.Е., Санкт-Петербург, АО «Адмиралтейские верфи»". Так как библиотека от стороннего разработчика и похоже сама содержит ошибки (не полностью соответствует документации и падает в неожиданных местах) использовать её в "боевых" целях нельзя. Но с её помощью получилось сформировать зашифрованный запрос, который ФСС успешно расшифровал и прислал ожидаемый зашифрованный ответ. Ответ тоже удалось расшифровать без проблем.

У нас зашифрование производится в Delphi с использованием CryptoPro CSP 4.0.9971. Ниже приводится код зашифрования. Код разбит регионами с комментариями, созданными на основе спецификации ФСС. Внутри регионов имеются комментарии непосредственно к коду, но вначале каждого региона вплоть до фрагмента "//---------" - копипаста из спецификации, без каких-либо изменений.


Вопрос: Что делаем не так?

p.s.: Не могу сказать что хорошо подкован в криптографии и свободно ориентируюсь в связанных с нею стандартах, так что возможно есть очевидная проблема которой я просто не вижу. Всё что на данный момент перечитал на эту тему, позволило только несколько переработать написанный предшественником код, локализовать проблему и актуализировать несколько идентификаторов, а местами устранить хардкод. На сколько я понимаю проблема точно должна быть в зашифровании, так как снаружи приведённого выше метода меняется только та часть soap-запроса которая содержит результат работы метода зашифрования. И в случае когда используем результат работы метода, ФСС не может расшифровать сообщение, а когда используем полученные упоминавшейся ранее библиотекой данные, ФСС успешно расшифровывает запрос.
p.p.s.: Спецификация на которую опираемся актуальная и используемые сертификаты тоже. Проверено-перепроверено, так как были подозрения что проблема не в коде.
p.p.p.s: Боевой код который используется в приложении не привожу из-за того что нет на это прав. Приводимый код - фрагмент тестового приложения, алгоритмически он соответствует оригиналу и проблемы возникающие в боевом коде в нём полностью повторяются.

На всякий случай привожу и шаблон XML-запроса который используется в тестировании. Именно в нём текст "EncrypttedKeyValue" и "EncryptedDataValue" замещаются результатом работы метода шифрования.


Буду признателен за помощь и дельные советы.

Отредактировано пользователем 11 февраля 2020 г. 12:35:25(UTC)  | Причина: Не указана

Offline KDA  
#2 Оставлено : 10 февраля 2020 г. 19:16:34(UTC)
KDA

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

Группы: Участники
Зарегистрирован: 12.10.2009(UTC)
Сообщений: 42

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Навскидку:
encryptionParamSet для ключа ГОСТ 28147-89 надо снимать для обоих ключей: согласования и шифрования. При этом тот, что в SIMPLEBLOB - это на шифрование.
Или ставить оба в известные значения принудительно.
Если у нас речь идет о стандартном CMS keytransport(имеем возможность расшифровать на той стороне через CryptDecryptMessage):
- На согласование ключа - только CALG_PRO_EXPORT
- режим шифра - CFB. Оно все получается "из коробки" после CryptGenKey (CFB/PKCS5_PADDING)
- Неплохо бы согласовывать параметры эфемерального ключа с ключом получателя

Отредактировано пользователем 10 февраля 2020 г. 19:26:52(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил KDA за этот пост.
Ещё один Сергей оставлено 11.02.2020(UTC)
Offline two_oceans  
#3 Оставлено : 11 февраля 2020 г. 5:21:08(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Внушает сомнения строка:
Цитата:
// Параметры шифрования TK26Z, на криптопровайдере по ГОСТ 2012, установлены поумолчанию, проверялось.
Потому как по умолчанию обычно генерится ключ гост-89 (гост-89 есть на разных криптопровайдерах) с параметрами верба-О. Но даже если по умолчанию TK26Z, Вас не побьют если их установите еще раз для страховки.

Про CALG_PRO_EXPORT уже сказали, много реализаций споткнулось на том что ставили CALG_PRO12_EXPORT для гост-2012, а ФСС использует CALG_PRO_EXPORT. Попробуйте расшифровать полученный ответ ФСС с такими установками (TK26Z CALG_PRO_EXPORT). Если в основном пойдет, но будут искажения в конце блоков - надо настраивать паддинг, если искажение в начале файла, то стартовый вектор.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Ещё один Сергей оставлено 11.02.2020(UTC)
Offline Ещё один Сергей  
#4 Оставлено : 11 февраля 2020 г. 12:59:27(UTC)
Ещё один Сергей

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.01.2020(UTC)
Сообщений: 5
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Спасибо за ответы.

Цитата:
Внушает сомнения строка:
Цитата:
// Параметры шифрования TK26Z, на криптопровайдере по ГОСТ 2012, установлены поумолчанию, проверялось.


Цитата:
- Неплохо бы согласовывать параметры эфемерального ключа с ключом получателя


Внёс изменения в код первого сообщения. Добавил туда две проверки на то что параметры сессионного и эфемерного ключей установлены в szOID_Gost28147_89_TC26_Z_ParamSet (можно найти в коде топика по тексту "szOID_Gost28147_89_TC26_Z_ParamSet"). На логике метода это никак не сказывается просто два асерта дописаны. На работу метода это никак не повлияло, асерты не срабатывают.
Возможно пункт про согласование параметров я как-то не так понял. Поправьте если имелось в виду что-то другое.

Цитата:
- На согласование ключа - только CALG_PRO_EXPORT


Заменил на CALG_PRO_EXPORT, не помогло.
Код:

        // Установка алгоритма ключа согласования
        // Пробовал и CALG_PRO12_EXPORT и CALG_PRO_EXPORT, всё-равно наше сообщение расшифровать не могут
        // а мы их расшифровываем только с CALG_PRO_EXPORT;
        keyParam := CALG_PRO_EXPORT; //поменял по совету
        CheckCryptoCall(CryptSetKeyParam(hAgreeKey, KP_ALGID, @keyParam, 0));


Цитата:
- режим шифра - CFB. Оно все получается "из коробки" после CryptGenKey (CFB/PKCS5_PADDING)


Попробовал CFB/PKCS5_PADDING, тоже не помогло. При этом расшифрование ответа от ФСС корректно работает только с CBC/ANSIX923_PADDING. Допускаю что они не обязаны совпадать. Возможно как-то и зависят от ключа получателя, но вроде в спецификации написано что использовать, хотя и как-то неоднозначно "Возможные параметры шифратора GostJCE/CBC/ISO10126Padding;"

Цитата:
encryptionParamSet для ключа ГОСТ 28147-89 надо снимать для обоих ключей: согласования и шифрования. При этом тот, что в SIMPLEBLOB - это на шифрование.
Или ставить оба в известные значения принудительно.


Этот момент скорее всего не так понял. Вроде пересекается с добавленными мною асертами, но это не точно. Что имеется в виду под снимать encryptionParamSet? И что на самом деле предлагается попробовать?
Offline KDA  
#5 Оставлено : 11 февраля 2020 г. 14:32:54(UTC)
KDA

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

Группы: Участники
Зарегистрирован: 12.10.2009(UTC)
Сообщений: 42

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Цитата:
Этот момент скорее всего не так понял. Вроде пересекается с добавленными мною асертами, но это не точно. Что имеется в виду под снимать encryptionParamSet? И что на самом деле предлагается попробовать?


Имелось в виду
Цитата:

transport.TransportParameters.EncryptionParamSet := sessionKeySimpleBlob.GetEncryptionParamSet;

Это некоторый аналог CryptGetKeyParam(hSessionKey, KP_CIPHEROID). Обращаем внимание, что это hSessionKey, а не hAgreeeKey
А c hAgreeKey никуда, в общем случае, не попадает.
В CMS рядом с ukm кладется именно c hAgreeKey (как и его вектор синхронизации), а для hSessionKey в структуру Gost28147-89-Parameters (RFC 4490), вместе с его KP_IV

Т.е. речь о том, что у нас есть часть параметров ключей, которые либо надо все передавать правильно, либо фиксировать на конкретные известные/фиксируемые на принимающей стороне значения.

Кстати, тут выше была оговорка, что провайдер - 12 года.
У него при генерации ключей encryptionParamSet по умолчанию - 1.2.643.7.1.2.5.1.1 - TC_()Z, а вот для CSP 2001 ГОСТа - 1.2.643.2.2.31.1 (..._CryptoPro_A_ParamSet). Точно можно посмотреть в панели управления КриптоПро

Так что, возможно, имеет смысл переключить CSP на 2001 год - любой провайдер в состоянии работать с любым ГОСТ, они отличаются тут только в значениях по умолчанию.
Ну и и, если есть возможность, начинать отладку с расшифровки сообщений с той стороны. Проще будет определиться с используемыми там параметрами:
Если получилось с hAgreeKey, то с его параметрами все ОК, и можно подбирать уже непосредственно параметры шифрования данных.

Отредактировано пользователем 11 февраля 2020 г. 14:39:49(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил KDA за этот пост.
Ещё один Сергей оставлено 12.02.2020(UTC)
Offline Ещё один Сергей  
#6 Оставлено : 12 февраля 2020 г. 16:45:35(UTC)
Ещё один Сергей

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.01.2020(UTC)
Сообщений: 5
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: KDA Перейти к цитате

Имелось в виду
Цитата:

transport.TransportParameters.EncryptionParamSet := sessionKeySimpleBlob.GetEncryptionParamSet;


Это некоторый аналог CryptGetKeyParam(hSessionKey, KP_CIPHEROID). Обращаем внимание, что это hSessionKey, а не hAgreeeKey
А c hAgreeKey никуда, в общем случае, не попадает.
В CMS рядом с ukm кладется именно c hAgreeKey (как и его вектор синхронизации), а для hSessionKey в структуру Gost28147-89-Parameters (RFC 4490), вместе с его KP_IV

Т.е. речь о том, что у нас есть часть параметров ключей, которые либо надо все передавать правильно, либо фиксировать на конкретные известные/фиксируемые на принимающей стороне значения.


На сколько я понимаю сейчас все параметры что можно было установить установлены в соответствии с настройками отправляющей стороны. Возможно что-то упускаю. Приведу ниже код расшифрования ответа, который отлично справляется как с расшифрованием данных от ФСС, так и с расшифрованием результатов функции EncryptData из первого поста (при условии что в ней используется CRYPT_MODE_CBC, ANSIX923_PADDING и CALG_PRO_EXPORT, ну и ARemotePublicKeyBlob отдаваемый ей на вход из нашего сертификата).

Автор: KDA Перейти к цитате

Кстати, тут выше была оговорка, что провайдер - 12 года.
У него при генерации ключей encryptionParamSet по умолчанию - 1.2.643.7.1.2.5.1.1 - TC_()Z, а вот для CSP 2001 ГОСТа - 1.2.643.2.2.31.1 (..._CryptoPro_A_ParamSet). Точно можно посмотреть в панели управления КриптоПро

Так что, возможно, имеет смысл переключить CSP на 2001 год - любой провайдер в состоянии работать с любым ГОСТ, они отличаются тут только в значениях по умолчанию.


Смена провайдера не помогла. Хоть устанавливаю значения '1.2.643.7.1.2.5.1.1' для эфемерного и сессионного ключей, хоть нет, хоть делаю это только для одного из них, результат один - ФСС нас не может расшифровать. Но наш метод расшифрования это дело успешно расшифровывает в любых комбинациях (если использовать для шифрования наш серт и некоторые асерты проверяющие этот параметр править в зависимости от того что устанавливаем).

Автор: KDA Перейти к цитате

Ну и и, если есть возможность, начинать отладку с расшифровки сообщений с той стороны. Проще будет определиться с используемыми там параметрами:
Если получилось с hAgreeKey, то с его параметрами все ОК, и можно подбирать уже непосредственно параметры шифрования данных.


Проблема в том что я уже не знаю из чего и подбирать. А метод расшифрования работает. Как и писал выше. Работает и с нашими данными и с данными от ФСС, если в нём установлены CRYPT_MODE_CBC, ANSIX923_PADDING и CALG_PRO_EXPORT.
Собственно вот он:


И метод DecodeTransport ещё приведу, вроде там всё честно, но есть некоторое количество магии, может натолкнёт на мысли.
Offline Ещё один Сергей  
#7 Оставлено : 18 февраля 2020 г. 18:20:26(UTC)
Ещё один Сергей

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.01.2020(UTC)
Сообщений: 5
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Проблему решить пока не удаётся. Может у кого-нибудь ещё идеи есть?
Offline haspb  
#8 Оставлено : 6 мая 2020 г. 11:50:52(UTC)
haspb

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.03.2019(UTC)
Сообщений: 8
Российская Федерация
Откуда: спб

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
У меня вопрос по первой реплике в части библиотеки api-fss. Автор скачал с сайта api-fss.ru готовое консольное приложение и произвел обмен данными с ФСС. При этом речь ведет о dll-библиотеке. Разницы нет между консольным приложением и dll-библиотекой? Автору не поставлялись ни библиотека, ни документация к ней. Этично ли давать негативный отзыв о том к чему у тебя нет доступа?
Offline two_oceans  
#9 Оставлено : 6 мая 2020 г. 13:16:30(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Наверно да, неэтично.
Это как раз как сформулировано на сайте - несовместимость конкретной ИС с библиотекой (если формально в состав ИС запишем и Framework и SDK, установленные на конкретном сервере ИС). Написать сразу с какими версиями библиотека тестирована наверно разумнее разработчику чем собирать негативные отзывы.

И наверно никто не будет спорить, что любой большой проект неизбежно будет содержать "шероховатости". Про спецификации тоже сложный вопрос: ФСС (и ПФР) очень часто понимают международные стандарты, мягко говоря, по-своему.
Не перелопатив классы от Майкрософт и соответственно не породив возможные несовместимости с другими версиями платформы .NET, просто невозможно написать рабочую библиотеку по спецификации ФСС - по стандартам ID и URI будет забракован и сертификат подписи не найдется. Здесь сложно ответить "кто виноват?"

С другой стороны, на сайте сейчас видно и архив с библиотекой (помимо приложения) и краткую инструкцию как пользоваться библиотекой. О какой "поставке" автору темы идет речь? Библиотека и урезанная документация в открытом доступе. Или в открытом бета версия, а за деньги под заказ нормальная? Тогда это нужно пояснить на сайте.

Отредактировано пользователем 6 мая 2020 г. 13:31:35(UTC)  | Причина: Не указана

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