Статус: Новичок
Группы: Участники
Зарегистрирован: 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, ничего не вышло, что я делаю не так? )
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,396 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
В первом случае подпись pkcs7, во втором raw (в base64). |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,396 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Это абсолютно разные форматы. Почитайте про XMLDSig и CMS |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.12.2013(UTC) Сообщений: 6
|
Я ценю ваше желание не давать прямой ответ, а только направить меня в нужном направлении. Сам так же делаю, отвечая на форумах. Но у меня конкретный вопрос. Есть XML-документ, подписанный с помощью класса SmevSignedXml.
Я формирую такой же документ вручную на Delphi. Каноническая форма Body, дайджест, каноническая форма Signed Info и, наконец, строка данных (в Base64), которые нужно подписать совпадают с полученными на сервере. Подпись не совпадает. Что нужно сделать, чтобы получить такую же подпись при помощи более низкоуровневых функций Крипто-Про (CryptSignMessage и т.п.).
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,396 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Нужно подписать в дельфи? - я не знаю как сделать xmldsig в нем. Вручную - CryptSignHash. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Автор: Вычеслав Автор: 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) - значение подписи... |
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Цитата:А CryptSignMessage не является оберткой над CryptSignHash? Нет, это разные функции и возвращают они разные вещи. Первая - подписанное сообщение CMS, а вторая - только значение подписи.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Автор: Андрей * Потому что в XML идет не PKCS7, а значение подписи. Значение подписи - можно получить: 1) CryptSignHash 2) CryptSignMessage - и извлечь из PKCS7(CMS) - значение подписи...
В пункте 2, если в сообщении будут подписанные атрибуты, подпись XMLDSig не проверится.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close