Стеганография — это междисциплинарная наука и искусство передавать сокрыты еданные, внутри других, не сокрытых данных. Скрываемые данные обычно называют стегосообщением, а данные, внутри которых находится стегосообщение называют контейнером [1].
Изучение стеганографии проходит в рамках дисциплин связанных с программированием и разбором криптографических принципов шифрования.
Классическая задача стеганографии — передать данные таким образом, чтобы противник не догадался о самом факте появления сообщения и именно это и отличает ее от криптографии, в рамках которых известно что сообщение существует.
Учащиеся узнают, что на сегодняшний день учеными разработаны и опробованы различные алгоритмы и методы стеганографии, среди которых особо выделим следующие:
Компьютерная стеганография на основе использование регистра букв. Если нам необходимо спрятать букву "А" в тексте "stenography". Для этого берем двоичное представление кода символа "А" — "01000001". Пускай для обозначения бита содержащего единицу используется символ нижнего регистра, а для нуля — верхнего. Поэтому после накладывания маски "01000001" на текст "stenography", результат будет "sTenogrAphy". Окончание "phy" нами не использовано поскольку для сокрытия одного символа используется 8 байт (по биту на каждый символ), а длинна строки 11 символов, вот и получилось, что последние 3 символа "лишние". Исспользуя такую технологию можно спрятать в текст длинной N, сообщение из N/8 символов) [2].
LSB-стеганография (сообщение скрывается в младших битах (возможно использование одного или нескольких младших бит) контейнера. Чем меньше бит задействовано, тем меньше артефактов получает оригинальный контейнер после внедрения.
Метод, основанный на сокрытии данных в коэффициентах дискретного косинусного преобразования (далее ДКП) — разновидность предыдущего метода, которая активно используется, например, при внедрении сообщения в контейнер формата JPEG. При прочих равных, такой контейнер имеет несколько меньшую емкость чем в предыдущем методе, в том числе за счет того, что коэффициенты «0» и «1» остаются неизменными— внедрение сообщения в них невозможно.
Метод сокрытия информации при помощи младших бит палитры— этот метод по сути является вариантом общего метода LSB, но информация встраивается не в наименее значащие биты контейнера, а в наименее значащие биты палитры, очевидный недостаток такого метода — низкая емкость контейнера.
Метод сокрытия информации в служебных полях формата — довольно простой метод, основанный на использовании служебных полей заголовка контейнера для хранения сообщения. Очевидные минусы — низкая емкость контейнера и возможность обнаружения внедренных данных при помощи обычных программ для просмотра изображения (которые иногда позволяют видеть содержимое служебных полей).
Метод встраивания сообщения — заключается в том, что сообщение встраивается в контейнер, затем при помощи схемы, известной обеим сторонам, извлекается. Можно встроить несколько сообщений в один контейнер, при условии, что способы их внедрения ортогональны.
Широкополосные методы, которые подразделяются на: метод псевдослучайной последовательности; используется секретный сигнал, который моделируется псевдослучайным сигналом; метод прыгающих частот: частота несущего сигнала меняется по определенному псевдослучайному закону.
Метод оверлея — по сути не является настоящей стеганографией, основан на том, что некоторые форматы содержат в заголовке размер данных, или же обработчик этих форматов будет читать файл до маркера конца данных. Примером такого метода является хорошо известный метод «rar-jpeg», который основан на конкатенации графического файла в формате JREG и RAR-архива. ПО для просмотра JPEG будет считывать информацию до границы, указанной в заголовке файла, а RAR-архиватор откинет все, что находится до сигнатуры «RAR!», которая обозначает начало архива. Таким образом, если такой файл открыть в просмотрщике графических файлов — мы увидим картинку, а если в RAR-архиваторе — содержимое RAR-архива. Очевидные минусы такого подхода заключаются в том, что оверлей, добавленный к контейнеру, легко выделяем при визуальном исследовании такого файла [3].
Цель изучения стеганографии в рамках дисциплин по программированию состоит в формировании знаний о современных принципах и методах сокрытия информации, умении применять полученные знания на практике, то есть обнаруживать скрытую информацию в различного рода системах, в том числе в аудио, видео и текстовой информации. В процессе изучения студент должен осознать современную роль стеганографических методов и важность комплексной защиты информации в работе организации или предприятия, а значит и ответственность, возлагаемую на персонал [4].
Учащимся третьего курса технических специальностей в рамках изучения дисуциплины «Технология программирования» была предложена следующая задача.
Постановка задачи: Разработайте приложение на языке программирвание C# для осуществления хранение информации методом стеганографии. Факт существования сообщения не должен привлекать к себе внимание.
Цель: Отработка практических навыков программирования. Создание криптографических и стеганографических моделей для решения поставленной задачи.
Базовый алгоритм: Разложение текста по последним битам красной кодировки (LSB-стеганография). Внедрение сообщения в графическое изображение.
Студенты выполнили предложенное задание. Приведем пример самой интересной реализации.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.IO; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace crypto { public partial class Form1 : Form { Bitmap bmp; Bitmap bmpCry; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) //OPEN { // выбор рисунка в котором будет храниться информация OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Image files (*.BMP, *.JPG, *.GIF, *.TIF, *.PNG, *.ICO, *.EMF, *.WMF)|*.bmp;*.jpg;*.gif; *.tif; *.png; *.ico; *.emf; *.wmf"; if (dialog.ShowDialog() == DialogResult.OK) { if (bmp != null) { bmp.Dispose(); pictureBox1.Image.Dispose(); } if (bmpCry != null) { bmpCry.Dispose(); pictureBox2.Image.Dispose(); } Image image = Image.FromFile(dialog.FileName); int width = image.Width; int height = image.Height; bmp = new Bitmap(image, width, height); pictureBox1.Image = bmp; } } private void button2_Click(object sender, EventArgs e) //save { // сохранение рисунка с внедренным текстом SaveFileDialog savedialog = new SaveFileDialog(); savedialog.Title = "Сохранить..."; savedialog.OverwritePrompt = true; savedialog.CheckPathExists = true; savedialog.Filter = "Bitmap File(*.bmp)|*.bmp|" + "GIF File(*.gif)|*.gif|" + "JPEG File(*.jpg)|*.jpg|" + "TIF File(*.tif)|*.tif|" + "PNG File(*.png)|*.png"; if (savedialog.ShowDialog() == DialogResult.OK) { string fileName = savedialog.FileName; bmpCry.Save(fileName); } } // кодирование private void button3_Click(object sender, EventArgs e) { // считывание текста для внедрение string txt = textBox1.Text; int len = Math.Min(txt.Length, 255); bmpCry = (Bitmap)bmp.Clone(); if (len != 0 && bmp != null) { int n = bmp.Height; int m = bmp.Width; for (int i = 0; i < 8; i++) { Color p = bmp.GetPixel(i, n — 1); int a = p.A; int r = p.R; int g = p.G; int b = p.B; // внедрение бита в последний бит байта красного цвета r = ((r & 254) | ((len & (1 << i)) > 0 ? 1 : 0)); p = Color.FromArgb(a, r, g, b); bmpCry.SetPixel(i, n — 1, p); } int x = 8; int y = n — 1; for (int i = 0; i < len; i++) { int c = txt[i]; for (int j = 0; j < 8; j++) { if (x >= m) { y-; x = 0; } Color p = bmp.GetPixel(x, y); int a = p.A; int r = p.R; int g = p.G; int b = p.B; r = ((r & 254) | ((c & (1 << j)) > 0 ? 1 : 0)); p = Color.FromArgb(a, r, g, b); bmpCry.SetPixel(x, y, p); x++; } } pictureBox2.Image = bmpCry; } } //декодирование private void button4_Click(object sender, EventArgs e) { string txt = ""; int len = 0; bmpCry = (Bitmap)bmp.Clone(); if (bmp != null) { int n = bmp.Height; int m = bmp.Width; // вытаскиваем биты текста for (int i = 0; i < 8; i++) { Color p = bmp.GetPixel(i, n — 1); int r = p.R; len = len | ((r & 1) << i); } int x = 8; int y = n — 1; for (int i = 0; i < len; i++) { int c = 0; for (int j = 0; j < 8; j++) { if (x >= m) { y-; x = 0; } Color p = bmp.GetPixel(x, y); int r = p.R; c = c | ((r & 1) << j); x++; } txt += (char)(c); } txt.Reverse(); label1.Text = len.ToString() + " " + txt; } } } }
Таким образом, стеганография служит одним из ярких примеров «особого» шифрования который может быть использован на уроках по изучению программирования. В результате обучающийся начинает понимать методику сокрытия информации при передаче её по открытому каналу, методы и средства обнаружения скрытой информации, реализует представленные методы и алгоритмы на языке программирования, используя существующий инструментарий для обнаружения скрытой информации.