Стеганография звука методом Patchwork

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

Техническое задание

Назначение программы

Данная программа предназначена для внесения произвольных данных в контейнер звука WAV, так чтобы злоумышленник не смог бы получить передаваемое сообщения без знаний методов занесения данных.

Условия применения

Условия, необходимые для функционирования программы

Данный программный продукт работает на ПК с ОС Windows.
Система состоит из следующих компонентов:

  1. Модуль внесения данных в аудио- файл WAV
  2. Модуль получения данных из аудио- файла WAV

Модули реализованы в среде MathCAD 15.

Требования к техническим средствам

MathCAD 15, требует:

  • X86 совместимый процессор – 700 МГц и выше
  • 512 МБ RAM и более.

Требования к программному обеспечению

Требуется установленный программный продукт MathCAD 15, а так же сопутствующее программное обеспечение:

  • Windows XP (Home или Professional), Windows XP Professional x64, Windows Vista, Windows 7; рекомендуется Windows XP SP3, XP-x64 SP2, или Vista.
  • Windows Installer 3.0 или старше.
  • Microsoft .NET Framework® 3.5 или старше
  • MSXML 4.0 SP2 Parser and SDK
  • Microsoft Data Access Components (MDAC) 2.8 или старше
  • Internet Explorer 5.0 или старше.
  • Adobe Reader 5.0 или старше.

Описание задачи

Решаемые задачи

Сокрытие и извлечение информации в/из контейнера WAV – программа позволяет определить количество возможной скрытой информации в контейнере и позволяет подобрать оптимальное ее количество, а так же произвести ее извлечение из контейнера. Алгоритм ограничен тем, что для каждого бита шифруемой информации берется 10000 пар байтов звука.

Используемые решения

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

Входные и выходные данные

Входные данные

На вход алгоритма подаются данные, не превышающие максимально допустимый размер сообщения, вычисляемый для каждого конкретного аудио-файла.

Выходные данные

На выходе алгоритма кодирования получаем ключ шифрования и контейнер с зашифрованными данными. На выходе алгоритма декодирования получаем, с использованием ключа, зашифрованные данные.

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

Введение

Область применения:
Данная программа предназначена для осуществления скрытой передачи данных в контейнере WAV.
Краткое описание возможностей:
Основными возможностями программы являются:

  • Сокрытие информации в контейнере WAV
  • Извлечение информации из контейнера WAV
  • Извлечение информации из контейнера, попавшего под влияние шумов
  • Оценка влияния шума на восстанавливаемую информацию

Назначение и условия применения

Требования к системе:
X86 совместимый процессор - 700 МГц или выше

  • 512Мб RAM и выше.
  • MathCAD 15
  • ОС Microsoft® Windows® XP/Vista/7 (32 или 64bit)

Виды деятельности, функции:
Перечень функций:
Создание файла с данными для записи

  • Занесение данных в аудио-файл
  • Извлечение данных из аудио-файла
  • Фильтрация аудио-файла

Подготовка к работе

Состав дистрибутива:

  • Patchwork_in.xmcd
  • Patchwork_out.xmcd

Запуск системы:

  1. Запустить ПО MathCAD 15
  2. Запустить Patchwork_in.xmcd
  3. После выполнения работы программы
  4. Запустить Patchwork_out.xmcd

Описание операций

Подготовительные действия:

  • Создание файла data.txt
  • Выбор будущего контейнера для стего

Основные действия:

  • Запись данных в контейнер
  • Занесение шума в контейнер с данными

Заключительные действия:

  • Сохранение контейнера в виде файла в папке с программой
  • Сохранение зашумленного контейнера в папке с программой

Внесение данных в аудио-файл

Подготовительные действия:

  • Генерация данных для внесения
  • Создание аудио-файла audio_in.wav

Основные действия:

  • Вычисления Patchwork_in.xmcd


Заключительные действия:

  • Запись контейнера со стего audio_out.wav
  • Запись выработанного ключа в Key.txt

Извлечение данных

Подготовительные действия:

  • Запуск Patchwork_in.xmcd в Mathcad 15
  • Открытие в файле MathCAD-а контейнера со стего audio_out.wav

Основные действия:

  • Вычисления Patchwork_out.xmcd

Заключительные действия:

  • Сравнение зашифрованных данных с исходными

Занесение стего в звуковой контейнер

Задание:

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

Входные данные:

  • звук в файле audio_in.wav, файл с шифруемыми данными data.txt


Выходные данные:

  • звук c записанными данными audio_out.wav
  • зашумленный звук с записанными данными audio_noise2.wav, audio_noise4.wav, audio_noise6.wav, audio_noise10.wav, audio_noise15.wav, audio_noise20.wav, audio_noise30.wav, audio_noise40.wav, audio_noise50.wav, audio_noise75.wav, audio_noise100.wav.

Решение:

  • параметры контейнера:

Matrix := READWAV("audio_in.wav")

Рис.1.Параметры контейнера


Matrix := GETWAVINFO("audio_in.wav")

Рис.2.матрица


height:= rown(Matrix) = 1.764×10^6 - размеры контейнера width:= cols(Vatrox) = 2

Рис.3.максимально допустимое количество блоков, мы можем записать 348 бит стего


максимально допустимое количество блоков, мы можем записать 348 бит стего

  • Данные для записи:

Data := READPON("data.txt")

Рис.4.матрица данных


Data_width:= cljs(Data) = 7 Data_geight:= rows(Data) = 8

  • Формирование массивов (которые будут содержать номера измененных бит):

seed(1357)

Рис.5.
Рис.6.


Рис.7.
Рис.8.


  • Запись стего в контейнер:
Рис.9.Запись стего в контейнер
Рис.10.Запись стего в контейнер


WRITEWAV("audia_oat/waw" ,Vatrix_INFO1,Vatrix_INFO2):=Matrix1 -сохранение полученного результата

  • Формирование ключа:

i:=0..Data_width - 1 j:=0..Data_height - 1 a:=4 h:=10

Рис.11.Формирование ключа


Рис.12.Формирование ключа


Рис.13.Формирование ключа


Рис.14.Формирование ключа


Рис.15.Формирование ключа


WRITEPRN("Key.txt"):= Key

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

1. lev_noise := 2

  u:= 0..height - 1 
  v:= 0..width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
  Matrix1(u,v) := Matrix1(u,v) + noise(u)
  WRITEWAV ("audio_noise2.wav" , Matrix_INFO1,Matrix_INF02):= Matrix1

2. lev_noise := 4

  u :=0..height - 1 
  v :=0..width - 1
  noise := floor(rnorm (height, lev_noise, lev_noise))
  Matrix1(u,v):= Matrix1(u,v)+ noise(u)
  WRITEWAV("audio_noise4.wav",Matrix_INFO1,Matrix_INF02):=Matrix1

3. lev noise := 6

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
  Matrix1(u,v):= Matrix1(u,v)+ noise(u)
  WRITEWAV (" audio_noise6.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

4. lev_noise := 10

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
  WRITEWAV (" audio_noise10.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

5. lev_noise := 15

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise15.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

6. lev_noise := 20

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise20.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

7. lev_noise := 30

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise30.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

8. lev_noise := 40

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise40.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

9. lev_noise := 50

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise50.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

10. lev_noise := 75

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise75.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1

11. lev_noise := 100

  u := 0.. height - 1 
  v:= 0.. width - 1
  noise := floor(morm (height, lev_noise, lev_noise)) 
   Matrix1(u,v):= Matrix1(u,v)+ noise(u)
   WRITEWAV (" audio_noise100.wav" , Matrix_INFO1, Matrix_INF02) := Matrix1


Извлечение стего из звукового контейнера

Задание:
В произвольно выбранном контейнере в виде сэмпла звукового файла управляемого объема записать произвольно выбранное стего методом "Patchwork" ("заплаток").

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

Входные данные:

  • звук с внедренными данными в файле audio_out
  • зашумленный звук с записанными данными audio_noise2.wav, audio_noise4.wav, audio_noise6.wav, audio_noise10.wav, audio_noise15.wav, audio_noise20.wav, audio_noise30.wav, audio_noise40.wav, audio_noise50.wav, audio_noise75.wav, audio_noise100.wav
  • файл с ключем Key.txt

Выходные данные:

  • звук в файлt audio_filter.wav
  • передаваемые данные

Решение:

  • Параметры контейнера:

Matrix := READWAV("audio_out.wav") -загрузка данных Data_ishod:= READPRN("data.txt") -шифруемые данные, которые нам потребуется для подсчета количества ошибок

Рис.16.Загрузка данных


Matrix_INFO := GETWAVINFO("audio_in.wav")

Рис.17.Загрузка данных


height:= rown(Matrix) = 1.764×10^6 - размеры контейнера width:= cols(Matrix) = 2

  • Формирование массивов:

seed(1357)-предустановка генератора псевдослучайных чисел

Рис.18.
Рис.19.


Рис.20.
Рис.21.


  • Воспользуемся ключом:

Key:= READPRN(Key.txt")-загрузка данных ключа

Рис.22.загрузка данных ключа


Data_width := Key(0,0) = 7 Data_geight := Key(0,1) = 8 i:=0..Data_width - 1 j:=0..Data_height - 1 a:=4 h:=10

Рис.23.загрузка данных ключа


Рис.24.загрузка данных ключа


Рис.25.загрузка данных ключа


Рис.26.загрузка данных ключа


Рис.26.загрузка данных ключа


-данные полностью восстановлены

  • Данные из контейнеров с добавленным шумом:

1.Matrix := READWAV("audio_noise2.wav")

Рис.28.Данные из контейнеров с добавленным шумом


Рис.29.Данные из контейнеров с добавленным шумом


Рис.30.Данные из контейнеров с добавленным шумом


Рис.31.Данные из контейнеров с добавленным шумом


Рис.32.данные восстановлены c ошибками, требуется подсчитать их количество, чтобы постороить их зависимость от уровня шума

-данные восстановлены c ошибками, требуется подсчитать их количество, чтобы постороить их зависимость от уровня шума


Oshibki := Data - Data_ishod -отображает в каких местах произошли ошибки

Рис.33.формируем единичный вектор, равный количеству строк матрицы ошибок


-формируем единичный вектор, равный количеству строк матрицы ошибок

Рис.34.количество ошибок в каждом столбце матрицы ошибок
-количество ошибок в каждом столбце матрицы ошибок


Рис.35.общее число ошибок
- общее число ошибок


2.Matrix := READWAV("audio_noise4.wav") </code>

Рис.36.Данные из контейнеров с добавленным шумом


Рис.37.Данные из контейнеров с добавленным шумом


Рис.38.Данные из контейнеров с добавленным шумом


Рис.39.Данные из контейнеров с добавленным шумом


Рис.40.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.41.формируем единичный вектор, равный количеству строк матрицы ошибок
Рис.42.
Рис.43.


3.Matrix := READWAV("audio_noise6.wav")

Рис.44.Данные из контейнеров с добавленным шумом


Рис.45.Данные из контейнеров с добавленным шумом


Рис.46.Данные из контейнеров с добавленным шумом


Рис.47.Данные из контейнеров с добавленным шумом


Рис.48.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.49.
Рис.50.Данные из контейнеров с добавленным шумом


Рис.50.Данные из контейнеров с добавленным шумом


4.Matrix := READWAV("audio_noise10.wav")

Рис.51.Данные из контейнеров с добавленным шумом


Рис.52.Данные из контейнеров с добавленным шумом


Рис.53.Данные из контейнеров с добавленным шумом


Рис.54.Данные из контейнеров с добавленным шумом


Рис.55.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.56.
Рис.57.Данные из контейнеров с добавленным шумом


Рис.58.Данные из контейнеров с добавленным шумом


5.Matrix := READWAV("audio_noise15.wav")

Рис.59.Данные из контейнеров с добавленным шумом


Рис.60.Данные из контейнеров с добавленным шумом


Рис.61.Данные из контейнеров с добавленным шумом


Рис.62.Данные из контейнеров с добавленным шумом


Рис.63.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.56.


Рис.64.Данные из контейнеров с добавленным шумом


Рис.65.Данные из контейнеров с добавленным шумом


6.Matrix := READWAV("audio_noise20.wav")

Рис.66.Данные из контейнеров с добавленным шумом


Рис.67.Данные из контейнеров с добавленным шумом


Рис.68.Данные из контейнеров с добавленным шумом


Рис.61.Данные из контейнеров с добавленным шумом


Рис.69.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.70.


Рис.71.Данные из контейнеров с добавленным шумом


Рис.72.Данные из контейнеров с добавленным шумом


7.Matrix := READWAV("audio_noise30.wav")

Рис.73.Данные из контейнеров с добавленным шумом


Рис.74.Данные из контейнеров с добавленным шумом


Рис.75.Данные из контейнеров с добавленным шумом


Рис.76.Данные из контейнеров с добавленным шумом


Рис.77.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.78.


Рис.79.Данные из контейнеров с добавленным шумом


Рис.80.Данные из контейнеров с добавленным шумом


8.Matrix := READWAV("audio_noise40.wav")

Рис.81.Данные из контейнеров с добавленным шумом


Рис.82.Данные из контейнеров с добавленным шумом


Рис.83.Данные из контейнеров с добавленным шумом


Рис.84.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.85.


Рис.86.Данные из контейнеров с добавленным шумом


Рис.87.Данные из контейнеров с добавленным шумом


9.Matrix := READWAV("audio_noise50.wav")

Рис.88.Данные из контейнеров с добавленным шумом


Рис.89.Данные из контейнеров с добавленным шумом


Рис.90.Данные из контейнеров с добавленным шумом


Рис.91.Данные из контейнеров с добавленным шумом


Рис.92.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.93.


Рис.94.Данные из контейнеров с добавленным шумом


Рис.95.Данные из контейнеров с добавленным шумом


10.Matrix := READWAV("audio_noise75.wav")

Рис.96.Данные из контейнеров с добавленным шумом


Рис.97.Данные из контейнеров с добавленным шумом


Рис.98.Данные из контейнеров с добавленным шумом


Рис.99.Данные из контейнеров с добавленным шумом


Рис.99.Данные из контейнеров с добавленным шумом


Oshibki := Data - Data_ishod

Рис.100.


Рис.101.Данные из контейнеров с добавленным шумом


Рис.102.Данные из контейнеров с добавленным шумом


11.Matrix := READWAV("audio_noise100.wav")

Рис.103.Данные из контейнеров с добавленным шумом


Рис.104.Данные из контейнеров с добавленным шумом


Рис.105.Данные из контейнеров с добавленным шумом


Рис.106.Данные из контейнеров с добавленным шумом


Рис.107.


Oshibki := Data - Data_ishod

Рис.108.


Рис.109.Данные из контейнеров с добавленным шумом


Рис.110.Данные из контейнеров с добавленным шумом


  • Изпользование фильтра низких частот:

Matrix := READWAV(" audio_noise2.wav")
New_dim =2^22 = 4.194 x 10^6 -сделаем размер контейнера кратным степени двойки (т.к. будем использовать БПФ)
f := 0.. height - 1 
dim := 0.. New_dim - 1
Corl(dim):=0 -разобъем контейнер на два вектра,дополнив нулями до нужного размера
Cor2(dim):=0
Cor1(f):= Matrix(f,0)
Cor2(f):= Matrix(f,1)
FFTC1 := fft(Corl)
FFTC2 := fft(Cor2)
rows(FFTCl) = 2.097 x 10^6
g:= 10000..гоws(FFTCl) - 1 - выбор диапазона частот
FFTC1(g) := 0 - применение фильтра
FFTC2(g) := 0
IFFTC1 := ifft(FFTCl) 
IFFTC2 := ifft(FFTC2)
Matrix_filter(dim,0):= IFFTC1(dim)
Matrix_filter(dim,1):= IFFTC2(dim)
WRITEWAV(" audio_filter.wav" , Matrix_INFO1 , Matrix_INF02) := Matrix_filter
Matrix:= READWAV(" audio_filter.wav")

Рис.111.


Рис.112.


Рис.113.


Рис.114.


Рис.115.


R сожалению, данные не восстановились. С увеличением уровня шума встает задача правильного подбора параметров фильтра.
При данных параметрах фильтр не справился с поставленной задачей

  • Зависимость количества ошибок от уровня шума
Рис.116.-количество произошедших ошибок






-количество произошедших ошибок


Рис.117.-уровень шума






- уровень шума


Рис.118.


Результат: Данные при малом уровне шума были успешно восстановлены. Также зависимость количества ошибок от уровня шума продемонстрировала,что с увеличением уровня шума возрастает количесто ошибок. Фильтр низких частот с выбранными параметрами не смог справиться с задачей восстановления информации.

Аудио файлы

Audio_filter.wav – фильтр'


Audio_in.wav - исходный фаил




Audio_noise2.wav – noise2'


Audio_noise4.wav - noise4'




Audio_noise6.wav – noise6'


Audio_noise10.wav - noise10




Audio_noise15.wav – noise15


Audio_noise20.wav - noise20




Audio_noise30.wav – noise30


Audio_noise40.wav - noise40




Audio_noise50.wav – noise50


Audio_noise75.wav - noise75




Audio_noise100.wav – noise100


udio_out.wav - итоговый фаил




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