Статус: Участник
Группы: Участники
Зарегистрирован: 17.08.2019(UTC) Сообщений: 21
|
Попадалась такая же проблема и похоже с тем же сервисом: https://www.cryptopro.ru...&m=104460#post104460https://www.cryptopro.ru...&m=104496#post104496https://www.cryptopro.ru...&m=104511#post104511В моем случае решение не помогло, может быть я неправильно делаю двойное хэширование: Код:
CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101; // 101
UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
HashedData1 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData1.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
HashedData1.Hash(UTF8Encoding.GetBytes_4("Customer11533830831932E2C"));
Хэш_HEXстрока = HashedData1.Value;
Хэш_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Хэш_HEXстрока);
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные);
HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101;
HashedData2.Hash(UTF8Encoding.GetBytes_4(ХэшBase64));
IRawSignature = Новый COMОбъект("CAdESCOM.RawSignature");
Подпись_HEXстрока = IRawSignature.SignHash(HashedData2, Сертификат);
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: ыволавыд  Код:HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101;
HashedData2.Hash(UTF8Encoding.GetBytes_4(ХэшBase64));
1) По идее UTF8Encoding.GetBytes_4 для таких данных и хэша ничего не поменяет, так как у всех символов коды меньше 128 и они совпадают в большинстве кодировок. Ладно, пусть будет для надежности; 2) Предположу, что ХэшBase64 надо либо а) закодировать в HEX перед передачей (полагая что HashedData2.DataEncoding=0) либо б) второй раз закодировать в Base64 перед передачей и поставить HashedData2.DataEncoding=1. Код:HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101; // гост 2012
HashedData2.DataEncoding=1; // base64
HashedData2.Hash(UTF8Encoding.GetBytes_4(Base64Строка(ХэшBase64)));
Отредактировано пользователем 5 сентября 2019 г. 5:09:41(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,215  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 285 раз в 265 постах
|
Автор: ыволавыд  Код:
CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101; // 101
UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
HashedData1 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData1.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
HashedData1.Hash(UTF8Encoding.GetBytes_4("Customer11533830831932E2C"));
Хэш_HEXстрока = HashedData1.Value;
Хэш_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Хэш_HEXстрока);
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные);
HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101;
HashedData2.Hash(UTF8Encoding.GetBytes_4(ХэшBase64));
IRawSignature = Новый COMОбъект("CAdESCOM.RawSignature");
Подпись_HEXстрока = IRawSignature.SignHash(HashedData2, Сертификат);
Автор: two_oceans  Автор: ыволавыд  Код:HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101;
HashedData2.Hash(UTF8Encoding.GetBytes_4(ХэшBase64));
1) По идее UTF8Encoding.GetBytes_4 для таких данных и хэша ничего не поменяет, так как у всех символов коды меньше 128 и они совпадают в большинстве кодировок. Ладно, пусть будет для надежности; 2) Предположу, что ХэшBase64 надо либо а) закодировать в HEX перед передачей (полагая что HashedData2.DataEncoding=0) либо б) второй раз закодировать в Base64 перед передачей и поставить HashedData2.DataEncoding=1. Код:HashedData2 = Новый COMОбъект("CAdESCOM.HashedData");
HashedData2.Algorithm = 101; // гост 2012
HashedData2.DataEncoding=1; // base64
HashedData2.Hash(UTF8Encoding.GetBytes_4(Base64Строка(ХэшBase64)));
Дико извиняюсь, но может это вам поможет.в php c libphpcades.so raw подпись делается так Код:$content = "test";
file_put_contents("data.txt",$content);
$hashAlg = 101;
$HD = new CPHashedData;
$HD->set_Algorithm($hashAlg);
$HD->set_DataEncoding(BASE64_TO_BINARY);
$HD->hash(base64_encode($content));
$raw = new CPRawSignature();
$signature = $raw->SignHash($HD, $cert);
$signature=hex2bin($signature); //convert from hex to binary
file_put_contents("data.txt.sig",$signature); //save binary signature for csptest
$signature = base64_encode($signature);
попроверяю у себя так: csptest -keys -verify GOST12_256 -in data.txt -signature data.txt.sig -cert cert.cer data.txt.sig - это полученная подпись в binary длиной 64 байта. насколько я понимаю тут мы из строки получаем байты https://docs.microsoft.c...es?view=netframework-4.8а исходя из http://cpdn.cryptopro.ru...es/content-encoding.html и DataEncoding=1 на вход мы должны передать base64 Отредактировано пользователем 7 сентября 2019 г. 8:49:38(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 17.08.2019(UTC) Сообщений: 21
|
У принимающей стороны есть пример формирования подписи на php с помощью csptest, получается с хэшем никаких действий не выполняется, а подпись переворачивается. Попробовал подписать и подпись тоже не прошла валидацию, отправил в ТП описание и полученные результаты, посмотрим что ответят.
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,215  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 285 раз в 265 постах
|
А можно ссылку на их пример? |
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Цитата:У принимающей стороны есть пример формирования подписи на php с помощью csptest Что-то мне кажется пример тут не исчерпывающий, так как они сказали, что поддерживают 3 алгоритма. Другими словами должно быть три рабочих примера, и задача найти хотя бы один из алгоритмов. Цитата:Написали что нужно использовать алгоритмы: 1. GOST3411_2012_256withGOST3410_2012_256 2. CryptoProSignature_2012_256 3. NONEwithGOST3410DH_2012_256 Это идентификаторы из КриптоПро JCP. Не нашел по ним подробной информации. Не нашел информации как они соотносятся с методами CADESCOM и можно ли их реализовать методам CADESCOM, задал вопрос в ТП, жду ответа. Хоть я и смутно понимаю алгоритмы по идентификатору, но по пояснениям похоже что по первым 2 вариантами надо либо передавать значения из КриптоПро без переворота и хэш и подпись (вариант 2), либо что-то переворачивать (вариант 1). Третий вариант похоже требует указать DH гост-2012 алгоритм вместо обычного гост-2012. Судя по ответу техподдержки по их логике почему-то результат падает в третий вариант. В 64 байтах "чистого" значения подписи по идее негде указать алгоритм - это два склееные числовых вектора. Сравнивать напрямую SignatureValue по гост также нельзя. Предположу алгоритм определяют по переданному значению DigestValue, например, так: любое значение DigestValue принимается, но если значение DigestValue не соответствует вычисленным по первым двум алгоритмам, то выбирается третий алгоритм. Это конечно гипотеза, но я всегда пытаюсь понять "черные ящики" с позиции "как бы я сделал?" Или даже представить самый плохой вариант реализации. Если гипотеза верна, то нужно либо получить верное значение хэша для выбора вариантов 1/2, либо поставить DH алгоритм при подписании чтобы сошелся вариант 3. Для перебора алгоритма наверно было бы проще либо получить от техподдержки 3 примера (по одному для каждого алгоритма) в составе (исходная строка, DigestValue, SignatureValue, сертификат). Для каждого примера провести такую процедуру: 1) декодировать SignatureValue(1), декодировать и перевернуть SignatureValue(2). 2) для каждой ветки делать всякие варианты хэша и передавать на проверку подписи с перевернутой и неперевернутой подписью. Напрямую мы не можем сравнить SignatureValue, но проверка подписи все равно выдаст ОК когда получим верный хэш для этого значения подписи и сертификата. Такой подход позволил бы проверить множество вариантов хэша за один запуск, а не пробовать по одному варианту за раз. Отредактировано пользователем 9 сентября 2019 г. 6:31:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 17.08.2019(UTC) Сообщений: 21
|
Спасибо всем большое за участие в этой эпопее, наконец то она закончилась, проблема была гораздо тривиальнее и прозаичнее, при формировании http-запроса к полям хэша и подписи надо применять URL-кодирование. Прошел вариант с "прямым/обычным" хэшем, и инвертированной подписью, полученной с помощью CAdESCOM.RawSignature.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,500   Сказал «Спасибо»: 554 раз Поблагодарили: 2249 раз в 1755 постах
|
Автор: ыволавыд  Спасибо всем большое за участие в этой эпопее, наконец то она закончилась, проблема была гораздо тривиальнее и прозаичнее, при формировании http-запроса к полям хэша и подписи надо применять URL-кодирование. Прошел вариант с "прямым/обычным" хэшем, и инвертированной подписью, полученной с помощью CAdESCOM.RawSignature. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.11.2014(UTC) Сообщений: 10
|
Помогите пожалуйста, ситуация аналогичная, SignatureValue не проходит проверку, все из темы перепробовал не получилось DigestValue проверку проходит DigestValue = Base64Строка(ПолучитьДвоичныеДанныеИзHexСтроки(HashedData.Value));
IRawSignature = Новый COMОбъект("CAdESCOM.RawSignature"); SignatureValue = Base64Строка(ПолучитьДвоичныеДанныеИзHexСтроки(IRawSignature.SignHash(HashedData, oCertificate))); Подпись не проходит проверку
Техподдержка принимающей стороны пишет На данный момент не поддерживается алгоритм NONEwithCryptoProSignature.
Используйте следующие алгоритмы: GOST3411_2012_256withGOST3410_2012_256 CryptoProSignature_2012_256 NONEwithGOST3410DH_2012_256
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,500   Сказал «Спасибо»: 554 раз Поблагодарили: 2249 раз в 1755 постах
|
Автор: slll  Техподдержка принимающей стороны пишет На данный момент не поддерживается алгоритм NONEwithCryptoProSignature.
Используйте следующие алгоритмы: GOST3411_2012_256withGOST3410_2012_256 CryptoProSignature_2012_256 NONEwithGOST3410DH_2012_256
Здравствуйте. У Вас сертификат с ГОСТ 2001? |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close