Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2018, 15:26   #1
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию Стеганографический метод встраивания информации

Здравствуйте.
Я написал метод стеганографии (LSB), который встраивает информацию в предварительно загруженный аудиофайл (WAV-файл) и на выходе получается новый аудиофайл со встроенным в него сообщением.
Помогите, пожалуйста, как изменить данный метод, чтобы было реализовано следующее:
Согласно методу, изменяется последний (восьмой) бит байта. Как сделать так, чтобы на форме пользователь, например, проставил checkBox "Изменить второй бит, изменить пятый бит, изменить седьмой бит" аудиофайла? И встраивание информации происходило бы уже согласно проставленным checkBox.
Спасибо.
Код:
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);
        }
Alexey Smirnov вне форума Ответить с цитированием
Старый 19.09.2018, 15:49   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alexey Smirnov Посмотреть сообщение
Согласно методу, изменяется последний (восьмой) бит байта. Как сделать так, чтобы на форме пользователь, например, проставил checkBox "Изменить второй бит, изменить пятый бит, изменить седьмой бит" аудиофайла?
Так может быть, это метод не позволяет сделать.
Когда Вы изменяете 8-й бит, то разница между значениями составляет 1 (единицу).
Если вы изменените 5-й бит, то разница будет составлять 1000 (это уже 8),
а если изменять второй бит, то это 1000000 (разница будет 64). Наверное, это уже сильно отразиться на содержимом файле (будут слышны внесённые искажения).

p.s. возможно, что мои догадки и не верны, я метод не разбирал.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.09.2018, 15:51   #3
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Так может быть, это метод не позволяет сделать.
Когда Вы изменяете 8-й бит, то разница между значениями составляет 1 (единицу).
Если вы изменените 5-й бит, то разница будет составлять 1000 (это уже 8),
а если изменять второй бит, то это 1000000 (разница будет 64). Наверное, это уже сильно отразиться на содержимом файле (будут слышны внесённые искажения).

p.s. возможно, что мои догадки и не верны, я метод не разбирал.
Догадки верны. И цель состоит именно в том, что вы описали: необходимо продемонстрировать, что будут заметны искажения файла.
Сам метод у меня реализован. Теперь в учебных целях необходимо его модифицировать тем образом и с той целью, что описаны выше.
Alexey Smirnov вне форума Ответить с цитированием
Старый 19.09.2018, 16:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alexey Smirnov Посмотреть сообщение
Теперь в учебных целях необходимо его модифицировать тем образом и с той целью, что описаны выше.
ну, тогда это несложно.
сделать на форме ввод номера бита сможете?
допустим есть число byte bit_number;
и, допустим, что это может принимать значение от 1 (самый старший бит в кодируемом байте) до 8 (последний, младший бит).
у Вас сейчас как раз реализован алгоритм с bit_number = 8;

полученный бит переводите в маску таким образом:
Код:
byte mask = (byte)(1 << 8-bit_number));
ну а процесс кодирования, собственно, будет выглядеть примерно так:
вместо
Цитата:
Код:
//Изменяем последний бит байта аудио файла
                    if ((bit == 1) && ((waveByte % 2) == 0))
                    {
                        waveByte += 1;
                    }
                    else if ((bit == 0) && ((waveByte % 2) == 1))
                    {
                        waveByte -= 1;
                    }
пишем что-то вроде:
Код:
                    //Изменяем заданный маской бит байта аудио файла
                    if(bit == 1){
                        waveByte |= mask;
                    }else{
                        waveByte &= (byte)~mask;
                    }
я код не проверял, надо проверить, чтобы с типами byte / int путаницы не было.
И всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.09.2018, 16:32   #5
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Спасибо за ответ.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, тогда это несложно.
сделать на форме ввод номера бита сможете?
Не могли бы вы подсказать, как сделать лаконичнее и правильнее, если необходимо внести изменения сразу в несколько битов байта?
Вы описали способ, если вносится изменение в один выбранный бит. А если необходимо внести изменения, например, в третий, четвертый и шестой бит?
У меня была идея сделать на форме восемь checkBox-ов, выбор каждого из которых предполагал бы внесение изменений в указанных битах.
Но как описать условия в коде для такого количества checkBox?
Alexey Smirnov вне форума Ответить с цитированием
Старый 19.09.2018, 17:05   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Метод абсолютной тот же. Только маску чуть сложнее сделать: теперь каждый бит маски представляет бит, который хотите поменять. Нужно 1, 3, 5 - вот их и устанавливайте.
p51x на форуме Ответить с цитированием
Старый 19.09.2018, 17:37   #7
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Метод абсолютной тот же. Только маску чуть сложнее сделать: теперь каждый бит маски представляет бит, который хотите поменять. Нужно 1, 3, 5 - вот их и устанавливайте.
Но как это правильно сделать? Не прописывать же каждый вариант через if, в теле которого будет индивидуальное условие для выбранного варианта.
Alexey Smirnov вне форума Ответить с цитированием
Старый 19.09.2018, 17:49   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Какие условия? Какие варианты? Поставьте в обработчик события установки/снятия чекбокса установка/снятия соответствующего бита в маске и используйте ее потом.
p51x на форуме Ответить с цитированием
Старый 19.09.2018, 17:51   #9
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Не очень понял. Не могли бы объяснить на примере?
Alexey Smirnov вне форума Ответить с цитированием
Старый 19.09.2018, 17:57   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что не поняли? У вас есть 8 чекбоксов, у байта есть 8 бит, которые вы хотите переключать в зависимости от состояния чекбоксов. Что надо сделать? Либо в коде собирать байт, либо взять обработчик события снятия/установки галки в чекбокс и соответственно установить/снять нужный бит в маске.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTML/CSS отобразить график по информации (алгоритм или метод) Lime Помощь студентам 3 12.04.2014 17:36
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
Теория информации. Метод сжатия Шеннона-Фано, Хаффмена и арифметический Fantazerishka Помощь студентам 0 15.02.2011 16:25
передача информации. метод post NSvirus PHP 2 27.10.2009 13:57
Сжатие информации. Метод RLE. WPALI4 Помощь студентам 4 19.11.2008 19:50