ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ СТЕГАНОГРАФИЧЕСКИХ МЕТОДОВ НА УРОКАХ ПО ИЗУЧЕНИЮ ПРОГРАММИРОВАНИЯ

№75-1,

Педагогические науки

В статье рассматриваются задачи и цели изучения стеганографических методов при изучении программирования. Приводится пример работ реализующих принципы LSB-стеганографии.

Похожие материалы

Стеганография — это междисциплинарная наука и искусство передавать сокрыты еданные, внутри других, не сокрытых данных. Скрываемые данные обычно называют стегосообщением, а данные, внутри которых находится стегосообщение называют контейнером [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;
            }
        }
    }
}

Таким образом, стеганография служит одним из ярких примеров «особого» шифрования который может быть использован на уроках по изучению программирования. В результате обучающийся начинает понимать методику сокрытия информации при передаче её по открытому каналу, методы и средства обнаружения скрытой информации, реализует представленные методы и алгоритмы на языке программирования, используя существующий инструментарий для обнаружения скрытой информации.

Список литературы

  1. Стеганография // ВикипедиЯ. Свободная энциклопедия. URL: https://ru.wikipedia.org/wiki/Стеганография (дата обращения 02.11.2017)
  2. Халилова С.Н., Гончарова О.Н. Современная стеганография// Проблемы информационной безопасности: Труды III Международной П781 научно-практической конференции, Симферополь-Гурзуф, 16-18 февраля 2017 г.  Симферополь : ИП Зуева Т.В., 2017.  190 с.
  3. Шульмин А., Крылова Е. Стегонография в современных киберотаках // Securelist. URL: https://securelist.ru/steganography-in-contemporary-cyberattacks/79090/ (дата обращения 07.11.2017)
  4. Векслер В.А. Cодержание и организация обучения взрослых основам информационных технологий в системе дополнительного образования: региональный аспект // диссертация на соискание ученой степени кандидата педагогических наук / амур. гуманитар.-пед. гос. ун-т. Комсомольск-на-Амуре, 2009