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

Уведомление

Icon
Error

5 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей *  
#11 Оставлено : 12 августа 2020 г. 14:52:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: esolomonov Перейти к цитате
А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :(


CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть...
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#12 Оставлено : 12 августа 2020 г. 15:04:13(UTC)
esolomonov

Статус: Участник

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

Автор: Андрей * Перейти к цитате
Автор: esolomonov Перейти к цитате
А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :(


CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть...


Я нашел примеры только на Си, не представляю как их адаптировать к C#. В примерах даже нет структур Windows, которые нужны для этого. У вас нет рабочего примера?
Offline Андрей *  
#13 Оставлено : 12 августа 2020 г. 15:13:01(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: esolomonov Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: esolomonov Перейти к цитате
А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :(


CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть...


Я нашел примеры только на Си, не представляю как их адаптировать к C#. В примерах даже нет структур Windows, которые нужны для этого. У вас нет рабочего примера?


у Вас же все под рукой, в том примере largecms - описаны все функции (Win32.cs)
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#14 Оставлено : 12 августа 2020 г. 15:27:27(UTC)
esolomonov

Статус: Участник

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

Автор: Андрей * Перейти к цитате


у Вас же все под рукой, в том примере largecms - описаны все функции (Win32.cs)


Спасибо! Я про largecms успел забыть, увлекся примерами из SDK. Кажется в largecms все есть. Остался вопрос только со скоростью работы, при такой скорости внедрить в продакшн все равно не получится :(
Offline Андрей *  
#15 Оставлено : 12 августа 2020 г. 15:33:00(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
попробовал через largecms - 13с на 10 мб файле + нагружает ЦП
посмотрел вызовы...

Вам понятно, что делает ProcessMessage?

почему потом вызывается CheckEnvelopeAlg?
и... в финале Decrypt?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#16 Оставлено : 12 августа 2020 г. 15:42:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
CryptMsgOpenToDecode

выделение памяти под буффер

цикл чтения файла
{
читаем в Buffer

CryptMsgUpdate( ..., isFinal) + проверка что это не финальный блок

CryptMsgGetParam(hMsg, CMSG_ENVELOPE_ALGORITHM_PARAM, 0, nil, szAlgInfo)
GetMem(AlgInfo, szAlgInfo);
CryptMsgGetParam(hMsg, CMSG_ENVELOPE_ALGORITHM_PARAM, 0, AlgInfo, szAlgInfo)
ENVELOPE_ALGORITHM = AlgInfo.pszObjId;

CryptMsgGetParam(hMsg, CMSG_TYPE_PARAM, ..
if iType <> CMSG_ENVELOPED then - какой-то мусор, не CMS Enveloped

CryptMsgControl(hMsg, 0, CMSG_CTRL_DECRYPT, @DecryptParameters)




}


DecryptParameters - содержит информацию о сертификате, для расшифровки,
получаю отдельно (достаточно считать отдельно файл до первого вызова Update и получить информацию о получателях => найти по серийному номеру нужный у себя сертификат)
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#17 Оставлено : 12 августа 2020 г. 15:53:19(UTC)
esolomonov

Статус: Участник

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

Автор: Андрей * Перейти к цитате
попробовал через largecms - 13с на 10 мб файле + нагружает ЦП
посмотрел вызовы...

Вам понятно, что делает ProcessMessage?

почему потом вызывается CheckEnvelopeAlg?
и... в финале Decrypt?


Спасибо за эксперимент! В общем, я подготовил зашифрованный файл 10 МБ и проверил. Все четко как у вас, секунд 10 не больше и все работает. Но когда я готовлю файл размером 160 МБ (200 это было в BASE64, в байтах 160 МБ), то все виснет в функции ProcessMessage в цикле do. То есть, CryptMsgUpdate работает, но очень медленно. Да, я понимаю что делает ProcessMessage, эта функция порциями грузит в структуры Windows контейнер CMS. По какой-то причине у меня нелинейная зависимость времени загрузки файлов. 10 МБ грузится 10 секунд, хочется ожидать, что 160 МБ будет грузиться 160 секунд. Но увы, там время стремится к получасу примерно. И почему-то не важно какими порциями я веду обработку, что по 1 МБ, что по 10 МБ, что по 100 МБ (это как в оригинале).
Offline Андрей *  
#18 Оставлено : 12 августа 2020 г. 16:02:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
исправляйте...

Я по коду из largecms

сделал DecodeAndDecrypt_NEW
в ней:
Код:

   m_hMsg = Win32.OpenMessageToDecode(StreamInfo); 
            Win32.ProcessMessage_NEW(m_hMsg, encodedFile);

и всё

в ProcessMessage_NEW:

после успешного вызова CryptMsgUpdate добавил
Код:

                    Win32.CheckEnvelopeAlg(hMsg); 
                    Win32.Decrypt(hMsg);


в Decrypt
нужно проанализировать код ошибки (сообщение уже расшифровано (т.е. текущий блок)
или закомментировать:
// throw new Exception("CryptMsgControl error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));

итог: 1.5с на 10 Мб
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#19 Оставлено : 12 августа 2020 г. 16:04:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
p.s. но это не оптимальный вариант, нужно как в сообщении16 - проанализировать сначала, какие есть серийные, получить нужный сертификат\контейнер\ключ и его использовать в вызовах
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#20 Оставлено : 12 августа 2020 г. 16:10:40(UTC)
esolomonov

Статус: Участник

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

Автор: Андрей * Перейти к цитате
p.s. но это не оптимальный вариант, нужно как в сообщении16 - проанализировать сначала, какие есть серийные, получить нужный сертификат\контейнер\ключ и его использовать в вызовах


Не поможет. У меня тормозит CryptMsgUpdate. Я провел четкие измерения, выставил буфер в 100 МБ и загрузил файл 10 МБ — 6 секунда. Файл 37 МБ — 84 секунды. CryptMsgUpdate вызывался один раз и эти 84 секунды все ушли на этот вызов. То есть, не важно что делается после CryptMsgUpdate, тормозит именно CryptMsgUpdate.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
5 Страницы<1234>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.