Изучение влияния шума и фильтрации на метод LSB — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
(Новая страница: «==Руководство пользователя== ===Запись стегосообщения в контейнер=== <code lang="matlab"> WRITEWAV("input.wav…»)
 
(Аудиофайлы)
Строка 235: Строка 235:
 
{|border="0" align="center"  
 
{|border="0" align="center"  
 
|-
 
|-
| align="center" | <mp3player>File:Input.mp3</mp3player> '''input.wav – контейнер'''
+
| align="center" | <youtube>https://youtu.be/FJfxpjpY5es</youtube>
 +
'''input.wav – контейнер'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <br><mp3player>File:Noisy_stegano.mp3</mp3player> '''noisy_stegano.wav - файл с занесенным гауссовским шумом.'''
+
| align="center" | <br><youtube>https://youtu.be/Fp7Jmo4uFC4</youtube>
 +
'''noisy_stegano.wav - файл с занесенным гауссовским шумом.'''
 
|-
 
|-
 
| <br>
 
| <br>
Строка 243: Строка 245:
 
| <br>
 
| <br>
 
|-
 
|-
| align="center" | <mp3player>File:Noisy_stegano_100.mp3</mp3player> '''noisy_stegano_100.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 100.'''
+
| align="center" | <youtube>https://youtu.be/Y9rVoLodwNo</youtube>
 +
'''noisy_stegano_100.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 100.'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <mp3player>File:Noisy_stegano_200.mp3</mp3player> '''noisy_stegano_200.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 200.'''
+
| align="center" | <youtube>https://youtu.be/yc8pgNM1X4E</youtube>
 +
'''noisy_stegano_200.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 200.'''
 
|-
 
|-
 
| <br>
 
| <br>
Строка 251: Строка 255:
 
| <br>
 
| <br>
 
|-
 
|-
| align="center" | <mp3player>File:Noisy_stegano_250.mp3</mp3player> '''noisy_stegano_250.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 250.'''
+
| align="center" | <youtube>https://youtu.be/VVxhYbjdurw</youtube>
 +
'''noisy_stegano_250.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 250.'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <mp3player>File:Noisy_stegano_300.mp3</mp3player> '''noisy_stegano_300.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 300.'''
+
| align="center" | <youtube>https://youtu.be/cg7hmHWB7Co</youtube>
 +
'''noisy_stegano_300.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 300.'''
 
|-
 
|-
 
| <br>
 
| <br>
Строка 259: Строка 265:
 
| <br>
 
| <br>
 
|-
 
|-
| align="center" | <mp3player>File:Noisy_stegano_350.mp3</mp3player> '''noisy_stegano_350.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 350.'''
+
| align="center" | <youtube>https://youtu.be/yYwwXnjp54o</youtube>
 +
'''noisy_stegano_350.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 350.'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <mp3player>File:Filtered_stegano.mp3</mp3player> '''filtered_stegano.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.'''  
+
| align="center" | <youtube>https://youtu.be/4vb1LZG-sec</youtube>
 +
'''filtered_stegano.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.'''  
 
|-
 
|-
 
| <br>
 
| <br>
Строка 267: Строка 275:
 
| <br>
 
| <br>
 
|-
 
|-
| align="center" | <mp3player>File:Filtered_stegano_03.mp3</mp3player> '''filtered_stegano_03.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,3.'''
+
| align="center" | <youtube>https://youtu.be/emi8yT9rxME</youtube>
 +
''filtered_stegano_03.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,3.'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <mp3player>File:Filtered_stegano_02.mp3</mp3player> '''filtered_stegano_02.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,2.'''
+
| align="center" | <youtube>https://youtu.be/levll8eTGto</youtube>
 +
'''filtered_stegano_02.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,2.'''
 
|-
 
|-
 
| <br>
 
| <br>
Строка 275: Строка 285:
 
| <br>
 
| <br>
 
|-
 
|-
| align="center" | <mp3player>File:Filtered_stegano_01.mp3</mp3player> '''filtered_stegano_01.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,1.'''
+
| align="center" | <youtube>https://youtu.be/_goEW9JjlRM</youtube>
 +
'''filtered_stegano_01.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,1.'''
 
| width="50px" | <br>
 
| width="50px" | <br>
| align="center" | <mp3player>File:Filtered_stegano_001.mp3</mp3player> '''filtered_stegano_001.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,01.'''
+
| align="center" | <youtube>https://youtu.be/UbbYqQpoYQs</youtube>
 +
'''filtered_stegano_001.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,01.'''
 
|-
 
|-
 
|}
 
|}

Версия 01:10, 18 мая 2017

Руководство пользователя

Запись стегосообщения в контейнер

WRITEWAV("input.wav", 11025, 8) := READWAV("NAME_SAMPLE.wav") WRITEWAV("NAME_STEGO.wav", 11025, 8) := WRITELSB("input.wav",Text) NAME_SAMPLE.wav - название пустого контейнера
NAME_STEGO.wav - название полного контейнера
Text - переменная, содержащая стего сообщение для записи

Чтение стегосообщения из контейнера

WRITEBIN("text.txt","byte",0) := READLSB("NAME.wav") text.txt - текст, куда будет извлечено стего сообщение
NAME.wav - название заполненного контейнера

Добавление шума

WRITEWAV("NOISY.wav",11025,8) := AddNoise("NAME.wav",PSNR) NOISY.wav - название зашумленного контейнера
NAME.wav - название контейнера, который необходимо зашумить
PSNR - значение сигнал-шум

Фильтрация

h := lowpass(a,b) WRITEWAV("FILTERED.wav",11025,8) := fftfilt(READWAV("NAME.wav"),h) a - частота среза
b - размер фильтра
FILTERED.wav - отфильтрованный контейнер
NAME.wav - контейнер, который необходимо отфильтровать

Все файлы должны находиться в папке с SteganoLSB.xmcd.
Просмотр txt осуществляется с помощью Notepad, wav - Windows Media Player.

Текст кода программы – занесение стего в звуковой контейнер и извлечение стегосообщения с шумом, без шума и с фильтрацией

Задача:

  1. В произвольно выбранном контейнере в виде сэмпла звукового файла управляемого объема записать произвольно выбранное стего методом LSB.
  2. Восстановить стего по известному ключу.
  3. Промоделировать занесение шума в контейнер, содержащий стегосообщение с помощью функции rnorm().
  4. Промоделировать фильтрацию с помощью полосового фильтра низких частот.
  5. Качественно оценить влияние шума и его фильтрации на восстановленное стего.

Описание решения:

  1. Из входного текста формируется битовый вектор (Text2Bin). Звуковой файл считывается в матрицу (ReadWAV). В младший бит каждого элемента матрицы (представляемый байтом) записывается 1 бит из битового вектора (WriteLSB). Полученная новая матрица записывается в звуковой файл (WriteWAV).
  2. Звуковой файл считывается в матрицу (ReadWAV). Младший бит каждого элемента матрицы записывается группируется по 8 бит и представляются 1 символом. Все символы записываются в текстовый файл (ReadLSB).
  3. Вводится желаемое значение сигнал-шум (PSNR), на его основе подсчитывается стандартное отклонение для матрицы шума. К каждому элементу входной матрицы добавляется соответствующий элемент матрицы шума (AddNoise).
  4. Генерируется вектор фильтра низких частот с желаемыми параметрами (lowpass). Звуковой файл фильтруется (fftfilt).
  5. Произведены попытки восстановления сообщения из стего контейнера, зашумленного / отфильтрованного разными способами.

Запись и восстановление текста в стего контейнер методом LSB

  1. GetBit - функция для битовой операции чтения
  2. Text2Bin - функция конвертации текста в битовый вектор
  3. WriteLSB - запись текста в стего контейнер
  4. ReadLSB - чтение текста из стего контейнера
  5. Пример записи и чтения в стегоконтейнер

GetBit
Список входных переменных:
data: число
pos: номер бита
Назначение:
Функция возвращает значение бита, находящегося на позиции с номером pos.

Фрагмент кода


Text2Bin
Список входных переменных:
txt: входной текст
Результат:
Функция конвертирует входной текст в битовый вектор и добавляет к нему на конце 8 нулевых бит.

Фрагмент кода


WriteLSB
Список входных переменных:
wavFile: входной звуковой файл
txt: входной текст
Результат:
Функция записывает входной текст в стего контейнер (звуковой файл).
Алгоритм работы:

1 - wavFile считывается посредством функции READWAV в матрицу
2 - для каждого элемента матрицы
a - (сначала) LSB устанавливается в 0
b - один бит из битового вектора записывается в LSB
3 - если сообщение записано или wav заполнен, возвращается результат
Фрагмент кода


ReadLSB
Список входных переменных:
wavFile: входной звуковой файл
Результат:
Функция считывает записанный текст из заполненного стего контейнера (звукового файла).
Алгоритм работы:

1 - wavFile считывается функцией READWAV в матрицу
2 - для каждого элемента матрицы
a - считывается LSB
b - происходит сбор каждого символа (байта)
c - если обнаруживается 8 нулевых подряд идущих бит, то шаг 2 прекращается
3 - возвращается считанный текст
Фрагмент кода


Пример записи и чтения в стего контейнер
Ввод текста для записи в стего контейнер:

Фрагмент кода


WRITEWAV("input.wav", 11025, 8) := READWAV("sample.wav") Запись текста в контейнер: WRITEWAV("stegano.wav", 11025, 8) := WriteLSB("input.wav" ,SourceText) Извлечение текста из контейнера: WRITEBIN("text_from_stegano.txt", "byte", 0) := ReadLSB("stegano.wav") Данные успешно извлечены.

Изучение влияния шума на метод LSB

  1. AddNoise - добавление шума в стего контейнер
  2. Исследование влияния шума на восстановление данных из стего контейнера

AddNoise
Список входных переменных:
wav: входной звуковой файл
PSNR: соотношение сигнал-шум
Результат:
Функция добавляет шум во входной звуковой файл.
Алгоритм работы:

  1. генерация вектора WGN на основе соотношения сигнал-шум
  2. чтение входного звукового файла
  3. добавление шума в звуковой файл
  4. возврат звукового файла
Фрагмент кода


Исследование влияния шума на восстановление данных из стего контейнера
Ввод текста для записи в стего контейнер:

Фрагмент кода


Ввод значения сигнал-шум:

Фрагмент кода


WRITEWAV("input.wav", 11025, 8) := READWAV("sample.wav") Запись стего сообщения и добавление шума: WRITEWAV("noisy_stegano.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR)) Считывание сообщения из контейнера: WRITEBIN("text_from_noisy_stegano.txt", "byte", 0) := ReadLSB("noisy_stegano.wav") Сообщение не было успешно восстановлено.
Попробуем увеличить значение сигнал-шум и восстановить стего сообщение: PSNR_100 := "100" WRITEWAV("noisy_stegano_100.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR_100)) WRITEBIN("text_from_noisy_stegano_100.txt", "byte", 0) := ReadLSB("noisy_stegano_100.wav") Сообщение не было успешно восстановлено. PSNR_200 := "200" WRITEWAV("noisy_stegano_200.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR_200)) WRITEBIN("text_from_noisy_stegano_200.txt", "byte", 0) := ReadLSB("noisy_stegano_200.wav") Сообщение не было успешно восстановлено.

PSNR_250 := "250" WRITEWAV("noisy_stegano_250.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR_250)) WRITEBIN("text_from_noisy_stegano_250.txt", "byte", 0) := ReadLSB("noisy_stegano_250.wav") Сообщение не было успешно восстановлено.

PSNR_300 := "300" WRITEWAV("noisy_stegano_300.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR_300)) WRITEBIN("text_from_noisy_stegano_300.txt", "byte", 0) := ReadLSB("noisy_stegano_300.wav") Сообщение не было успешно восстановлено.

PSNR_350 := "350" WRITEWAV("noisy_stegano_350.wav", 11025, 8) := AddNoise(WriteLSB("input.wav" ,SourceText2), str2num(PSNR_350)) WRITEBIN("text_from_noisy_stegano_350.txt", "byte", 0) := ReadLSB("noisy_stegano_350.wav") Сообщение успешно восстановлено.
Вывод: лишь при огромном значении сигнал-шум (PSNR=350) сообщение было успешно восстановлено. Это говорит о том, что метод LSB крайне неустойчив к влиянию шума.

Изучение влияния фильтрации на метод LSB

Запись стегосообщения в контейнер: WRITEWAV("stegano.wav", 11025, 8) := WriteLSB("input.wav" ,SourceText2) Фильтр низких частот: h := lowpass(0.4,31) //Первое значение - частота среза

                       //Второе значение - длина фильтра

Фильтрация стего контейнера: WRITEWAV("filtered_stegano.wav", 11025, 8) := fftfilt(READWAV("stegano.wav") ,h) Попытка восстановления сообщения из контейнера: WRITEBIN("text_from_filtered_stegano.txt", "byte", 0) := ReadLSB("filtered_stegano.wav") Сообщение не было успешно восстановлено.
Попробуем изменить частоту среза фильтра для успешного восстановления сообщения из контейнера: h_03 := lowpass(0.3,31) WRITEWAV("filtered_stegano_03.wav", 11025, 8) := fftfilt(READWAV("stegano.wav") ,h_03) WRITEBIN("text_from_filtered_stegano_03.txt", "byte", 0) := ReadLSB("filtered_stegano_03.wav") Сообщение не было успешно восстановлено. h_02 := lowpass(0.2,31) WRITEWAV("filtered_stegano_02.wav", 11025, 8) := fftfilt(READWAV("stegano.wav") ,h_02) WRITEBIN("text_from_filtered_stegano_02.txt", "byte", 0) := ReadLSB("filtered_stegano_02.wav") Сообщение не было успешно восстановлено. h_01 := lowpass(0.1,31) WRITEWAV("filtered_stegano_01.wav", 11025, 8) := fftfilt(READWAV("stegano.wav") ,h_01) WRITEBIN("text_from_filtered_stegano_01.txt", "byte", 0) := ReadLSB("filtered_stegano_01.wav") Сообщение не было успешно восстановлено. h_001 := lowpass(0.01,31) WRITEWAV("filtered_stegano_001.wav", 11025, 8) := fftfilt(READWAV("stegano.wav") ,h_001) WRITEBIN("text_from_filtered_stegano_001.txt", "byte", 0) := ReadLSB("filtered_stegano_001.wav") Сообщение не было успешно восстановлено.
Вывод: невозможность восстановления стего сообщения после применения фильтра низких полосовых частот (с различными параметрами) подтверждает крайнюю неустойчивость метода LSB к сторонним воздействиям.

Аудиофайлы

input.wav – контейнер



noisy_stegano.wav - файл с занесенным гауссовским шумом.




noisy_stegano_100.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 100.


noisy_stegano_200.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 200.




noisy_stegano_250.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 250.


noisy_stegano_300.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 300.




noisy_stegano_350.wav - файл с занесенным гауссовским шумом.Дисперсия шума - 350.


filtered_stegano.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.




filtered_stegano_03.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,3.'


filtered_stegano_02.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,2.




filtered_stegano_01.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,1.


filtered_stegano_001.wav - файл после фильтрации.Импульсный отклик фильтра – гауссоида.Размер импульсного отклика - 0,01.

Стегосообщения