Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 675   Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 95 раз в 68 постах
|
Ладно, если уж очень хочется странного (получить DER, а не BER), то используйте в CMSG_STREAM_INFO результат работы функции CryptMsgCalculateEncodedLength и возможно наступит счастье. Хотя CryptDecryptMessage прекрасно работает и с BER на самом деле. |
С уважением, Юрий Строжевский |
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2013(UTC) Сообщений: 18
|
При указании размера возвращаемого CryptMsgCalculateEncodedLength счастья не наступило. CryptDecryptMessage смогла расшифровать файлик в BER размером 2кб, а вот на 5мб уже споткнулась с сообщением "Нехватка памяти для ASN1. (0x80093106)". В DER кодировке такие файлы проблемой не являются.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,421  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 734 раз в 632 постах
|
Наконец дошли руки разобраться с проблемой. 1. cbContent должен быть равен размеру зашифровываемых данных, иначе нарушается структура ASN1, ровно поэтому при маленьких размерах возникает ошибка отсутствия ключей - информация о сертификате не попадает в сообщение. Для нашего CSP было несколько ошибок реализации такого варианта использования - постараемся исправить. 2. Если cbContext равен -1, то все работает. 3. В исходном коде ошибка - не всегда вызывается с fFinal = true в последнем блоке. |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,421  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 734 раз в 632 постах
|
Ошибки в CSP исправлены только в CSP 4.0, в сборках с февраля 2014. Есть один нюанс. MS использует размер блока ключа (8 байт) в качестве размера блока шифруемых данных - скорость поточного шифрования по 8 байт будет весьма невысокой (несколько мегабайт в секунду) Но есть параметр dwKeyZeroBlockLen (HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters), указав размер ~несколько килобайт скорость на порядок вырастет, но при этом поточное шифрование в DER работать не сможет. |
|
 1 пользователь поблагодарил Максим Коллегин за этот пост.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.03.2015(UTC) Сообщений: 3
Сказал(а) «Спасибо»: 1 раз
|
Добрый день! Верно ли, что при расшифровании данных в потоковом режиме, всё зашифрованное сообщение от момента последнего вызова CryptMsgUpdate до первого вызова CryptMsgControl будет находиться в памяти приложения? Отредактировано пользователем 10 марта 2015 г. 18:56:06(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,421  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 734 раз в 632 постах
|
|
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.03.2015(UTC) Сообщений: 3
Сказал(а) «Спасибо»: 1 раз
|
В таком случае не очень ясна последовательность действий. Возьмём в качестве образца пример из КриптоПро .NET StreamVerify.cs. Последовательность действий следующая: 1. Открытие сообщения для декодирования и передача структуры CMSG_STREAM_INFO. 2. Чтение входного потока файла небольшими порциями и передача их в CryptMsgUpdate. 3. Чтение заголовков получившегося сообщения и получение информации о подписанте. 4. Вызов CryptMsgControl.
Разве на шаге 2 не весь файл целиком перемещается в память?
Для случая расшифрования на этапе 2 после каждого вызова CryptMsgUpdate можно проверять доступность параметра сообщения CMSG_ENVELOPE_ALGORITHM_PARAM. Если данной параметр ещё не доступен, то CryptMsgGetParam вернёт ошибку CRYPT_E_STREAM_MSG_NOT_READY. Как только этот параметр станет доступным, можно получать информацию о получателях сообщения и вызывать CryptMsgControl. Но как в этом случае передать оставшиеся данные для расшифрования? Если продолжить читать файл и вызывать последовательно CryptMsgUpdate и CryptMsgControl, то уже на второй итерации вызов CryptMsgControl возвращает ошибку CRYPT_E_ALREADY_DECRYPTED.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 150  Поблагодарили: 33 раз в 32 постах
|
CrypMsgControl достаточно вызвать один раз для начала процесса расшифрования. Затем данные добавляются вызовом CryptMsgUpdate и расшифровываются. |
|
 1 пользователь поблагодарил Георгий Садофьев за этот пост.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.03.2015(UTC) Сообщений: 3
Сказал(а) «Спасибо»: 1 раз
|
Спасибо! Ещё вопрос. Есть ли ограничение на размер буфера, передаваемого в функцию CryptMsgUpdate? При передаче буфера размером 10 MB (а именно 1024*1000*10 байтов) возникает ошибка E_OUTOFMEMORY. В данной статье ( ссылка) указывается значение 1024*1000*100 (примерно 97 MB): Цитата:It turns out that CryptMsgUpdate API has a limit on the size of the data that we can pass to it when decoding (when used along with CryptMsgOpenToDecode). This limit is 1024 * 1000 * 100 bytes (around 100MB), and it was set starting on Windows XP SP2 and Windows Server 2003 SP1. This applies to all versions of Windows after that, regardless of being x86 or x64. А также сообщение от MS: Ошибка при декодировании данных.Цитата ( ссылка): Цитата:There is a counter in the ASN structure that is increased every time an octet block is processed when the ASN sequence that wraps the octets is BER encoded. It adds the number of bytes that have already been processed plus the new block size; as the number of processed bytes grows that is added to the counter and the rate at which the counter grows increases. Since the counter is represented by an integer it can overflow. On Windows 7, the ASN code checks for overflow so the function fails. On pre-Windows 7 platforms, the overflow still occurs but it wasn't checked. That counter is not critical for operation and did not cause issues in the code for the previous versions of the OS.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,421  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 734 раз в 632 постах
|
Нужно определять экспериментально. |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close