logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline ыволавыд  
#21 Оставлено : 4 сентября 2019 г. 10:52:19(UTC)
ыволавыд

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

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

Информацию по идентификаторам уточнил.
Написали что нужно использовать алгоритмы:
1. GOST3411_2012_256withGOST3410_2012_256
2. CryptoProSignature_2012_256
3. NONEwithGOST3410DH_2012_256
Это идентификаторы из КриптоПро JCP. Не нашел по ним подробной информации.
Не нашел информации как они соотносятся с методами CADESCOM
и можно ли их реализовать методам CADESCOM, задал вопрос в ТП, жду ответа.

Принимающая сторона не принимает именно подпись, хэш сравнили с ним все в порядке.
Со слов специалистов принимающей стороны подписывать нужно значение хэша в base64.
В CADESCOM.RawSignature для подписи используется хэш в виде HEXстроки, это не особо проблемно
потому что CAdESCOM.HashedData возвращает значение хэша в виде HEXстроки и его можно использовать для подписи (переводил хэш из HEXстроки в base64, хэш валидацию проходит)
С помощью хэш2 пробовал подписывать, подпись валидацию не проходит.

Попробую инвертировать хэш, спасибо за идею



Offline Андрей Писарев  
#22 Оставлено : 4 сентября 2019 г. 10:58:26(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 279 раз
Поблагодарили: 1155 раз в 913 постах
Автор: ыволавыд Перейти к цитате

Со слов специалистов принимающей стороны подписывать нужно значение хэша в base64.


Как интерпретировали?
Может они реально кодируют так?

Данные => хеш => хеш в base64 (строка) => подписание (т.е. вычисление хеша от "хеша в base64, как строки" и подписание вычисленного хеша). d'oh!


p.s.
участвовал в "исследовании" таких ИС, когда обращались за помощью.
Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#23 Оставлено : 4 сентября 2019 г. 11:05:57(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 130 раз в 125 постах
хэш сравнили на принимающей стороне и сами? если на принимающей стороне тогда наверно нет смысла инвертировать хэш, но вдруг подойдет. Вот с замечанием "подписывать нужно значение хэша в base64" наверно надо подумать... что если схема двойного хэширования такая (в принципе тоже что в сообщении выше от Андрея):
Код:
Хэш_HEXстрока = COMВычислитьХэшСуммуПоГОСТ_3411_2012(СтрокаДляФормированияДайджеста);
Хэш_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Хэш_HEXстрока);
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные);
Хэш2_HEXстрока = COMВычислитьХэшСуммуПоГОСТ_3411_2012(ХэшBase64);
...
oHashedData.SetHashValue(Хэш2_HEXстрока);
В общем идей немало, осталось все методично опробовать.

Отредактировано пользователем 4 сентября 2019 г. 11:10:24(UTC)  | Причина: Не указана

Offline ыволавыд  
#24 Оставлено : 4 сентября 2019 г. 11:12:34(UTC)
ыволавыд

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

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

Для создания подписи в формате RAW использовал объект CADESCOM.RawSignature, точнее его метод SignHash, на вход метода подается объект содержащий значение подписи в виде HEXстроки. Получается цепочка
"данные => хэш в формате HEXстрока = > подпись в формате HEXстроки"
Пробовал
Цитата:
вычисление хеша от "хеша в base64, как строки"
, подпись валидацию не прошла
Offline Андрей Писарев  
#25 Оставлено : 4 сентября 2019 г. 11:31:07(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 279 раз
Поблагодарили: 1155 раз в 913 постах
19 пост:
Цитата:

oHashedData.DataEncoding = 1; // CADESCOM_BASE64_TO_BINARY


Вы понимаете, что делаете?
Если Да - то почему передаете значение в hex?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#26 Оставлено : 4 сентября 2019 г. 11:36:01(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 279 раз
Поблагодарили: 1155 раз в 913 постах
Свойство ICPHashedData::DataEncoding

Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#27 Оставлено : 4 сентября 2019 г. 11:56:53(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 130 раз в 125 постах
Автор: Андрей Писарев Перейти к цитате
19 пост:
Цитата:

oHashedData.DataEncoding = 1; // CADESCOM_BASE64_TO_BINARY


Вы понимаете, что делаете?
Если Да - то почему передаете значение в hex?
В принципе согласен, не стал комментировать сразу вот почему. Тут момент в том, распространяется DataEncoding только на принимаемые данные или на устанавливаемый хэш тоже, потому что дальше идет .SetHashValue вместо передачи данных для хэширования. Если DataEncoding не распространяется на SetHashValue, то эта строка тупо срабатывает вхолостую. Просветите - распространяется или нет?

Отредактировано пользователем 4 сентября 2019 г. 11:58:39(UTC)  | Причина: Не указана

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

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

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

При использовании SetHashValue, значение DataEncoding не влияет на устанавливаемое значение хэша, оно влияет только на хэширование. Пробовал оба варианта значения DataEncoding, на значение хэша это никак не повлияло, подаю hex потому что в SetHashValue другие форматы не принимаются.
Offline ыволавыд  
#29 Оставлено : 4 сентября 2019 г. 12:00:33(UTC)
ыволавыд

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

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

Значение хэша получаю с DataEncoding = 0, хэш валидацию проходит.
Offline Андрей Писарев  
#30 Оставлено : 4 сентября 2019 г. 12:06:55(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 279 раз
Поблагодарили: 1155 раз в 913 постах
Автор: two_oceans Перейти к цитате
Автор: Андрей Писарев Перейти к цитате
19 пост:
Цитата:

oHashedData.DataEncoding = 1; // CADESCOM_BASE64_TO_BINARY


Вы понимаете, что делаете?
Если Да - то почему передаете значение в hex?
В принципе согласен, не стал комментировать сразу вот почему. Тут момент в том, распространяется DataEncoding только на принимаемые данные или на устанавливаемый хэш тоже, потому что дальше идет .SetHashValue вместо передачи данных для хэширования. Если DataEncoding не распространяется на SetHashValue, то эта строка тупо срабатывает вхолостую. Просветите - распространяется или нет?



SetHashValue - да, принимает hex.
Не влияет...
Техническую поддержку оказываем тут
Наша база знаний
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)
Сообщений: 602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 130 раз в 125 постах
Автор: ыволавыд Перейти к цитате
Код:
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)
Сообщений: 90
Российская Федерация

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

Код:

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)
Сообщений: 90
Российская Федерация

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

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

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

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 130 раз в 125 постах
Цитата:
У принимающей стороны есть пример формирования подписи на 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)
Сообщений: 8,259
Мужчина
Российская Федерация

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


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