Автор работы: Пользователь скрыл имя, 11 Декабря 2013 в 03:55, лабораторная работа
Стеганография (от греч. «скрытый» и «пишу», буквально «тайнопись») — это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.
Цель работы: изучить метод Стеганографии.
Программа работы: Ознакомиться с технологиями Стеганографии. Разработать и реализовать диалоговую программу, которая реализует метод стеганографии.
Лабораторная работа №4
Стеганография (от греч. «скрыт
В конце 90-х годов выделилось несколько направлений стеганографии:
Цифровая стеганография — направление классической стеганографии, основанное на сокрытии или внедрении дополнительной информации в цифровые объекты, вызывая при этом некоторые искажения этих объектов. Но, как правило, данные объекты являются мультимедиа-объектами (изображения, видео, аудио, текстуры 3D-объектов) и внесение искажений, которые находятся ниже порога чувствительности среднестатистического человека, не приводит к заметным изменениям этих объектов. Кроме того в оцифрованных объектах, изначально имеющих аналоговую природу, всегда присутствует шум квантования; далее, при воспроизведении этих объектов появляется дополнительный аналоговый шум и нелинейные искажения аппаратуры, все это способствует большей незаметности сокрытой информации.
Из рамок цифровой стеганографии вышло наиболее востребованное легальное направление — встраивание цифровых водяных знаков (ЦВЗ) (watermarking), являющееся основой для систем защиты авторских прав и DRM систем. Методы этого направления настроены на встраивание скрытых маркеров, устойчивых к различным преобразованиям контейнера (атакам).
Полухрупкие и хрупкие ЦВЗ используются в качестве аналоговой ЭЦП, обеспечивая хранение информации о передаваемой подписи и попытках нарушения целостности контейнера (канала передачи данных).
Например, разработки Digimark в виде плагинов к редактору Adobe Photoshop позволяют встроить в само изображение информацию об авторе. К сожалению, такая метка неустойчива, впрочем как и абсолютное их большинство. Программа Stirmark, разработчиком которой является ученый Fabien Petitcolas, с успехом атакует подобные системы, разрушая стеговложения.
Все алгоритмы встраивания скрытой информации можно разделить на несколько подгрупп:
По способу встраивания
Метод LSB
LSB (Least Significant Bit, наименьший значащий бит) — суть этого метода заключается в замене последних значащих битов в контейнере (изображения, аудио или видеозаписи) на биты скрываемого сообщения. Разница между пустым и заполненным контейнерами должна быть не ощутима для органов восприятия человека.
Суть метода заключается в следующем: Допустим, имеется 8-битное изображение в градациях серого. 00h (00000000b) обозначает черный цвет, FFh (11111111b) — белый. Всего имеется 256 градаций (28). Также предположим, что сообщение состоит из 1 байта — например, 01101011b. При использовании 2 младших бит в описаниях пикселей, нам потребуется 4 пикселя. Допустим, они черного цвета. Тогда пиксели, содержащие скрытое сообщение, будут выглядеть следующим образом: 00000001 00000010 00000010 00000011. Тогда цвет пикселей изменится: первого — на 1/255, второго и третьего — на 2/255 и четвертого — на 3/255. Такие градации, мало того что незаметны для человека, могут вообще не отобразиться при использовании низкокачественных устройств вывода.
Методы LSB являются неустойчивыми ко всем видам атак и могут быть использованы только при отсутствии шума в канале передачи данных.
Растровый файл GIF (Graphics Interchange Format ).
Формат файла GIF (Graphics Interchange Format - формат обмена графическими данными) разработан компанией CompuServe.
Структура файла GIF зависит от версии GIF-спецификации, которой соответствует файл. В настоящее время используются две версии, GIF87a и GIF89a. Первая из них проще. Независимо от номера версии, файл GIF начинается с 13-байт заголовка, содержащего сигнатуру, которая идентифицирует этот файл в качестве GIF-файла, номер версии GIF и другую информацию. Если файл хранит всего одно изображение, вслед за заголовком обычно располагается общая таблица цветов, определяющая цвета изображения. Если в файле хранится несколько изображений, то вместо общей таблицы цветов каждое изображение сопровождается локальной таблицей цветов (Рис. 1).
Рис. 1. Структура *.gif файла.
В файле GIF87a вслед за заголовком и общей таблицей цветов размещается изображение, которое может быть первым из нескольких располагаемых подряд изображений. Каждое изображение состоит из 10-байт описателя изображения, расположенной вслед за ним локальной таблицы цветов и битов растрового массива. Для повышения эффективности использования памяти данные растрового массива сжимаются с помощью алгоритма LZW.
Файлы GIF89a имеют аналогичную структуру, но они могут содержать факультативные блоки расширения с дополнительной информацией о каждом изображении. В спецификации GIF89a определены четыре типа блоков расширения. Это блоки расширения для управления графикой, которые описывают, как изображение должно выводиться на экран (например, накладывается ли оно на предыдущее изображение подобно диапозитиву или просто заменяет его); блоки расширения с обычным текстом, содержащие текст, отображаемый вместе с графикой; блоки расширения для комментария, содержащие комментарии в коде ASCII; и блоки расширения прикладных программ, в которых хранится информация, принадлежащая только создавшей этот файл программе. Блоки расширения могут находиться практически в любом месте файла после общей таблицы цветов.
Основные достоинства GIF заключаются
в широком распространении
Структура заголовка файла GIF89a с размером изображения 385x100 пикселов представлена в таблице 1.
Таблица 1.
Информация |
Идентификатор GIF |
Ширина изображения |
Высота изображения |
Прочая информация | |||||||||
Номер байта (десятичное) |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
Пример значения (шестнадцат.) |
47 |
49 |
46 |
38 |
39 |
61 |
81 |
01 |
64 |
00 |
D5 |
00 |
00 |
Таким образом, ширина нашего изображения будет равна &H0181=385, а высота &H0064=100. Все очень просто. Тем не менее подробно рассмотрим это на примере.
Пример работы программы
Рис. 2. Окно программы, реализующей стеганографию
*.gif файла
Описание переменных, используемых в
программе
Описание переменных, используемых в программе представлено в таблице 2.
Таблица 2
byte[] FGif; |
*.gif файл |
byte[] FTxt; |
*.txt файл |
FileStream CodeFGif; |
Зашифрованный *.gif файл |
int a; |
Длинна используемого файла |
byte[] z |
Байтовый массив расшифрованного сообщения |
В ходе проделанной лабораторной работы были получены теоретические знания в области методов цифровой. Сообщение было спрятано в конце файла *.gif, что не повлияло на само изображение. Сообщение осталось незаметным. Таким образом, мы убедились в работоспособности изученного метода и научились его применять на практике
Листинг
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace gif_Steganography
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
byte[] FTxt;
byte[] FGif;
FileStream fread;
FileStream tfread;
FileStream CodeFGif;
int a;
private void button4_Click(object sender, EventArgs e)
{
Close();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.
{
pictureBox1.Load(
tfread = new FileStream(openFileDialog1.Fil
}
if (openFileDialog2.ShowDialog() == System.Windows.Forms.
{
fread = new FileStream(openFileDialog2.
}
FTxt = new byte[(int)fread.Length];
FGif = new byte[(int)tfread.Length];
tfread.Read(FGif, 0, (int)tfread.Length);
fread.Read(FTxt, 0, (int)fread.Length);
a = (int)tfread.Length;
fread.Close();
tfread.Close();
}
private void button2_Click(object sender, EventArgs e)
{
CodeFGif = new FileStream(@"CodeFile.gif", FileMode.Create);
CodeFGif.Write(FGif, 0, FGif.Length);
byte[] ch = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
CodeFGif.Write(ch, 0, 9);
for (int j = 0; j < FTxt.Length; j++)
{
CodeFGif.WriteByte(FTxt[j]);
}
CodeFGif.Close();
pictureBox2.ImageLocation = @"code.gif";
}
private void button3_Click(object sender, EventArgs e)
{
FileStream fdecode = new FileStream(@"decode.txt", FileMode.Create);
CodeFGif = new FileStream(@"code.gif", FileMode.Open);
byte[] dec = new byte[(int)CodeFGif.Length];
CodeFGif.Read(dec, 0, (int)CodeFGif.Length);
int x = 0;
bool b = false;
for (int i = 0; i < (int)CodeFGif.Length; i++)
{
if (dec[i] == 1)
if (dec[i+1] == 1)
if (dec[i+2] == 1)
if (dec[i+3] == 1)
if (dec[i+4] == 1)
if (dec[i+5] == 1)
if (dec[i+6] == 1)
if (dec[i+7] == 1){ b = true; x = i + 8;}
}
byte[] z = new byte[dec.Length - x/*a*/];
for (int i = 0; i < z.Length;i++ )
{
z[i] = dec[i + x/*a*/];
}
fdecode.Write(z,0, z.Length);
CodeFGif.Close();
fdecode.Close();
richTextBox1.LoadFile(@"
}
}
}