<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://miac.volmed.org.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro</id>
	<title>Подпись ИЭМК с помощью Crypto Pro - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://miac.volmed.org.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro"/>
	<link rel="alternate" type="text/html" href="https://miac.volmed.org.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro&amp;action=history"/>
	<updated>2026-04-11T12:21:11Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://miac.volmed.org.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro&amp;diff=3943&amp;oldid=prev</id>
		<title>Misha в 13:41, 20 октября 2016</title>
		<link rel="alternate" type="text/html" href="https://miac.volmed.org.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro&amp;diff=3943&amp;oldid=prev"/>
		<updated>2016-10-20T13:41:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 16:41, 20 октября 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Подпись с помощью CryptoPro&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Подпись с помощью CryptoPro&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1. &lt;/del&gt;Установка Crypro Pro.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;Установка Crypro Pro.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;2. &lt;/del&gt;Установка Crypro Pro.Net&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;Установка Crypro Pro.Net&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;3. &lt;/del&gt;Установка Crypro Pro.Net SDK&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;Установка Crypro Pro.Net SDK&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Misha</name></author>
	</entry>
	<entry>
		<id>https://miac.volmed.org.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro&amp;diff=3550&amp;oldid=prev</id>
		<title>Dmitriy: Новая страница: «Подпись с помощью CryptoPro 1. Установка Crypro Pro. 2. Установка Crypro Pro.Net 3. Установка Crypro Pro.Net SDK  &lt;pre&gt;…»</title>
		<link rel="alternate" type="text/html" href="https://miac.volmed.org.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C_%D0%98%D0%AD%D0%9C%D0%9A_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_Crypto_Pro&amp;diff=3550&amp;oldid=prev"/>
		<updated>2015-04-01T16:59:30Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «Подпись с помощью CryptoPro 1. Установка Crypro Pro. 2. Установка Crypro Pro.Net 3. Установка Crypro Pro.Net SDK  &amp;lt;pre&amp;gt;…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Подпись с помощью CryptoPro&lt;br /&gt;
1. Установка Crypro Pro.&lt;br /&gt;
2. Установка Crypro Pro.Net&lt;br /&gt;
3. Установка Crypro Pro.Net SDK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Threading.Tasks;&lt;br /&gt;
using System.Security.Cryptography.X509Certificates;&lt;br /&gt;
using System.Xml;&lt;br /&gt;
using System.Xml.Linq;&lt;br /&gt;
using System.Security.Cryptography;&lt;br /&gt;
using System.Security.Cryptography.Xml;&lt;br /&gt;
using CryptoPro.Sharpei;&lt;br /&gt;
using CryptoPro.Sharpei.Xml;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace Samples.Xml.cs&lt;br /&gt;
{&lt;br /&gt;
    class SignSmevRequest&lt;br /&gt;
    {&lt;br /&gt;
        [STAThread]&lt;br /&gt;
        static void Main(string[] args)&lt;br /&gt;
        {&lt;br /&gt;
            X509Store certStore = new X509Store(StoreLocation.CurrentUser);&lt;br /&gt;
            certStore.Open(OpenFlags.ReadOnly);&lt;br /&gt;
            X509Certificate2Collection certs = X509Certificate2UI.SelectFromCollection(&lt;br /&gt;
                certStore.Certificates,&lt;br /&gt;
                &amp;quot;Выберите сертификат&amp;quot;,&lt;br /&gt;
                &amp;quot;Пожалуйста, выберите сертификат электронной подписи&amp;quot;,&lt;br /&gt;
                X509SelectionFlag.SingleSelection);&lt;br /&gt;
            if (certs.Count == 0)&lt;br /&gt;
            {&lt;br /&gt;
                Console.WriteLine(&amp;quot;Сертификат не выбран.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // Подписываем запрос&lt;br /&gt;
            SignXmlFile(args[0], args[1], certs[0]);&lt;br /&gt;
&lt;br /&gt;
            // Проверяем подпись&lt;br /&gt;
            VerifyXmlFile(args[1]);&lt;br /&gt;
&lt;br /&gt;
            Console.ReadKey();&lt;br /&gt;
        }&lt;br /&gt;
        static void SignXmlFile(string FileName, string SignedFileName, X509Certificate2 Certificate)&lt;br /&gt;
        {&lt;br /&gt;
            // Создаем новый документ XML.&lt;br /&gt;
            XmlDocument doc = new XmlDocument();&lt;br /&gt;
            doc.PreserveWhitespace = true;&lt;br /&gt;
            // Читаем документ из файла.&lt;br /&gt;
            doc.Load(new XmlTextReader(FileName));&lt;br /&gt;
            // Создаём объект SmevSignedXml - наследник класса SignedXml с перегруженным GetIdElement&lt;br /&gt;
            // для корректной обработки атрибута wsu:Id. &lt;br /&gt;
            SmevSignedXml signedXml = new SmevSignedXml(doc);&lt;br /&gt;
            // Задаём ключ подписи для документа SmevSignedXml.&lt;br /&gt;
            signedXml.SigningKey = Certificate.PrivateKey;&lt;br /&gt;
            var sign = Certificate.PrivateKey;&lt;br /&gt;
            // Создаем ссылку на подписываемый узел XML. В данном примере и в методических&lt;br /&gt;
            // рекомендациях СМЭВ подписываемый узел soapenv:Body помечен идентификатором &amp;quot;body&amp;quot;.&lt;br /&gt;
            Reference reference = new Reference();&lt;br /&gt;
            reference.Uri = &amp;quot;#BODY&amp;quot;;&lt;br /&gt;
            // Задаём алгоритм хэширования подписываемого узла - ГОСТ Р 34.11-94. Необходимо&lt;br /&gt;
            // использовать устаревший идентификатор данного алгоритма, т.к. именно такой&lt;br /&gt;
            // идентификатор используется в СМЭВ.&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            //warning CS0612: &amp;#039;CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete&amp;#039; is obsolete&lt;br /&gt;
            reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
&lt;br /&gt;
            // Добавляем преобразование для приведения подписываемого узла к каноническому виду&lt;br /&gt;
            // по алгоритму http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими&lt;br /&gt;
            // рекомендациями СМЭВ.&lt;br /&gt;
            XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();&lt;br /&gt;
            reference.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(reference);&lt;br /&gt;
            // #wsa-300 !MessageID&lt;br /&gt;
            Reference referenceWSA300 = new Reference();&lt;br /&gt;
            referenceWSA300.Uri = &amp;quot;#WSA-300&amp;quot;;&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            referenceWSA300.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
            referenceWSA300.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceWSA300);&lt;br /&gt;
// #wsa-301 !Action&lt;br /&gt;
            Reference referenceWSA301 = new Reference();&lt;br /&gt;
            referenceWSA301.Uri = &amp;quot;#WSA-301&amp;quot;;&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            referenceWSA301.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
            referenceWSA301.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceWSA301);&lt;br /&gt;
// WSA-302 ! ReplyTo&lt;br /&gt;
            Reference referenceWSA302 = new Reference();&lt;br /&gt;
            referenceWSA302.Uri = &amp;quot;#WSA-302&amp;quot;;&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            referenceWSA302.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
            referenceWSA302.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceWSA302);&lt;br /&gt;
// WSA-303 ! To&lt;br /&gt;
            Reference referenceWSA303 = new Reference();&lt;br /&gt;
            referenceWSA303.Uri = &amp;quot;#WSA-303&amp;quot;;&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            referenceWSA303.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
            referenceWSA303.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceWSA303);&lt;br /&gt;
&lt;br /&gt;
//  #TRHEAD&lt;br /&gt;
            Reference referenceTH = new Reference();&lt;br /&gt;
            referenceTH.Uri = &amp;quot;#TRHEAD&amp;quot;;&lt;br /&gt;
            #pragma warning disable 612&lt;br /&gt;
            referenceTH.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
            #pragma warning restore 612&lt;br /&gt;
            referenceTH.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceTH);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
            doc.GetElementsByTagName(&amp;quot;wsse:BinarySecurityToken&amp;quot;)[0].InnerText =&lt;br /&gt;
    Convert.ToBase64String(Certificate.RawData);&lt;br /&gt;
&lt;br /&gt;
            //  #SenderCertificate&lt;br /&gt;
            Reference referenceSS = new Reference();&lt;br /&gt;
            referenceSS.Uri = &amp;quot;#CertId&amp;quot;;&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            referenceSS.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
            referenceSS.AddTransform(c14);&lt;br /&gt;
            signedXml.AddReference(referenceSS);&lt;br /&gt;
&lt;br /&gt;
            // Задаём преобразование для приведения узла ds:SignedInfo к каноническому виду&lt;br /&gt;
            // по алгоритму http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими&lt;br /&gt;
            // рекомендациями СМЭВ.&lt;br /&gt;
            signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;&lt;br /&gt;
&lt;br /&gt;
            // Задаём алгоритм подписи - ГОСТ Р 34.10-2001. Необходимо использовать устаревший&lt;br /&gt;
            // идентификатор данного алгоритма, т.к. именно такой идентификатор используется в&lt;br /&gt;
            // СМЭВ.&lt;br /&gt;
#pragma warning disable 612&lt;br /&gt;
            //warning CS0612: &amp;#039;CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete&amp;#039; is obsolete&lt;br /&gt;
            signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410UrlObsolete;&lt;br /&gt;
#pragma warning restore 612&lt;br /&gt;
&lt;br /&gt;
            // Вычисляем подпись.&lt;br /&gt;
&lt;br /&gt;
            signedXml.ComputeSignature();&lt;br /&gt;
&lt;br /&gt;
            // Получаем представление подписи в виде XML.&lt;br /&gt;
            XmlElement xmlDigitalSignature = signedXml.GetXml();&lt;br /&gt;
&lt;br /&gt;
            // Добавляем необходимые узлы подписи в исходный документ в заготовленное место.&lt;br /&gt;
            doc.GetElementsByTagName(&amp;quot;Signature&amp;quot;)[0].PrependChild(&lt;br /&gt;
                doc.ImportNode(xmlDigitalSignature.GetElementsByTagName(&amp;quot;SignatureValue&amp;quot;)[0], true));&lt;br /&gt;
            doc.GetElementsByTagName(&amp;quot;Signature&amp;quot;)[0].PrependChild(&lt;br /&gt;
                doc.ImportNode(xmlDigitalSignature.GetElementsByTagName(&amp;quot;SignedInfo&amp;quot;)[0], true));&lt;br /&gt;
&lt;br /&gt;
            // Добавляем сертификат в исходный документ в заготовленный узел&lt;br /&gt;
            // wsse:BinarySecurityToken.&lt;br /&gt;
            doc.GetElementsByTagName(&amp;quot;wsse:BinarySecurityToken&amp;quot;)[0].InnerText =&lt;br /&gt;
                Convert.ToBase64String(Certificate.RawData);&lt;br /&gt;
            // Сохраняем подписанный документ в файл.&lt;br /&gt;
            using (XmlTextWriter xmltw = new XmlTextWriter(SignedFileName,&lt;br /&gt;
                new UTF8Encoding(false)))&lt;br /&gt;
            {&lt;br /&gt;
                doc.WriteTo(xmltw);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        static void VerifyXmlFile(string SignedFileName)&lt;br /&gt;
        {&lt;br /&gt;
            // Создаем новый документ XML.&lt;br /&gt;
            XmlDocument xmlDocument = new XmlDocument();&lt;br /&gt;
&lt;br /&gt;
            // Форматируем документ с сохранением всех пробельных символов, т.к. они&lt;br /&gt;
            // важны при проверке подписи.&lt;br /&gt;
            xmlDocument.PreserveWhitespace = true;&lt;br /&gt;
&lt;br /&gt;
            // Загружаем подписанный документ XML из файла.&lt;br /&gt;
            xmlDocument.Load(SignedFileName);&lt;br /&gt;
&lt;br /&gt;
            // Ищем все узлы ds:Signature и сохраняем их в объекте XmlNodeList&lt;br /&gt;
            XmlNodeList nodeList = xmlDocument.GetElementsByTagName(&lt;br /&gt;
                &amp;quot;Signature&amp;quot;, SignedXml.XmlDsigNamespaceUrl);&lt;br /&gt;
&lt;br /&gt;
            Console.WriteLine(&amp;quot;Найдено подписей: {0}.&amp;quot;, nodeList.Count);&lt;br /&gt;
&lt;br /&gt;
            // Проверяем все подписи.&lt;br /&gt;
            for (int curSignature = 0; curSignature &amp;lt; nodeList.Count; curSignature++)&lt;br /&gt;
            {&lt;br /&gt;
                // Создаём объект SmevSignedXml - наследник класса SignedXml с перегруженным&lt;br /&gt;
                // GetIdElement для корректной обработки атрибута wsu:Id. &lt;br /&gt;
                SmevSignedXml signedXml = new SmevSignedXml(xmlDocument);&lt;br /&gt;
&lt;br /&gt;
                // Загружаем узел с подписью.&lt;br /&gt;
                signedXml.LoadXml((XmlElement)nodeList[curSignature]);&lt;br /&gt;
&lt;br /&gt;
                // Получаем идентификатор ссылки на узел wsse:BinarySecurityToken,&lt;br /&gt;
                // содержащий сертификат подписи.&lt;br /&gt;
                XmlNodeList referenceList = signedXml.KeyInfo.GetXml().GetElementsByTagName(&lt;br /&gt;
                    &amp;quot;Reference&amp;quot;, WSSecurityWSSENamespaceUrl);&lt;br /&gt;
                if (referenceList.Count == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    throw new XmlException(&amp;quot;Не удалось найти ссылку на сертификат&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Ищем среди аттрибутов ссылку на сертификат.&lt;br /&gt;
                string binaryTokenReference = ((XmlElement)referenceList[0]).GetAttribute(&amp;quot;URI&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                // Ссылка должна быть на узел внутри данного документа XML, т.е. она имеет вид&lt;br /&gt;
                // #ID, где ID - идентификатор целевого узла&lt;br /&gt;
                if (string.IsNullOrEmpty(binaryTokenReference) || binaryTokenReference[0] != &amp;#039;#&amp;#039;)&lt;br /&gt;
                {&lt;br /&gt;
                    throw new XmlException(&amp;quot;Не удалось найти ссылку на сертификат&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Получаем узел BinarySecurityToken с закодированным в base64 сертификатом&lt;br /&gt;
                XmlElement binaryTokenElement = signedXml.GetIdElement(&lt;br /&gt;
                    xmlDocument, binaryTokenReference.Substring(1));&lt;br /&gt;
                if (binaryTokenElement == null)&lt;br /&gt;
                {&lt;br /&gt;
                    throw new XmlException(&amp;quot;Не удалось найти сертификат&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Создаём объект X509Certificate2&lt;br /&gt;
                X509Certificate2 cert =&lt;br /&gt;
                    new X509Certificate2(Convert.FromBase64String(binaryTokenElement.InnerText));&lt;br /&gt;
&lt;br /&gt;
                // Проверяем подпись.&lt;br /&gt;
                // ВНИМАНИЕ! Проверка сертификата в данном примере не осуществляется. Её необходимо&lt;br /&gt;
                // реализовать самостоятельно в соответствии с требованиями к подписи проверяемого&lt;br /&gt;
                // типа сообщения СМЭВ.&lt;br /&gt;
                bool result = signedXml.CheckSignature(cert.PublicKey.Key);&lt;br /&gt;
                // Выводим результат проверки подписи в консоль&lt;br /&gt;
                if (result)&lt;br /&gt;
                {&lt;br /&gt;
                    Console.WriteLine(&amp;quot;Подпись №{0} верна.&amp;quot;, curSignature + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    Console.WriteLine(&amp;quot;Подпись №{0} не верна.&amp;quot;, curSignature + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        class SmevSignedXml : SignedXml&lt;br /&gt;
        {&lt;br /&gt;
            public SmevSignedXml(XmlDocument document)&lt;br /&gt;
                : base(document)&lt;br /&gt;
            {&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            public override XmlElement GetIdElement(XmlDocument document, string idValue)&lt;br /&gt;
            {&lt;br /&gt;
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);&lt;br /&gt;
                nsmgr.AddNamespace(&amp;quot;wsu&amp;quot;, WSSecurityWSUNamespaceUrl);&lt;br /&gt;
                return document.SelectSingleNode(&amp;quot;//*[@wsu:Id=&amp;#039;&amp;quot; + idValue + &amp;quot;&amp;#039;]&amp;quot;, nsmgr) as XmlElement;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public const string WSSecurityWSSENamespaceUrl = &amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&amp;quot;;&lt;br /&gt;
        public const string WSSecurityWSUNamespaceUrl = &amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dmitriy</name></author>
	</entry>
</feed>