Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :( CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть... |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * Автор: esolomonov А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :( CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть... Я нашел примеры только на Си, не представляю как их адаптировать к C#. В примерах даже нет структур Windows, которые нужны для этого. У вас нет рабочего примера?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov Автор: Андрей * Автор: esolomonov А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :( CryptMsgUpdate + еще несколько функций CryptMsg* - это как раз и есть... Я нашел примеры только на Си, не представляю как их адаптировать к C#. В примерах даже нет структур Windows, которые нужны для этого. У вас нет рабочего примера? у Вас же все под рукой, в том примере largecms - описаны все функции (Win32.cs) |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей *
у Вас же все под рукой, в том примере largecms - описаны все функции (Win32.cs)
Спасибо! Я про largecms успел забыть, увлекся примерами из SDK. Кажется в largecms все есть. Остался вопрос только со скоростью работы, при такой скорости внедрить в продакшн все равно не получится :(
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
попробовал через largecms - 13с на 10 мб файле + нагружает ЦП посмотрел вызовы...
Вам понятно, что делает ProcessMessage?
почему потом вызывается CheckEnvelopeAlg? и... в финале Decrypt? |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
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 и получить информацию о получателях => найти по серийному номеру нужный у себя сертификат) |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 МБ (это как в оригинале).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
исправляйте... Я по коду из 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 Мб |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
p.s. но это не оптимальный вариант, нужно как в сообщении16 - проанализировать сначала, какие есть серийные, получить нужный сертификат\контейнер\ключ и его использовать в вызовах |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * p.s. но это не оптимальный вариант, нужно как в сообщении16 - проанализировать сначала, какие есть серийные, получить нужный сертификат\контейнер\ключ и его использовать в вызовах Не поможет. У меня тормозит CryptMsgUpdate. Я провел четкие измерения, выставил буфер в 100 МБ и загрузил файл 10 МБ — 6 секунда. Файл 37 МБ — 84 секунды. CryptMsgUpdate вызывался один раз и эти 84 секунды все ушли на этот вызов. То есть, не важно что делается после CryptMsgUpdate, тормозит именно CryptMsgUpdate.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close