Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Добрый день! До настоящего момента мы расшифровывали небольшие файлы, но теперь потребовалась обработка файлов размером около 200 МБ. Столкнулся с тем, что чтение контейнера CMS дает ошибку: ASN1 value too largeПроисходит это в этом месте кода: Код:public static byte[] Decrypt(byte[] encodedCms, X509Certificate2 certificate)
{
EnvelopedCms envelopedCms = new EnvelopedCms();
envelopedCms.Decode(encodedCms);
...
}
Кто может поделиться опытом чтения больших файлов в формате контейнера CMS? Сам я смог найти только вот эту библиотеку, которую разработал один добрый человек для чтения больших CMS: https://archive.codeplex.com/?p=largecmsНо увы, у меня чтение 200 МБ CMS в этой библиотеке происходит так медленно, что пользоваться ею возможности нет. Процесс надолго останавливается в цикле чтения файла через функцию Win32 CryptMsgUpdate, которая читает файл порциями. Пробовал менять размер порций, но это никак не ускоряет процесс. Может быть у кого-то есть опыт чтения и дешифрации больших файлов на C#? Я просто еще даже не дошел до расшифровки, может быть там тоже все зависнет, я не знаю. В Крипто Про Арме же процесс шифрования/дешифрования этого файла (200 МБ) происходит минут за 6-7, что вполне приемлемо. Заранее всем спасибо.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: esolomonov В Крипто Про Арме же процесс шифрования/дешифрования этого файла (200 МБ) происходит минут за 6-7, что вполне приемлемо. Это опечатка...? |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Может проблема с диском?
Использую CryptMsgUpdate (на c# не проверял): шифрование 150 Мб - 5 сек расшифровка - так же
на медленном диске: Размер файла: 230 Мб - 9 сек. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * Автор: esolomonov В Крипто Про Арме же процесс шифрования/дешифрования этого файла (200 МБ) происходит минут за 6-7, что вполне приемлемо. Это опечатка...? Что-то я преувеличил, на расшифровку этого файла (200 МБ в base64) ушло 23 секунды.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * Может проблема с диском?
Использую CryptMsgUpdate (на c# не проверял): шифрование 150 Мб - 5 сек расшифровка - так же
на медленном диске: Размер файла: 230 Мб - 9 сек. Удивительно... Вот часть кода библиотеки, на которую я ссылался, вот тут все зависает надолго. Причем в отладке видно, что все работает, просто очень медленно: Код:public unsafe static void ProcessMessage(SafeMsgHandle hMsg, FileStream file)
{
// Variables
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(1024 * 1000 * 10);
if (pbData.Length == 0)
{
break;
}
// Update message piece by piece
bFinal = (dwRemaining <= 1024 * 1000 * 10);
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);
}
Я здесь в 10 раз уменьшил размер порции, потому что при изначальном размере я просто не мог дождаться даже одного вызова CryptMsgUpdate. Дело точно не в диске, потому что с диска я файл байтами читаю моментально, за секунду. К этому моменту он уже прочтен. Вот же беда...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
А если исправить на 1024 * 1024? у меня по 1 Мб в тесте. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * А если исправить на 1024 * 1024? у меня по 1 Мб в тесте. Я почему-то как всегда забыл начать с примеров в SDK. Впрочем, там тоже самое. Но теперь просто я напишу более предметно. Итак, моя задача расшифровать большой файл, потом проверить подпись и снять ее. Есть пример в SDK: StreamVerify.cs. К сожалению, он не расшифровывает файл, а проверяет подпись. Но в начале в этом примере файл формата CMS читается, а мне это как раз и нужно. Как потом расшифровывать — это второй вопрос. Для начала хочется хотя бы прочесть файл. Файл у меня размером 200 МБ (бинарный). Я запускаю пример в оригинальном виде, там буфер чтения равен как раз 1 МБ (1024*1024). Так вот, 8% файла у меня читается 2 минуты. Это очень медленно! Вопрос: почему? Кусок кода — цикл чтения из SDK: Код:while (dwRemaining > 0)
{
inFile.Read(pbData, 0, dwSize);
// Вызываем обработку блока
bResult = CMSWin32.CryptMsgUpdate( hMsg, pbPtr,
dwSize, (dwRemaining <= dwSize) ? true : false );
if (!bResult)
{
throw new CryptographicException(
"CryptMsgUpdate error #" +
Marshal.GetLastWin32Error().ToString(),
new Win32Exception(Marshal.GetLastWin32Error()));
}
// Переходим к следующему блоку
dwRemaining -= dwSize;
if (dwRemaining < dwSize)
{
dwSize = (int)dwRemaining;
}
if (progress != null)
progress(dwFileSize, dwRemaining);
}
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
а этот файл, 200МБ - он из другой ИС?
Предлагаю зашифровать для теста файл (через КриптоАРМ, другое приложение) и расшифровать в C#. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей * а этот файл, 200МБ - он из другой ИС?
Предлагаю зашифровать для теста файл (через КриптоАРМ, другое приложение) и расшифровать в C#. Файл 200 Мб я сам зашифровал в Крипто Арме.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.08.2020(UTC) Сообщений: 22 Откуда: Москва
|
А может кто подскажет где найти примеры потоковой расшифровки? В SDK нет :(
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close