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

Уведомление

Icon
Error

5 Страницы«<2345>
Опции
К последнему сообщению К первому непрочитанному
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)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Автор: 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)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
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)
Сообщений: 13,340
Мужчина
Российская Федерация

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

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

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

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Техническую поддержку оказываем тут
Наша база знаний
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)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Вот что получилось для получения 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)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Какое время в итоге стало на расшифровку?
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
5 Страницы«<2345>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.