2015-03-13 3 views
0

Я написал код, это просто эксперимент. У меня была идея (возможно, раньше была сделана), чтобы создать случайное изображение и установить значения пикселей rgb в случайных местоположениях на номер символа ascii, чтобы скрыть сообщения на изображении. Это почти работает, но по какой-то причине я получаю странные возвращения на дешифрования, такие как «TIIS это я secter текст» вместо «это мой секрет, текст» Ну вот код:скрытие сообщения в цветных пикселях rgb

public Form1() 
    { 
     InitializeComponent(); 
    } 

    //storing pixel locations 
    public static List<int> pixel_list = new List<int>(); 

    public static Bitmap bitmap = new Bitmap(144, 119); 
    private void Form1_Load(object sender, EventArgs e) 
    { 

     bitmap = GenerateNoise(144, 119); 

     bitmap = encrypt("this is my secret text",bitmap); 

     pictureBox1.Image = bitmap; 
    } 

    public static void decrypt(Bitmap img) 
    { 
     string str=""; 
     foreach (int pix in pixel_list) 
     { 
      //get the pixel from the list of pixel locations 
      Color color = img.GetPixel(pix, pix); 
      //convert the pixels rgb value in to a char and append it to str 
      str += Convert.ToChar(color.R).ToString(); 

     } 
     //we have the original message 
     MessageBox.Show(str); 
    } 

    public Bitmap encrypt(string message, Bitmap img) 
    { 
     Random rnd = new Random(); 
     byte[] ASCIIValues = Encoding.ASCII.GetBytes(message); 
     foreach (byte b in ASCIIValues) 
     { 
      //select a random pixel 
      int pixelXY = rnd.Next(1, 119); 
      //add it to the list 
      pixel_list.Add(pixelXY); 
      //chnage that pixels rgb value to the ascii code (b) 
      img.SetPixel(pixelXY, pixelXY, Color.FromArgb(b, b, b)); 
     } 

     return img; 
    } 

    public Bitmap GenerateNoise(int width, int height) 
    { 
     Bitmap finalBmp = new Bitmap(width, height); 
     Random r = new Random(); 

     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       int num = r.Next(0, 256); 
       finalBmp.SetPixel(x, y, Color.FromArgb(10, num, num, num)); 
      } 
     } 

     return finalBmp; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     decrypt(bitmap); 
    } 
+2

Что делать, если 'rnd.Next (1, 119);' в методе 'encrypt' возвращает значение индекса, которое было уже использован? Затем он перепишет уже использованный пиксель с новым значением данных. Вы должны гарантировать уникальность каждого пиксельного индекса. –

+0

Да, я подумал об этом, но потом проигнорировал это как «возможно, не из-за причины», я сейчас проверю. – user2864613

+0

Я думаю, вы должны использовать 2 целых пикселя X и pixelY вместо pixelXY для пиксельных координат и проверить записи предыдущего пикселя, прежде чем добавлять новые один в случае дублирования – Emre

ответ

1

Я думаю, когда ты расшифровываются, вы используете Unicode вместо ASCII. Вы должны расшифровать обратный путь к тому, как вы шифруете. Прежде всего, сохраните все свои байты в байтовом массиве, а затем преобразуйте массив в строку, используя string str = System.Text.Encoding.ASCII.GetString(yourByteArray)

+0

Да, это важный момент (так +1), но это не вызовет проблем, таких как «tiis is me secter text» вместо «tiis is me secter text», это мой секретный текст ", потому что такие байты (после (Char)) представляют значения, которые являются действительными ASCII и UTF-16. Проблема заключается в начальном значении «Random». Он должен храниться в некоторых предопределенных пикселях при шифровании, а затем использоваться для повторного обновления RNG при расшифровке - http://stackoverflow.com/questions/1785744/how-do-i-seed-a-random-class-to-avoid- получение дубликатов-случайные значения. –

+0

@ Юджин, я не понимаю, что вы имеете в виду. OP сохраняет случайные значения, например. 5, 97, 66 и т. Д. В списке , и для расшифровки они проходят через этот же список, например. получить цвет от пикселя (5,5), затем от пикселя (97,97) и т. д., так зачем повторять семантику Random? – IglooGreg

+0

О, да, извините за эту глупость. Сохранение семян и их пересадка не помогут само по себе, ценности должны быть уникальными в любом случае - я просто думал об этом как о способе сохранения последовательности индексов в самом изображении, но в спешке неправильно написал его как способ решить проблема. [Неповторимый генератор случайных чисел] (http://stackoverflow.com/questions/1011198/non-repetitive-random-number) - это ответ, как использование простого «Distinct» над первоначально сгенерированной последовательностью индексов. –

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