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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей *  
#21 Оставлено : 12 августа 2020 г. 16:12:45(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
нельзя так ... использовать CryptMsgUpdate, она любит небольшие порции...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#22 Оставлено : 12 августа 2020 г. 16:14:37(UTC)
Андрей *

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

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

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


Не поможет. У меня тормозит CryptMsgUpdate. Я провел четкие измерения, выставил буфер в 100 МБ и загрузил файл 10 МБ — 6 секунда. Файл 37 МБ — 84 секунды. CryptMsgUpdate вызывался один раз и эти 84 секунды все ушли на этот вызов. То есть, не важно что делается после CryptMsgUpdate, тормозит именно CryptMsgUpdate.


у меня в профиле - есть приложение...
CryptMsgUpdate там во всех операциях, не передаю большие размеры (снижают скорость), по 1МБ - всё летает, можете попробовать расшифровать файл... ну или через КриптоАРМ - он ту же CryptMsgUpdate использует (и кажется раньше по 32 Кб )
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#23 Оставлено : 12 августа 2020 г. 16:29:44(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
проверил на 230 Мб - 5 сек на обычном диске
на SSD - 3 сек.

размер буфера: 1024*1024;

Snimok ehkrana ot 2020-08-12 17-28-47.png (35kb) загружен 7 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#24 Оставлено : 12 августа 2020 г. 16:59:51(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
проверил на 230 Мб - 5 сек на обычном диске
на SSD - 3 сек.

размер буфера: 1024*1024;

Snimok ehkrana ot 2020-08-12 17-28-47.png (35kb) загружен 7 раз(а).


Спасибо, что помогаете мне! Но не получается :) может у меня что-то не так с ОС? Я уже какие только порции не пробовал. Вот текущий кусочек кода, сделал ~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) загружен 6 раз(а).

Вот, что не так я делаю? Попробовал сделать точно 1024*1024, тоже самое. Пробовал запускать в режиме отладки и без нее. Все одинаково. Дофига времени :) и все время уходит именно на этот цикл в коде выше.
Offline Андрей *  
#25 Оставлено : 12 августа 2020 г. 17:05:39(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Вы невнимательно читали...
1. 1 МБ = 1024*1024
2. Изменения в коде ...





в Decrypt закомментировать (а лучше обработать по коду):



но это всё равно, не оптимальное решение (обращаться к хранилищу при каждом Update)
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#26 Оставлено : 12 августа 2020 г. 17:22:44(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
Вы невнимательно читали...



Видимо я не до конца понимаю суть функций АПИ. Я не понимаю как можно вызывать Win32.Decrypt еще до того как загрузился весь файл. Для меня это нонсенс. Попробовал выполнить ваш код как он есть, получил ошибку:

CryptMsgUpdate error #87
Параметр задан неверно

На одной из итераций CryptMsgUpdate. Пока не понимаю что это значит, буду думать. Спасибо.
Offline Андрей *  
#27 Оставлено : 12 августа 2020 г. 17:39:45(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: esolomonov Перейти к цитате
Автор: Андрей * Перейти к цитате
Вы невнимательно читали...



Видимо я не до конца понимаю суть функций АПИ. Я не понимаю как можно вызывать Win32.Decrypt еще до того как загрузился весь файл. Для меня это нонсенс.


Куда он должен загрузиться-то?
Это и есть поточная обработка - считывается блоками, вызывается расшифровка, из Decrypt - при успехе - вызывается Callback-функция - которая записывает расшифрованный участок в файл. В итоге - можно обрабатывать гигабайтные файлы, при этом контролируя буфер (1-10 МБ)
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#28 Оставлено : 12 августа 2020 г. 17:41:15(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: esolomonov Перейти к цитате
получил ошибку:

CryptMsgUpdate error #87
Параметр задан неверно

На одной из итераций CryptMsgUpdate.


Да, код нужно править, дописывать условия, инициализировать необходимые указатели.


Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#29 Оставлено : 12 августа 2020 г. 17:50:43(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
Автор: esolomonov Перейти к цитате
получил ошибку:

CryptMsgUpdate error #87
Параметр задан неверно

На одной из итераций CryptMsgUpdate.


Да, код нужно править, дописывать условия, инициализировать необходимые указатели.




Спасибо! Суть я понял. Я просто плохо разбираюсь в криптографии... Но делать надо. Буду думать!
Offline Андрей *  
#30 Оставлено : 12 августа 2020 г. 17:57:17(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: esolomonov Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: esolomonov Перейти к цитате
получил ошибку:

CryptMsgUpdate error #87
Параметр задан неверно

На одной из итераций CryptMsgUpdate.


Да, код нужно править, дописывать условия, инициализировать необходимые указатели.




Спасибо! Суть я понял. Я просто плохо разбираюсь в криптографии... Но делать надо. Буду думать!



Тоже на досуге попробую доисправлять.
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#31 Оставлено : 12 августа 2020 г. 18:05:00(UTC)
esolomonov

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

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

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

Тоже на досуге попробую доисправлять.


Проект LargeCms был настроен на NET 3.5. Я менял его на 4.0 чтобы соответствовал версии NET моих библиотек, куда мне потом ее нужно будет встраивать. Так вот эту ошибку "Параметр задан неверно" я получал при версии NET 4.0. Вернул обратно 3.5 — и файл расшифровался без ошибок 37 МБ за 5 секунд. Но я не смогу использовать версию 3.5, мне надо чтобы работало на 4.0 ))) Вот теперь задачка...

Спасибо еще раз, я хотя бы стал что-то понимать :)
Offline Андрей *  
#32 Оставлено : 12 августа 2020 г. 18:14:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: esolomonov Перейти к цитате
Автор: Андрей * Перейти к цитате

Тоже на досуге попробую доисправлять.


Проект LargeCms был настроен на NET 3.5. Я менял его на 4.0 чтобы соответствовал версии NET моих библиотек, куда мне потом ее нужно будет встраивать. Так вот эту ошибку "Параметр задан неверно" я получал при версии NET 4.0. Вернул обратно 3.5 — и файл расшифровался без ошибок 37 МБ за 5 секунд. Но я не смогу использовать версию 3.5, мне надо чтобы работало на 4.0 ))) Вот теперь задачка...

Спасибо еще раз, я хотя бы стал что-то понимать :)


не в этом дело...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#33 Оставлено : 12 августа 2020 г. 18:22:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
1. Получить отдельно список серийных номеров сертификатов получателей
2. Найти в хранилище подходящий сертификат\контейнер (проверить наличие ссылки на ЗК) и инициализировать структуру для расшифровки (индекс получателя и т.п.) - DecryptPara
3. Перед вызовом Decrypt - проверять доступность CMSG_ENVELOPE_ALGORITHM_PARAM
4. переписать Win32.Decrypt(hMsg);

это сверил со своим кодом на другом ЯП.
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#34 Оставлено : 13 августа 2020 г. 13:49:07(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
1. Получить отдельно список серийных номеров сертификатов получателей
2. Найти в хранилище подходящий сертификат\контейнер (проверить наличие ссылки на ЗК) и инициализировать структуру для расшифровки (индекс получателя и т.п.) - DecryptPara
3. Перед вызовом Decrypt - проверять доступность CMSG_ENVELOPE_ALGORITHM_PARAM
4. переписать Win32.Decrypt(hMsg);

это сверил со своим кодом на другом ЯП.


Спасибо за совет.

Можно вопрос задать как к знающему? Вот я в цикле делаю порциями CryptMsgUpdate. Каждая порция добавляет часть сообщения. Я правильно понимаю, что если порции будут очень маленькими, то после первого CryptMsgUpdate в сообщении может не оказаться полного списка сертификатов получателей? Ну, например, получателей аж 100 штук. И мне надо проверить есть ли среди них нужный мне сертификат с нужным серийником. А я сделал только первую итерацию и первый CryptMsgUpdate. Ведь в этом случае может оказаться, что в списке получателей загрузилось только 20 штук из 100, так? А как мне тогда понять, что список получателей уже заполнен и я могу в нем копаться, чтобы искать нужную мне запись?

Вот я делаю GetMessageParam(hMsg, CMSG_RECIPIENT_COUNT_PARAM, out cCertInfo); получаю количество. Потом в цикле иду по ним:

GetMessageParam(hMsg, CMSG_RECIPIENT_INFO_PARAM, i, out pCertInfoTry);

Проверяю if (!pCertInfoTry.IsInvalid). Проверка сертификата на валидность это единственный способ понять что он загрузился в сообщение или нет? Что будет если сертификат еще не загрузился?

Я не могу понять этого момента из-за потоковой технологии.
Offline Андрей *  
#35 Оставлено : 13 августа 2020 г. 14:11:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Список получателей - сделать в отдельную функцию (со своими вызовами CryptMsg*) и буфер - например 1 Мб (влезут 100 серийных сертификатов), найти - какой сертификат есть для расшифровки и вернуть нужное для DecryptPara
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#36 Оставлено : 13 августа 2020 г. 15:56:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#37 Оставлено : 13 августа 2020 г. 16:44:15(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=72771#post72771


Спасибо за помощь!
Offline Андрей *  
#38 Оставлено : 13 августа 2020 г. 18:22:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Вот что получилось для получения DecryptPara:

GetCertToDecrypt(string EncryptedFile, out SafeCSPHandle hProv, out Win32.CRYPT_KEY_PROV_INFO KeyProvInfo, out Win32.CMSG_CTRL_DECRYPT_PARA DecryptPara)




GetCertToDecrypt - вызвать внутри,
получить\показать информацию (в логе - какой CSP\Контейнер..)
и вместо вызова Win32.Decrypt(hMsg) (в исходном коде largecms):





Техническую поддержку оказываем тут
Наша база знаний
Offline esolomonov  
#39 Оставлено : 14 августа 2020 г. 11:56:43(UTC)
esolomonov

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

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

Автор: Андрей * Перейти к цитате
Вот что получилось для получения DecryptPara:
...


Спасибо! Примерно так же получилось и у меня.

Хотел только написать одну мудрость, вдруг кто-то столкнется. Когда я запустил свою процедуру расшифровки не из приложения, а из Windows-сервиса, запущенного под системным аккаунтом, то функция CryptAcquireContext стала возвращать ошибку, что, дескать, не может найти keyset.

#-2146893802: Keyset does not exist

Помогло добавление флага CRYPT_MACHINE_KEYSET в dwFlags. Сам сертификат я загружаю из реестра Local Machine/My. Для него и этот флаг.

Код:
internal const int CRYPT_MACHINE_KEYSET = 32;

// Get CSP for that key
bResult = CryptAcquireContext(
	out hProv,
	keyProvInfo.pwszContainerName,
	keyProvInfo.pwszProvName,
	keyProvInfo.dwProvType,
	CRYPT_MACHINE_KEYSET
);

Offline Андрей *  
#40 Оставлено : 14 августа 2020 г. 12:20:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Какое время в итоге стало на расшифровку?
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.