Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/92: Рейтинг темы: голосов - 92, средняя оценка - 4.77
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527

ЭЦП, C# и Рутокен

09.07.2015, 00:54. Показов 18362. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую великих гуру. Вопрос назрел, зело важный - есть файл, форматом - xml. Токен есть от Рутокена. Нужно прилепить к файлу подпись, какую - никакую информацию я нашел, но есть несколько вопросов.
Вот тут: С# + Криптопровайдер человек рассказывает, что при втыкании токена в usb-порт, то ключ автоматом станет доступным программе. Это будет работать с токенами от рутокен? На их сайте некие драйвера есть, значит по-идее должно? (задаю вопрос чисто на всякий случай, вдруг с ними кто-то уже работал и знает, так я на эту тему буду их саппорт мучать).
Меня интересует более важный вопрос: Если использовать функцию, выкопанную мной в MSDN без воткнутого токена, то она всё равно подпишет файл, и это на компьютере, в котором в принципе не было ни одного токена.
Вот код функции, которую я использую:
Кликните здесь для просмотра всего текста

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
        /// <summary>
        /// Подписывание xml-файла
        /// </summary>
        /// <param name="path">Путь к подписываемому файлу</param>
        public void SignXml(string path)
        {
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
 
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(path);
 
            SignedXml signedXml = new SignedXml(xmlDoc);
            signedXml.SigningKey = rsaKey;
 
            Reference reference = new Reference();
            reference.Uri = "";
        
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);
            signedXml.AddReference(reference);
            signedXml.ComputeSignature();
            XmlElement xmlDigitalSignature = signedXml.GetXml();
            xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
 
            xmlDoc.Save(path);      
        }

Возможно, я что-то не так понял, или не так делаю? Как определять, что USB-токен вставлен в компьютер?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2015, 00:54
Ответы с готовыми решениями:

Отследить подключение и отключение Рутокен
Здравствуйте, как можно отловить подключение и отключение Рутокен в Delphi 7?

Рутокен на базе чипа LPC1342F
Можно как-то использовать уже не годные модули?

Кто использует РуТокен для двухфакторной авторизации?
Всем привет. Есть задача реализовать двухфакторную авторизацию всех сотрудников компании с помощью РуТокен PKI. Вопрос только один:...

5
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
09.07.2015, 19:52
https://msdn.microsoft.com/ru-... .110).aspx
- тут подробнее , если контейнера ключа нет , то он будет создан , а ключ сгенерирован и сохранен в нем. , так что да , подпись будет в любом случае.
https://msdn.microsoft.com/ru-... .110).aspx - инфа по контейнеру, HardwareDevice - позволит определить аппаратный ключ или нет.
2
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
09.07.2015, 22:37  [ТС]
sau, спасибо большое за сылки, буду смотреть.
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
11.07.2015, 05:15  [ТС]
sau, вот такой вопрос возник, эта функция будет работать со всеми токенами? Просто у меня пока на руках токена нету, и я не могу проверить сам... Дело в том, что у того же РуТокена есть своя SDK, для взаимодействия между токеном и программой, и поэтому встаёт такой вопрос...
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
25.07.2015, 03:01  [ТС]
Хммм... Возникла проблема - C# никак не может зацепится за токен.
Токен воткнут в комп, дрова поставлены, код вот такой:
C#
1
2
3
4
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "RaUser-*****-****-****-****-********";
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
            MessageBox.Show(rsaKey.CspKeyContainerInfo.HardwareDevice.ToString());
При запуске выдаёт false, что автоматом означает, что подключается он не к токену.
Ещё, при попытке указать пароль от токена выдаёт ошибку:
C#
1
2
3
4
5
6
7
    CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "RaUser-5e2143e4-9f60-44e7-a796-c2ae672a3990";
            cspParams.KeyPassword = new System.Security.SecureString();
            cspParams.KeyPassword.AppendChar('c');///тут тип пин код от токена ввёл
 
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
            MessageBox.Show(rsaKey.CspKeyContainerInfo.HardwareDevice.ToString());
На строку:

C#
1
2
3
4
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
/*Сообщение ошибки:
An unhandled exception of type 'System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll
Additional information: Указан неправильный тип.*/
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
27.07.2015, 03:09  [ТС]
Так, господа, я таки решил проблему, используя КриптоПро .NET.

Полная инструкция, по подписыванию xml - файлов, при помощи токенов от РуТокен.
1) Установить драйвера для токена, установить КриптоПРО CSP, НИ В КОЕМ СЛУЧАЕ! не устанавливать фигвину, которая идёт на диске от рутокена в папке с драйверами ("rtSup_CryptoPro.x86.v.2.41.00.0162.exe " и "rtSup_CryptoPro.x64.v.2.41.00.0162.exe" ). По названию - это "Модуль поддержки РуТокен в КриптоПРО CSP", вот только эффект от его установки - строго противоположный! Я не представляю, как такое может быть, но эта информация стоила мне трёх полных удалений всего этого софта, и установки по новой. Так вот, устанавливаешь драйвера - всё ок. Устанавливаешь КриптоПРО CSP - всё ок, и в списке есть РуТокен. Ставишь этот "модуль подержки", и рутокен из списка резко исчезает! Притом исчезает даже из установки, и не вернуть его никак, кроме полной переустановки КриптоПРО и дров.

2) С сайта криптоПРО (линк на скачку) качаешь 2 штуки:
- КриптоПро .NET
- КриптоПро .NET SDK
После установки, у вас в шарпе появятся 3 новых пункта во вкладке Reference Manager, в разделе Extensions. Нам нужно будет добавить в проект 2 из них:
- CryptoPro.Sharpei.Base
- CryptoPro.Sharpei.Xml
Кроме того, нужно добавить из вкладки Framework:
- System.Xml
- System.Security

Вот и все приготовления. Далее идёт сам код:

1) В верху добавим:
C#
1
2
3
4
5
6
        using System.Xml;
        using System.Security.Cryptography;
        using System.Security.Cryptography.Xml;
        using System.Security.Cryptography.X509Certificates;
        using CryptoPro.Sharpei;
        using CryptoPro.Sharpei.Xml;
2) И сама функция:
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
        /// <summary>
        /// Подписывание xml-файла
        /// </summary>
        /// <param name="path">Путь к подписываемому файлу</param>
        public void SignXml(string path)
        {
            CspParameters cspParameters = new CspParameters(75, null, "RaUser-****-*****-***-**"); ///Идентификатор ключа. Смотрится в "Панель управления Рутокен"
 
 
            Gost3410CryptoServiceProvider prov = new Gost3410CryptoServiceProvider(cspParameters);
            X509Certificate2 certificate = prov.ContainerCertificate;
            AsymmetricAlgorithm Key = certificate.PrivateKey;
 
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(path);
 
            SignedXml signedXml = new SignedXml(xmlDoc);
            signedXml.SigningKey = Key;
 
            Reference reference = new Reference();
            reference.Uri = "";
            reference.DigestMethod = CPSignedXml.XmlDsigGost3411Url;
 
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);
 
            XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
            reference.AddTransform(c14);
 
            signedXml.AddReference(reference);
 
            KeyInfo keyInfo = new KeyInfo();
            keyInfo.AddClause(new KeyInfoX509Data(certificate));
            signedXml.KeyInfo = keyInfo;
            signedXml.ComputeSignature();
 
            XmlElement xmlDigitalSignature = signedXml.GetXml();
            xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
 
            if (xmlDoc.FirstChild is XmlDeclaration)
                xmlDoc.RemoveChild(xmlDoc.FirstChild);
 
            xmlDoc.Save(path);
        }
Комментарии к отдельным частям функции я не писал, т.к. он почти полностью повторяет пример от КриптоПРО. Посмотреть этот(и другие) пример(ы) можно вот тут (Путь для Windows x64): C:\Program Files (x86)\Crypto Pro\NET SDK\Examples\simple\Xml\cs
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2015, 03:09
Помогаю со студенческими работами здесь

ЭЦП
Подскажите пожалуйста у меня тема диплома &quot;разработка программного приложения по сопровождению документов ЭЦП&quot;. Можете объяснить что...

1с и эцп
Доброго времени суток, форумчане. Как, работая в 1с (8.2, толстый клиент), анализировать, подписан ли файл с разрешением .dbf ЭЦП? С...

ИС с ЭЦП
Работаю над информационной системой на PHP, требуется организовать документооборот между участниками данной ИС с использованием ЭЦП. У...

ЭЦП
Можете скинуть какую-нибудь годную статью про ЭЦП? Где подробно и понятно написано как с ней работать.

ЭЦП в Лотусе
Как бы не совсем сюда... Но другие подфорумы еще менее &quot;в тему&quot;. На сколько подпись в Лотусе является юридически значимой? Я так понимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru