Подписание ключами ГОСТ в .NET (C#)
(0 чел.) 
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5

ТЕМА: Подписание ключами ГОСТ в .NET (C#)

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 9 мес. назад #2716

  • Mol4ok
  • Новый участник
  • Постов: 7
  • Репутация: 0
Доброго времени суток.

Скачал последнюю версию SDK сегодня. Зарегистрировал библиотеку KalkancryptCOM.dll в системе(команда regsvr32)
Затем дал ссылку на библиотеку в проекте на C#.
Возникли некоторые трудности в проверке подписи с помощью функции VerifyData. решил для начала просто подписать текстовые данные, затем попробовать поработать с подписанием файлов.
Мой код:
  KalkanCryptCOM fff = new KalkanCryptCOM();
            fff.Init(); //инициализация

            try
            {
                fff.LoadKeyStore(1, "123456", Server.MapPath("~/cert/") + "GOSTKZ_e56fe5a0899f787815adaf5d256da7a0a70c2c13.p12", "");
            }
            catch (Exception ex)
            {

            }


            String outSign;
            String indata;

            indata = "текст подписи";

            fff.SignData("", 1, indata, out outSign); 

            String  outVerifyInfo, outData, outCert, inSign;

            inSign = outSign;

            try
            {
                fff.VerifyData("", 1, 0, indata, inSign, out outData, out outVerifyInfo, out outCert);
            }
            catch (Exception ex)
            {
                throw new Exception();
            }




Подпись заполняется значением, на скриншоте я показал - scr1.jpeg(причем в каждый раз это значение разное - не знаю должно ли так быть для одинаковых данных), но затем при проверке подписи (функция VerifyData) приложение полностью вылетает...

Подскажите пожалуйста в чем может быть причина в моем случае.

Также есть вопрос по запуску проекта в папке SDK 2.0\COM\examples\TestClient_Delphi\Win32\Debug - не удается подписать данные(scr2.jpeg), хотя информация о сертификате выводится корректно. На скриншотах во вложении отметил ошибку. Подскажите пожалуйста что может быть не так, либо я что-то не так делаю. Спасибо!

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 9 мес. назад #2722

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

Как я понял. Вам необходим формат подписи Draft Sign (т.н. сырая подпись).
При подписи данных рекомендую установить флаг выходных данных KC_OUT_BASE64. Либо KC_OUT_DER, если необходимо в бинарном формате.
Если при подписи был установлен флаг KC_OUT_BASE64, то при проверке необходимо установить флаг KC_IN2_BASE64.

О том, что значение подписи каждый раз разное, я уже писал в другой теме на форуме. В алгоритме ГОСТ при вычислении значения подписи используется случайное число, поэтому подпись каждый раз имеет различное значение. Но это не влияет на ее корректность и проверку. В алгоритме RSA подпись для одних и тех же данных будет всегда одинаковой.
Модератор

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 8 мес. назад #2736

  • Mol4ok
  • Новый участник
  • Постов: 7
  • Репутация: 0
Доброго времени суток.

Сделал подписание как вы сказали

fff.SignData("", (int) KalkanCryptCOMLib.KALKANCRYPTCOM_FLAGS.KC_OUT_BASE64, indata, out outSign);


Соответственно проверка

 fff.VerifyData("", (int)KalkanCryptCOMLib.KALKANCRYPTCOM_FLAGS.KC_IN2_BASE64, 0, indata, inSign, out outData, out outVerifyInfo, out outCert);


Однако на выходе outSign выходит со значением null, я неверно указал флаг?


Еще скажите пож-та, почему при подписании XML(тоже C# и библиотека KalKanCryptcom) в теме
pki.gov.kz/index.php/ru/forum/7-dlya-raz...limit=6&start=12
при указании сертификатов мы выбираем два сертификата корневой и промежуточный
signer.X509LoadCertificateFromFile(Path+"root_gost.cer", (int) KALKANCRYPTCOM_CERTTYPE.KC_CERT_CA);
signer.X509LoadCertificateFromFile(Path + "root_gost.cer", (int)KALKANCRYPTCOM_CERTTYPE.KC_CERT_INTERMEDIATE);

а в примере для подписания можно просто воспользоваться методом
fff.LoadKeyStore(1, "123456", Server.MapPath("~/cert/") + "GOSTKNCA_c025b4e0f8b1c26de1e381d7771f5f8d407ba76b.p12", "");

В чем различие этих методов, в том что используются публичные сертификаты либо индивидуальный сертификат, выданный юр или физ лицу? Можно ли при подписании xml использовать

fff.LoadKeyStore(1, "123456", Server.MapPath("~/cert/") + "GOSTKNCA_c025b4e0f8b1c26de1e381d7771f5f8d407ba76b.p12", "");
?


При подписании файла с помощью библиотеки KalKanCryptcom в метод SignData передавать ХЭШ код файла? И можно ли с помощью этой библиотеки подписать файл, к примеру также сгенерировать подпись в формате base64 или в байтовом виде)?

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 8 мес. назад #2740

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

1. Как инициализируете outSign? Должна быть непустая строка, т.к. при пустой C# инициализирует как NULL. А в библиотеке не выделяется память.

2. В этой теме идет разговор о проверке (verify), а не о подписании (sign). При проверке необходимо также указать корневые и промежуточные сертификаты, т.к. проверяется цепочка сертификатов до коневого (доверенного) сертификата. Соответственно, и различие этих методов: Вы подгружаете свои ключи или сертификаты.

3. Нет, передаете исходные данные. Библиотека сама вычисляет хэш.
Файл можете подписать предварительно представив его в байтовом виде.
Модератор

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 8 мес. назад #2742

  • Mol4ok
  • Новый участник
  • Постов: 7
  • Репутация: 0
1. outSign инициализирую таким образом
String outSign=" ";


то есть передаю пустую строку, либо пробовал и так(передавал любое значение)
String outSign="111";


но результат пока такой же...


2. Вот я это и хотел узнать, выходит в целом либо свои ключи использую либо корневой и промежуточный сертификат, соответственно при проверке и подписании тоже.


3. Хорошо, а pdf файл или tiff к примеру можно ли представить в бинарном виде, это мне поискать способы представления файлов в бинарный вид к примеру в моем случае на c#? Просто исходные данные в представленный метод SignData я могу передать в виде строки, наверное бинарный вид(полученный из файла) надо перевести в base64 строку?
Извините, просто не сталкивался с такой задачей, буду благодарен если подскажите направление в котором копать дальше.

Re: Подписание ключами ГОСТ в .NET (C#) 2 года, 8 мес. назад #2744

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
1. Скиньте мне на почту Ваш тестовый проект на C#.

2. Не "либо". При подписании используете ТОЛЬКО свои ключи. Для проверки необходимы корневой и промежуточный сертификаты (это не ключи). Рекомендую изучить немного основ на тему Инфраструктура открытых ключей. Тогда Вам станет понятнее.

3. Да, можете сконвертировать в base64
Модератор
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
FaLang translation system by Faboba