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

Уведомление

Icon
Error

7 Страницы«<23456>»
Опции
К последнему сообщению К первому непрочитанному
Offline Shuraken  
#31 Оставлено : 20 декабря 2018 г. 21:13:04(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 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)
Сообщений: 16
Российская Федерация

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

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

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

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

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

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

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

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

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 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)
Сообщений: 38
Российская Федерация

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 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)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
В 10.2



в hex:



"текст":

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

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

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

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

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

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 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)
Сообщений: 12,630
Мужчина
Российская Федерация

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


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


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

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

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 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) загружен 35 раз(а).

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