Добавление числового значения в байт? - PullRequest
0 голосов
/ 15 января 2010
public void EncryptFile()
    {            
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|All files (*.*)|*.*";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to encrypt.";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            byte[] ImageBytes = File.ReadAllBytes(dialog.FileName);

            foreach (byte X in ImageBytes)
            {
                //How can I take byte "X" and add a numerical value to it?
            }
        }             
    }

Итак, я пытаюсь зашифровать файл изображения, просто преобразовав его в массив byte [], а затем добавив числовое значение к каждому байту.

Как добавить числовое значение в байт?

Ответы [ 4 ]

2 голосов
/ 15 января 2010

Вы просто добавляете это. Проблема в том, что вы не можете изменить значение в цикле foreach. Вы действительно хотите цикл for:

for(int k = 0; k < ImagesBytes.Length; k++){
   ImageBytes[k] = (byte) (ImageBytes[k] + 5); // needs a cast
}
0 голосов
/ 15 января 2010

Вопрос: Почему бы просто не использовать один из встроенных криптопотоков в .NET?

Если вы не хотите этого делать, предполагая, что вы захотите каким-то образом использовать изображение после того, как вы его затените, я бы посмотрел на создание пользовательского потока и просто изменил байты. вход.

Здесь есть отличный сквозной обзор Пользовательские потоки преобразования (и поворотный поток был бы лучшим более быстрым способом решения вашей проблемы затенения файла изображения). Это также избавляет от проблем переполнения при добавлении в байт.

0 голосов
/ 15 января 2010

Вам необходимо использовать по модулю (в частности, по модулю 256), чтобы операция была обратимой. В качестве альтернативы вы можете использовать побитовую операцию, XOR является распространенным выбором.

Операция по модулю 256 проста для реализации для байтов, вам просто нужно привести результат, как в:

ImageBytes[k] = (unsigned byte) ((unsigned byte) ImageBytes[k] + x)

Остерегайтесь, однако, что такое "шифрование" довольно слабое. Способ повышения надежности такого шифрования состоит в добавлении отдельного значения для каждого байта, например, путем добавления добавленного значения в кольцевой буфер (т.е. с последовательностью, которая в конечном итоге повторяется). Лучше всего использовать значения, легко декодируемые как часть операндов.

0 голосов
/ 15 января 2010

byte - это тип значения, что означает, что он всегда копируется при возвращении. Следовательно, вы можете только добавить значение к локальному байтовому значению внутри вашего foreach, почти так же, как изменение значения аргумента byte внутри функции не изменит значения вне функции (если, конечно, вы не использовал ключевое слово ref).

Вы не можете использовать foreach для этой задачи. Используйте обычный цикл for:

for(int i = 0; i < ImageBytes.Length; i++)
    ImageBytes[i] += MyNumericValue;
...