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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Вычеслав  
#1 Оставлено : 24 декабря 2013 г. 11:08:22(UTC)
Вычеслав

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

Группы: Участники
Зарегистрирован: 24.12.2013(UTC)
Сообщений: 6

День добрый.
Есть некоторая функция на Object Pascal, возвращающая цифровую подпись:

Код:

function crypto_get_sign_message(...)
...
begin
   ...
          SetLength(MessageArray, 1);
          SetLength(MessageSize, 1);
          SetLength(MessageCert, 1);
          MessageArray[0] := Pointer(str);
          MessageSize[0] := strlen(str);
          FillChar(SigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA ), 0);
          SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA);
          SigParams.dwMsgEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
          SigParams.pSigningCert := pContext;
          SigParams.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;
          SigParams.cMsgCert := 0;
          if CryptSignMessage(@SigParams, True, 1, Pointer(MessageArray), Pointer(MessageSize), nil, signSize) then 
            begin
              data := AllocMem(signSize);
              try
                if CryptSignMessage(@SigParams, True, 1, Pointer(MessageArray), Pointer(MessageSize), data, signSize) then
                    Result := crypto_binary_to_string(data, signSize);
               finally
                  FreeMem(data);
               end;
            end;
   ...
end;

Эта функция используется в нескольких проектах для подписи SOAP-сообщений.
Возникла потребность взаимодействия с SOAP-сервисом, где подпись вычисляется при помощи библиотек КриптоПро .NET:

Код:

{
  ...
      SmevSignedXml signedXml = new SmevSignedXml(doc);
      signedXml.SigningKey = cert.PrivateKey;
      ...
      reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;
      XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
      reference.AddTransform(c14);
      signedXml.AddReference(reference);

      signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
      signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410UrlObsolete;
      signedXml.ComputeSignature();
      ...
}


Подписи не верифицируются и не совпадают, в первом случае длина подписи 1264 байта, во втором - 88 байт.
Пытался подобрать значение SigParams.HashAlgorithm.pszObjId, ничего не вышло, что я делаю не так? )
Offline Максим Коллегин  
#2 Оставлено : 24 декабря 2013 г. 11:20:47(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
В первом случае подпись pkcs7, во втором raw (в base64).
Знания в базе знаний, поддержка в техподдержке
Offline Вычеслав  
#3 Оставлено : 24 декабря 2013 г. 12:42:47(UTC)
Вычеслав

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

Группы: Участники
Зарегистрирован: 24.12.2013(UTC)
Сообщений: 6

Автор: maxdm Перейти к цитате
В первом случае подпись pkcs7, во втором raw (в base64).

Неверное значение SigParams.dwMsgEncodingType ?

message encoding type
Defines how the message is encoded. The message encoding type is stored in the high-order word of the encoding type structure. Current defined encoding types are: CRYPT_ASN_ENCODING, X509_ASN_ENCODING, and PKCS_7_ASN_ENCODING.

Какое значение требуется? При вызове CertFindCertificateInStore/CertCreateCertificateContext требуется указать тот же EncodingType?


Offline Максим Коллегин  
#4 Оставлено : 24 декабря 2013 г. 12:58:57(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Это абсолютно разные форматы. Почитайте про XMLDSig и CMS
Знания в базе знаний, поддержка в техподдержке
Offline Вычеслав  
#5 Оставлено : 24 декабря 2013 г. 15:25:41(UTC)
Вычеслав

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

Группы: Участники
Зарегистрирован: 24.12.2013(UTC)
Сообщений: 6

Я ценю ваше желание не давать прямой ответ, а только направить меня в нужном направлении. Сам так же делаю, отвечая на форумах.
Но у меня конкретный вопрос. Есть XML-документ, подписанный с помощью класса SmevSignedXml.

Я формирую такой же документ вручную на Delphi. Каноническая форма Body, дайджест, каноническая форма Signed Info и, наконец,
строка данных (в Base64), которые нужно подписать совпадают с полученными на сервере. Подпись не совпадает.
Что нужно сделать, чтобы получить такую же подпись при помощи более низкоуровневых функций Крипто-Про (CryptSignMessage и т.п.).
Offline Максим Коллегин  
#6 Оставлено : 24 декабря 2013 г. 15:40:33(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Нужно подписать в дельфи? - я не знаю как сделать xmldsig в нем. Вручную - CryptSignHash.
Знания в базе знаний, поддержка в техподдержке
Offline Вычеслав  
#7 Оставлено : 24 декабря 2013 г. 16:09:40(UTC)
Вычеслав

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

Группы: Участники
Зарегистрирован: 24.12.2013(UTC)
Сообщений: 6

Автор: maxdm Перейти к цитате
Нужно подписать в дельфи? - я не знаю как сделать xmldsig в нем. Вручную - CryptSignHash.

А CryptSignMessage не является оберткой над CryptSignHash? Почему в данном случае нужно использовать низкоуровневые функции?

MSDN написал:

CryptSignMessage function
The CryptSignMessage function creates a hash of the specified content, signs the hash, and then encodes both the original message content and the signed hash.

Offline Андрей Писарев  
#8 Оставлено : 24 декабря 2013 г. 16:15:08(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: Вычеслав Перейти к цитате
Автор: maxdm Перейти к цитате
Нужно подписать в дельфи? - я не знаю как сделать xmldsig в нем. Вручную - CryptSignHash.

А CryptSignMessage не является оберткой над CryptSignHash? Почему в данном случае нужно использовать низкоуровневые функции?

MSDN написал:

CryptSignMessage function
The CryptSignMessage function creates a hash of the specified content, signs the hash, and then encodes both the original message content and the signed hash.



Потому что в XML идет не PKCS7, а значение подписи.
Значение подписи - можно получить:
1) CryptSignHash
2) CryptSignMessage - и извлечь из PKCS7(CMS) - значение подписи...
Техническую поддержку оказываем тут
Наша база знаний
Offline Новожилова Елена  
#9 Оставлено : 24 декабря 2013 г. 16:16:12(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Цитата:
А CryptSignMessage не является оберткой над CryptSignHash?


Нет, это разные функции и возвращают они разные вещи. Первая - подписанное сообщение CMS, а вторая - только значение подписи.
Offline Новожилова Елена  
#10 Оставлено : 24 декабря 2013 г. 16:20:02(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Автор: Андрей * Перейти к цитате

Потому что в XML идет не PKCS7, а значение подписи.
Значение подписи - можно получить:
1) CryptSignHash
2) CryptSignMessage - и извлечь из PKCS7(CMS) - значение подписи...


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