Добрый день!
Пытаюсь написать сервис, который отправляет soap-запрос на сервис ФСС и получает оттуда больничный лист.
Уже написал запрос, который подписывается ЭЦП, отправляется на тестовый сервер ФСС и приходит корректный ответ(данные по больничному листку)
Но с шифрованием все оказалось не однозначно.
ВО первых, в самой спецификации, указанной на сайте ФСС про шифрование почти ничего не написано, кроме как данные должны быть зашифрованы по ГОСТ 28147-89.
Например, не указано в каком режиме шифровать данные(ECB, CBC и др.), как сформировать UKM(синхропосылку), какой паддинг использовать и т.д.
Посмотрев этот форум нашел информацию о том, что шифровать нужно в режиме CBC и используя паддинг ISO10126
ссылка на постЯ пишу на python и использую библиотеку pygost, т.к. не хочу использовать microsoft CryptoApi для работы с криптопровайдером, т.к. придется описывать кучу С-шных структур на питоне.
Сейчас я делаю так(весь алгоритм), который
не использует Microsoft Crypto Api:
1.Случайным образом вырабатываю сессионный ключ и вектор инициализации(IV), и синхропосылку – UKM.
2.Генерирую эфемерную ключевую пару(тоже случайным образом)
3.Выполняю выработку общего ключа(ключ согласования - kek) используя приватный ключ эфемерной пары, открытый ключ ФСС и UKM-синхропосылку, работая с 34.10-2001 кривой
4.Шифрую данные сессионного ключа в режиме ECB используя ключ согласования - KEK и UKM – получаю зашифрованный сессионный ключ и MAC
5.Делаю падинг исходных данных(паддинг первого запроса в ФСС, который подписан и работает) в соответствии с ISO10126.
6.Шифрую сырые данные в режиме CBC используя не зашифрованный сессионный ключ и вектор инициализации – IV
7.Формирую структуру GostR3410-KeyTransport из полученных данных при шифровании сессионного ключа.
8.Формирую итоговую XML для soap-запроса
В итоге сначала у меня была такая ошибка:
«S:Serverru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Не удалось расшифровать сообщение. Возможно сообщение зашифровано на ключе отличном от ключа уполномоченного лица ФСС. Проверьте правильность и актуальность ключа уполномоченного лица ФСС.»Это потому что я попробовал везде использовать режим шифрования CBC(т.е. и для шифрования сессионого ключа тоже), но изменив режим шифрования сессионного ключа на ECB, ошибка эта ушла, но появилась новая:
«Запрос не корректен. Код ошибки - 500. S:Serverru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Error in execution of data encrypting/decrypting operation. class org.apache.xml.security.encryption.XMLEncryptionException»
Из чего я сделал вывод, что зашифрованный сессионный ключ теперь расшифрован, но не получается расшифровать сами данные. Возможно я ошибаюсь.
В указанном выше посте написано в каком режиме шифруются данные, но в каком сессионный ключ - нет.
Вопросы такие:1.В каком режиме шифровать сырые данные(данные первого запроса с подписью)? (я использовал CBC, padding ISO10126)
2.В каком режиме шифровать сессионный ключ? (я использовал ECB)
3.Каким образом формировать UKM? Можно ли его формировать случайно, чтобы потом вставить в структуру GostR3410-KeyTransport?
4.Можно ли генерировать сессионный ключ и вектор инициализации случайно?