logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline Shuraken  
#41 Оставлено : 25 декабря 2018 г. 16:52:19(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Занятно. Удалось выяснить следующую особенность.
При формировании сообщения внутрь него вкладывается публичный сертификат пользователя. После подписания сообщения оно шифруется сертификатом ФСС и отправляется на их сервер. Там сообщение расшифровывается их закрытым ключом, проверяется ЭЦП и формируется ответное сообщение. В него вкладывается публичный сертификат (по идее, тот же самый, которым я шифровал сообщение), подписывается и шифруется.
Если я правильно понял, шифровать они должны моим публичным сертификатом, взятым из подписанного сообщения. Поправьте, если я не прав. И после отправки я расшифровываю его своим закрытым ключом и обрабатываю.
Так вот особенность заключается в том, что я шифрую сообщение сертификатом ФСС с открытым ключом ГОСТ Р 34.10-2001 (512 bit), вкладывая внутрь свой сертификат с открытым ключом, а тестовый сервер, насколько я понял, шифрует ответное сообщение сертификатом ФСС с открытым ключом ГОСТ Р 34.10-2012 256 бит - по крайней мере, в узле <ds:X509Certificate></ds:X509Certificate> содержится именно он.
И когда я пытаюсь расшифровать данные своим сертификатом, он их расшифровать не может и ошибки не выдаёт.
Когда я подменяю сертификаты в сообщении и пытаюсь их расшифровать - ругается на плохие данные.

И как исправить эту ситуацию?
Offline two_oceans  
#42 Оставлено : 25 декабря 2018 г. 21:51:41(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 51 раз в 50 постах
Библиотека вообще гост-2012 поддерживает? в приложенном pas файле не заметил упоминаний гост-2012.

Подробно не разбирался с расшифровкой, но навскидку: при варианте через низкоуровневые функции в procedure Tfrm.GetResponseKeysBlobs был приведен код формирования блобов с явными идентификаторами параметров гост-2001(параметры подписи 1.2.643.2.2.36.0 ~ xchgA ~ AT_KEYEXCHANGE, параметры хэширования 1.2.643.2.2.30.1, алгоритм открытого ключа $2e23 ~ 1.2.643.2.2.19), хорошо бы все же выяснить какой алгоритм нужен. Раз уж фигурируют ключи ГОСТ-2012 256 и 512 бит, то очень вероятно что блоб тоже должен содержать параметры гост-2012, а не гост-2001. Это же касается keyParam := CALG_PRO_EXPORT, для гост-2012 есть и другой алгоритм.

Если берется открытый ключ из контекста сертификата, то там есть уже сформированная информация об открытом ключе со всеми нужными идентификаторами самого открытого ключа (причем незашифрованная), ее можно импортировать специальной упрощенной для открытых ключей функцией (в hProv созданный с параметром verifycontext) и получить дескриптор открытого ключа
Код:
pKeyBlob:=@(pCertCont^.pCertInfo^.SubjectPublicKeyInfo);
CryptCheck(CryptImportPublicKeyInfo(hProv,X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,pKeyBlob, hPubKey)
либо можно добавить к ней впереди заголовок блоба (16 байт) и передать в CryptImportKey как у Вас, но тогда опять же надо заголовок заполнить нужными параметрами.

По поводу шифрования вообще - как правило все-таки сертификат адресата для шифрования берется из хранилища, то есть Ваш сертификат должен присутствовать в хранилище сервера. При регистрации в какой-либо информационной системе обычно нужно приложить свой сертификат как раз для добавления в список адресатов. Частным случаем хранилища может выступать файл, но это совершенно не обязательно. Поэтому если при регистрации указывали какой-либо сертификат, то имеет смысл попробовать расшифровать им вместо вложенного при запросе. Насколько помню во всей этой затее с ЭЛН у меня как раз был вопрос откуда ФСС возьмут наш сертификат. Далее у нас в организации решили получать ЭЛН через Контур-Экстерн в ручном режиме, так что вопрос остался незаданным.

Если сертификат вкладывается при подписании, то он может не совпадать с сертификатом шифрования. Например, если на тестовом сервере есть 2 контейнера - 1 для расшифровки (сертификат соответствующий ему от аккредитованного центра Вы используете при зашифровании) и 1 для подписания (сертификат соответствующий ему от тестового центра вкладывается в ответное сообщение и его Вы используете при проверке подписи в тестовом режиме).

Ну и конечно возможна ситуация когда второпях посмотрели на другое поле, так как длина в названии алгортима 256 соответствует размеру открытого ключа 512, длина в названии алгортима 512 - размеру открытого ключа 1024.

Отредактировано пользователем 25 декабря 2018 г. 22:15:01(UTC)  | Причина: Не указана

Offline Shuraken  
#43 Оставлено : 25 декабря 2018 г. 22:46:45(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Библиотека вообще гост-2012 поддерживает? в приложенном pas файле не заметил упоминаний гост-2012.


Не поддерживает. Когда я пробовал для проверки зашифровать и расшифровать сообщение своим сертификатом с закрытым ключом, то это работало только для сертификата с гост-2001

Автор: two_oceans Перейти к цитате
Подробно не разбирался с расшифровкой, но навскидку при варианте через низкоуровневые функции в procedure Tfrm.GetResponseKeysBlobs был приведен код формирования блобов с явными идентификаторами параметров гост-2001(1.2.643.2.2.36.0 ~ AT_KEYEXCHANGE, 1.2.643.2.2.30.1, $2e23 ~ 1.2.643.2.2.19), хорошо бы все же выяснить какой алгоритм нужен. Раз уж фигурируют ключи ГОСТ-2012 256 и 512 бит, то очень вероятно что блоб тоже должен содержать параметры гост-2012, а не гост-2001. Это же качается keyParam := CALG_PRO_EXPORT, для гост-2012 есть и другой алгоритм.

А как выяснить, какой алгоритм нужен? Я шифрую сообщение сертификатом с гост-2001, в ответ приходит зашифрованное сообщение с публичным сертификатом по гост-2012 256 бит. Вот пример ответа.



Автор: two_oceans Перейти к цитате
По поводу шифрования вообще - как правило все-таки сертификат адресата для шифрования берется из хранилища, то есть Ваш сертификат должен присутствовать в хранилище сервера.

Навряд ли. Если только при получении сообщения они не заносят публичный сертификат из подписи.

Автор: two_oceans Перейти к цитате
Если сертификат вкладывается при подписании, то он может не совпадать с сертификатом шифрования. Например, если на тестовом сервере есть 2 контейнера - 1 для расшифровки (сертификат соответствующий ему от аккредитованного центра Вы используете при зашифровании) и 1 для подписания (сертификат соответствующий ему от тестового центра вкладывается в ответное сообщение и его Вы используете при проверке подписи в тестовом режиме).

Для подписи используются 2 сертификата: по гост-2001, когда сообщение подписывается сертификатом с ключом по этому госту, и сертификат с гост-2012 256 бит, когда сообщение подписывается сертификатом с гост-2012 256 бит. Если же сообщение подписывается сертификатом с гост-2012 512 бит, то в ответном сообщении никакого сертификата не прикладывается.

Шифруется же сообщение всё время одним сертификатом с гост-2012 256 бит.

Честно скажу, из всего вышесказанного не очень понял, как всё-таки расшифровывать их сообщение, имея на руках лишь их открытый сертификат с гост-2001 или гост-2012 256 бит. Можете чуть подробнее осветить этот вопрос?

С уважением, Александр.

Offline two_oceans  
#44 Оставлено : 26 декабря 2018 г. 12:16:54(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 51 раз в 50 постах
Как уже я писал подробно в тему ранее не вникал. Поискал по интернету (без обращения к документации самого стандарта xmlenc и добавки для гост), самая полная информация на мой взгляд как раз вот в этой теме в сообщении 17. Частично похоже я был не прав и сертификат берется из сообщения.
По urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001 в примере ответа похоже, что вся схема транспорта ключей на алгоритме гост-2001 (для гост-2012 введены другие идентификаторы) и библиотека по идее должна бы частично работать. Как схема транспорта гост-2001 совмещается с ключом гост-2012 пока мне непонятно, возможно библиотека падает как раз на этом. Или в Вашем контейнере ключ типа AT_SIGNATURE вместо AT_KEYEXCHANGE, тогда большинство высокоуровневых оберток будут спотыкаться на проверке типа ключа, но низкоуровневыми функциями можно использовать и ключ типа AT_SIGNATURE (я так понимаю это потребует замены одного из идентификаторов в блобе). Или ключ из сертификата не соответствует контейнеру.

Сообщение №17 этой темы как раз подробно разжевывает алгоритм шифрования/расшифрования транспорта ключей на алгоритме гост-2001 низкоуровневыми функциями с примерами кода на Дельфи. В частности, еще указываются несколько параметров расшифрования. Следующие 2 сообщения еще и про обработку паддинга вручную уточняют.

Из №14 другой темы узнаем, что п. 4 при отправке запроса как раз сертификат в готовом зашифрованном заменяется на "Ваш" сертификат (для которого у Вас есть контейнер с ключом типа AT_KEYEXCHANGE). Сервер должен зашифровать сообщение, ориентируясь на этот сертификат. Продолжая мысль - при расшифровке ответа нужно проводить операции импорта на экземпляре криптопровайдера связанном с этим же контейнером, на сертификат которого был заменен сертификат в запросе. Соответственно по такой логике сертификат приложенный сервером в ответе приглашает Вас при следующем запросе использовать сертификат из ответа сервера, но сертификат из ответа не участвует в расшифровке. Получается когда используете гост-2001, а сервер предлагает перейти на гост-2012 256. А когда используете гост-2012 512, сервер это устраивает и ничего не предлагает. Ну я понял так.

Определить нужный контейнер можно по-разному.
Какой способ использует библиотека достаточно сложно без декомпиляции/отладки самой библиотеки.

Далее - расшифрованный текст должен представлять собой подписанный сервером xml ответ и в нем уже будет сертификат для проверки подписи ФСС.

Отредактировано пользователем 26 декабря 2018 г. 12:34:28(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Shuraken оставлено 26.12.2018(UTC)
Offline Shuraken  
#45 Оставлено : 26 декабря 2018 г. 12:55:54(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
two_oceans, огромное спасибо. Действительно сработало.
Зашифровал их сертификатом при помощи GostEncryptSOAP и заменил их сертификат в зашифрованном сообщении на свой. Получил ответ, заменил их публичный сертификат на свой, и им же расшифровал при помощи GostDecryptSOAP.
Млин, до такого я додуматься не мог.
Offline Shuraken  
#46 Оставлено : 27 декабря 2018 г. 15:29:19(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Пытаюсь сейчас разобраться с шифрованием и дешифрованием в новых версиях GostCryptography.dll, но в них постоянно вылезают ошибки. Если кто может, проверьте пожалуйста, работают ли у вас функции GostEncryptSoap.encryptMsg и GostDecryptSoap.decryptMsg из аттача. Также прилагаю тестовый проект для проверки. EncryptMessage.rar (9kb) загружен 1 раз(а).

С уважением, Александр.

GostCryptography2020.rar (220kb) загружен 1 раз(а).

Отредактировано пользователем 28 декабря 2018 г. 6:10:28(UTC)  | Причина: Не указана

Offline Shuraken  
#47 Оставлено : 15 января 2019 г. 9:47:42(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Пытаюсь разобраться с GostCryptography. Скачал версию с гитхаба разработчика: GostCryptography, батником собираю, получаю dll (во вложении). Пытаюсь regasm-ом зарегистрировать - пишет "ни одного типа не найдено". TlbExp создаёт GostCryptography.tlb, но он пустой (также во вложении).
Версия DLL (gostcryptography2020.dll во вложении), поставляемая с АРМ ФСС совпадает по номеру с версией разработчика (2.0.2), но больше на 6Кб и весь необходимый функционал у неё есть, который нормально регистрируется, нормально экспортируется в tlb-файл, нормально переводится в Делфи. Но при попытке шифрования через GostEncryptSOAP выдаёт ошибку: ASN.1 encoded byte array contains invalid structure "GostCryptography.ASN1.PKI.GOSTR34102001.GOSTR34102001PublicKeyParameters". При этом ошибка возникает как при использовании сертификата ФСС с открытым ключом по гост-2001, так и с ключом по гост-2012. Стоит КриптоПро и всё.
Что самое интересное, АРМ ФСС этой ошибки не выдаёт и спокойно загружает тестовые данные как на сертификате по гост-2001, так и по гост-2012.

Если несложно, проверьте пожалуйста, какая длл создаётся у вас при использовании версии с сайта разработчика? В ней также, как и у меня, отсутствуют ссылки на используемый функционал?
И такой вопрос: есть ли у кого-нибудь код шифрования сообщения при помощи gostcryptography.dll, но без использования класса GostEncryptSOAP. Если есть, можете поделиться?

С уважением, Александр.

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