Статус: Участник
Группы: Участники
Зарегистрирован: 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.
Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.05.2019(UTC) Сообщений: 18 Откуда: Moscow
|
Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.01.2015(UTC) Сообщений: 5 Откуда: Ярославль Сказал(а) «Спасибо»: 1 раз
|
Столкнулся с такой же проблемой. Михаил, вам удалось найти решение? Автор: Mikhail Kislovskiy Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Здравствуйте. Автор: Mikhail Kislovskiy Добрый день.
Пользуюсь такой реализацией получения подписи для некоторого хэша:
byte[] HashValue = GetDigest(message); Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел? Код GetDigest - покажите? Автор: Mikhail Kislovskiy Помогите понять, как всё таки правильно подписывать хэш без запуска датчика случайных чисел? ДСЧ запускается или требуется ввод пароля, поэтому реализована передача пароля вручную? Отредактировано пользователем 26 июня 2019 г. 23:36:13(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: Mikhail Kislovskiy Немного информации, на стороне java для проверки подписи используются GOST3411_2012_256withGOST3410_2012_256 либо CryptoProSignature_2012_256. Уточните, что ждёт java, raw-подпись или cms? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.05.2019(UTC) Сообщений: 18 Откуда: Moscow
|
Автор: Drew Столкнулся с такой же проблемой. Михаил, вам удалось найти решение?
Добрый день, коллеги решили проблему, она была связана с реализацией проверки на java, вроде как добавили поддержку алгоритма NONEwithGOST3410DH_2012_256.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.05.2019(UTC) Сообщений: 18 Откуда: Moscow
|
Автор: Drew
Есть ли варианты добиться нужного эффекта с моей стороны?
Мне кажется что для c# нет такой возможности, сам пытался найти какое то решение и перерыл sdk, но так ни к чему не пришел.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: 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. |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
Drew оставлено 28.06.2019(UTC)
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.01.2015(UTC) Сообщений: 5 Откуда: Ярославль Сказал(а) «Спасибо»: 1 раз
|
Действительно, прошел вариант с двойным хэшем. Спасибо. Автор: Андрей Писарев Сталкивался с вариантом "сервисов", где нужно было reverse делать для byte[] hashValue. Или дважды "вычисляли хеш": т.е. есть данные, от них получали хеш, этот хеш еще раз "хешировали и уже полученный хеш подписывали", правда там был вариант с CMS, а не raw.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close