Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline idtks  
#1 Оставлено : 30 ноября 2017 г. 12:26:03(UTC)
idtks

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.07.2014(UTC)
Сообщений: 107
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 24 раз
Добрый день.

Мне надо по готовому хешу создать подпись, используя сертификат ГОСТ-2001. Все подписывается и "на другой" стороне подпись проходит проверку. Но вызывает удивление время вызова функции CryptSignHash из advapi32.dll для провайдера КриптоПро CSP 4.0 - более 60 миллисекунд на не очень слабой машине. Почему так долго формируется подпись? Вроде как, должно отрабатывать раз в десять быстрее? При этом нагрузка на процессор практически не идет - складывается впечатление, что CryptSignHash внутри себя просто чего-то ждет и ничего не делает.

Более подробно: по разным причинам в проекте на C# нельзя использовать "КриптоПРО.NET", а подписывать XML-документы сертификатами ГОСТ-2001 и ГОСТ-2012 надо. Реализовали самостоятельно это подписание через вызовы advapi32.dll - все работает, но 95% времени на формирование подписи XML-документа уходит в вызове CryptSignHash - вот это и удивляет. Ведь SignedXml из "КриптоПРО.NET" ухитряется делать туже самую подпись в разы быстрее - как так это ему удается?

С уважением, Констатин Ткачук.
Offline idtks  
#2 Оставлено : 30 ноября 2017 г. 13:55:43(UTC)
idtks

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.07.2014(UTC)
Сообщений: 107
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 24 раз
Посылаю архив с примером исходного кода приложения на C#:

Test_CryptSignHash.zip (105kb) загружен 12 раз(а).

--- 100 раз вызывается "CryptSignHash" и выводится время в миллисекундах для каждого вызова. В командной строке надо указать отпечаток сертификата из "Личных" для текущего пользователя. Например:

Test_CryptSignHash.exe dbbd01db27d79dd9f8c87a180f806398eb91b81c

Вот типичный вывод программы:

== (0): 0
== (1): 0
== (2): 6
== (3): 7
== (4): 7
# (s3): 77
== (5): 84
= Sign hash: 84

--- "# (s3):" это время отработки этого фрагмента кода (файл "atlcrypt.cs"):

...
var sw = System.Diagnostics.Stopwatch.StartNew();
if ( !NativeMethods.CryptSignHash( m_hHash, dwKeySpec, null, dwFlags,
pbSignature, ref pdwSigLen ) )
{
System.Console.WriteLine("# (s0): {0}", sw.ElapsedMilliseconds);
if ( WinError.ERROR_MORE_DATA == Marshal.GetLastWin32Error() )
{
System.Array.Resize( ref pbSignature, (int)pdwSigLen );
if ( !NativeMethods.CryptSignHash( m_hHash, dwKeySpec, null, dwFlags,
pbSignature, ref pdwSigLen ) )
return AtlMethods.AtlHresultFromLastError();
System.Console.WriteLine("# (s2): {0}", sw.ElapsedMilliseconds);
}
else return AtlMethods.AtlHresultFromLastError();
}
System.Console.WriteLine("# (s3): {0}", sw.ElapsedMilliseconds);
...

Может я что-то не так делаю? Почему оно так долго работает? И нагрузки на процессор совсем нет.

С уважением, Константин Ткачук.
Offline idtks  
#3 Оставлено : 30 ноября 2017 г. 14:27:20(UTC)
idtks

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.07.2014(UTC)
Сообщений: 107
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 24 раз
Самое удивительное - если запускать эту утилиту параллельно, то скорость вызова CryptSignHash падает пропорционально количеству запущенных процессов! Пример во вложении:

Release.zip (7kb) загружен 3 раз(а).

"res.txt" - работает один процесс, а "res1.txt" - "res5.txt" - то же самое, но запущенное в пять параллельных процессов (см. "run.bat"). "# (s3)" - для одного процесса одно равно примерно 70 миллисекунд, а для пяти работающих параллельно уже чуть больше 350 миллисекунд. При этом нагрузки на процессор НЕТ!

Неужели у вас там в функции "CryptSignHash" стоит какой-то глобальный лок ограничивающий количество вызовов в секунду?!

С уважением, Константин Ткачук.
Offline Максим Коллегин  
#4 Оставлено : 30 ноября 2017 г. 16:11:43(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,408
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
А где находится контейнер?
Знания в базе знаний, поддержка в центре поддержки
Offline idtks  
#5 Оставлено : 30 ноября 2017 г. 16:20:11(UTC)
idtks

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.07.2014(UTC)
Сообщений: 107
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 24 раз
На флешке:

Проверка завершена успешно ошибок не обнаружено
Контейнер закрытого ключа пользователя
имя esvXXX
уникальное имя FAT12\3C14B711_TKS20120614\esvXXX.000\B44D
FQCN \\.\FAT12_F\esvXXX
проверка целостности контейнера успешно
Ключ обмена доступен
длина ключа 512 бит
экспорт открытого ключа успешно
вычисление открытого ключа успешно
импорт открытого ключа успешно
подпись успешно
проверка успешно
создание ключа обмена успешно
экспорт ключа разрешен
алгоритм ГОСТ Р 34.10-2001 DH
ГОСТ Р 34.10-2001, параметры обмена по умолчанию
ГОСТ Р 34.11-94, параметры по умолчанию
ГОСТ 28147-89, параметры по умолчанию
сертификат в контейнере соответствует закрытому ключу
сертификат в хранилище My
ОГРН=1047702026701, ИНН=007710474375, C=RU, S=77 г.Москва, L=Москва, O=Минкомсвязь России, CN=Единый сервис проверки ИС ГУЦ, STREET=125375 г. Москва ул. Тверская д.7
FAT12\3C14B711_TKS20120614\esvXXX.000\B44D; Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider#75; dwFlags: 0x00000020; dwKeySpec: AT_KEYEXCHANGE#1
имя сертификата Единый сервис проверки ИС ГУЦ
субъект ОГРН=1047702026701, ИНН=007710474375, C=RU, S=77 г.Москва, L=Москва, O=Минкомсвязь России, CN=Единый сервис проверки ИС ГУЦ, STREET=125375 г. Москва ул. Тверская д.7
поставщик ИНН=007710474375, ОГРН=1047702026701, E=dit@minsvyaz.ru, STREET=125375 г. Москва ул. Тверская д.7, O=Минкомсвязь России, L=Москва, S=77 г. Москва, C=RU, CN=УЦ 1 ИС ГУЦ
действителен с 12 декабря 2013 г. 15:55:00
действителен по 4 декабря 2017 г. 21:12:00
ключ действителен с 12 декабря 2013 г. 15:55:00
ключ действителен по 12 декабря 2017 г. 15:55:00
серийный номер 1F27 915C 0001 0000 0253
Срок действия закрытого ключа 12 декабря 2017 г. 15:55:00
Использование ключа обмена разрешено до окончания срока действия закрытого ключа.
Ключ подписи отсутствует
загрузка ключей успешно
Версия контейнера 2
Расширения контейнера
некритическое Расширение контейнера КриптоПро CSP. Промежуточные сертификаты
имя сертификата УЦ 1 ИС ГУЦ
субъект ИНН=007710474375, ОГРН=1047702026701, E=dit@minsvyaz.ru, STREET=125375 г. Москва ул. Тверская д.7, O=Минкомсвязь России, L=Москва, S=77 г. Москва, C=RU, CN=УЦ 1 ИС ГУЦ
поставщик E=dit@minsvyaz.ru, C=RU, S=77 г. Москва, L=Москва, STREET="125375 г. Москва, ул. Тверская, д. 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Головной удостоверяющий центр
действителен с 5 декабря 2013 г. 21:12:06
действителен по 4 декабря 2017 г. 21:12:06
серийный номер 00FF 72F4 C100 0000 0000 2B
некритическое Расширение контейнера КриптоПро CSP. Доверенные сертификаты обмена
имя сертификата Головной удостоверяющий центр
субъект E=dit@minsvyaz.ru, C=RU, S=77 г. Москва, L=Москва, STREET="125375 г. Москва, ул. Тверская, д. 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Головной удостоверяющий центр
поставщик E=dit@minsvyaz.ru, C=RU, S=77 г. Москва, L=Москва, STREET="125375 г. Москва, ул. Тверская, д. 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Головной удостоверяющий центр
действителен с 20 июля 2012 г. 15:31:14
действителен по 17 июля 2027 г. 15:31:14
серийный номер 3468 1E40 CB41 EF33 A9A0 B7C8 7692 9A29
Offline Максим Коллегин  
#6 Оставлено : 30 ноября 2017 г. 17:45:07(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,408
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Попробуйте использовать контейнер в реестре, а если инициализировать криптопровайдер _provider снаружи цикла - время исполнения значительно уменьшится.
Знания в базе знаний, поддержка в центре поддержки
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
idtks оставлено 30.11.2017(UTC)
Offline idtks  
#7 Оставлено : 30 ноября 2017 г. 18:43:25(UTC)
idtks

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.07.2014(UTC)
Сообщений: 107
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 24 раз
Да, действительно, если кешировать проинициализированный объект CCryptProv, то это существенно ускоряет вызовы CryptSignHash.

Спасибо.

С уважением, Констатин Ткачук.
Offline Максим Коллегин  
#8 Оставлено : 30 ноября 2017 г. 19:09:57(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,408
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Кэшировать контекст может и PCCERT_CONTEXT, но для этого в вызов CryptAcquireCertificatePrivateKey нужно передать CRYPT_ACQUIRE_CACHE_FLAG или в ссылку на ключ прописать CERT_SET_KEY_CONTEXT_PROP и использовать CRYPT_ACQUIRE_USE_PROV_INFO_FLAG
Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.