0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
1

Стеганография. Методы LSB и DCT

03.06.2017, 23:31. Показов 3978. Ответов 11

Студворк — интернет-сервис помощи студентам
Необходимо реализовать эти 2 метода. Метод LSB как-то еще получился, не могу только понять как записывать сообщение больше ~30 символов, если при условия записи ( textBox1 . Text . Length * 8 > 255 ), и как реализовать запись русских букв. А с ДКП что-то вообще тяжко даже не понимаю, как его реализовать. Помогите кто чем сможет))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2017, 23:31
Ответы с готовыми решениями:

LSB-шифрование
как можно обнаружить LSB-шифрование в файле? т.е. то что в файле действительно что то зашифровано....

LSB Стеганография
Здравствуйте, помогите, пожалуйста решить задачу. Решение я находила, но в среде Делфи, а мне нужна...

Стеганография LSB BMP
Такой вопрос: мне нужно из едита побитно запихнуть в байты цвета файла-контейнера биты текста. Есть...

Что означает это строчка print(min(dct, key = lambda x : dct[x])
...

11
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
04.06.2017, 00:36 2
Пиши постановку задачи полностью.

Например, LSB внутри DCT на ячейках "средних частот"

Добавлено через 19 минут
Другой метод - LSB на первой ячейке DCT, она (ячейка) еще называется DC и является средним арифметическим.
0
0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
04.06.2017, 02:56  [ТС] 3
Что то я не совсем понял.вероятно вы не так поняли под я имел ввиду LSB - метод наименее значащих битов, а DCT- метод дискретно косинусного преобразования.
В LSB не могу понять как правильно сделать условие для внедрения большого числа символов если использовать такое условие
C#
1
if ( textBox1 . Text . Length * 8 > 255)
то больше 30 символов не вместить
Здесь мои наработки по методу LSB
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
//Внедрение стегосообщения методом LSB
private void buttonEncode_Click(object sender, EventArgs e)
        {
            Bitmap img = new Bitmap(textBoxFilePath.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 < textBoxMessage.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(textBoxMessage.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, textBoxMessage.TextLength));
                    }
 
                }
            }
 
            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
            saveFile.InitialDirectory = @"C:\Users\metech\Desktop";
 
            if (saveFile.ShowDialog() == DialogResult.OK)
            {
                textBoxFilePath.Text = saveFile.FileName.ToString();
                pictureBox1.ImageLocation = textBoxFilePath.Text;
 
                img.Save(textBoxFilePath.Text);
            }
//Извлечение стегосообщения
 private void buttonDecode_Click(object sender, EventArgs e)
        {
            Bitmap img = new Bitmap(textBoxFilePath.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;
                    }
                }
            }
 
            textBoxMessage.Text = message;
        }
        }
С методом ДКП у меня только отрывки кода не могу понять как их связать друг с другом

Добавлено через 2 минуты
да и в моем коде если использовать русские буквы программа вылетает тоже не могу понять причину, есть предположение что при переводе текста в биты число получается больше 255(но это не точно)
0
Модератор
2982 / 2136 / 451
Регистрация: 26.03.2015
Сообщений: 8,306
04.06.2017, 04:46 4
Цитата Сообщение от Brothev Посмотреть сообщение
да и в моем коде если использовать русские буквы программа вылетает тоже не могу понять причину
Если бы Вы написали, какая ошибка и где, вероятно, кто-нибудь объяснил Вам причину возникновения ошибки.

В кодировке UTF-8 один символ может занимать от 1 до 4 байт.
0
0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
04.06.2017, 15:07  [ТС] 5
System.ArgumentException: Значение '1091' недопустимо для 'blue'. 'blue' должно быть больше или равно 0 и меньше или равно 255.
в System.Drawing.Color.CheckByte(Int32 value, String name)
в System.Drawing.Color.FromArgb(Int32 alpha, Int32 red, Int32 green, Int32 blue)
в System.Drawing.Color.FromArgb(Int32 red, Int32 green, Int32 blue)
в SimpleSteganography.Form1.buttonEncode_Click(Object sender, EventArgs e) в C:\Users\metech\AppData\Local\Temporary Projects\SimpleSteganography\Form1.cs:строка 53
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
04.06.2017, 17:26 6
Цитата Сообщение от Brothev Посмотреть сообщение
System.ArgumentException: Значение '1091' недопустимо для 'blue'. 'blue' должно быть больше или равно 0 и меньше или равно 255.
Как впихнуть число большее чем 255 в один байт? Да никак! Используй 2, 3, 4 и так далее байт. Например, первый байт сообщения говорит сколько следующих байт отведено под хранение размера сообщения.
Либо сразу брать 2/3/4 байта под размер заранее ограничив максимальный размер сообщения.

Ты не можешь использовать коэффициенты DCT для непосредственного хранения данных. Т.е. можешь, но это будет заметно. Чтобы это не было заметно - нужен способ незначительного изменения данных коэффициентов.
В данный момент я интересуюсь данным вопросом, и из тематических публикаций пока извлек следующие методы:
- LSB на коэффициенты "средних частот" - в низких частотах будут слишком заметно, а высокие отбрасываются при сжатии изображения
- LSB на первый коэффициент - дает слишком низкую плотность, да и не такой уж незаметный.
- сдвиг значений коэффициентов согласно "алфавиту" из слабо коррелирующих массивов

Добавлено через 14 минут
К слову, перезапись одного цвета картинки числами из сообщения - это ни разу не LSB.

Конвертируй текст UTF8 в массив байт, потом обратно, либо работай с ASCII текстом.
0
0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
04.06.2017, 22:34  [ТС] 7
А что насчет метода ДКП. Я почитал некоторые статьи с форума получил следующий код, но в нем что то не то не могу понять что именно ругается на строку в функции извлечения стего.(Вызвано исключение: "System.InvalidOperationException" в System.Drawing.dll
Дополнительные сведения: Область растрового изображения уже заблокирована.)
C#
1
BitmapData bmpData = image.LockBits(rect, ImageLockMode.ReadWrite, image.PixelFormat);
Могли бы вы помочь мне в этом вопросе?
ШИФРОВАНИЕ:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
String parol = textBox2.Text;
            if (parol.Length < 4 || parol.Length > 8)
            {
                MessageBox.Show("Пароль должен состоять из 4-8 символов"); return;
            }
            int x1 = 1; //координаты коэф ДКП в которые будем встраивать сообщение
            int y1 = 7;
            int x2 = 7;
            int y2 = 1;
            String s = textBox1.Text;
            s = s + parol;
            UTF8Encoding utf8 = new UTF8Encoding();
            String bits = "";
            Byte[] encodedBytes = utf8.GetBytes(s);//строку в последовательность байт
            for (int i = 0; i < encodedBytes.Length; i++)
            {
                bits = bits + Int2Bin(encodedBytes[i]);// Int2Bin переводит байт в сроку 0 1 символов
            }//в результате bits хранит 0 1 биты которые нужно закодировать
            if (s.Length > ((int)(image.Width / 8) * (int)(image.Height / 8)))
            {
                MessageBox.Show("Сообщение велико для данного изображения");
                return;
            }//проверяю влезит ли сообщение, тоесть s.Length должна быть меньше блоков 8 * 8
            Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
            System.Drawing.Imaging.BitmapData bmpData =
            image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, image.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes = Math.Abs(bmpData.Stride) * image.Height;
            int maxWidth = bmpData.Stride * 8;
            int width = image.Width;
            byte[] bValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, bValues, 0, bytes - 1);
            //получил массив всех байт изображения, включая те лишние  между строками
            byte[,] blue = new byte[image.Height, image.Width];//создал массив куда запишу синие байты
            int lishnie = (bytes - image.Height * image.Width * 3) / image.Height;//количество лишних байтов между двумя строками
            int index = 2;
            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    blue[i, j] = bValues[index];
                    index += 3;
                }
                index += lishnie;
            }//цикл который получае синие быйты из всего массива bValues
            int str = 0;//переменые которые понадобятся для получения подматриц 8 * 8 из масива синих байт
            int stb = 0;
            for (int k = 0; k < bits.Length; k++)//начинаем кодировать байт
            {
                byte[,] tempmass = new byte[8, 8];//текущая подматрица в которую кодируем текущий бит
                for (int i = 0, p = 7 * str + str; i < 8; i++, p++)
                {
                    for (int j = 0, z = 7 * stb + stb; j < 8; j++, z++)
                    {
                        tempmass[i, j] = blue[p, z];
                    }
                }//заполняем его
                int[,] koef = new int[8, 8]; //матрица, где будут хранится коэф ДКП
                double sum = 0;
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        for (int p = 0; p < 8; p++)
                        {
                            for (int z = 0; z < 8; z++)
                            {
                                sum += Convert.ToInt32(tempmass[p, z]) *
                               Math.Cos((Math.PI * i * (2 * p + 1)) / (16)) * Math.Cos((Math.PI * j * (2 * z + 1)) / (16));
                            }
                        }
                        koef[i, j] = (int)(((fun(i) * fun(j)) / 4) * sum);
                        sum = 0;
                    }
                }//заполняем ее, проверял на маленьком изображение, получается как в теории большие по модулю в верхнем углу левом, а меншие в правом нижнем.
                int v = Convert.ToInt32(textBox1.Text);
                if (bits[k] == '0')
                {
                    do
                    {
                        if (koef[x1, y1] < 0) { koef[x1, y1]--; }
                        else
                        {
                            koef[x1, y1]++;
                        }
                        if (koef[x2, y2] < 0) { koef[x2, y2]++; }
                        else
                        {
                            koef[x2, y2]--;
                        }
                    } while (Math.Abs(koef[x1, y1]) - Math.Abs(koef[x2, y2]) < v);
                }
                else
                {
                    do
                    {
                        if (koef[x1, y1] < 0) { koef[x1, y1]++; }
                        else
                        {
                            koef[x1, y1]--;
                        }
                        if (koef[x2, y2] < 0) { koef[x2, y2]--; }
                        else
                        {
                            koef[x2, y2]++;
                        }
                    } while (Math.Abs(koef[x1, y1]) - Math.Abs(koef[x2, y2]) > -v);
                }//меняюю коэфициэньты
                 //начинается обратное дкп
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        for (int p = 0; p < 8; p++)
                        {
                            for (int z = 0; z < 8; z++)
                            {
                                sum += fun(p) * fun(z) * koef[p, z] *
                               Math.Cos((Math.PI * p * (2 * i + 1)) / (16)) * Math.Cos((Math.PI * z * (2 * j
                               + 1)) / (16));
                            }
                        }
                        if (sum > 1000) sum = 1000;
                        if (sum < 0) sum = 0;
                        tempmass[i, j] = Convert.ToByte((int)(sum / 4));
                        sum = 0;
                    }
                }
                for (int i = 0, p = 7 * str + str; i < 8; i++, p++)
                {
                    for (int j = 0, z = 7 * stb + stb; j < 8; j++, z++)
                    {
                        blue[p, z] = tempmass[i, j];
                    }
                }// засовываю обратно матрицу 8*8 в матрицу синих байт
                stb += 1;
                if (8 * stb + stb >= image.Width)
                {
                    str += 1; stb = 0;
                }//меняю те два коэфициента которые отвечают за текущюю подматрицу в  которую кодируем
                if (8 * str + str >= image.Height) { break; }
            }
            index = 2;
            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    bValues[index] = blue[i, j];
                    index += 3;
                }
                index += lishnie;
            }//засовываю обратно массив синих байтов в массив всех байтов
            System.Runtime.InteropServices.Marshal.Copy(bValues, 0, ptr, bytes);
            image.UnlockBits(bmpData);
            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
            saveFile.InitialDirectory = @"C:\Users\metech\Desktop";
 
            if (saveFile.ShowDialog() == DialogResult.OK)
            {
                textBoxFilePath.Text = saveFile.FileName.ToString();
                pictureBox1.ImageLocation = textBoxFilePath.Text;
 
                image.Save(textBoxFilePath.Text);
            }//сохраняю изображение
 
        }
        public double fun(int x)
        {
            if (x == 0) return 1 / Math.Sqrt(2);
            if (x > 0) return 1;
 
            return 0;
        }
ИЗВЛЕЧЕНИЕ:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 String parol = textBox2.Text;
            if (parol.Length < 4 || parol.Length > 8)
            {
                MessageBox.Show("Пароль не верный!!!"); return;
            }
            int x1 = 1;
            int y1 = 7;
            int x2 = 7;
            int y2 = 1;
            Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
            BitmapData bmpData = image.LockBits(rect, ImageLockMode.ReadWrite, image.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes = Math.Abs(bmpData.Stride) * image.Height;
            int maxWidth = bmpData.Stride * 8;
            int width = image.Width;
            byte[] bValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, bValues, 0, bytes - 1);
            byte[,] blue = new byte[image.Height, image.Width];
            int lishnie = (bytes - image.Height * image.Width * 3) / image.Height;
            int index = 2;
            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    blue[i, j] = bValues[index];
                    index += 3;
                }
                index += lishnie;
            }
            int str = 0;
            int stb = 0;
            String masege = "";
            for (int k = 0; k < ((int)(image.Width / 8) * (int)(image.Height / 8)); k++)
            {
                byte[,] tempmass = new byte[8, 8];
                for (int i = 0, p = 7 * str + str; i < 8; i++, p++)
                {
                    for (int j = 0, z = 7 * stb + stb; j < 8; j++, z++)
                    {
                        tempmass[i, j] = blue[p, z];
                    }
                }
                int[,] koef = new int[8, 8];
                double sum = 0;
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        for (int p = 0; p < 8; p++)
                        {
                            for (int z = 0; z < 8; z++)
                            {
                                sum += Convert.ToInt32(tempmass[p, z]) * Math.Cos((Math.PI * i * (2 * p + 1)) / (16)) * Math.Cos((Math.PI * j * (2 * z + 1)) / (16));
                            }
                        }
                        koef[i, j] = (int)(((fun(i) * fun(j)) / 4) * sum);
                        sum = 0;
                    }
                }
 
                if (Math.Abs(koef[x1, y1]) > Math.Abs(koef[x2, y2])) masege = masege + "0";
                if (Math.Abs(koef[x1, y1]) < Math.Abs(koef[x2, y2])) masege = masege + "1";
                //начинается обратное дкп
                //if (Math.Abs(koef[x1, y1]) == Math.Abs(koef[x2, y2])) 
                masege = masege + "1";
                stb += 1;
                if (8 * stb + stb >= image.Width) { str += 1; stb = 0; }
                if (8 * str + str >= image.Height) { break; }
            }
            Byte[] ne = new Byte[(int)(masege.Length / 8)];
            for (int i = 0, j = 0; j < (int)(masege.Length / 8); j++, i++)
            {
                ne[j] = Bin2Int(masege.Substring(i, 8));
                i = i + 7;
            }
            string stt = System.Text.UTF8Encoding.UTF8.GetString(ne);
            int xz = stt.IndexOf(parol);
            if (xz == -1) { return; }
            String m = stt.Substring(0, xz);
            textBox1.Text = m;
 
        }
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
05.06.2017, 08:59 8
Цитата Сообщение от Brothev Посмотреть сообщение
(Вызвано исключение: "System.InvalidOperationException" в System.Drawing.dll
Дополнительные сведения: Область растрового изображения уже заблокирована.
У тебя нет Unlock в извлечении.
1
0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
05.06.2017, 12:41  [ТС] 9
а поконкретнее можно где именно в извлечении?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
05.06.2017, 15:11 10
Не знаю, но у тебя в шифровании есть Lock и Unlock, а в извлечении только Lock, добавь разблокировку где-то в конце
1
0 / 0 / 0
Регистрация: 09.09.2014
Сообщений: 21
05.06.2017, 15:51  [ТС] 11
Не помогло((

Добавлено через 28 минут
Хотя ошибки больше нет но не выводится результат дешифровки может есть какие то ошибки в алгоритме могли бы посмотреть?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
06.06.2017, 21:14 12
Попробуй распечатать числа ДКП на стадии записи, и на стадии чтения в извелечении
И сравни их, может этот метод просто не подходит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2017, 21:14
Помогаю со студенческими работами здесь

Методы GetPixel\SetPixel BMP и стеганография
Подскажите, мне необходимо реализовать метод стеганографии &quot;&quot;замена палитры&quot;, следовательно нужно...

Стеганография. Методы и программное обеспечение для извлечения информации
Подскажите пожалуйста какие есть методы и инструменты для обнаружения и извлечения информации...

Domino Configuration Tuner (dct) не пашет
Не важно какой сервер выбираю, всё валится по ошибке похожу ошибка в самом клиент, клиент...

LSB (Least Significant Bit)
Добрый вечер! Есть у меня лабораторное задание реализовать стенографию. И я не понимаю некоторые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru