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

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

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

  • triangle
  • Новый участник
  • Постов: 5
  • Репутация: 0
От меня что-то ускользает:
1."Он в последней версии SDK". Кто он? SDK 2.0 это последняя версия или нет? Есть нет - дайте урл на последнюю
2. "оба варианта подписи". О каких вариантах речь?
3. На вопрос "Это тот алгоритм что нужен?" - ответа нет.

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

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
1. Наш SDK регулярно обновляется и выкладывается на сайте. Доступ имеют организации подписавшие с нами акт приема-передачи SDK. Им высылается ссылка, пройдя по которой можно вбить указанный в акте email и получить ссылку на последнюю версию SDK. Все вопросы по получению SDK пишите на info[a]pki.gov.kz

2. "У нас с одним из наших интеграторов возникла проблема при проверке подписи." Если у вас один вариант, высылайте один.

3. Если Вам нужен алгоритм подписи, то это GOST 34.311-95 with GOST 34.310-2004. Если алгоритм хэширования, то GOST 34.311-95.

Для подписи Вам необходим этот алгоритм:
#define SN_id_Gost34311_95_with_Gost34310_2004 "id-Gost34311-95-with-Gost34310-2004"
#define LN_id_Gost34311_95_with_Gost34310_2004 "GOST 34.311-95 with GOST 34.310-2004"
#define NID_id_Gost34311_95_with_Gost34310_2004 925
#define OBJ_id_Gost34311_95_with_Gost34310_2004 OBJ_pkigovkz,1L,1L,2L

Вообще нормально и поподробнее опишите ситуацию. Например, на сервере используется библиотека на Java. У клиента на С. Подпись сделанная клиентом не проверяется на сервере и т.п. приложите файл с подписью, которая не проверяется. А то непонятно кто от вас требует алгоритм подписи. Сравниваете алгоритм подписи и хэша.
Модератор

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

  • triangle
  • Новый участник
  • Постов: 5
  • Репутация: 0
1. Доступ у нас есть, завтра человек с доступом скачает свежий SDK

2. Суть в том, что проверка подписи происходит на стороне ЭСФ ( 92.46.122.150:8443/esf-web/login), на нашей стороне (C# + C Kalkan; libeay32.dll & ssleay32.dll) идёт формирование данных и их подпись. Так вот подпись на стороне ЭСФ (там Java Kalkan) и не прошла проверку. При разборе деталей выяснили разницу в используемых алгоритмах, они при проверке используют ECGOST34310, и нам нужно понять что ему соответсвует в Калкане для С.

3. Получается что ECGOST34310 это "id-Gost34311-95-with-Gost34310-2004"? Проблема в том, что функция EVP_get_digestbyname его "не видит", дайте пример хоть на голом С как с ним дайджест построить. Или вытягивать его через EVP_get_digestbynid(925)?

Сейчас наш C# код выгдядит так:
var bio = OpenSSL.Core.BIO.File(signCertificatePath, "r");
var signX509Cert = OpenSSL.X509.X509Certificate.FromPKCS12(bio, authCertificatePassword);
var digest = MessageDigest.CreateByName("GOST 34.311-95");
var context = new MessageDigestContext(digest);
var signature = Convert.ToBase64String(context.Sign(Encoding.UTF8.GetBytes("123"), signX509Cert.PrivateKey)); //123 is a test data

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

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
triangle написал:
Получается что ECGOST34310 это "id-Gost34311-95-with-Gost34310-2004"?

- Да. Но это не означает, что в метод MessageDigest.CreateByName Вы должны передавать Gost34311-95-with-Gost34310-2004 и тем более не ECGOST34310.

triangle написал:
дайте пример хоть на голом С как с ним дайджест построить

- Все примеры содержаться в SDK

Я бы не рекомендовал Вам использовать метод Sign. Возможно именно в нем неверные параметры подписи вычисляются.

Примерно так должно быть (код на C):
md = EVP_get_digestbynid(NID_id_Gost34311_95); //для новых ключей
md = EVP_get_digestbynid(NID_id_GostOld34311_95); //для старых ключей

EVP_MD_CTX *ctx = EVP_MD_CTX_create();

resultSign = EVP_SignInit(ctx, md);
resultSign = EVP_SignUpdate(ctx, inData, inDataLength);
resultSign = EVP_SignFinal(ctx, signedData, (unsigned int *)&signedDataLen, pkey);
Модератор

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

  • triangle
  • Новый участник
  • Постов: 5
  • Репутация: 0
Скачали свежий SDK, посмотрел KalkanCryptCOM - нам он не подходит т.к. в нём нет методов чтобы получить PEM из сертификата (во всяком случае нет в примерах).

У метода SignData параметр alias для чего?

Основная проблема осталась: EVP_get_digestbynid(925)//NID_id_Gost34311_95_with_Gost34310_2004
возвращает null, что делать?

Инициализацию делаем так:
ENGINE_load_openssl();
ENGINE_load_gost();
OPENSSL_add_all_algorithms_noconf();
ENGINE_register_all_pkey_asn1_meths();

Может быть что-то ещё нужно?

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

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Внимательно прочитайте мое предыдущее сообщение. В нем все ответы на Ваши вопросы.

Я написал: "Но это НЕ означает, что ..."
Модератор
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
FaLang translation system by Faboba