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

Уведомление

Icon
Error

6 Страницы«<23456>
Опции
К последнему сообщению К первому непрочитанному
Offline ыволавыд  
#31 Оставлено : 4 сентября 2019 г. 13:11:44(UTC)
ыволавыд

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

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

Попадалась такая же проблема и похоже с тем же сервисом:
https://www.cryptopro.ru...&m=104460#post104460
https://www.cryptopro.ru...&m=104496#post104496
https://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, Сертификат);

Offline two_oceans  
#32 Оставлено : 5 сентября 2019 г. 5:05:58(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 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)  | Причина: Не указана

Offline Санчир Момолдаев  
#33 Оставлено : 7 сентября 2019 г. 4:12:59(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
Автор: ыволавыд Перейти к цитате

Код:

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)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ыволавыд  
#34 Оставлено : 7 сентября 2019 г. 13:17:55(UTC)
ыволавыд

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

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

У принимающей стороны есть пример формирования подписи на php с помощью csptest,
получается с хэшем никаких действий не выполняется, а подпись переворачивается.
Попробовал подписать и подпись тоже не прошла валидацию, отправил в ТП описание и полученные результаты, посмотрим что ответят.
Offline Санчир Момолдаев  
#35 Оставлено : 7 сентября 2019 г. 14:38:27(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
А можно ссылку на их пример?
Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#36 Оставлено : 9 сентября 2019 г. 5:38:44(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 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)  | Причина: Не указана

Offline ыволавыд  
#37 Оставлено : 9 сентября 2019 г. 18:59:11(UTC)
ыволавыд

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

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

Спасибо всем большое за участие в этой эпопее, наконец то она закончилась, проблема была гораздо тривиальнее и прозаичнее, при формировании http-запроса к полям хэша и подписи надо применять URL-кодирование. Прошел вариант с "прямым/обычным" хэшем, и инвертированной подписью, полученной с помощью CAdESCOM.RawSignature.
Offline Андрей Писарев  
#38 Оставлено : 10 сентября 2019 г. 2:32:27(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: ыволавыд Перейти к цитате
Спасибо всем большое за участие в этой эпопее, наконец то она закончилась, проблема была гораздо тривиальнее и прозаичнее, при формировании http-запроса к полям хэша и подписи надо применять URL-кодирование. Прошел вариант с "прямым/обычным" хэшем, и инвертированной подписью, полученной с помощью CAdESCOM.RawSignature.


Applause
Техническую поддержку оказываем тут
Наша база знаний
Offline slll  
#39 Оставлено : 25 октября 2019 г. 6:43:34(UTC)
slll

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

Группы: Участники
Зарегистрирован: 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

Offline Андрей Писарев  
#40 Оставлено : 25 октября 2019 г. 8:26:19(UTC)
Андрей *

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

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

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

Техподдержка принимающей стороны пишет
На данный момент не поддерживается алгоритм NONEwithCryptoProSignature.

Используйте следующие алгоритмы:
GOST3411_2012_256withGOST3410_2012_256
CryptoProSignature_2012_256
NONEwithGOST3410DH_2012_256



Здравствуйте.

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