Стеганографический метод
|
Краткая характеристика
метода
|
Недостатки
|
Преимущества
|
Методы сокрытия информации
в аудиоконтейнерах
|
Метод сокрытия в наименьших
значащих битах
|
Основан на записи сообщения
в наименьшие значащие биты исходного сигнала. В качестве контейнера
используется, как правило, несжатый аудиосигнал
|
Невысокая скрытность
передачи сообщения. Низкая устойчивость к искажениям. Используется только для
определенных форматов аудио-файлов
|
Достаточно высокая емкость
контейнера (до 25 %)
|
Метод сокрытия на основе
распределения по спектру
|
Основан на генерации
псевдослучайного шума, являющегося функцией внедряемого сообщения, и
подмешивании полученного шума к основному сигналу-контейнеру в качестве
аддитивной составляющей. Кодирование потоков информации путем рассеяния
кодированных данных по спектру частот
|
Низкий коэффициент
использования контейнера. Значительные вычислительные затраты
|
Сравнительно высокая
скрытность сообщения
|
Основан на использовании в
качестве шумоподобного сигнала самого аудиосигнала, задержанного на различные
периоды времени в зависимости от внедряемого сообщения («дозвоночного эха»)
|
Низкий коэффициент
использования контейнера. Значительные вычислительные затраты
|
Сравнительно высокая
скрытность сообщения
|
Метод сокрытия в фазе
сигнала
|
Основан на факте
нечувствительности уха человека к абсолютному значению фазы гармоник.
Аудио-сигнал разбивается на последовательность сегментов, сообщение
встраивается путем модификации фазы первого сегмента
|
Малый коэффициент
использования контейнера
|
Обладает значительно более
высокой скрытностью, чем методы сокрытия в НЗБ
|
Методы сокрытия информации
в текстовых контейнерах
|
Метод сокрытия на основе
пробелов
|
Основан на вставке пробелов
в конце строчек, после знаков препинания, между словами при выравнивании
длины строк
|
Методы чувствительны к
переносу текста из одного формата в другой. Возможна потеря сообщения.
Невысокая скрытность
|
Достаточно большая
пропускная способность
|
Метод сокрытия на основе
синтаксических особенностей текста
|
Основан на том, что правила
пунктуации допускают неоднозначности при расстановке знаков препинания
|
Очень низкая пропускная
способность. Сложность детектирования сообщения
|
Существует потенциальная
возможность подобрать такой метод, при котором потребуются весьма сложные
процедуры для раскрытия сообщения
|
Метод сокрытия на основе
синонимов
|
Основан на вставке
информации в текст при помощи чередования слов из какой-либо группы синонимов
|
Сложен применительно к
|
Один из наиболее
|
|
|
русскому языку в связи с
большим разнообразием оттенков в разных синонимах
|
перспективных методов.
Обладает сравнительно высокой скрытностью сообщения
|
Метод сокрытия на основе
использования ошибок
|
Основан на маскировке
информационных битов под естественные ошибки, опечатки, нарушения правил
написания сочетаний гласных и согласных, замене кириллицы на аналогичные по
внешнему виду латинские буквы и др.
|
Невысокая пропускная
способность. Быстро вскрывается при статистическом анализе.
|
Весьма прост в применении.
Высокая скрытность при анализе человеком
|
Метод сокрытия на основе
генерации квазитекста
|
Основан на генерации
текстового контейнера с использованием набора правил построения предложений.
Используется симметричная криптография
|
Невысокая пропускная
способность. Бессмысленность созданного текста
|
Скрытность определяется
методами шифрования и, как правило, весьма высока
|
Метод сокрытия на основе
использования особенностей шрифта
|
Основан на вставке
информации за счет изменения типа шрифта и размера букв, а также на
возможности встраивания информации в блоки с неизвестными для браузера
идентификаторами
|
Легко выявляется при
преобразовании масштаба документа, при статистическом стегоанализе
|
Высокий коэффициент
использования контейнера
|
Метод сокрытия на основе
использования кода документа и файла
|
Основан на размещении
информации в зарезервированных и неиспользуемых полях переменной длины
|
Низкая скрытность при
известном формате файла
|
Прост в применении
|
Метод сокрытия на основе
использования жаргона
|
Основан на изменении
значений слов
|
Низкая пропускная
способность. Узко специализирован. Низкая скрытность
|
Прост в применении
|
Метод сокрытия на основе
использования чередования длины слов
|
Основан на генерации текста
-контейнера с формированием слов определенной длины по известному правилу
кодирования
|
Сложность формирования
контейнера и сообщения
|
Достаточно высокая
скрытность при анализе человеком
|
Метод сокрытия на основе
использования первых букв
|
Основан на внедрении
сообщения в первые буквы слов текста с подбором слов
|
Сложность составления
сообщения. Низкая скрытность сообщения
|
Дает большую свободу выбора
оператору, придумывающему сообщение
|
Методы сокрытия информации
в графических контейнерах
|
Метод сокрытия в наименьших
значащих битах
|
Основан на записи сообщения
в наименьшие значащие биты исходного изображения
|
Невысокая скрытность
передачи сообщения. Низкая устойчивость к искажениям
|
Достаточно высокая емкость
контейнера (до 25 %)
|
Метод сокрытия на основе
модификации индексного формата представления
|
Основан на редукции
(замене) цветовой палитры и упорядочивании цветов в пикселях с соседними
номерами
|
Применяется преимущественно
к сжатым изображениям. Невысокая скрытность передачи сообщения
|
Сравнительно высокая
емкость контейнера
|
Метод сокрытия на основе использования
автокорреляцион-ной функции
|
Основан на поиске с
применением автокорреляционной функции областей, содержащих сходные данные
|
Сложность расчетов
|
Устойчивость к большинству
нелинейных преобразований контейнера
|
Метод сокрытия на основе
использования нелинейной модуляции встраиваемого сообщения
|
Основан на модуляции
псевдослучайного сигнала сигналом, содержащим скрываемую информацию
|
Низкая точность
детектирования. Искажения
|
Достаточно высокая
скрытность сообщения
|
Метод сокрытия на основе
использования знаковой модуляции встраиваемого сообщения
|
Основан на модуляции
псевдослучайного сигнала биполярным сигналом, содержащим скрываемую
информацию
|
Низкая точность
детектирования. Искажения
|
Метод сокрытия на основе вейвлет-преобразования
|
Основан на особенностях
вейвлет-преобразований
|
Сложность расчетов
|
Высокая скрытность
|
Метод сокрытия на основе
использования дискретного косинусного преобразования
|
Основан на особенностях
дискретного косинусного преобразования
|
Сложность расчетов
|
Высокая скрытность
|
В настоящее время существует целый ряд как
коммерческих, так и бесплатных программных продуктов, доступных обычному
пользователю, реализующих известные стеганографические методы сокрытия
информации. При этом преимущественно используются графические и
аудио-контейнеры. В нетрадиционных информационных каналах, основанных на
манипуляции различных характеристик ресурсов ИСПДн, используются для передачи
данных некоторые разделяемые ресурсы. При этом в каналах, использующих временные
характеристики, осуществляется модуляция по времени занятости разделяемого
ресурса (например, модулируя время занятости процессора, приложения могут
обмениваться данными). В каналах памяти ресурс используется как промежуточный
буфер (например, приложения могут обмениваться данными путем помещения их в
имена создаваемых файлов и директорий). В каналах баз данных и знаний
используют зависимости между данными, возникающими в реляционных базах данных и
знаний.
Нетрадиционные информационные каналы могут быть
сформированы на различных уровнях функционирования ИСПДн: на аппаратном уровне;
на уровне микрокодов и драйверов устройств; на уровне операционной системы; на
уровне прикладного программного обеспечения; на уровне функционирования каналов
передачи данных и линий связи. Эти каналы могут использоваться как для скрытой
передачи скопированной информации, так и для скрытной передачи команд на
выполнение деструктивных действий, запуска приложений и т.п. Для реализации
каналов, как правило, необходимо внедрить в автоматизированную систему
программную или программно-аппаратную закладку, обеспечивающую формирование
нетрадиционного канала. Нетрадиционный информационный канал может существовать
в системе непрерывно или активизироваться одноразово или по заданным условиям.
При этом возможно существование обратной связи с субъектом НСД.[6]
3. Метод сокрытия информации в наименьших значащих
битах (LSB) графических контейнеров
LSB (Least Significant Bit, наименьший значащий бит). Суть этого метода заключается в
замене последних значащих битов в контейнере (изображения, аудио или
видеозаписи) на биты скрываемого сообщения.
Разница между пустым и заполненным контейнерами должна
быть не ощутима для органов восприятия человека [1]. Для простоты описания
можно рассмотреть принцип работы этого метода на примере 24-битного растрового
RGB-изображения. Одна точка изображения в этом формате кодируется тремя
байтами, каждый из которых отвечает за интенсивность одного из трех
составляющих цветов (в соответствии с рисунком 1)
Рисунок 1. Представление цвета пикселя в 24-битном bmp-изображении
В результате смешения цветов из красного (R), зеленого
(G) и синего (B) каналов пиксель получает нужный оттенок. Чтобы нагляднее
увидеть принцип действия метода LSB, распишем каждый из трех байтов в битовом
виде. Младшие разряды (на рисунке они расположены справа) в меньшей степени
влияют на итоговое изображение, чем старшие. Из этого можно сделать вывод, что
замена одного или двух младших, наименее значащих битов, на другие произвольные
биты настолько незначительно исказит оттенок пикселя, что зритель просто не
заметит изменения.
Допустим, нам нужно скрыть в данной точке изображения
шесть бит: 101100. Для этого разобьем их на три пары и заместим ими по два младших
бита в каждом канале (в соответствии с рисунком 2, 3).
Рисунок 2. Исходные и измененные компоненты цвета
Рисунок 3. Цвет пикселя с внедренными данными
В результате мы получим новый оттенок, очень похожий
на исходный (см. рис. 3). Эти цвета трудно различить даже на большой по площади
заливке. Как показывает практика, замена двух младших битов не воспринимается
человеческим глазом. В случае необходимости можно занять и три разряда, что
весьма незначительно скажется на качестве картинки.
Теперь можно посчитать полезный объем такого
RGB-контейнера. Занимая два бита из восьми на каждый канал, мы будем иметь
возможность спрятать три байта полезной информации на каждые четыре пикселя
изображения, что соответствует 25% объема картинки. Таким образом, имея файл
изображения размером 200 Кбайт, мы можем скрыть в нем до 50 Кбайт произвольных
данных так, что невооруженному глазу эти изменения не будут заметны.
Все BMP контейнеры нужно разделить на два класса:
«чистые» и зашумленные. В «чистых» картинках прослеживается связь между младшим
битом, который подвергается изменениям, и остальными 7-ю битами элементов
цвета, а также видна зависимость самих младших битов между собой. Внедрение сообщения
в «чистую» картинку разрушает существующие зависимости, что очень легко
выявляется наблюдателем. Если же картинка зашумлена (например, получена со
сканера или фотокамеры), то определить вложение становиться намного сложнее.
Таким образом, в качестве файлов-контейнеров для метода LSB рекомендуется
использовать файлы, которые не были созданы на компьютере изначально. [3]
Преимущества метода:
) размер файла-контейнера остается неизменным;
) при замене одного бита в канале синего цвета
внедрение невозможно заметить визуально;
) возможность варьировать пропускную
способность, изменяя количество заменяемых бит.
Недостатки метода:
) метод неустойчив к обработке
файла-контейнера.
4. Алгоритм и блок-схема работы программы, реализующей
метод LSB в BMP-файлах
Блок-схема файла encode.py
Описание блок-схемы файла encode.py
. Начало
. Подключение библиотек
. Инициализация переменных
. Ввод пути хранения картинки
. Ввод текста, который необходимо спрятать
6. Ввод пути сохранения картинки с зашифрованным текстом
7. Исходя из правильности ввода данных, выбирается тип действия
.1 Корректно
.1.1 Открыть картинку
.1.2 Чтение заголовка картинки без перезаписи
.1.3 Перебор символ за символом и запись в наименее значимый бит
.1.4 Добавление разделителя
.1.5 Сохранение полученного изображения
.2 Некорректно
.2.1 Завершение работы программы
. Конец
Описание блок-схемы файла decode.py
. Начало
. Подключение библиотек
. Инициализация переменных
. Ввод пути хранения картинки
. Исходя из правильности ввода данных, выбирается тип действия
.1 Корректно
.1.1 Открыть картинку
.1.2 Чтение заголовка картинки без перезаписи
.1.3 Перебор символ за символом, поиск разделителя и выбор значения,
стоящего перед разделителем
.1.4 Вывод оригинального текста на экран
.1.5 Закрытие картинки
.2 Некорректно
.2.1 Завершение работы программы
. Конец
Заключение
В ходе курсового проекта были изучены базовая модель угроз персональных данных,
обрабатываемых в информационных системах персональных данных, актуальность
вопроса защиты персональных данных, метод цифровой стеганографии LSB (Least
Significant Bit, наименьший значащий бит) и возможность его реализации на языке
программирования Python. Была
разработана программа реализующая сокрытие информации в наименее значимый бит
растрового изображения формата BMP.
Данная программа позволяет скрыть персональные данные и показала устойчивость к
визуальным атакам.
Список литературы
. Методика определения актуальных угроз (ФСТЭК-2008)
. Обзор современных алгоритмов стеганографии
. Актуальность защиты персональных данных [Электронный
ресурс]. - Режим доступа - http://www.ifru.ru/6701/ (дата обращения: 02.04.15)
. ПП РФ от 1 ноября 2012 г. N 1119 “ Об утверждении
требований к защите персональных данных при их обработке в информационных
системах персональных данных”
6. Базовая модель угроз
безопасности персональных данных при их обработке в информационных системах
персональных данных (ФСТЭК России, 2008 год
<http://fstec.ru/tekhnicheskaya-zashchita-informatsii/dokumenty/114-spetsialnye-normativnye-dokumenty/379-bazovaya-model-ugroz-bezopasnosti-personalnykh-dannykh-pri-ikh-obrabotke-v-informatsionnykh-sistemakh-personalnykh-dannykh-vypiska-fstek-rossii-2008-god>)
Приложение
encode.py
# -*- coding: utf-8 -*- # установка используемой
кодировки
import sys # подключение
библиотеки
import argparse # подключение библиотеки
from argparse import ArgumentParser # подключение библиотеки
# Константы
HEADER_SIZE = 54 # Размер заголовка в BMP
DELIMITER = "$" # объявление разделителя
# Ввод информации пользователем
TextToHide = raw_input("Input secret text: ") #
переменная с шифруемым текстом
ImageFile = raw_input('Open bmp file: ') # переменная с
путем для открытия картинки
StegImageFile = raw_input('Save secret bmp to: ') # переменная, в
которой хранится путь, где будет сохранена зашифрованная картинка
class LSBEncrypter(object): # объявление
класса
def __init__(self): # объявление
конструктора
self.image_byte_counter = 0 # объявление
переменной с начальным значением ‘0’
self.new_image_data = '' # объявление
пустой переменной
self.original_image = '' # объявление
пустой переменной
self.text_to_hide = '' # объявление
пустой переменной
def open_image(self): # функция,
открывающая картинку
with open(ImageFile, "rb") as f: #
открытие файла с флагами
rb.original_image = f.read() # чтение байтов картинки read_header(self): # функция,
считывающая каждый байт по очереди
for x in range(0, HEADER_SIZE): # Цикл, перебирающий все байты
.new_image_data += self.original_image[x] # присвоение пустой переменной значения текущего байта.image_byte_counter
+= 1 # инкрементhide_text_size(self):
# функция, определяющая длину шифруемого текста = len(self.text_to_hide) # переменная,
содержащая длину шифруемого текста
s_sz = str(sz) # приведение
переменной к типу string
s_sz += DELIMITER # s_sz равна величине
текста, который скрываем c прибавлением разделителя
self.do_steg(s_sz) # вызов функции do_steg
# Сокрытие текста в картинку в самый незначимый бит
def do_steg(self, steg_text): # Функция,
принимающая на вход 2 параметра
for ch in range(0, len(steg_text)): # Перебираем
символ за символом в тексте, который прячем
current_char = steg_text[ch] # получаем текущий
символ
current_char_binary = '{0:08b}'.format(ord(current_char)) # Получает
двоичное значение текущего символа
# перебираем бит за битом в текущем бинарном символе
for bit in range(0, len(current_char_binary)):_byte_binary
= ''_image_binary =
'{0:08b}'.format(ord(self.original_image[self.image_byte_counter])); # # бинарное значение байтов оригинального текста_byte_binary = current_image_binary[:7] # #Возвращает
двоичное значение исходного байта изображения
new_byte_binary += current_char_binary[bit] # Заменяет
последний бит на наш бит
new_byte = chr(int(new_byte_binary, 2)) # Получаем
значение в переменную new_byte
self.new_image_data += new_byte # Добавление нового
байта в вывод
self.image_byte_counter += 1 # инкремент
def copy_rest(self): # функция,
копирующая то, что осталось от файла
self.new_image_data += self.original_image[self.image_byte_counter:] # присвоение
переменной значение остаточного текста
def close_file(self): # функция, сохраняющая
полученную картинку
with open(StegImageFile, "wb") as
out: .write(self.new_image_data) # сохранение картинкиrun(self,
stega_text): # функция, выполняющая процесс сокрытия.text_to_hide =
stega_text # присвоение переменной значения stega_text.open_image() # вызов функции,
открывающую картинку
self.read_header() # вызов функции,
считывающая байты заголовка, при этом не изменяя его
self.hide_text_size() # вызов функции,
которая определяет длину шифруемого текста
self.do_steg(self.text_to_hide) # вызов функции,
записывающая информацию в последний незначимый бит
self.copy_rest() # вызов функции,
копирующей остаток картинки
self.close_file() # вызов функции,
которая сохраняет зашифрованную картинку
def main(): # Объявление
аргументов командной стоки
global TextToHide # Объявление
глобальной переменной
stega_instance = LSBEncrypter() # присвоение
переменной результат выполнения класса
stega_instance.run(TextToHide) # выполнении
функции
print "Successfully finished hiding text" # вывод
надписи при успешном выполнении функции.
if __name__ == '__main__': # конструктор,
определяющий начало работы программы
main() # вызов main
decode.py
# -*- coding: utf-8 -*- # установка
используемой кодировки
import argparse
#
подключение библиотеки
from argparse
import ArgumentParser # подключение
библиотеки
import binascii
#
подключение библиотеки
# Определение констант
HEADER_SIZE = 54 # Размер заговолка в BMP
DELIMITER = "$" # Разделитель
StegImageFile = raw_input('Path to secret image: ') # переменная, хранящая путь до картинки с
зашифрованным текстом
class LSBDecrypter: #
объявление класса
def __init__(self): # объявление
конструктора
self.fh = open(StegImageFile, 'rb') # открытие картинки
self.number_of_chars_in_text = 0 # начальное значение длины зашифрованного текста
self.original_text = '' # переменная, хранящая скрытый текст
for i in range(0, HEADER_SIZE): #
Цикл, перебирающий все байты = self.fh.read(1) # присвоение байтов в переменную
def get_char(self): # объявление функции, получающая последний
незначимых бит из текста 8 байт и ассемблирует байты из него
new_byte = '' # объявление переменной
for bit in range(0, 8): # объявление цикла
byte =
self.fh.read(1) # чтение
значения последнего незначимого бита
new_byte += str(ord(byte) & 0x01) # присвоение значение последнего незначимого бита
n = int(new_byte,
2) # приведение к типу integer
desteg_char = binascii.unhexlify('%x' % n) #
конвертация бинарного вида в ASCII
return desteg_char # возврат зашифрованного текста
def get_text_size(self):
# функция, получающая длину скрытого текста
curr_ch = self.get_char() # присвоение текущего символа
s_sz = '' # объявление переменной
while curr_ch != DELIMITER: # цикл, перебирающий значения, пока
не будет найден разделитель
s_sz += curr_ch #
присвоение текущего символа
curr_ch = self.get_char() # присвоение текущего символа
if (s_sz != ''): # Условие, если переменная не пустая
self.number_of_chars_in_text = int(s_sz) # тогда привести
s_sz к типу integer и присвоить значение read_stega_text(self): # функция, читающая весь скрытый
текс в изображении
decoded_chars = 0; # объявление переменнойdecoded_chars <
self.number_of_chars_in_text: # объявление цикла.original_text += self.get_char() # присвоение переменной скрытого текста
decoded_chars += 1 # инкремент
def close_file(self): # функция, закрывающая картинку
self.fh.close(); # Закрытие картинки
def get_text(self): # функция, выполняющая извлечение скрытого текста
self.read_header() # вызов функции
self.get_text_size()
# вызов функции
self.read_stega_text() # вызов функции.close_file() # вызов функцииself.original_text
# возвращает оригинальный текст main():#
Объявление аргументов командной стоки
destag_insta = LSBDecrypter() # присвоение
переменной результат выполнения класса
text =
destag_insta.get_text() # присвоение
переменной text значения оригинального текста
print
"Successfully decoded, text is: {}".format(text) # при успешном выполнении вывод надписи, сообщающая
корректное завершение.
if __name__ == '__main__': # конструктор,
определяющий начало работы программы
main() # вызов main