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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Mikhail Kislovskiy  
#1 Оставлено : 10 июня 2019 г. 10:50:31(UTC)
Mikhail Kislovskiy

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

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

Добрый день.

Пользуюсь такой реализацией получения подписи для некоторого хэша:

byte[] HashValue = GetDigest(message);

X509Certificate2 Certificate = GetX509Certificate(SerialNumber);
CspParameters cspParameters = GetCertificateParams(Certificate, SerialNumber, ContainerPassword);

// Создаем криптопровайдер с заданными параметрами
Gost3410_2012_256CryptoServiceProvider gost = new Gost3410_2012_256CryptoServiceProvider(cspParameters);
// Создаем форматтер подписи для криптопровайдера
Gost2012_256SignatureFormatter GostFormatter = new Gost2012_256SignatureFormatter(gost);
// Создаем деформаттер подписи для криптопровайдера
Gost2012_256SignatureDeformatter GostDeformatter = new Gost2012_256SignatureDeformatter(gost);
// Подписываем хеш
byte[] SignedHashValue = GostFormatter.CreateSignature(HashValue);

// Проверяем правильность подписи
bool ret = GostDeformatter.VerifySignature(HashValue, SignedHashValue);

В параметре cspParameters следующая реализация:

private static CspParameters GetCertificateParams(X509Certificate2 Certificate, string SerialNumber, string ContainerPassword)
{
if (Certificate == null)
{
throw new System.Exception("Не найден указанный сертификат (серийный номер:" + SerialNumber.ToString() + ")");
}

// Объект, содержащий параметры криптопровайдера:
var cspParameters = new CspParameters();
Gost3410_2012_256CryptoServiceProvider cert_key = Certificate.PrivateKey as Gost3410_2012_256CryptoServiceProvider;
if (null != cert_key)
{
//копируем параметры csp из исходного контекста сертификата
cspParameters.KeyContainerName = cert_key.CspKeyContainerInfo.KeyContainerName;
cspParameters.ProviderType = cert_key.CspKeyContainerInfo.ProviderType;
cspParameters.ProviderName = cert_key.CspKeyContainerInfo.ProviderName;
cspParameters.Flags = cert_key.CspKeyContainerInfo.MachineKeyStore
? (CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore)
: (CspProviderFlags.UseExistingKey);

if (ContainerPassword.Length > 0)
{
cspParameters.KeyPassword = new SecureString();
foreach (var c in ContainerPassword)
{
cspParameters.KeyPassword.AppendChar(c);
}
}
}
else
{
throw new System.Exception("Сертификат не содержит ссылку на закрытый ключ (серийный номер:" + SerialNumber.ToString() + ")");
}

return cspParameters;
}

На обратной стороне настроен прием хэша и подписи, работает эта часть на Java с JCP.

Собственно вопрос, сторона которая принимает данные параметры говорит, что я как то не так получаю саму подпись, т.е. на их стороне подпись считает невалидной.

Из примера в самом верху есть проверка подписи, которая хранится в аргументе ret, так вот там осуществляется проверка при помощи VerifySignature, которая возвращает true.
Так же проверял правильность функции и если передать в неё неправильную подпись, то возвращает false.

Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел?
Offline Mikhail Kislovskiy  
#2 Оставлено : 10 июня 2019 г. 16:49:15(UTC)
Mikhail Kislovskiy

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

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

Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.
Offline Drew  
#3 Оставлено : 26 июня 2019 г. 22:43:57(UTC)
Drew

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

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

Сказал(а) «Спасибо»: 1 раз
Столкнулся с такой же проблемой. Михаил, вам удалось найти решение?

Автор: Mikhail Kislovskiy Перейти к цитате
Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.


Online Андрей Писарев  
#4 Оставлено : 26 июня 2019 г. 23:34:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Здравствуйте.

Автор: Mikhail Kislovskiy Перейти к цитате
Добрый день.

Пользуюсь такой реализацией получения подписи для некоторого хэша:

byte[] HashValue = GetDigest(message);
Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел?



Код GetDigest - покажите?


Автор: Mikhail Kislovskiy Перейти к цитате

Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел?

ДСЧ запускается или требуется ввод пароля, поэтому реализована передача пароля вручную?

Отредактировано пользователем 26 июня 2019 г. 23:36:13(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Online Андрей Писарев  
#5 Оставлено : 26 июня 2019 г. 23:36:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Mikhail Kislovskiy Перейти к цитате
Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.


Уточните, что ждёт java, raw-подпись или cms?
Техническую поддержку оказываем тут
Наша база знаний
Offline Mikhail Kislovskiy  
#6 Оставлено : 27 июня 2019 г. 12:19:34(UTC)
Mikhail Kislovskiy

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

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

Автор: Drew Перейти к цитате
Столкнулся с такой же проблемой. Михаил, вам удалось найти решение?


Добрый день, коллеги решили проблему, она была связана с реализацией проверки на java, вроде как добавили поддержку алгоритма NONEwithGOST3410DH_2012_256.
Offline Drew  
#7 Оставлено : 27 июня 2019 г. 14:33:46(UTC)
Drew

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

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

Сказал(а) «Спасибо»: 1 раз
В моем случае raw-подпись.

Я подписываю следующим образом:
Gost3411_2012_256CryptoServiceProvider gostHash = new Gost3411_2012_256CryptoServiceProvider();
byte[] hashValue = gostHash.ComputeHash(content);
Gost3410_2012_256CryptoServiceProvider gost = (Gost3410_2012_256CryptoServiceProvider)certificate.PrivateKey;
byte[] signatureValue = gost.SignHash(hashValue);

Сервис, к которому подключаюсь, считает, что подпись некорректная. Служба поддержки этого сервиса ответила, что я подписываю алгоритмом NONEwithCryptoProSignature, а нужно GOST3411_2012_256withGOST3410_2012_256 или CryptoProSignature_2012_256.

Есть ли варианты добиться нужного эффекта с моей стороны?

Автор: Андрей Писарев Перейти к цитате
Автор: Mikhail Kislovskiy Перейти к цитате
Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.


Уточните, что ждёт java, raw-подпись или cms?


Offline Mikhail Kislovskiy  
#8 Оставлено : 28 июня 2019 г. 10:51:34(UTC)
Mikhail Kislovskiy

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

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

Автор: Drew Перейти к цитате


Есть ли варианты добиться нужного эффекта с моей стороны?



Мне кажется что для c# нет такой возможности, сам пытался найти какое то решение и перерыл sdk, но так ни к чему не пришел.
Online Андрей Писарев  
#9 Оставлено : 28 июня 2019 г. 13:43:35(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Drew Перейти к цитате
В моем случае raw-подпись.

Я подписываю следующим образом:
Gost3411_2012_256CryptoServiceProvider gostHash = new Gost3411_2012_256CryptoServiceProvider();
byte[] hashValue = gostHash.ComputeHash(content);
Gost3410_2012_256CryptoServiceProvider gost = (Gost3410_2012_256CryptoServiceProvider)certificate.PrivateKey;
byte[] signatureValue = gost.SignHash(hashValue);

Сервис, к которому подключаюсь, считает, что подпись некорректная. Служба поддержки этого сервиса ответила, что я подписываю алгоритмом NONEwithCryptoProSignature, а нужно GOST3411_2012_256withGOST3410_2012_256 или CryptoProSignature_2012_256.

Есть ли варианты добиться нужного эффекта с моей стороны?

Автор: Андрей Писарев Перейти к цитате
Автор: Mikhail Kislovskiy Перейти к цитате
Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.


Уточните, что ждёт java, raw-подпись или cms?





Сталкивался с вариантом "сервисов", где нужно было reverse делать для byte[] hashValue.
Или дважды "вычисляли хеш": т.е. есть данные, от них получали хеш, этот хеш еще раз "хешировали и уже полученный хеш подписывали", правда там был вариант с CMS, а не raw.



Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Drew оставлено 28.06.2019(UTC)
Offline Drew  
#10 Оставлено : 28 июня 2019 г. 17:13:58(UTC)
Drew

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

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

Сказал(а) «Спасибо»: 1 раз
Действительно, прошел вариант с двойным хэшем. Спасибо.

Автор: Андрей Писарев Перейти к цитате

Сталкивался с вариантом "сервисов", где нужно было reverse делать для byte[] hashValue.
Или дважды "вычисляли хеш": т.е. есть данные, от них получали хеш, этот хеш еще раз "хешировали и уже полученный хеш подписывали", правда там был вариант с CMS, а не raw.


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