Стеганография в текстовых файлах.
⇐ ПредыдущаяСтр 3 из 3
Понятие «стеганография» означает сокрытие информации в объекте таким образом, чтобы никто и не догадался о том, что в нем что-нибудь вообще спрятали. Можно скрывать информацию в текстовых, графических, мультимедийных файлах и др. В данном пособии будут рассмотрены алгоритмы по сокрытию информации в текстовых файлах. Для начала необходимо себе представить то, что мы будем скрывать и где мы будем скрывать. Файл, где мы будем скрывать, будет текстовым и должен состоять из строк. Такой файл называется контейнером. Файл, который мы прячем, может быть любым, но для простоты реализации зададим его текстовым. Этот файл будет содержать только одну строку с одним предложением. Затем необходимо считать по байтам файл, текст который мы хотим скрыть. Будем считать данный файл байт за байтом, каждый из которых может принимать значение от 0 до 255. При каждом чтении байта необходимо десятичное значение переводить в двоичное и накапливать в какой-либо строке двоичные символы, из которых состоит файл. Например: у нас есть фраза «ABC». Считываем первый байт с символом «A». Его значение – 41h, переводим в двоичную систему счисления, получаем 1000001. Число разрядов должно быть равно восьми, поэтому слева приписываем недостающие нули – они не изменят двоичного значения: 01000001. Затем читаем второй байт с символом «B». Его значение – 42h, переводим в двоичную систему счисления, получаем 01000010. Читаем третий байт с символом «C». Его значение – 43h, переводим в двоичную систему счисления, получаем 01000011. В итоге имеем строку: «010000010100001001000011» - это двоичное представление файла с содержанием «ABC». Таким методом можно представить любой файл, хранящийся на диске. Именно так мы и будем задавать текст, который необходимо спрятать. Когда заданы данные для сокрытия, можно перейти к описанию методов сокрытия информации.
*Метод 1 Для реализации это метода необходим контейнер с большим количеством строк, в конце которых не стоит пробел. Так как для сокрытия одного бита (0 или 1) информации нам нужна одна строка и исходное сообщение содержит 15*8 (120) бит информации, для сокрытия строки, состоящей из 15 букв необходим контейнер, который будет содержать минимум 15*8 строк. Сокрытие. После того, как мы прочли файл с информацией для сокрытия и сформировали двоичную цепочку, начинаем чтение файла-контейнера по строкам. Для сокрытия всего сообщения двигаемся слева направо по двоичному ряду. Извлекаем один символ из этой цепочки и при этом читаем одну строку из контейнера. Если символ равен 1, то в конец строки дописываем пробел, иначе строку оставляем без изменений. Получившуюся строку записываем в третий файл, открытый для записи. Продолжаем сокрытие информации, пока у нас не закончится цепочка из нулей и единиц. Извлечение. На входе имеем текстовый файл со строками, читаем файл по строкам. Анализируем последний символ в каждой строке. Если символ равен пробелу, то к двоичной последовательности добавляем единицу, иначе – ноль. Когда длина последовательности доходит до восьми, осуществляем перевод из двоичной в десятичную СС и получившееся число записываем как байт в новый файл, очищая двоичную последовательность. И так до тех пор, пока не закончится файл со строками.
*Метод 2 Для реализации второго метода необходим контейнер с большим количеством пробелов. Так как для сокрытия одного бита (0 или 1) информации нам нужен один пробел и исходное сообщение содержит 15*8 (120) бит информации для сокрытия строки, состоящей из 15 букв необходим контейнер, который будет содержать минимум 15*8 пробелов.
Сокрытие. После того, как мы прочли файл с информацией для сокрытия и сформировали двоичную цепочку, начинаем чтение файла-контейнера по строкам. Для сокрытия всего сообщения двигаемся слева направо по двоичному ряду. Идем слева направо в строке файла-контейнера по символам. Как только встречаем пробел, анализируем символ из двоичной последовательности. Если символ равен 1, то пробел в строке удваивается, если ноль, то пробел остается пробелом. Когда строка файла-контейнера заканчивается, записываем измененную строку в третий файл, считываем из файла-контейнера новую строку и т.д., пока не закончится цепочка из нулей и единиц. Извлечение. На входе имеем текстовый файл со строками, читаем файл по строкам. Идем по каждой строке слева направо. Пока не конец строки, анализируем каждый символ в строке. Если текущий и следующий символы равны пробелу, то к двоичной последовательности добавляем единицу, иначе – ноль. Когда длина последовательности доходит до восьми, осуществляем перевод из двоичной в десятичную СС и получившееся число записываем как байт в новый файл, очищая двоичную последовательность. И так до тех пор, пока не закончится файл со строками.
*Метод 3 Для реализации этого метода необходим файл-контейнер, содержащий много русских букв, которые по написанию схожи с английскими. Например, А, В, С, Е, О, М, Н, Р, е, о, к, T и так далее. Можно использовать как строчные, так и заглавные буквы. Таких букв в контейнере должно быть как минимум в 8 раз больше, чем в букв в предложении, которое мы хотим скрыть. Причина – точно такая же, как и в предыдущих методах. Сокрытие. После того, как мы прочли файл с информацией для сокрытия и сформировали двоичную цепочку, начинаем чтение файла-контейнера по символам. Для сокрытия всего сообщения двигаемся слева направо по двоичному ряду. Анализируем очередной символ строки файла-контейнера. Если русский символ не имеет аналога с английским, оставляем этот символ без изменений и записываем его в третий файл. Если же имеет схожее написание с английской буквой, то смотрим на символ в двоичной последовательности. Если он равен 1, то русскую букву заменяем на английский аналог, иначе – русская буква остается русской. Записываем новый символ в третий файл. Таким образом, выполняем сокрытие, пока цепочка из нулей и единиц не закончилась.
Извлечение. На входе имеем символьный файл. Читаем файл по символам. Анализируем каждый символ. Если русский символ не имеет английских аналогов, мы его пропускаем, читая следующий символ. Если же аналог существует, то смотрим на сам символ. Для проверки принадлежности символа к русскому/английскому языку необходимо узнать код этого символа в кодировочной таблице ASCII. Как уже было выше сказано, каждый символ имеет цифровое значение или код в диапазоне от 0 до 255. Например, русская буква «а» имеет код 116, а английская буква «a» имеет код 43. Причем, следует отметить, что строчные и заглавные буквы одного алфавита имеют различные кодировки. Для того чтобы узнать, какое цифровое представление имеет тот или иной символ, следует воспользоваться функцией ord(X), где X – определенный символ. Ord(X) – возвращает номер символа (от 0 до 255) А функция char(d) возвращает по номеру соответствующий ему символ. Char(d) – возвращает символ по номеру. Вернемся к извлечению информации. Если значение функции ord(X) попадает в английский интервал (например, от 40 до 91), то очередной символ в двоичной последовательности станет равным 1. В противном случае, он равен 0. После того, когда входной файл будет полностью прочтен, сформируется двоичная цепочка. Эту цепочку следует разбит на группы из 8-ми символов (по байтам) и перевести из двоичной СС в десятичную. Затем каждый символ записать в новый выходной файл. Этот файл и будет содержать сообщение, которое было скрыто в файле-контейнере.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|