one4zero
@one4zero

Почему декодируется неправильно?

При расшифровке программа выдает неправильный текст
Есть программа для шифрования текста в изображении
607328ea7c1d6184772295.png

при дешифровке выдает неправильный текст
607328fe0769c821787152.png

Подскажите пожалуйста из-за чего это может быть?
P.S. код не мой
Сам проект архив

кнопка открытия файла
private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
            openDialog.InitialDirectory = @"C:\";
 
            if (openDialog.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openDialog.FileName.ToString();
                pictureBox1.ImageLocation = textBox1.Text;
            }
        }


кнопка шифрования
private void button3_Click(object sender, EventArgs e)
        {
            Bitmap img = new Bitmap(textBox1.Text);
 
            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    Color pixel = img.GetPixel(i, j);
 
                    if (i < 1 && j < textBox2.TextLength)
                    {
                        Console.WriteLine("R = [" + i + "][" + j + "] = " + pixel.R);
                        Console.WriteLine("G = [" + i + "][" + j + "] = " + pixel.G);
                        Console.WriteLine("G = [" + i + "][" + j + "] = " + pixel.B);
 
                        char letter = Convert.ToChar(textBox2.Text.Substring(j, 1));
                        int value = Convert.ToInt32(letter);
                        Console.WriteLine("letter : " + letter + " value : " + value);
 
                        img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, value));
                    }
 
                    if (i == img.Width - 1 && j == img.Height - 1)
                    {
                        img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, textBox2.TextLength));
                    }
 
                }
            }
 
            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
            saveFile.InitialDirectory = @"C:\";
 
            if (saveFile.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = saveFile.FileName.ToString();
                pictureBox1.ImageLocation = textBox1.Text;
 
                img.Save(textBox1.Text);
            }
        }


кнопка дешифровки
private void button2_Click(object sender, EventArgs e)
        {
            Bitmap img = new Bitmap(textBox1.Text);
            string message = "";
 
            Color lastpixel = img.GetPixel(img.Width - 1, img.Height - 1);
            int msgLength = lastpixel.B;
 
            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    Color pixel = img.GetPixel(i, j);
 
                    if (i < 1 && j < msgLength)
                    {
                        int value = pixel.B;
                        char c = Convert.ToChar(value);
                        string letter = System.Text.Encoding.ASCII.GetString(new byte[] { Convert.ToByte(c) });
 
                        message = message + letter;
                    }
                }
            }
 
            textBox2.Text = message;
        }
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
twobomb
@twobomb
Странная хрень, почему для шифрования используется только байт голубого цвета, зачем при шифровании выбирать изображение если оно должно создаваться, да и еще длинна массива записываемая в голубой цвет последнего пикселя ограничена 255 символами. Крч всё переписал.
Теперь длинна массива записывается в первые 2 пикселя, точнее rgb первого и r второго. Крч записывается весь int (4 байта) и она ограничена 2147483647 байтами, а не 255 как раньше.
Ну и изображение соответсвенно теперь генерируется, размер изображения сам подбирается.
Код
private void button3_Click(object sender, EventArgs e) {//Шифруем текст в файл
            string textDecode = textBox2.Text;
            byte[] bytes = Encoding.UTF8.GetBytes(textDecode);

            int wh = (int) Math.Ceiling(Math.Sqrt(Math.Ceiling((double) ((bytes.Length + 4)/3))));//Определяем размер изображения для шифрования, + 4 (4 байта для резервируем в начале для записи размера массива bytes),  делим на три потому что RGB, тоесть в 1 пиксель может 3 байта всунуть
            Bitmap img = new Bitmap(wh,wh);

            byte[] length = BitConverter.GetBytes(bytes.Length);
            
            //пишем длинну массива
            img.SetPixel(0,0,Color.FromArgb(length[0], length[1], length[2]));
            img.SetPixel(1,0,Color.FromArgb(length[3], 0,0));
            //пишем шифрованный текст
            int cur = 0;
            for (int y = 0; y < img.Height; y++) {
                for (int x = 0; x < img.Width && cur < bytes.Length; x++) {
                    if (y == 0 && x == 0) {
                        x = 1;
                        continue;
                    }

                    byte[] pixels = new byte[]{0,0,0};
                    for (int k = 0; k < 3 && cur < bytes.Length; k++)
                        pixels[k] = bytes[cur++];
                    img.SetPixel(x,y,Color.FromArgb(pixels[0], pixels[1], pixels[2]));
                }
            }

            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
            saveFile.InitialDirectory = @"C:\";

            if (saveFile.ShowDialog() == DialogResult.OK) {
                textBox1.Text = saveFile.FileName.ToString();
                img.Save(textBox1.Text);
                pictureBox1.ImageLocation = textBox1.Text;
            }
        }

        private void button2_Click(object sender, EventArgs e) {//Дешифруем текст из файла
            if (pictureBox1.Image == null) {
                MessageBox.Show("Изображение не выбрано");
                return;
            }

            Bitmap img = new Bitmap(pictureBox1.Image);

            int length = BitConverter.ToInt32(new byte[] {//Получаем длинну массива 
                img.GetPixel(0,0).R,
                img.GetPixel(0,0).G,
                img.GetPixel(0,0).B,
                img.GetPixel(1,0).R
            },0);
            byte[] textBytes = new byte[length];
            //читаем шифрованный текст
            int cur = 0;
            for (int y = 0; y < img.Height; y++) {
                for (int x = 0; x < img.Width && cur < textBytes.Length; x++) {
                    if (y == 0 && x == 0) {
                        x = 1;
                        continue;
                    }
                    for (int k = 0; k < 3 && cur < textBytes.Length; k++)
                        textBytes[cur++] = (new byte[] {img.GetPixel(x, y).R, img.GetPixel(x, y).G, img.GetPixel(x, y).B}[k]);
                }
            }

            string text = Encoding.UTF8.GetString(textBytes);
            textBox2.Text = text;
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы