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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline djoni-kga  
#1 Оставлено : 22 января 2014 г. 17:56:51(UTC)
djoni-kga

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

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

Добрый день!

Пытаюсь наладить онлайн взаимодействие с Вымпелкомом, уткнулся в формировании и проверки подписи. В спецификации Вымпелкома написано, работы с ЭСП выполняется по алгоритму ГОСТ Р 34.11-94 и ГОСТ Р 34.10-2001. Написал код, собственно там ни чего нового, есть функция подписи и проверки, но, ни у Вымпелкома, ни у меня, подпись не проходит. Если подписываю и проверяю своей ключевой парой все работает великолепно. Проверял данные, одно и то же. В чем может быть причина? Код ниже.

Код:
 /// <summary>Подписать сообщение</summary>
 /// <param name="message">подписываемое сообщение</param>
 /// <param name="certificate">сертификат закрытого ключа</param>
 /// <returns>результат кодированный в base64</returns>
 public static string Sign(string message, X509Certificate2 certificate)
 {
   using (var gost = new Gost3411CryptoServiceProvider())
   {
     var sign = new GostSignatureFormatter(certificate.PrivateKey);
     var buff = Encoding.UTF8.GetBytes(message);
     var hash = gost.ComputeHash(buff);
     return Convert.ToBase64String(sign.CreateSignature(hash));
    }
 }


Код:
 /// <summary>Проверка подписи</summary>
 /// <param name="message">проверяемое сообщение</param>
 /// <param name="sign">подпись сообщения</param>
 /// <param name="certificate">сертификат открытого ключа</param>
 public static void Verify(string message, string sign, X509Certificate2 certificate)
 {
   using (var gost = new Gost3411CryptoServiceProvider())
   {
     var gostSign = new GostSignatureDeformatter(certificate.PublicKey.Key);
     var buff = Encoding.UTF8.GetBytes(message);
     // Создаем объект для хеширования.
     var hash = gost.ComputeHash(buff);
     byte[] signature = System.Convert.FromBase64String(sign);
     bool result = gostSign.VerifySignature(hash, signature);

     // Выводим результат проверки подписи
     if (!result)
     {
       throw new Exception("Подпись не верна!");
     }
   }
 }

Offline Максим Коллегин  
#2 Оставлено : 22 января 2014 г. 18:27:54(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Может подпись ожидается в формате pkcs7?
Знания в базе знаний, поддержка в техподдержке
Offline djoni-kga  
#3 Оставлено : 23 января 2014 г. 10:00:35(UTC)
djoni-kga

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

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

Добрый день!

В спецификации упоминание по pkcs7 или CMS нет, ниже формат сообщения

Код:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://payment.beepayxp.jetinfosoft.ru">
  <soap:Header>
    <digitalSignature>
      <signature>uL45S07uVqJ3a8dJ68AwhvWyC4rthbfPFsKcJHEDo3DvV6dhv2ocY78S3xrJRJsfl6ICawK4vwjW3w8/24l5xQ==</signature>
    </digitalSignature>
  </soap:Header>
  <soap:Body>
    <!--Подписываемая и проверяемая секция-->
  </soap:Body>
</soap:Envelope>
Offline Юрий  
#4 Оставлено : 23 января 2014 г. 10:13:46(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Подпись переверните: первый байт сделайте последним, второй - предпоследним и так далее.
P.S.: Естественно это надо сделать до конвертации в BASE64.

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

С уважением,
Юрий Строжевский
Offline Юрий  
#5 Оставлено : 23 января 2014 г. 10:17:00(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
С уважением,
Юрий Строжевский
Offline djoni-kga  
#6 Оставлено : 23 января 2014 г. 11:48:55(UTC)
djoni-kga

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

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

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

Код:
private static byte[] MixBytes(byte[] values)
{
  for (int i = 0; i <= (values.Length / 2 - 1); i++)
  {
    byte b = values[i];
    values[i] = values[values.Length - 1 - i];
    values[values.Length - 1 - i] = b;
  }
  return values;
}
Offline djoni-kga  
#7 Оставлено : 23 января 2014 г. 12:12:53(UTC)
djoni-kga

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

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

Ураа!!!! заработало спасибо за совет, Вы не видете..., я вам низко кланяюсь.
Offline Юрий  
#8 Оставлено : 23 января 2014 г. 12:15:51(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Автор: djoni-kga Перейти к цитате
Ураа!!!! заработало спасибо за совет, Вы не видете..., я вам низко кланяюсь.

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