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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Gruzilkin  
#1 Оставлено : 27 октября 2011 г. 17:31:04(UTC)
Gruzilkin

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

Группы: Участники
Зарегистрирован: 27.10.2011(UTC)
Сообщений: 1

Здравствуйте, пытаюсь проверять документы от налоговой (они в формате УФЭБС приходят), но как-то не особо получается пока, и не знаю в какую сторону дальше копать

в качестве исходных данных есть пример сообщения из налоговой, и собственно сертификат, которым якобы сообщения должны проверяться

в SDK от шарпея есть примеры для работы с XML (SignedXML), но при работе с УФЭБС они видимо не особо применимы и соответственно я за основу взял примеры с подписанием простой строки, скорее всего я как-то неправильно произвожу подготовку текста к подписанию, но может быть кто-то уже реализовывал проверку УФЭБС документов и сможет подсказать где ошибка

для проверки я использую следующий код:
Код:
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
using CryptoPro.Sharpei;

namespace GostSignedXmlTest
{
    class Program
    {
        const string CertificatePath = @"d:\cert_mci\rsrv.cer";
        const string PacketEPD = @"d:\cert_mci\sample.xml";
        const string CanonizedXML = @"d:\cert_mci\canonized_{0}.xml";

        static void Main(string[] args)
        {
            // Создаем новый XML документ в памяти.
            XmlDocument xmlDocument = new XmlDocument();

            // Загружаем подписанный документ из файла.
            xmlDocument.Load(PacketEPD);

            // читаем сертификат
            X509Certificate2 cert = new X509Certificate2(CertificatePath);

            // Создаем объект, реализующий алгоритм ГОСТ 3410 через CSP.
            var Gost = (Gost3410CryptoServiceProvider)cert.PublicKey.Key;

            // Создаем объект, реализующий алгоритм хэширования ГОСТ 3411
            Gost3411CryptoServiceProvider GostHash = new Gost3411CryptoServiceProvider();

            // получаем все подписи
            var signatureNodes = xmlDocument.GetElementsByTagName("SigValue", "urn:cbr-ru:dsig:v1.1");

            // идём в обратном порядке, потому что они исчезают из списка 
            for (int i = signatureNodes.Count - 1; i >= 0; i--)
            {
                var sigValue = signatureNodes[i];

                // конвертируем значение подписи в массив байт
                var signature = Convert.FromBase64String(sigValue.InnerXml);

                // берем родителя подписи, чтобы проверить на нём подпись
                var parentNode = sigValue.ParentNode;
                // при этом удаляем саму подпись из него
                sigValue.ParentNode.RemoveChild(sigValue);

                // теперь нужно провести канонизацию родительского элемента, для этого
                // создаем новый объект xml документа
                var parent = new XmlDocument();

                // и записываем в него текст родительского элемента
                var parentText = parentNode.OuterXml;
                parent.LoadXml(parentText);

                // а теперь мы можем произвести трансформацию этого документа
                XmlDsigC14NTransform transform = new XmlDsigC14NTransform();
                transform.LoadInput(parent);

                // после трансформации, мы получаем поток байт для проверки подписи
                using (var canonizedMemoryStream = (MemoryStream)transform.GetOutput(typeof(Stream)))
                {
                    // сохраним канонизированное представление родительского элемента, чтобы потом его можно было проверить
                    var bytes = canonizedMemoryStream.ToArray();
                    File.WriteAllBytes(string.Format(CanonizedXML, i), bytes);

                    // Проверяем правильность подписи и выводим результат:
                    if (Gost.VerifyData(bytes, GostHash, signature))
                    {
                        Console.WriteLine("Подпись вычислена верно.");
                    }
                    else
                    {
                        Console.WriteLine("Подпись вычислена неверно.");
                    }
                }
            }

            Console.ReadKey();
        }
    }
}


пример XML файла и сертификат из налоговой:
Сертификат
Пример XML файла

примеры данных, полученных после канонизации (байты под подпись):
сообщение раз
сообщение два

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

на машине установлены КриптоПро CSP (3.6.6497), КриптоПро Sharpei RTE (1.0.4087.0) и КриптоПро Sharpei SDK (1.0.4087.0), но пока еще бесплатные(тестовые), это какую-то роль играть может?
Вложение(я):
rsrv.cer (2kb) загружен 8 раз(а).
sample.xml (2kb) загружен 12 раз(а).
Program.cs (5kb) загружен 10 раз(а).
canonized_1.xml (1kb) загружен 17 раз(а).
canonized_0.xml (1kb) загружен 11 раз(а).

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