Внедрение XOR в простой метод шифрования изображений - PullRequest
1 голос
/ 15 января 2010

Итак, с помощью вас, ребята, я закончил создание своего очень простого шифратора изображений. Этого достаточно, чтобы не пускать не технаря, верно? : P

Теперь к следующему шагу. Кто-то предложил мне использовать XOR. Я читал о XOR, и это в основном логическая таблица, которая определяет ответ между двумя битами, верно?

Только когда один истинен, утверждение верно.

0 0 = false 1 0 = верно 0 1 = верно 1 1 = ложь

Это правильно? Итак, как бы я занялся XOR-шифрованием изображения?

Вот мой предыдущий способ использования шифра Цезера.

private void EncryptFile()
    {            
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to encrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] + 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }

    private void DecryptFile()
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to decrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] - 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }

Ответы [ 3 ]

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

XOR - логическая операция между двумя битами. Преимущество состоит в том, что если вы запускаете XOR во второй раз, он отменяется в первый раз. Поэтому измените код на

ImageBytes[i] = (byte)(ImageBytes[i] ^ 5);
0 голосов
/ 15 января 2010

Papuccino1, как вы, наверное, поняли. , , использование XOR в любом смысле не является шифрованием. Это немного бессмысленный ответ, но он просто «скрывает» изображение - оно, конечно, не зашифровывает его. Но, кроме того, забавным побочным эффектом XOR, как упоминалось в предыдущем сообщении, является то, что он «обратим».

Поэтому

Vx XOR Vy => Vz where V is a byte array of some arbitrary length.

Допустим, что Vx - это ваше изображение, вы можете создать массив случайных чисел Vy длиной ровно Vx и использовать его для заполнения вашего механизма 'XOR' для получения Vz. Если вы затем откажетесь от Vx и сделаете Vy «закрытым» и известным только вам, теперь у вас будет «скрытый» образ. Затем вы можете использовать Vz XOR vy =>, чтобы получить исходное изображение. Это быстро, особенно если все это делается в памяти. Интересно, что если вы теперь логически замените 'Vn' на DISKn STRIPEs, то у вас есть RAID 5! Представьте, что выброшенный вами Vx - это один из трех дисков в наборе RAID5, и этот диск вышел из строя. Поскольку у него еще осталось два диска и механизм XOR, вы можете воссоздать недостающие данные на лету. При замене рабочего диска механизм XOR восстанавливает исходные данные. XOR классная штука. , , Это действительно не отвечает на его первый вопрос, уже поздно, и моя математика может быть выключена. , , извините за бродягу!

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

Извините, я не уточнил, как ответить на ваш первоначальный вопрос.

XOR - просто побитовый оператор. В C # для этой операции используется символ ^. По сути вам просто нужно заменить

 ImageBytes[i] = (byte)(ImageBytes[i] + 5);

по

 ImageBytes[i] = (byte) (ImageBytes[i] ^ (byte) 0xA9);  // or some other value

Точно такую ​​же строку (как и вторую строку) можно использовать для декодирования, для ((X XOR Y) XOR Y) = X, какими бы ни были X и Y.

Как указывалось в моем ответе на предыдущий вопрос, вместо того, чтобы использовать одно значение для добавления (или к XOR), вы должны использовать небольшой массив (циклически перебирая массив, снова и снова, возможно, с некоторыми «поворотами» (например, любой другой цикл в массиве, только нечетные элементы из массива). Таким образом, результирующий закодированный файл труднее «взломать». (в целом эти схемы шифрования остаются довольно простыми и просто держат в стороне тех, кто не технически ориентирован).

...