2010-01-15 7 views
1

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

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

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

0 0 = ложь 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); 
     }    
    } 
+0

BTW, я просто добавляю числовое значение к каждому байту в массиве byte []. Я не уверен, как XOR впишется в это. Я даже не уверен, что это путь. xD –

+0

@ Papuccino1: почему бы не использовать один из встроенных методов шифрования? Катиться самостоятельно - это не очень хорошая идея. –

+1

Это если вы хотите изучить внутреннюю работу и любопытны. : 3 –

ответ

3

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

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

Кстати, как уже было сказано, это не шифрование - это демонстрация того, что вы не понимаете шифрование и приглашение просматривать ваши незащищенные данные. –

0

Прошу прощения, я не прояснил это, отвечая на ваш первоначальный вопрос.

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), вы должны использовать небольшой массив (циклически перемещаясь по массиву, снова и снова, возможно, с некоторыми «завихрениями» ", например, каждый другой цикл в массиве, используйте только нечетные элементы из массива). Таким образом, результирующий кодированный файл сложнее «взломать». (в целом эти схемы шифрования остаются довольно простыми и просто удерживают нетехнически ориентированных людей в страхе).

+0

Благодарим вас за подробный ответ. Я попробую закончить мой маленький зашифрованный с помощью XOR, а затем соответственно поднять цепь продуктов питания. Я просто пытаюсь учиться, и я обязан совершать ошибки новичков. : D –

0

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 STRIPE, то у вас есть RAID 5! Представьте, что Vx, который вы выбрали, - это 1 из 3 дисков в наборе RAID5, и этот диск портился. Поскольку у него все еще осталось два диска, и движок XOR, вы можете повторно создавать отсутствующие данные «на лету». Когда рабочий диск заменяется, двигатель XOR восстанавливает исходные данные. XOR - классный материал. , ,Это действительно не отвечает на его первый вопрос, его поздняя и моя математика может быть отключена. , , извините за прогулку!

 Смежные вопросы

  • Нет связанных вопросов^_^