typedef struct {

       byte id[4];

       long len;

} IDRiff;

id - идентификатор файла = "RIFF" = 0x46464952;

len  - длина файла без этого заголовка.

Область данных имеет переменную длину, однако она должна быть выравнена на границу слова и при необходимости дополнена в конце нулевым байтом до целого числа слов.

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


WAV заголовок и его структура

Затем идет структура WAV заголовока:

typedef struct {

       byte id[4]; 

       byte fmt[4];

       long len;

} IDChuckWave;

id  - идентификатор = "WAVE" = 0x45564157;

fmt  - идентификатор = "fmt " = 0x20746D66;

len - длина куска WAV – файла.

Далее описывается структура WAVEFORMAT:

typedef struct waveformat_tag {

  word wFormatTag;

  word nChannels;

  dword nSamplesPerSec;

  dword nAvgBytesPerSec;

  word nBlockAlign;

} WAVEFORMAT;

wFormatTag - описывает тип формата звуковых данных;

nChannels - содержит количество каналов. В нем могут находиться значение 1 (моно) или 2 (стерео);

nSamplesPerSec - записана частота дискретизации, то есть количество выборок сигнала в секунду. В этом поле могут находиться стандартные значения (11025 кГц, 22 050 кГц или 44100 кГц) либо нестандартные значения, такие, как 5000 кГц или 4400 кГц;

НЕ нашли? Не то? Что вы ищете?

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

nAvgBytesPerSec = (nChannels * nSamplesPerSec * wBitsPerSanipIe) / 8;

nBlockAlign находится выравнивание блока в байтах, которое подсчитывается по формуле:

nBlockAlign = (nChannels * wBitsPerSample) / 8;

Поле wBitsPerSainple находится в структуре PCMWAVEFORMAT и содержит дискретность сигнала, то есть количество бит, используемых для представления одной выборки сигнала. Обычно используются значение 8 или 16.


Заголовок данных

Выглядит в следующем формате:

typedef struct {

  byte id[4];

  long len; 

} IDSampleWave;

id - идентификатор ="data" =0x61746164;

len - длина выборки (кратно 2).



Звуковые данные

Далее идут сами данные звукового файла. Если файл 2-х канальный, то данные идут по очереди, 1 канал, 2-ой, 1-ый, 2-ой... и т. д. Необходимо также помнить, что если файл 8 битный, то под каждый сэмпл отводится по одному байту, если же 16 битный - то по 2 байта. В конце файла иногда бывает некоторая дополнительная информация о WAV файле (имя Автора и т. д.).



Алгоритмы шифрования и дешифрования информации в стегоконтейнере

3.1. Алгоритм шифрования информации в стегоконтейнере

1. Загружаем WAV-файл.

2. Определяется позиция начала звуковых данных.

3. Определяется количество семплов.

4. Определяем количество байтов в Исходном Тексте.

5. В первые сорок семплов запишем количество символов Исходного Текста.

6. Определяем позицию смещения для записи в биты.

7. Организовываем два цикла:

- Внешний: обход по битам семплов;

- Внутренний: обход по битам символа.

8. В циклах заменяем последний бит семпла инверсией бита текста последовательно (т. е. если бит текста равен 1, то в бит семпла записываем 0). Пропуская при этом последние биты семплов, которые попали под область смещения.

9. Сохраняем полученный результат.

3.2. Алгоритм дешифрования информации из стегоконтейнера

Загружаем WAV-файл. Определяется позицию начала звуковых данных. Из первых сорок семплов считываем последние биты, преобразовав их, получаем количество символов Исходного Текста. Определяем позицию смещения для считывания нужных битов семплов. Организуем цикл обхода по битам семплов, учитывая при этом смещение. Количество итераций в цикле равно количеству символов умноженное на восемь. Применяем инверсию к полученным последним битам. Сохраняем полученный результат.

3.3. Ограничение на использование данного алгоритма

Сообщение не должно превосходить размер WAV-файла. В сообщении должны использоваться только символы кириллицы, латиницы, а также цифры от 0 до 9. Контейнер не имеет сжатия. В контейнере должно выделяться 8 бит на семпел.
Программная реализация

Программный код написан на языке С++. В программе используется структура Wav-файла, описанная выше:

struct WAVHEADER

{

       byte chunkId[4];//Содержит символы "RIFF" в ASCII кодировке

         unsigned long chunkSize; //это размер файла

         byte format[4];// Содержит символы "WAVE"

         byte subchunk1Id[4]; // Содержит символы "fmt "

         unsigned long subchunk1Size;// размер подцепочки

         unsigned short audioFormat;// Формат сжатия

unsigned short numChannels;// Количество каналов

         unsigned long sampleRate; // Частота дискретизации

         unsigned long byteRate;

         unsigned short blockAlign;// Количество байт для одного семпла

         unsigned short bitsPerSample;// Точность звучания

byte subchunk2Id[4];// Содержит символы "data"

         unsigned long subchunk2Size;// Количество байт в области данных.

         // Далее следуют непосредственно Wav-данные.

};

Используются следующие функции:

    ByteToBinary - разбивает исходный Байт на биты. Возвращает массив из восьми элементов. Каждый N-й элемент соответствует N-му биту. Принимает значения 1 или 0; Power – функция, возводит в степень значения CheckWavFile - функция проверяет, подходит ли исходный файл для работы над ним программы; Inversion – функция инвертирует биты, т. е. 1->0, а 0->1 GetBitValue - Получает значение N-ого бита в байте B. Возвращает 1 или 0 (в зависимости от значения Бита). Функция используется в функции ReadBitToByte; BinaryToByte - Собирает из массива битов один целый байт и возвращает его; ReadBitToByte - Записывает в байт B на последнюю позицию бит Bit; Mass - преобразовывает десятиричное число в двоичную систему счисления и на выходе получаем массив; QuantitySymbol  – преобразовывает двоичное число в десятеричную систему счисления;

В программе также содержится две основные функция для шифрования текста в звуковой файл encrypt() и функция для извлечения текста из звукового файла decrypt().

Программный код представлен в

Результаты работы программы представлены в ПРИЛОЖЕНИИ Б.



Результаты работы программы

Искажения, вносимые методом замены наименьшего значащего бита в реальном звуковом сигнале, можно визуально обнаружить путем анализа спектра сигнала. Проверка слышимости искажений (другими словами, возможности обнаружения вложений) была проведена визуально с помощью звукового редактора Audacity 1.3.

В качестве контейнера использовался звуковой файл, который содержал запись инструментального симфонического произведения. В ПРИЛОЖЕНИИ Б на рисунке 1 изображен спектр пустого контейнера, а на рисунке 2 изображен спектр с заменой последнего младшего бита. Для сравнения на рисунке 3 представлен спектр с заменой 4-го бита и на рисунке 4 спектр с заменой 6-го бит.

Внедрение в самые младшие разряды не вносило заметных искажений. Изменения в средних битах надежно выявлялись путем анализа спектра, но плохо различались на слух. При внедрении информации в старшие биты искажения были различимыми даже на слух. Наиболее заметные искажения обнаруживались на участках с низким уровнем звукового сигнала («полная тишина»). Если исключить внедрение информации на участках с низким уровнем громкости, то для внедрения можно использовать последние два бита. При этом изменения спектра с помощью звукового редактора Audacity 1.3 визуально зарегистрировать нельзя.



Устойчивость разработанного алгоритма к стегоанализу

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

Известно, что файлы аудио форматов могут служить хорошим контейнером для стеганографической передачи данных, так как обладают необходимой информационной избыточностью. Одним из широко используемых методов стеганографии для аудио-файлов является перезапись его младших бит. Визуально звуковой файл при этом не изменяется, особенно если в качестве контейнера выбран звуковой файл с низкочастотным шумом, то есть информационно нагруженное. Это в значительной степени осложняет работу стегоаналитика, если он не обладает специальными средствами стегоанализа.

Метод звукового анализа является самым простым способом анализа звуковых файлов, поскольку для этого достаточно просто прослушать аудио-файл. Тем не менее, этот метод анализа уже способен установить некоторые ограничения на объем скрываемых данных. Так, для аудиосигналов в формате WAV незаметными для человеческого слуха будут искажения менее 10%. Если в результате скрытия в аудиосигналах возникают незначительные искажения, то их можно объяснить применением процедуры сжатия.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4