// Создаем новый документ XML.
XmlDocument doc = new XmlDocument();
// Читаем документ из файла.
doc.Load(new XmlTextReader(FileName));
// Создаём объект SmevSignedXml - наследник класса SignedXml с перегруженным GetIdElement
// для корректной обработки атрибута wsu:Id.
SmevSignedXml signedXml = new SmevSignedXml(doc);
// Задаём ключ подписи для документа SmevSignedXml.
signedXml.SigningKey = Certificate.PrivateKey;
// Создаем ссылку на подписываемый узел XML. В данном примере и в методических
// рекомендациях СМЭВ подписываемый узел soapenv:Body помечен идентификатором "body".
Reference reference = new Reference();
reference.Uri = "#a06356a7e8bd4239ad69b3e9c949bca1";
// Задаём алгоритм хэширования подписываемого узла - ГОСТ Р 34.11-94. Необходимо
// использовать устаревший идентификатор данного алгоритма, т.к. именно такой
// идентификатор используется в СМЭВ.
#pragma warning disable 612
//warning CS0612: 'CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete' is obsolete
reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411_2012_256Url;
#pragma warning restore 612
// Добавляем преобразование для приведения подписываемого узла к каноническому виду
// по алгоритму
http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими
// рекомендациями СМЭВ.
// XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();XmlDsigCanonicalizationUrl
reference.AddTransform(new XmlDsigExcC14NTransform());
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
// Добавляем ссылку на подписываемый узел.
signedXml.AddReference(reference);
// Задаём преобразование для приведения узла ds:SignedInfo к каноническому виду
// по алгоритму
http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими
// рекомендациями СМЭВ.
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
// Задаём алгоритм подписи - ГОСТ Р 34.10-2001. Необходимо использовать устаревший
// идентификатор данного алгоритма, т.к. именно такой идентификатор используется в
// СМЭВ.
#pragma warning disable 612
//warning CS0612: 'CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete' is obsolete
signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410_2012_256Url;
#pragma warning restore 612
// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();
// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(Certificate));
// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;
// Вычисляем подпись.
signedXml.ComputeSignature();
// Получаем представление подписи в виде XML.
XmlElement xmlDigitalSignature = signedXml.GetXml();
var signedDataContainer = signedXml.GetIdElement(doc, "a06356a7e8bd4239ad69b3e9c949bca1");
signedDataContainer.InsertBefore(doc.ImportNode(xmlDigitalSignature, true), signedDataContainer.FirstChild);