Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
нельзя так ... использовать CryptMsgUpdate, она любит небольшие порции... |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov Автор: Андрей * p.s. но это не оптимальный вариант, нужно как в сообщении16 - проанализировать сначала, какие есть серийные, получить нужный сертификат\контейнер\ключ и его использовать в вызовах Не поможет. У меня тормозит CryptMsgUpdate. Я провел четкие измерения, выставил буфер в 100 МБ и загрузил файл 10 МБ — 6 секунда. Файл 37 МБ — 84 секунды. CryptMsgUpdate вызывался один раз и эти 84 секунды все ушли на этот вызов. То есть, не важно что делается после CryptMsgUpdate, тормозит именно CryptMsgUpdate. у меня в профиле - есть приложение... CryptMsgUpdate там во всех операциях, не передаю большие размеры (снижают скорость), по 1МБ - всё летает, можете попробовать расшифровать файл... ну или через КриптоАРМ - он ту же CryptMsgUpdate использует (и кажется раньше по 32 Кб ) |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
проверил на 230 Мб - 5 сек на обычном диске на SSD - 3 сек. размер буфера: 1024*1024; Snimok ehkrana ot 2020-08-12 17-28-47.png (35kb) загружен 13 раз(а). |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * проверил на 230 Мб - 5 сек на обычном диске на SSD - 3 сек. размер буфера: 1024*1024; Snimok ehkrana ot 2020-08-12 17-28-47.png (35kb) загружен 13 раз(а). Спасибо, что помогаете мне! Но не получается :) может у меня что-то не так с ОС? Я уже какие только порции не пробовал. Вот текущий кусочек кода, сделал ~1 МБ: Код:// Process message
dwRemaining = file.Length;
stream = new BinaryReader(file);
do
{
// Read one chunk of data
pbData = stream.ReadBytes(1024 * 1000 * 1);
if (pbData.Length == 0)
{
break;
}
// Update message piece by piece
bFinal = (dwRemaining <= 1024 * 1000 * 1);
fixed (byte* pAux = &pbData[0])
{
bResult = CryptMsgUpdate(
hMsg.DangerousGetHandle(),
new IntPtr(pAux),
pbData.Length,
bFinal
);
if (!bResult)
{
throw new Exception("CryptMsgUpdate error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
}
}
dwRemaining = dwRemaining - pbData.Length;
} while (!bFinal);
А вот результат работы на файле размером 37 МБ: Clip2net_200812165326.png (132kb) загружен 8 раз(а).Вот, что не так я делаю? Попробовал сделать точно 1024*1024, тоже самое. Пробовал запускать в режиме отладки и без нее. Все одинаково. Дофига времени :) и все время уходит именно на этот цикл в коде выше.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Вы невнимательно читали... 1. 1 МБ = 1024*1024 2. Изменения в коде ...
public unsafe static void ProcessMessage_NEW(SafeMsgHandle hMsg, FileStream file) { // Variables int BufSize = 1024 * 1024; BinaryReader stream = null; byte[] pbData = null; long dwRemaining = 0; bool bFinal = false; bool bResult = false;
// Process message dwRemaining = file.Length; stream = new BinaryReader(file); do { // Read one chunk of data pbData = stream.ReadBytes(BufSize); if (pbData.Length == 0) { break; } bFinal = (dwRemaining <= BufSize); fixed (byte* pAux = &pbData[0]) { bResult = CryptMsgUpdate( hMsg.DangerousGetHandle(), new IntPtr(pAux), pbData.Length, bFinal ); if (!bResult) { throw new Exception("CryptMsgUpdate error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error())); } Win32.CheckEnvelopeAlg(hMsg); Win32.Decrypt(hMsg);
}
dwRemaining = dwRemaining - pbData.Length;
} while (!bFinal); }
в Decrypt закомментировать (а лучше обработать по коду):
// Decrypt the message bResult = CryptMsgControl( hMsg, 0, CMSG_CTRL_DECRYPT, ref DecryptPara ); if (!bResult) { // throw new Exception("CryptMsgControl error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error())); }
но это всё равно, не оптимальное решение (обращаться к хранилищу при каждом Update) |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * Вы невнимательно читали...
Видимо я не до конца понимаю суть функций АПИ. Я не понимаю как можно вызывать Win32.Decrypt еще до того как загрузился весь файл. Для меня это нонсенс. Попробовал выполнить ваш код как он есть, получил ошибку: CryptMsgUpdate error #87 Параметр задан неверно На одной из итераций CryptMsgUpdate. Пока не понимаю что это значит, буду думать. Спасибо.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov Автор: Андрей * Вы невнимательно читали...
Видимо я не до конца понимаю суть функций АПИ. Я не понимаю как можно вызывать Win32.Decrypt еще до того как загрузился весь файл. Для меня это нонсенс. Куда он должен загрузиться-то? Это и есть поточная обработка - считывается блоками, вызывается расшифровка, из Decrypt - при успехе - вызывается Callback-функция - которая записывает расшифрованный участок в файл. В итоге - можно обрабатывать гигабайтные файлы, при этом контролируя буфер (1-10 МБ) |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov получил ошибку:
CryptMsgUpdate error #87 Параметр задан неверно
На одной из итераций CryptMsgUpdate. Да, код нужно править, дописывать условия, инициализировать необходимые указатели. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * Автор: esolomonov получил ошибку:
CryptMsgUpdate error #87 Параметр задан неверно
На одной из итераций CryptMsgUpdate. Да, код нужно править, дописывать условия, инициализировать необходимые указатели. Спасибо! Суть я понял. Я просто плохо разбираюсь в криптографии... Но делать надо. Буду думать!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: esolomonov Автор: Андрей * Автор: esolomonov получил ошибку:
CryptMsgUpdate error #87 Параметр задан неверно
На одной из итераций CryptMsgUpdate. Да, код нужно править, дописывать условия, инициализировать необходимые указатели. Спасибо! Суть я понял. Я просто плохо разбираюсь в криптографии... Но делать надо. Буду думать! Тоже на досуге попробую доисправлять. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close