| 
	Статус: Новичок
 Группы: Участники
Зарегистрирован: 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 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
	                           
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close