logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline arte-tkolomiets  
#21 Оставлено : 15 июня 2018 г. 0:55:56(UTC)
arte-tkolomiets

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

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

Поблагодарили: 4 раз в 1 постах
Коллеги, день добрый. По мотивам темы пытаюс отослать сообщение в ФСС шифрованное. Получаю печальное
ru.ibs.cryptoprto.jcp.wrapper.ws.client.generated.CryptoException_Exception: Не удалось расшифровать сообщение. Возможно сообщение зашифровано на ключе отличном от ключа уполномоченного лица ФСС. Проверьте правильность и актуальность ключа уполномоченного лица ФСС
Если можно, просмотрите код, он основан на источнике верхних функций, типы данных все совпадают, за исключением некоторых доп кусков, комментирую которые. Может, сразу что-то в глаза бросится, вроде бы все выходит в соответствии с кодом выше.


Собственно, все. Заранее благодарен.

Отредактировано пользователем 15 июня 2018 г. 1:21:06(UTC)  | Причина: Не указана

Offline not_x  
#22 Оставлено : 15 июня 2018 г. 7:38:33(UTC)
not_x

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

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

Сначала прорвете сертификат ФСС - в начале июня он его поменяли (см. https://cabinets-test.fss.ru/eln.html)
Offline arte-tkolomiets  
#23 Оставлено : 15 июня 2018 г. 8:25:02(UTC)
arte-tkolomiets

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

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

Поблагодарили: 4 раз в 1 постах
Автор: not_x Перейти к цитате
Сначала прорвете сертификат ФСС - в начале июня он его поменяли (см. https://cabinets-test.fss.ru/eln.html)

использую этот
Сертификат уполномоченного лица 2018

Offline arte-tkolomiets  
#24 Оставлено : 16 июня 2018 г. 4:39:00(UTC)
arte-tkolomiets

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

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

Поблагодарили: 4 раз в 1 постах
Причем, хочу заметить, перестало работать даже АРМ ЛПУ с сайта https://cabinets-test.fss.ru/eln.html
Выдает ту же самую ошибку. Сертификат новый довольно странный какой-то.
Offline arte-tkolomiets  
#25 Оставлено : 16 июня 2018 г. 6:45:08(UTC)
arte-tkolomiets

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

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

Поблагодарили: 4 раз в 1 постах
С крипто-про нормально работает софт от ФСС, но теперь возникла проблема, почему-то, в зависимости, находится ли контейнер с закрытым ключом в реестре текущего пользователя или реестре локального компьютера, валятся, соответственно, вызовы
1) CryptSignHash с AT_SIGNATURE
2) CryptAcquireContext при локальном компьютере
С ошибкой "Набор ключей не существует". То есть, если ключ в реестре пользователя, до доходит доформирования подписи, если в реетре компьютера, то рвется на инициализации контекста. С VinCSP такого не было.
Offline arte-tkolomiets  
#26 Оставлено : 16 июня 2018 г. 6:49:52(UTC)
arte-tkolomiets

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

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

Поблагодарили: 4 раз в 1 постах
Автор: arte-tkolomiets Перейти к цитате
С крипто-про нормально работает софт от ФСС, но теперь возникла проблема, почему-то, в зависимости, находится ли контейнер с закрытым ключом в реестре текущего пользователя или реестре локального компьютера, валятся, соответственно, вызовы
1) CryptSignHash с AT_SIGNATURE
2) CryptAcquireContext при локальном компьютере
С ошибкой "Набор ключей не существует". То есть, если ключ в реестре пользователя, до доходит доформирования подписи, если в реетре компьютера, то рвется на инициализации контекста. С VinCSP такого не было.

Решил беду, в общем, тип ключа заменил на AT_KEYEXCHANGE

Offline PaulIsh  
#27 Оставлено : 17 сентября 2018 г. 10:14:16(UTC)
PaulIsh

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

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

С шифрованием через CSP тут разобрались. С шифрованием XML через .Net тоже есть спец. классы. С шифрованием XML на Java изначально всё было просто.

Теперь хочется понять какие варианты у тех, кто пишет web-приложения и должен реализовать шифрование на javascript. Посмотрел cadesplugin. Он позволяет работать через объекты CAdESCOM. Там есть подписание XML и оно работает. Имеется ли возможность сформировать шифрованный XML для ФСС через CAdESCOM? Если нет, то какие варианты есть с продуктами КриптоПро.
Offline Shuraken  
#28 Оставлено : 18 декабря 2018 г. 16:58:25(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Очередные грабли с ЭЛН по ФСС. На сей раз шифрование.
Подписанные запросы на получение и отправку данных без проблем обрабатываются тестовым сервером ФСС. Работаю над шифрованием. Вот с ним и возникла проблема. Всё время возникает ошибка

ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: Не удалось расшифровать сообщение. Возможно сообщение зашифровано на ключе отличном от ключа уполномоченного лица ФСС. Проверьте правильность и актуальность ключа уполномоченного лица ФСС.

С сертификатами всё в порядке, с криптопровайдером тоже. В чём ошибка, понять не могу. В аттаче образец подписанного сообщения, зашифрованного и код. Буду признателен, если посмотрите и укажете на проблему.

С уважением, Александр.
EncryptSignMessage.rar (30kb) загружен 15 раз(а).
Offline Shuraken  
#29 Оставлено : 20 декабря 2018 г. 19:56:22(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Самое забавное, что я не могу подписать и зашифровать файл программой ФСС. Скачиваю с сайта ФСС АРМ "подготовка расчётов для ФСС" версия 2.0.4.68 (single), устанавливаю, добавляю организацию страхователя, настраиваю соединение, АРМ подписания и шифрования и пробую получить данные по ЭЛН, чтобы была возможность взглянуть на зашифрованный файл. Так даже там выходит ошибка шифрования, если используется криптопровайдер CryptoPro. Если используется VipNET, то возникает другая ошибка - плохой ключ.
И проблема заключается в том, что я спокойно работаю с подписанием данных и отправкой их на тестовый контур ФСС. А вот с шифрованием - просто засада.
Прошу прощения за этот крик души, но я реально не понимаю, где искать ошибку: в коде, в сертификатах, или ещё где-то.

А кто-нибудь пробовал шифровать сообщение при помощи GostCryptography.dll, которая поставляется вместе с АРМ ФСС? Мне удалось портировать её на Делфи, но зашифровать сообщение не удалось. Использовал вот такой код:
Код:

function EncryptSOAP(const ASignedXml: WideString; const ACertName: string): WideString;
var
  GostEncryptSOAP: TGostEncryptSOAP;
begin
  GostEncryptSOAP := TGostEncryptSOAP.Create(nil);
  try
    GostEncryptSOAP.Connect;
    Result := GostEncryptSOAP.encryptMsg(CP_GR3410_2001_PROV_A, ACertName, ASignedXml);
  finally
    GostEncryptSOAP.Free;
  end;
end;


Но в нём постоянно вылезает ошибка "Операция не может быть выполнена с текущим ключом", после чего слетают все настройки хранилища сертификатов и приходится перезагружать компьютер. Буду признателен, если поможете объяснить и исправить ошибку.
Offline Андрей Писарев  
#30 Оставлено : 20 декабря 2018 г. 20:46:54(UTC)
Андрей Писарев

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,344
Мужчина

Сказал «Спасибо»: 292 раз
Поблагодарили: 1170 раз в 921 постах
Здравствуйте.

В ОС два криптовайдера установлено?
Какие сборки?
Техническую поддержку оказываем тут
Наша база знаний
Offline Shuraken  
#31 Оставлено : 20 декабря 2018 г. 21:13:04(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Установлен всегда один. На текущий момент установлен КриптоПРО CSP
Версия продукта 4.0.9944
Версия ядра СКЗИ 4.0.9017 КС1
Offline not_x  
#32 Оставлено : 21 декабря 2018 г. 4:17:47(UTC)
not_x

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

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

Ключи, сгенерированные и сохранённые в КриптоПро не совместимы с VipNet и наоборот (требуется нестандартными средствами делать экспорт частных ключей). Код, приведенный выше работоспособен, переводил на другой язык и проверял. Просмотр зашифрованного сообщения ничего не даст, так как он будет каждый раз разный. Обратите внимание на режимы CBC, PADDING и структуру передаваемого сессионного ключа в формате ASN.1.
Offline Shuraken  
#33 Оставлено : 21 декабря 2018 г. 13:51:06(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: not_x Перейти к цитате
Ключи, сгенерированные и сохранённые в КриптоПро не совместимы с VipNet и наоборот (требуется нестандартными средствами делать экспорт частных ключей). Код, приведенный выше работоспособен, переводил на другой язык и проверял. Просмотр зашифрованного сообщения ничего не даст, так как он будет каждый раз разный. Обратите внимание на режимы CBC, PADDING и структуру передаваемого сессионного ключа в формате ASN.1.

Про ключи прекрасно понимаю, и поэтому для каждого криптопровайдера свои ключи. Экспортом не занимаюсь.
Вы сказали, что код работоспособный и посоветовали обратить внимание на режимы. А что с ними в коде не так?

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

Offline Shuraken  
#34 Оставлено : 22 декабря 2018 г. 23:32:52(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Мне удалось через GostCryptography.dll зашифровать сообщение для ФСС и отправить его. В ответ получил зашифрованное сообщение и теперь пытаюсь понять, чем его расшифровывать.
Шифровал так:
Код:

procedure TfrmSignAndEncode.EncodeMessage(FSSName: string; ASignMessage: string);
const
  SoapRequestBeg = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body>';
  SoapRequestEnd = '</soapenv:Body></soapenv:Envelope>';
var
  res: string
  encryptedDoc: IXMLDocument;
  GostSoap: TGostEncryptSOAP;
begin
  GostSoap := TGostEncryptSOAP.Create(Self);
  try
    GostSoap.Connect;
    try
      res := GostSoap.encryptMsg(CP_GR3410_2001_PROV_A, FSSName, ASignMessage);
      encryptedDoc := LoadXMLData(res);
      res := SoapRequestBeg + encryptedDoc.XML[1] + SoapRequestEnd;
    finally
      GostSoap.Disconnect;
    end;
  finally
    FreeAndNil(GostSoap);
  end;
end;


Отправил и получил ответ


Попробовал расшифровать с помощью сертификата, которым подписывал сообщение
Код:

  GostSoap := TGostDecryptSOAP.Create(Self);
  try
    GostSoap.Connect;
    try
      mSignature.Lines.Text := GostSoap.decryptMsg(CP_GR3410_2012_PROV_A, EncryptFSSMessage);
    finally
      GostSoap.Disconnect;
    end;
  finally
    FreeAndNil(GostSoap);
  end;

Получил ошибку "данные шифра не указаны". Попробовал подставить другие алгоритмы - то же самое.

Подскажите пожалуйста, как это исправить?

С уважением, Александр.
Offline Shuraken  
#35 Оставлено : 24 декабря 2018 г. 11:16:14(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Попробовал расшифровать по другому, застрял на ошибке "Плохие данные":

Код:

    CheckCryptoCall(CryptGetUserKey(ACryptoProvider, AT_KEYEXCHANGE, @hPrivateKey));

    // Формирование BLOB-ов публичного и сессионного ключей ФСС на основе зашифрованного ключа из ответа ФСС
    GetResponseKeysBlobs(ASOAPResponse, remotePublicKeyBlob, remoteSessionKeyBlob);

    // Получение ключа согласования импортом открытого ключа ФСС (отправителя)
    // на локальном закрытом ключе (получателя).
    // ошибка происходит здесь
    CheckCryptoCall(CryptImportKey(ACryptoProvider, @remotePublicKeyBlob[0], Length(remotePublicKeyBlob), hPrivateKey, 0, @hAgreeKey));

при этом подозреваю, что ошибку допустил где-то здесь:

Код:

procedure Tfrm.GetResponseKeysBlobs(
  ASOAPResponse: IXMLDocument; out APublicKeyBlob,
  ASessionKeyBlob: TByteArray);

const OpenPublicKeyBlob: array[0..35] of byte =
      ($06,       // bType = PUBLICKEYBLOB
       $20,       // bVersion = 0x20
       $00, $00,
       $23, $2E, $00, $00, // KeyAlg = ALG_SID_GR3410EL
       $4D, $41, $47, $31, //Magic = GR3410_1_MAGIC
       $00, $02, $00, $00, // BitLen = 512
       // bASN1GostR3410_94_PublicKeyParameters
       $30, $12,
       $06, $07 ,
       $2A, $85, $03, $02, $02, $24, $00,
       $06, $07,
       $2A, $85, $03, $02, $02, $1E, $01);

  trBlob:  array[1..71] of byte =
  ($01, $20, $00, $00, $1E, $66, $00, $00,
   $FD, $51, $4A, $37, $1E, $66, $00, $00,
   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, // ключ
   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
   $30, $09, $06, $07,
   $2A, $85, $03, $02, $02, $1F, $01); // UKM (157,8)
var
  i: integer;
  transportNode: IXMLNode;
  transport, publicKey, sessionKey,
  sessionSV, sessionMAC: TByteArray;
  trText: string;
  enc: TUTF8Encoding;
begin
  try
    transportNode := ASOAPResponse.DocumentElement
                     .ChildNodes[1]  // Body
                     .ChildNodes[0]  // EncryptedData
                     .ChildNodes[1]  // KeyInfo
                     .ChildNodes[0]  // EncryptedKey
                     .ChildNodes[2]  // CipherData
                     .ChildNodes[0]; // CipherValue

 //изначальный код
{    transport := TNetEncoding.Base64.DecodeStringToBytes(transportNode.Text);}
//мои переделки под Delphi7
    enc := TUTF8Encoding.Create;
    try
      transport := TByteArray(enc.GetBytes(transportNode.Text));
      trText := Q_Base64Decode(enc.GetString(TBytes(transport)));
    finally
      FreeAndNil(enc);
    end;
    SetLength(transport, length(trText));
    system.Move(Windows.PByte(trText)^, Pointer(transport)^, length(trText));

    publicKey := Copy(transport, 93, 64);
    sessionKey := Copy(transport, 7, 32);
    sessionMAC := Copy(transport, 41, 4);
    sessionSV := Copy(transport, 159, 8);

//изначальный код
{    APublicKeyBlob := 
      [
       $06,       // bType = PUBLICKEYBLOB
       $20,       // bVersion = 0x20
       $00, $00,
       $23, $2E, $00, $00, // KeyAlg = ALG_SID_GR3410EL
       $4D, $41, $47, $31, //Magic = GR3410_1_MAGIC
       $00, $02, $00, $00, // BitLen = 512
       // bASN1GostR3410_94_PublicKeyParameters
       $30, $12,
       $06, $07 ,
       $2A, $85, $03, $02, $02, $24, $00,
       $06, $07,
       $2A, $85, $03, $02, $02, $1E, $01
      ] + publicKey;



    // сборка SessionKey BLOB из статической части и параметров сессионного ключа
    ASessionKeyBlob :=
    [
     $01, // bType = SIMPLEBLOB
     $20, // bVersion = 0x20
     $00,$00 ,
     $1E,$66 ,$00 ,$00, // KeyAlg = CALG_G28147
     $FD,$51 ,$4A ,$37, // Magic = G28147_MAGIC
     $1E,$66 ,$00 ,$00] // EncryptKeyAlgId = CALG_G28147
     + sessionSV + sessionKey + sessionMAC +
    [// ASN.1 Sequence + OID Header
       $30 ,$09 ,$06 ,$07,
     // OID_GOST_R28147_89_CryptoPro_A_ParamSet 1.2.643.2.2.31.1
     $2A ,$85 ,$03 ,$02 ,$02 ,$1F ,$01
    ];   }
//мои переделки под Delphi7
    SetLength(APublicKeyBlob, 100);
    for i := 0 to 35 do
      APublicKeyBlob[i] := OpenPublicKeyBlob[i];
    for i := 1 to 64 do
      APublicKeyBlob[i + 35] := publicKey[i];
    setLength(ASessionKeyBlob, 134);
    for i := 1 to 71 do
      ASessionKeyBlob[i] := trBlob[i];
    for i := 1 to 8 do
      ASessionKeyBlob[i+16] := sessionSV[i];
    for i := 1 to 32 do
      ASessionKeyBlob[i+24] := sessionKey[i];
    for i := 1 to 4 do
      ASessionKeyBlob[i+56] := sessionMAC[i];
  finally
    SetLength(sessionSV, 0);
    SetLength(sessionMac, 0);
    SetLength(sessionKey, 0);
    SetLength(publicKey, 0);
    SetLength(transport, 0);
  end;
end;



У кого стоит Embarcadero, проверьте пожалуйста, какой результат возвращает функция TNetEncoding.Base64.DecodeStringToBytes(transportNode.Text);
Если ей на вход поступает вот такое значение (CipherValue):
MIGkMCgEINMuXESbgvBOY8udqVlHxbfpPgcKAS5Ew6HTwpGhz269BASOb6SYoHgGByqFAwICHwGgYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUDAgIeAQNDAARAZMGkZ+ODNscutZgYgesDlGkN5AiubvNOhdJOaIZK+QRoVkMZnq22foPv660Khhs9zj5BTwx5u1HOITYmgEj1fwQIkfNcLhh/iDk=

С уважением, Александр.
Offline Андрей Писарев  
#36 Оставлено : 24 декабря 2018 г. 16:01:07(UTC)
Андрей Писарев

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,344
Мужчина

Сказал «Спасибо»: 292 раз
Поблагодарили: 1170 раз в 921 постах
В 10.2



в hex:



"текст":

Техническую поддержку оказываем тут
Наша база знаний
Offline Shuraken  
#37 Оставлено : 24 декабря 2018 г. 19:48:35(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Скажите, а кто-нибудь использовал для шифрования/расшифровки GostCryptography.dll, которая поставляется с АРМ ФСС? Если да, то приведите пожалуйста код для расшифровки, или объясните, пожалуйста, какой тип провайдера надо указывать в TGostDecryptSOAP.decryptMsg? А то перебрал уже все алгоритмы, указанные в сертификате, которым шифровал сообщение, но результата нет.
Offline Shuraken  
#38 Оставлено : 25 декабря 2018 г. 3:14:58(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Ура, удалось разобраться с GostDecryptSOAP из GostCryptography.dll. Оказывается, ему надо было "скармливать" не всё сообщение, а лишь EncryptedData с содержимым. Но тут возникла другая проблема. Ошибка исчезла, но расшифровка не происходит. Подаёшь на вход зашифрованное сообщение, и его же получаешь на выходе.
Что самое интересное, вот такой код показывает, что обе функции работают нормально. Подаю на вход подписанный xml, указываю свой сертификат и вижу зашифрованное сообщение, после чего расшифровываю его и вижу исходное сообщение.

Код:

  EncSoap := TGostEncryptSOAP.Create(Self);
  try
    EncSoap.Connect;
    try
      EncryptedResponse := EncSoap.encryptMsg(CP_GR3410_2001_PROV_A, CertName, SignedXML);
      mEncryptedResponse.Text := EncryptedResponse;
    finally
      EncSoap.Disconnect;
    end;
  finally
    FreeAndNil(EncSoap);
  end;

  DecSoap := TGostDecryptSOAP.Create(Self);
  try
    DecSoap.Connect;
    try
      DecryptedResponse := DecSoap.decryptMsg(CP_GR3410_2001_PROV_A, EncryptedResponse);
      mDecryptedResponse.Text := DecryptedResponse;
    finally
      DecSoap.Disconnect;
    end;
  finally
    FreeAndNil(DecSoap);
  end;


А вот зашифровав сообщение сертификатом ФСС, ничем расшифровать его не могу. Кто-нибудь может объяснить, с чем это может быть связано?
Offline Андрей Писарев  
#39 Оставлено : 25 декабря 2018 г. 11:04:54(UTC)
Андрей Писарев

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,344
Мужчина

Сказал «Спасибо»: 292 раз
Поблагодарили: 1170 раз в 921 постах
Автор: Shuraken Перейти к цитате


А вот зашифровав сообщение сертификатом ФСС, ничем расшифровать его не могу. Кто-нибудь может объяснить, с чем это может быть связано?


Для расшировки требуется закрытый ключ, который на стороне ФСС.
В этом и есть смысл шифрования с участием открытого ключа из сертификата.
Расшифровать может только владелец сертификата
Техническую поддержку оказываем тут
Наша база знаний
Offline Shuraken  
#40 Оставлено : 25 декабря 2018 г. 11:54:58(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Андрей Писарев Перейти к цитате
Автор: Shuraken Перейти к цитате


А вот зашифровав сообщение сертификатом ФСС, ничем расшифровать его не могу. Кто-нибудь может объяснить, с чем это может быть связано?


Для расшировки требуется закрытый ключ, который на стороне ФСС.
В этом и есть смысл шифрования с участием открытого ключа из сертификата.
Расшифровать может только владелец сертификата


Спасибо за поправку, действительно неправильно выразил свою мысль. Да, я зашифровываю сообщение открытым ключом из сертификата ФСС, отправляю его и получаю зашифрованный ответ. В техподдержке говорят, что запрос был сформирован правильно и мне в ответ было выслано зашифрованное сообщение. Вот именно его я пытаюсь расшифровать с помощью GostDecryptSOAP.decryptMsg из GostCryptography.dll и подав на вход зашифрованные данные, получаю их же на выходе. При этом сертификат с закрытым ключом у меня есть, но такое чувство, что он почему-то не подходит.
Код:

  DecSoap := TGostDecryptSOAP.Create(Self);
  try
    DecSoap.Connect;
    try
      DecryptedResponse := DecSoap.decryptMsg(CP_GR3410_2001_PROV_A, EncryptedResponse);
      mDecryptedResponse.Text := DecryptedResponse;
    finally
      DecSoap.Disconnect;
    end;
  finally
    FreeAndNil(DecSoap);
  end;


Когда я делаю это низкоуровневыми функциями, то получаю ошибку "плохие данные" при получении сессионного ключа
Код:

    CheckCryptoCall(CryptGetUserKey(ACryptoProvider, AT_KEYEXCHANGE, @hPrivateKey));

    // Формирование BLOB-ов публичного и сессионного ключей ФСС на основе зашифрованного ключа из ответа ФСС
    GetResponseKeysBlobs(ASOAPResponse, remotePublicKeyBlob, remoteSessionKeyBlob);

    // Получение ключа согласования импортом открытого ключа ФСС (отправителя)
    // на локальном закрытом ключе (получателя)
    CheckCryptoCall(CryptImportKey(ACryptoProvider, @remotePublicKeyBlob[0], Length(remotePublicKeyBlob), hPrivateKey, 0, @hAgreeKey));

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

    // Получение сессионного ключа импортом сессионного ключа ФСС (отправителя) на ключе согласования
    // Вот здесь и происходит ошибка.
    CheckCryptoCall(CryptImportKey(ACryptoProvider, @remoteSessionKeyBlob[0], Length(remoteSessionKeyBlob), hAgreeKey, 0, @hSessionKey));

В аттаче dll и обёртка. По возможности прошу проверить, как она работает.
И кстати, никак не могу понять одну вещь. В функции GostEncryptSOAP.encryptMsg 3 параметра
const pProvName: WideString; const pCertName: WideString; const pSOAPMsg: WideString
Как я понял, первый отвечает за наименование криптопровайдера, второй за сертификат, которым шифруется сообщение из третьего параметра. Тут, в принципе, всё понятно.

А вот в GostDecryptSOAP.decryptMsg только 2 параметра: const pProvName: WideString; const pSOAPMsg: WideString
Как я понял, первый аналогичен первому из функции шифрования, второй - последнему параметру. А как тогда функция подберёт сертификат с закрытым ключом? Или она перебирает все сертификаты с указанным криптопровайдером и найдя первый с закрытым ключом, расшифровывает им? Непонятно. Можете объяснить этот момент?
GostCryptography.rar (80kb) загружен 14 раз(а).

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