Здравствуйте. Реализую стеганографический метод 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);
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Доброго времени сутокНужно создать акт в word на основе данных, имеющихся на winforms
Добрый вечерКак из кода изменить слой у 3D объекта в иерархии
Доброго времени сутокПытаюсь писать диплом на тему "Разработка приложения многофакторной аутентификации для защищённой децентрализованной...