Стеганография WAV файла

214
28 февраля 2018, 06:17

Здравствуйте. Реализую стеганографический метод LSB для WAV файла. Подскажите, пожалуйста, как доработать мой класс, чтобы вставка происходила согласно данному методу (замена битов файла битами сообщения)? У меня же происходит замена значений аудио файла на байты сообщения, что является некорректным:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using Steganography.Media;

namespace Steganography
{
[Serializable]
//в этом классе скрываем и извлекаем шифруемое сообщение
class HideAndExtract
{
    private WavAudio _file;
    private List<byte> _bits;
    //инициализируем объект класса с помощью класса WavAudio
    public HideAndExtract(WavAudio file)
    {
        _file = file;
    }        
    скрываем сообщение в левом и правом потоках аудиофайла
    public void HideMessage(string message)
    {
        //получаем каналы из файла WaveAudio
        List<short> leftStream = _file.GetLeftStream();
        List<short> rightStream = _file.GetRightStream();
        //скрываем сообщения в потоках
        //преобразовываем сообщение в массив байт
        byte[] bufferMessage = Encoding.UTF8.GetBytes(message);
        short tempBit;
        //место - индекс, который будет идти по сообщению
        int bufferIndex = 0;
        //длина сообщения
        int bufferLength = bufferMessage.Length;
        //длина аудио (длина левого канала равна длине правого канала)
        int channelLength = leftStream.Count;
        //блок хранения сообщения. Это значение равно 1. Если оно не равно 1, то длина шифруемого сообщения больше, чем длина исходного аудиофайла
        int storageBlock = (int)Math.Ceiling((double)bufferLength / (channelLength * 2));
        //если длина сообщения больше, чем длина аудиоканала
        if (bufferLength > channelLength)
            throw new Exception();           
        //сохраняем информацию о длине шифруемого сообщения в первых элементах левого и правого потоков аудиофайла
        //берем целую часть размера сообщения и записываем первым элементом в левом канале
        leftStream[0] = (short)(bufferLength / 32767);
        //берем остаток размера сообщения и записываем первым элементом в правом канале
        rightStream[0] = (short)(bufferLength % 32767);
        var countBufferMessage = 0;
        //идем по длине потока, начиная с 1, так как в [0] хранится длина сообщения; сохраняем бит сообщения в левый и правый потоки 
        for (int i = 1; i < leftStream.Count && countBufferMessage < bufferMessage.Length; i++)
        {
            //берем остаток от деления на 8, так как работаем с битами; также работаем с цифрой 7, так как диапазон [0..7]
            if (bufferIndex < bufferLength && i % 8 > 7 - storageBlock && i % 8 <= 7)
            {
                //получаем бит сообщения
                tempBit = bufferMessage[bufferIndex++];
                //заменяем бит аудиоданных битом сообщения
                //leftStream.Insert(i, tempBit);
                leftStream[i] = tempBit;
                countBufferMessage++;
            }
            if (bufferIndex < bufferLength && i % 8 > 7 - storageBlock && i % 8 <= 7)
            {
                tempBit = bufferMessage[bufferIndex++];
                //rightStream.Insert(i, tempBit);
                rightStream[i] = tempBit;
                countBufferMessage++;
            }
        }
        //в потоках теперь есть введенное сообщение. Обновляем потоки исходного WAV - файла
        _file.UpdateStreams(leftStream, rightStream);
    }
    public string ExtractMessage()
    {
        if (bufferLength > channelLength)
            throw new Exception();
        //получаем каналы из файла WaveAudio
        List<short> leftStream = _file.GetLeftStream();
        List<short> rightStream = _file.GetRightStream();
        //извлекаем сообщение из потоков и отображаем в соответствующем поле
        //индекс в шифруемом сообщении
        int bufferIndex = 0;
        //целая часть длины шифруемого сообщения
        int messageLengthQuotient = leftStream[0];
        //дробная часть длины шифруемого сообщения
        int messageLengthRemainder = rightStream[0];
        //длина аудиоканалов
        int channelLength = leftStream.Count;
        //вычисляем исходную длину шифруемого сообщения
        int bufferLength = 32767 * messageLengthQuotient + messageLengthRemainder;
        //блок хранения сообщения. Это значение равно 1. Если оно не равно 1, то длина шифруемого сообщения больше, чем длина исходного аудиофайла
        int storageBlock = (int)Math.Ceiling((double)bufferLength / (channelLength * 2));
        //создаем сообщение - массив байт
        byte[] bufferMessage = new byte[bufferLength];
        //идем по длине потока, начиная с 1, так как в [0] хранится длина сообщения; сохраняем бит сообщения в левый и правый потоки 
        for (int i = 1; i < leftStream.Count; i++)
        {
            //берем остаток от делания на 8, так как работаем с битами; также работаем с цифрой 7, так как диапазон [0..7]
            if (bufferIndex < bufferLength && i % 8 > 7 - storageBlock && i % 8 <= 7)
            {
                //получаем биты сообщения из левого и правого каналов
                bufferMessage[bufferIndex++] = (byte)leftStream[i];
                if (bufferIndex < bufferLength)
                    bufferMessage[bufferIndex++] = (byte)rightStream[i];
            }
        }
        //преобразовываем массив байт в строковое сообщение и возвращаем его
        return Encoding.UTF8.GetString(bufferMessage);
    }
}

}

READ ALSO
Создание акта в word C#

Создание акта в word C#

Доброго времени сутокНужно создать акт в word на основе данных, имеющихся на winforms

214
Как динамически изменить слой у объекта в unity?

Как динамически изменить слой у объекта в unity?

Добрый вечерКак из кода изменить слой у 3D объекта в иерархии

416
Как задать модель для шаблона?

Как задать модель для шаблона?

Есть сайт на ASPNet Core MVC

199
Защищённая децентрализованная сеть

Защищённая децентрализованная сеть

Доброго времени сутокПытаюсь писать диплом на тему "Разработка приложения многофакторной аутентификации для защищённой децентрализованной...

168