Посоветуйте пожалуйста производительность в C # File Encryption - PullRequest
0 голосов
/ 08 июля 2010

Я создал тестовую (не настоящую) функцию шифрования, которая принимает байт [] и заменяет все байты на 0xff и возвращает

private byte[] encrypt(byte[] input)
        {


            for (int i = 0; i < input.Length; i++)
            {
                input[i] = 0xff;
            }

            return input;



        }

Теперь я хочу попробовать эту тестовую процедуру шифрования для файла,Но я хочу иметь возможность читать и записывать в тот же файл.

Это то, что я сделал до сих пор

using (FileStream myfileStream = new FileStream(openFile, FileMode.Open,FileAccess.ReadWrite))

    {   

    byte[] buffer = new byte[16]; 



        while (myfileStream.Position < myfileStream.Length)
        {

          myfileStream.Read(buffer, 0, 16);

          buffer = encrypt(buffer);

          myfileStream.Position -= 16;

          myfileStream.Write(buffer, 0, 16);

         }

         myfileStream.Close();            

    }

Это прекрасно работает, но я знаю, что я не делаю это правильно.Кажется, это ОЧЕНЬ серьезные проблемы с производительностью, когда для файла размером 1 МБ потребовалось 24 секунды.(Проверено с помощью StopWatch в эмуляторе WinMo 6 Pro).

Что я здесь не так делаю?Что я могу сделать, чтобы повысить производительность при одновременном чтении и записи в один и тот же файл?Пожалуйста, порекомендуйте.Большое спасибо заранее:)


ОБНОВЛЕНИЕ:

Я сократил время, которое это заняло значительно (с 24 секунд до 6 секунд), используяОбъекты FileStream, указывающие на один и тот же файл со свойством FileShare.ReadWrite.

Безопасно ли это делать?Это нормально?

ОБНОВЛЕНИЕ СНОВА

Хотя я использовал алгоритм поддельного шифрования, я надеюсь использовать AES с CBC + CTS.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Несколько вещей сразу приходят на ум:

  1. Используйте больший буфер - почему только 16 байтов?
  2. Не записывайте в один и тот же файл - вы можете удалить / переименовать после шифрования.

Обновление

Даже с EAS и 16-байтовым ограничением вы можете выполнять шифрование в памяти (для больших файлов используйте большой буфер вместо шифрования всего файла в памяти).

Вам не следует использовать две такие файловые команды - вы можете закончить тем, что напишете те части файла, которые будете читать позже.

Что касается буферов - вы можете читать большие куски с диска, затем обрабатывать 16 байтов за раз в памяти перед записью больших кусков зашифрованных данных.

2 голосов
/ 08 июля 2010

Не проверяйте длину файла в блоке while (т.е. myfileStream.Length), так как это приводит к системному вызову для проверки длины файла на каждой итерации. Вместо этого поместите длину файла в переменную перед циклом while и используйте вместо нее переменную.

Хотя больший буфер поможет, помните, что о некоторой буферизации уже позаботятся:

  1. Сам класс потока.
  2. Кэш диска операционной системы.
  3. Буфер накопителя.

Повторное считывание длины файла в блоке while, вероятно, является основной проблемой.

...