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

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:23, 1 июня 2017.
Open book.svg Авторство
Д.А. Дурдиева
Согласовано: 2011

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

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

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.

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