Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 94
Добрый день.

Имеется подписанный файл (для удобства чтения отформатированный):
+ подписанный файл
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/insurer/12345">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="http://eln.fss.ru/actor/insurer/12345">
тут сертификат пользователя, подписавшего данные
</wsse:BinarySecurityToken>
<ds:Signature>
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<Reference URI="#body">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<DigestValue>тут хеш-сумма тега body</DigestValue>
</Reference>
</SignedInfo>
<ds:SignatureValue>
тут подписанная хеш-сумма тега SignedInfo
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#http://eln.fss.ru/actor/insurer/12345" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body wsu:Id="body">
<getPrivateLNData xmlns="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl">
<regNum>1111111</regNum>
<lnCode>22222222</lnCode>
<snils>123456789</snils>
</getPrivateLNData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Также в наличии имеется 2 сертификата: свой и ФСС.
С вычислением хеш-суммы и подписи разобрался. А вот шифрование не осилил.

Задача: этот подписанный файл зашифровать и поместить в файл:
+ структура зашифрованного файла
<SOAP-ENV:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:sch="http://gost34.ibs.ru/WrapperService/Schema"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <xenc:EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"></xenc:EncryptionMethod>
  <ds:KeyInfo>
    <xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
      <xenc:EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"></xenc:EncryptionMethod>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate></ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <xenc:CipherData>
        <xenc:CipherValue></xenc:CipherValue>
      </xenc:CipherData>
    </xenc:EncryptedKey>
  </ds:KeyInfo>
  <xenc:CipherData>
    <xenc:CipherValue>здесь содержимое зашифрованного файла</xenc:CipherValue>
  </xenc:CipherData>
</xenc:EncryptedData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В документе Спецификация_ЭЛН_Страхователь_v1_1_20171215.doc указано:
KeyInfo – содержит информацию об секретном ключе, сгенерированном для данного информационного взаимодействия (CipherValue) и публичный сертификат пользователя, зашифровавшего данные (X509Certificate)

Собственно вопросы:
1. Что такое "секретный ключ для данного информационного взаимодействия"?
2. Из непонимания (1) следующий вопрос: какими функциями пользоваться и в какой последовательности для шифрования файла.
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?
25 дек 17, 09:17    [21059341]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 557
Создание и проверка подписи документа XML

Объект CPEnvelopedData

+ форум КРИПТО-ПРО.
25 дек 17, 23:18    [21061778]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 94
sql2012,

Спасибо за ссылки, только они не открываются.

Вот сейчас у меня есть конкретный вопрос: как формируется CipherValue. Тот самый, который "секретный ключ для данного информационного взаимодействия".

По примерам с сайта накидал вот такое:
+
var
  PublicKeyFss, SessionKey, InitVector: TBytes;
  hKey, hAgreeKey, hSessionKey: Cardinal;
  Len, InputDataLen: Cardinal;
  AlgProExport: DWORD;
  KeySpec: DWORD;
begin
  // Загрузка PUBLICKEYBLOB из сертификата ФСС
  PublicKeyFss := GetPublicKeyFss;

  CryptAcquireContext(hProv, ContainerName, CP_GR3410_2001_PROV_A, PROV_GOST_2001_DH, 0);

  // Получение дескриптора закрытого ключа отправителя.
  CryptGetUserKey(hProv, AT_KEYEXCHANGE, hKey);

  // Получение ключа согласования импортом открытого ключа получателя на закрытом ключе отправителя.
  CryptImportKey(hProv, @PublicKeyFss[0], Length(PublicKeyFss), hKey, 0, hAgreeKey);

  // Установление PRO12_EXPORT алгоритма ключа согласования
  AlgProExport := CALG_PRO_EXPORT;
  CryptSetKeyParam(hAgreeKey, KP_ALGID, @AlgProExport, 0);

  // Генерация сессионного ключа.
  CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, hSessionKey);

  //--------------------------------------------------------------------
  // Зашифрование сессионного ключа.
  //--------------------------------------------------------------------

  //--------------------------------------------------------------------
  // Зашифрование сессионного ключа на ключе Agree.
  CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, nil, Len);
  SetLength(SessionKey, Len);
  CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, @SessionKey[0], Len);

  // Определение вектора инициализации сессионного ключа.
  CryptGetKeyParam(hSessionKey, KP_IV, nil, Len, 0);
  SetLength(InitVector, Len);
  CryptGetKeyParam(hSessionKey, KP_IV, @InitVector[0], Len, 0);

  // Зашифрование данных на сессионном ключе.
  InputDataLen := Length(Data);
	CryptEncrypt(hSessionKey, 0, True, 0, nil, Len, InputDataLen);
  if InputDataLen < Len then
    SetLength(Data, Len);
  CryptEncrypt(hSessionKey, 0, True, 0, @Data[0], Len, InputDataLen);


Как, зная SessionKey, InitVector и может быть что-то еще сформировать CipherValue?
28 дек 17, 12:51    [21069603]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 557
http://cpdn.cryptopro.ru/?url=/content/cades/plugin-samples-sign-xml.html

http://cpdn.cryptopro.ru/?url=/content/cades/class_c_ad_e_s_c_o_m_1_1_c_p_enveloped_data.html
28 дек 17, 16:47    [21070326]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 557
>CP_GR3410_2001_PROV_A, PROV_GOST_2001_DH

Такого не должно быть в коде,
в 2018 переход на ГОСТ-2012.
28 дек 17, 16:49    [21070329]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 3
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании.
Я использую C++, openssl и xmlsec1

Если Вам удастся разобраться, буду рад услышать способы вашего решения.


По поводу третьего вопроса
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?

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

А вот шифровать данные надо открытым ключом ФСС, чтобы он смог расшифровать их своим закрытым ключом
31 дек 17, 04:27    [21075732]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 557
cutecode
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании.
Я использую C++, openssl и xmlsec1

Если Вам удастся разобраться, буду рад услышать способы вашего решения.


По поводу третьего вопроса
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?

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

А вот шифровать данные надо открытым ключом ФСС, чтобы он смог расшифровать их своим закрытым ключом


Мне разобраться?
"Ваш" сертификат?

Что мешает использовать SDK и примеры с форумов?
Нежелание выделить время и взять\найти, лень, непонимание как искать по ключевым словам?

А... Новый Год же...

С наступающим.
31 дек 17, 09:52    [21075791]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
onets
Member

Откуда:
Сообщений: 64
cutecode
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании. Я использую C++, openssl и xmlsec1

Мда, на .NET я подобное делал для ФССП в 2012-2013 годах за три месяца весь проект. В целом ничего сложного - крипто-про, их примеры и форумы. Были локальные проблемы, типа несовпадения хеш сумм, но все решалось отладкой, вдумчивыми чтением документации и форумов крипто-про. Или как подлезть к этому во внутренностях WCF, чтоб в итоге все заработало.

Насколько я помню:
1. Если через СМЭВ, то два сертификата. Один для СМЭВ, второй для получателя. Нужно зашифровать сообщение-конверт для получателя сертификатом для получателя. Потом вложить его в конверт СМЕВ и зашифровать еще раз сертификатом для СМЭВ. Проблемы были - какой именно вложенный блок шифровать (начиная с какого xml тега) и какой проставлять Reference URI
2. Если напрямую, то по идее один сертификат.

В любом случае библиотека и примеры от крипто-про делали львиную долю работы. Все SignedInfo, DigestValue, SignatureValue проставлялись автоматически. Просто указываешь контент и какой сертификат использовать.

maratvg, cutecode
Попробуйте поискать примеры для делфей и C++ у крипто-про. Не думаю, что вас обделили в этом плане.
31 дек 17, 10:58    [21075821]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 557
onets,

ему уже был дан пример из руководства разработчика,
открыть SDK и посмотреть... что же там такого нужно написать на C++... видимо сложно.
31 дек 17, 12:57    [21075921]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 3
Уж поверьте мне - сложно.
ибо вы тут сами пишите всякую "хрень"

например, ели человек пишет
Такого не должно быть в коде, 
в 2018 переход на ГОСТ-2012.

то он не имеет ни какого представления об XML encryption. В шаблоне же XML явно указаны алгоритмы
Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"
Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"


А юзер onets вообще не знает разницы между XML Signing и XML encryption.
Автор темы же написал, что он разобрался с подписью, и не может зашифровать.
А onets злорадно описывает, о том как он легко разобрался с подписью и ни слова о шифровании

А .NET вам не C++. Да, на Java и C# есть готовые библиотеки. Но на С++ я не нашел.
Есть куча библиотек, но они ГОСТ-а не понимают.
А на КриптоПро есть пример только с СОМ-объктом, т.е. на Линукс уже работать не будет. И то при условии что установлен MS Office 2003.

Если вы "умники" если такие умные, то я готов вам заплатить если вы мне сделаете это для вас "легкое задание".
Говорите вашу цену.


С Новым Годом
2 янв 18, 04:07    [21078073]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 94
cutecode,

На delphi пока никуда не продвинулся.

На данный момент пользуюсь классами GostEncryptSOAP/GostDecryptSOAP из GostCryptography.dll из набора arm_fss.
Что примечательно, программисты ФСС видимо тоже не делфи не стали это всё реализовывать, раз юзают дотнетовскую длл-ку.
9 янв 18, 13:42    [21089923]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
uranic
Member

Откуда:
Сообщений: 294
Знаю одну успешную реализацию на Delphi, с ноября 2017 все отправляют. Номера ЛН регистрируют и т.п. Вообщем полный цикл
Из сторонних библиотек используется JwaWinCrypt.pas (из JEDI, для доступа к CryptoAPI)

Весь процесс реализации затянулся на 4 месяца. (начали в середине июля, к середине октября были в тестовой эксплуатации).
К сожалению подробностей много рассказать не могу.
9 янв 18, 17:18    [21091020]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить