Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416

Выбор битов в стеганографическом методе встраивания информации

19.09.2018, 15:13. Показов 3349. Ответов 33

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я написал метод стеганографии (LSB), который встраивает информацию в предварительно загруженный аудиофайл (WAV-файл) и на выходе получается новый аудиофайл со встроенным в него сообщением.
Помогите, пожалуйста, как изменить данный метод, чтобы было реализовано следующее:
Согласно методу, изменяется последний (восьмой) бит байта. Как сделать так, чтобы на форме пользователь, например, проставил checkBox "Изменить второй бит, изменить пятый бит, изменить седьмой бит" аудиофайла? И встраивание информации происходило бы уже согласно проставленным checkBox.
Спасибо.

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
public void Hide(List<short> channelOneSrc, List<short> channelTwoSrc, List<short> channelOneDst,List<short> channelTwoDst, Stream messageStream)
        {
 
            byte[] waveBuffer = new byte[_bytesPerSample];
            byte message, bit, waveByte;
            //Получает следующий байт сообщения или -1
            int messageBuffer;
 
 
            while ((messageBuffer = messageStream.ReadByte()) >= 0)
            {
                //Присваиваем байт из буфера сообщения
                message = (byte)messageBuffer;
 
                //Записываем каждый бит взятого байта из сообщения в аудио поток
                for (int bitIndex = 0; bitIndex < 8; bitIndex++)
                {
                    //Читаем один сэмпл из wav потока
                    _sourceStream.Read(waveBuffer, 0, waveBuffer.Length);
                    //Запоминаем первые 20000 байт аудио файла в целях сокращения временных затрат на работу программы
                    if (channelOneSrc.Count <= 10000)
                    {
                        //Добавление значений байт аудио файла для дальнейшего их отображения в таблице замены бит
                        channelOneSrc.Add(waveBuffer[0]);
                        channelTwoSrc.Add(waveBuffer[1]);
                    }
 
                    //Изменяем бит только у одного канала аудио файла
                    waveByte = waveBuffer[_bytesPerSample - 1];
 
                    //Сначала делаем побайтовый сдвиг влево, а затем производим поразрядную операцию И 
                    if ((message & (byte)(1 << bitIndex)) > 0)
                        bit = 1;
                    else
                        bit = 0;
 
                    //Изменяем последний бит байта аудио файла
                    if ((bit == 1) && ((waveByte % 2) == 0))
                    {
                        waveByte += 1;
                    }
                    else if ((bit == 0) && ((waveByte % 2) == 1))
                    {
                        waveByte -= 1;
                    }
                    //Присваиваем новое значение байта
                    waveBuffer[_bytesPerSample - 1] = waveByte;
 
                    //Запоминаем первые 20000 байт аудио файла в целях сокращения временных затрат на работу программы
                    if (channelOneDst.Count <= 10000)
                    {
                        //Добавление значений байт аудио файла для дальнейшего их отображения в таблице замены бит
                        channelOneDst.Add(waveBuffer[0]);
                        channelTwoDst.Add(waveBuffer[1]);
                    }
 
                    //Записываем результат в целевой поток
                    _destinationStream.Write(waveBuffer, 0, _bytesPerSample);
                }
            }
 
            //Записываем оставшуюся часть файла без изменений
            waveBuffer = new byte[_sourceStream.Length - _sourceStream.Position];
            _sourceStream.Read(waveBuffer, 0, waveBuffer.Length);
            _destinationStream.Write(waveBuffer, 0, waveBuffer.Length);
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2018, 15:13
Ответы с готовыми решениями:

Поиск информации о методе построения геометрических фракталов
Есть такой метод построения геометрических фракталов под названием &quot;метод хаоса&quot;. Суть его на примере треугольника Серпинского можно...

Проверка информации из нескольких текстбоксов в отдельном методе
На форме два текстбокса - в них вводим цену и курс бакса. Десятичный разделитель у меня, например, - запятая. Так вот, если юзер...

Выбор варианта отчета в методе для сохранения в эксель
Есть отчет с 3 вариантами. Мне нужно программно вывести третий вариант отчета в эксель. У меня все срабатывает, но почему-то в эксель...

33
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 21:43  [ТС]
Студворк — интернет-сервис помощи студентам
182 строка имеет вид:
C#
1
date |= (byte)(((message >> bitIndex + bit_next) & 0b0000_0001) << Ind);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.09.2018, 21:44
Цитата Сообщение от Alex7676 Посмотреть сообщение
У меня реализован метод LSB стеганографии, который изменяет один бит байта. Там шумов не слышно.
Если для подмешивания будет использован старший бит - то шум возможно будет слышен.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 21:45  [ТС]
Элд Хасп, этот метод для замены младшего бита. LSB - Last Significant Bit.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.09.2018, 21:47
Цитата Сообщение от Alex7676 Посмотреть сообщение
182 строка имеет вид:....
Нет, я же написал Вам - там не хватает скобки. Возьмите из поста #14.

Добавлено через 1 минуту
Цитата Сообщение от Alex7676 Посмотреть сообщение
этот метод для замены младшего бита. LSB - Last Significant Bit.
Тогда - согласен. Шум будет неразличим.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 21:58  [ТС]
Элд Хасп, я строку из поста #14 взял.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 22:05  [ТС]
Элд Хасп, вот что выдает:
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 22:13  [ТС]
Но с помощью Resharper эта ошибка исчезает, а другие остаются.

Добавлено через 1 минуту
Элд Хасп, в общем, вся проблема кроется в этом 0b0000_0001.

Добавлено через 1 минуту
Элд Хасп, предлагается исправить 0b0000_0001 на 0x1 типа hex либо на 1 типа decimal. Тогда ошибки исчезнут. Это одно и тоже?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.09.2018, 22:27
Цитата Сообщение от Alex7676 Посмотреть сообщение
предлагается исправить 0b0000_0001 на 0x1 типа hex либо на 1 типа decimal. Тогда ошибки исчезнут. Это одно и тоже?
Да, одно и тоже. Интересно почему у Вас не принимает в двоичном коде?
Или может разделитель "_" не принимает? Он недавно появился. Может в VS 2013 его ещё не было? У меня 2017.

Добавлено через 43 секунды
Попробуйте без разделителя 0b00000001

Добавлено через 14 секунд
Или 0b1

Добавлено через 1 минуту
Цитата Сообщение от Alex7676 Посмотреть сообщение
исправить 0b0000_0001 на 0x1 типа hex либо на 1 типа decimal
В данном случае можно и просто 1 без указания системы счисления.
1
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
21.09.2018, 23:22  [ТС]
Элд Хасп, если убрать _ или изменить на 0b1, то ошибка остается. Эту ошибку мы решили.

Добавлено через 1 минуту
Элд Хасп, как быть с bitIndex, который у меня не учитывает, что записалось несколько битов?
И как исправить, чтобы не менялись указанные биты на 0, а менялись по тому принципу, что указан в посте #9?

Добавлено через 51 минуту
Элд Хасп, не подскажете...?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.09.2018, 23:32
Цитата Сообщение от Alex7676 Посмотреть сообщение
И как исправить, чтобы не менялись указанные биты на 0, а менялись по тому принципу, что указан в посте #9?
Вообще не понял Вас. Я же Вам в посте ниже пошагово показал как происходит изменение потока. И результат получается такой как у Вас. Эти биты меняются на ноль для того чтобы в них можно было записать биты потока информации. В конечном итоге там эти биты.
Вы проверяли результат?

Добавлено через 38 секунд
https://www.cyberforum.ru/post12915151.html
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.09.2018, 23:26  [ТС]
Элд Хасп, да, я результат проверил. При таком методе никаких изменений не происходит.

Добавлено через 1 час 2 минуты
Элд Хасп, перепроверил. Кажется, работает. Спасибо большое за помощь!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
22.09.2018, 23:28
Лучший ответ Сообщение было отмечено Alex7676 как решение

Решение

Alex7676, сделал отладочный кусок. Если что посмотрите.
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
        public static void BitSten()
        {
            List<byte> source = new List<byte>() { 0b0011_0110, 0b1111_1010, 0b0001_1001, 0b1110_0011 };
            List<byte> target = new List<byte>();
            byte message = 0b0111_0010;
            byte mask = 0b1101_0111;
            int bitIndex = 0;
            foreach (byte waveByte in source)
            {
                byte data = (byte)((((message >> bitIndex) & 0b0000_0001) << 3) | ((message >> bitIndex + 1) & 0b0000_0001) << 5);
                byte _targ_mask = (byte)(waveByte & mask);
                byte _targ = (byte)(_targ_mask | data);
                target.Add(_targ);
                bitIndex += 2;
                Console.WriteLine($"  Байт подгот. данных {ByteToString(data)} \n" +
                                  $"  Исходный   байт     {ByteToString(waveByte)}\n" +
                                  $"  С наложенной маской {ByteToString(_targ_mask)}\n" +
                                  $"  Байт  с информацией {ByteToString(_targ)}\n" +
                                  $"  {new string('-', 80)}");
            }
            Console.WriteLine("  Исходный байт | Байт  с информацией }");
            for (int Ind = 0; Ind < source.Count; Ind++)
            {
                Console.WriteLine($"    {ByteToString(source[Ind])}   |     {ByteToString(target[Ind])}");
            }
 
        }
Миниатюры
Выбор битов в стеганографическом методе встраивания информации  
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.09.2018, 12:22
Совет по оптимизации - не сразу обратил внимание.
Маска формируется один раз. На основании информации полученной до вызова метода HideModifyFile.
Поэтому не надо её формировать заново в каждом цикле. Достаточно один раз в начале метода HideModifyFile до циклов.
1
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
24.09.2018, 20:22  [ТС]
Элд Хасп, Понял. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.09.2018, 20:22

Сколько битов информации несет сообщение "Ваня не получил двойку"?
За контрольную работу в классе из 30 человек учитель поставил 7 пятерок ,9 четверок,8 троек и 6 двоек.Сколько битов информации несет...

Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B...
Нужна помощь с задачей. Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B

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

Код встраивания на js
Всем хорошего дня! Сделали бейдж, который должны встраивать партнёры сайта по той же аналогии, как это делается у различных...

Способы встраивания вычисляемых полей в таблицы ЮИ
Всех с наступающим концом. Задался целью реализовать вычисляемые поля на стороне клиента. Но боюсь, без опыта, наломать кучу дров и...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru