powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ЭЦП на XML файл
13 сообщений из 13, страница 1 из 1
ЭЦП на XML файл
    #39989349
tatanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
Есть XML-файл, который надо подписать ЕСЦ на C#. Выбор сертификата выполняется так:

Код: c#
1.
2.
3.
4.
5.
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
X509Certificate2Collection fcollection=(X509Certificate2Collection)store.Certificates;
X509Certificate2Collection collection=X509Certificate2UI.SelectFromCollection(fcollection, "Выберите сертификат", 
    "Выберите сертификат", X509SelectionFlag.SingleSelection);store.Open(OpenFlags.ReadOnly);
X509Certificate2 c = collection[0];



Далее надо считать закрытый ключ
Для сертификатов RSARSACrypto все проходит нормально:

Код: c#
1.
keyp1 = (RSACryptoServiceProvider)sert.PublicKey.Key;



Но для сертификата Gost3410Crypto не получается считать приватный ключ таким образом

Может кто-то уже сталкивался с такой проблемой?
Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989429
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Api для "Честного знака" делаешь?
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989440
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с помощью КриптоПро .NET нужно вам пытаться
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989650
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покупаешь КриптоПро .NET за 900р
можно качнуть триал, она вообщем то без ограничений
там с примерами на c#
я недавно такое делал, пол дня работы
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989653
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview,
а без КриптоПро .NET можно обойтись?
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989732
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
listtoview,
а без КриптоПро .NET можно обойтись?

https://docs.microsoft.com/ru-ru/dotnet/standard/security/how-to-sign-xml-documents-with-digital-signatures
Да, можно
подключите криптопро нет бесплатно
отладьте код
затем отключите криптопро нет
если у вас нет хитрых трансформов, то там только строковые константы объявить останется

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
using System;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using CryptoPro.Sharpei.Xml;
using System.Xml;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;


// Подписывает XML документ и сохраняем подпись в документе.
        public static void SignXmlDocument(XmlDocument doc, AsymmetricAlgorithm Key, X509Certificate Certificate)
        {
            // удаляем существующие подписи
            var sngtrStNode = doc.GetElementsByTagName("SngtrSt")[0];
            var signatures = new List<XmlNode>();
            foreach (XmlNode sig in doc.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl))
            {
                signatures.Add(sig);
            }
            foreach (XmlNode sig in signatures)
            {
                sngtrStNode.RemoveChild(sig);
            }

            //var sngtrStNode = doc.GetElementsByTagName("SngtrSt")[0];
            //XmlNode sig1Node = doc.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0];
            //if (sig1Node != null)
            //    sngtrStNode.RemoveChild(sig1Node);

            // Создаем объект SignedXml по XML документу.
            SignedXml signedXml = new SignedXml(doc);

            // Добавляем ключ в SignedXml документ. 
            signedXml.SigningKey = Key;

            // Создаем ссылку на node для подписи.
            // При подписи всего документа проставляем "".
            Reference reference = new Reference();
            reference.Uri = "";

            // Явно проставляем алгоритм хэширования,
            // по умолчанию SHA1.
            //reference.DigestMethod =
            //    CPSignedXml.XmlDsigGost3411Url;
            reference.DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url;

            // Добавляем transform на подписываемые данные
            // для удаления вложенных подписей, не только
            // собственной.            
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);
            XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
            reference.AddTransform(c14);
            XmlDsigXPathTransform xpath = CreateXPathTransform();
            reference.AddTransform(xpath);

            // Добавляем ссылку на подписываемые данные
            signedXml.AddReference(reference);

            // Создаем объект KeyInfo.
            KeyInfo keyInfo = new KeyInfo();

            // Добавляем сертификат в KeyInfo
            keyInfo.AddClause(new KeyInfoX509Data(Certificate));

            // Добавляем KeyInfo в SignedXml.
            signedXml.KeyInfo = keyInfo;

            // Можно явно проставить алгоритм подписи: ГОСТ Р 34.10.
            // Если сертификат ключа подписи ГОСТ Р 34.10
            // и алгоритм ключа подписи не задан, то будет использован
            //XmlDsigGost3410Url
            //signedXml.SignedInfo.SignatureMethod =
            //    CPSignedXml.XmlDsigGost3410Url;
            signedXml.SignedInfo.SignatureMethod = Key.SignatureAlgorithm;

            // Вычисляем подпись.
            signedXml.ComputeSignature();

            // возвращаем удаленные подписи
            foreach (XmlNode sig in signatures)
            {
                sngtrStNode.AppendChild(doc.ImportNode(sig, true));
            }
            //if (sig1Node != null)
            //    sngtrStNode.AppendChild(doc.ImportNode(sig1Node, true));

            // Получаем XML представление подписи и сохраняем его 
            // в отдельном node.
            XmlElement xmlDigitalSignature = signedXml.GetXml();

            // добавляем хеш в ид ноды подписи
            xmlDigitalSignature.SetAttribute("ID", MD5Helper.GetExeHash());

            // Добавляем вторую подпись
            sngtrStNode.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
        }
		
		
		// Создаем XML transform.        
        public static XmlDsigXPathTransform CreateXPathTransform()
        {
            // Создаем новый XMLDocument.
            XmlDocument doc = new XmlDocument();

            // Создаем новый XmlElement.
            doc.LoadXml("<XPath xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">"
                + "not(ancestor-or-self::dsig:Signature)</XPath>");
            XmlElement xPathElem = (XmlElement)doc.SelectSingleNode("/XPath");

            // Создаем новый объект XmlDsigXPathTransform.
            XmlDsigXPathTransform xForm = new XmlDsigXPathTransform();

            // Загружаем XPath XML из элемента. 
            xForm.LoadInnerXml(xPathElem.SelectNodes("."));

            // Возвращаем XML, осуществляющий преобразование.
            return xForm;
        }
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989734
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а лучше возьмите примеры с криптопро нет у них на сайте
у меня просто преобразования хитрые и несколько подписей на один xml
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989736
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и крипто про csp должен быть установлен на компьютере
он тож есть бесплатный
это провайдер
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989738
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989744
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989764
tatanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду разбираться
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39989774
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Это скорее всего не будет работать, потому что в криптоПро работают православные криптографические алгоритмы собственной разработки, которые отсутствуют в общих сборках Microsoft или open-source.
...
Рейтинг: 0 / 0
ЭЦП на XML файл
    #39990025
tatanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После обновления КРИПТО.NET все заработало.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ЭЦП на XML файл
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]