Волшебник
656 / 259 / 88
Регистрация: 18.12.2010
Сообщений: 545
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Стеганография01.04.2011, 08:30. Показов 86839. Ответов 70
Метки нет Все метки)
(
Основы и методы защиты информации
Для некоторых скрытие текста методами стеганографии вызывает некоторые трудности, поэтому я решил написать небольшую статью где подробно изложу ход выполнения практических заданий. Если кому-нибудь это покажется банально просто то просьба не читать, эта статья рассчитана на людей кто хочет выполнить практические задания по «Основы и методы защиты информации» обладая базовыми знаниями в программировании. Для начала приведу тексты самих заданий. Задание 1. Нужно посчитать контрольную сумму от файла, используя любой из алгоритмов подсчета контрольных сумм. Задание 2. Есть текст и в нем надо скрыть некоторую фразу, состоящую из букв. Буквы этой фразы представляются как байты. Эти байты надо разбить на биты. Текст, в котором будет прятаться сообщение, должен иметь много строчек (как стихотворение). Мы должны разбить скрываемый текст на биты. И если очередной бит скрываемой информации равен единице, то в конец очередной строки текста-контейнера дописываем пробел. Если же бит равен нулю, то в конец строки не пишем пробел. После шифрования, шифровку надо будет обратно раскодировать. Задание 3. Есть некий текст и в нем тоже надо спрятать другой текст. Аналогичным образом скрываемый текст разбиваем на биты. И если очередной бит секретного сообщения равен единице, то в тексте-контейнере удваиваем пробел. Если очередной бит скрываемого текста равен нулю, то пробел остается одним. Обычные буквы пропускаются в тексте- контейнере. То есть, для того, чтобы скрыть слово "пиво" (4 буквы, 4 байта или 32 бита), нужен текст-контейнер как минимум, с 32-мя пробелами. Таким же методом надо расшифровать сообщение обратно. Задание 4. условие то же, что и в задаче 3. Только если бит секретного сообщения равен единице, то в тексте-контейнере меняем русскую букву на английский аналог. Если бит равен нулю, то очередную букву-аналог в тексте-контейнере оставляем без изменений. Буквы-аналоги - это буквы русского языка, имеющие аналогичное начертание в англ. языке. Так же, надо расшифровать текст обратно. З.Ы: все примеры реализованы в Delphi 7 Задание 1. Это задание на мой взгляд является самым простым. Тут следующими переменными будет обозначено TEST_FILE:File Of Byte; //Файл, контрольную сумму которого будем считать CS:Byte;//Сюда будет считан очередной байт из файла Res:Integer;//Здесь будет конечный результат Sum:Integer;//Здесь будет контрольная сумма Простейшим способом подсчета КС файла служит следующий алгоритм: 1)Обнулить переменную контрольной суммы Sum 2)Пока не конец файла a.Считать очередной байт б.Прибавить его к контрольной сумме Найти остаток от деления Sum на некое большое целое число. Согласно алгоритму обнуляем Sum; Sum:=0; Далее запускаем цикл While Not Eof(TEST_FILE) Do Begin//Пока не конец файла Read(TEST_FILE,CS);//Читаем один байт из файла Sum:=Sum+CS;//Прибавляем этот байт к контрольной сумме End; Т.к. контрольная сумма может получится достаточно большой то делим результат на какое-нибудь большое число, например 10000. Res:=Sum Mod 10000; В переменной Res наш конечный результат, его и выводим на экран любым способом. Вот весь текст процедур.Форма состояла из 1 Memo, 1 OpenDialog и 2 SpeedButton Файл TEST_FILE лучше объявить в разделе глобальных переменных (перед implementation),т.к. файл используется в двух процедурах
Это задание (как и следущие два) будет состоять из двух подзаданий: скрытие строки и извлечение строки. Для этих заданий нам понадобятся следущие функции, которые мы и напишем. DecToBin (Перевод из десятичной системы в двоичную) BinToDec(Перевод из двоичной в десятичную) StrToBin (Перевод из строки в биты) FirstEight(Будет возвращать первые 8 символов строки) DecToBin Работает эта функция следущим образом. Известно что в Pascal нумерация элементов строки начинается с 1 и поэтому если остаток от деления на 2 равен 1 (при переводе из десятичной в двоичную делением столбиком на 2) то пишем второй элемент строки StringConst, т.е. пишем 1, если остаток ноль то пишем первый элемент(пишем 0).
Как видно из названия это противоположенность предыдущей функции, она переводит из двоичной в десятичную. Тут тоже всё просто. От начала и до конца строки к произведению DecValue*2 (DecValue это десятичное значение) прибавляем 1 или 0 взавмсимости от элемента строки Value (это строка где содержится двоичное число) . Если элемент ноль то, то его позиция в строке Digit равна 1, если элемент 1 – позиция в Digit равна 2. Но исходная система двоичная, поэтому вычитаем 1. И так всё происходит до конца цикла, и в итоге в DecValue получается десятичное число. Далее переводим его в строку функцией IntToStr и присваиваем результату функции. Вот текст функции.
Эта хитрая функция переводит строку в биты( набор нулей и едениц ). Работает всё следущим образом. Мы каждый элемент переводим в двоичное представление (для этого мы написали ранее функцию DecToBin ). Для этого возвращаем числовое представление i-го элемента функцией Ord. Например если Chr(100) это соответствует символу ‘d’ то Ord(‘d’) = 100. Далее переводим это число в двоичное функцией DecToBin и присваиваем его строке TempString. Длина этой строки может быть от 1 до 8(т.к. один символ занимает 1 байт, а 1 байт это 8 бит) и этого совсем не надо. Поэтому надо дополнить (если это требуется) каждую строку нулями до 8 символов. Для этого надо создать строку длиной 8-Length(TempString) состоящую из нулей, и дополнить ею строку TempString. И эту строку добавляем в строку BinString.Таким образом выполяем цикл пока не закончится элементы строки TextValue.
Эта функция самая простая из всех. Она возвращает первые 8 символов строки. Принцип работы очевиден: считывает первые 8 символов и присваивает их результату функции.
кинем на форму 3 кнопки, 1 OpenDialog (находится он на вкладке Dialog) и 1Edit. Кнопки можно назвать Открыть файл, Спрятать текст и Извлечь текст. Работать программа будет так: сначала открываем файл- контейнер (это файл куда будем прятать сообщение, он должен содержать минимум 8*n строк, где n – число символов в сообщении ), далее вводим в Edit своё сообщение и жмем Скрыть текст, в папке с программой должен появиться файл Задание2.txt. В этом файле и храниться наше сообщение. Потом кликаем Открыть файл и выбираем файл с сообщением (Задание2.txt) и нажимаем Извлечь текст, и в Edit1 должно появиться сообщение. Открыть файл. Этот код будем выполняться при нажатии на кнопку Открыть файл
Этот код будем выполняться при нажатии на кнопку Скрыть текст
Задание также будет состоять из двух подзаданий: скрытие и извлечение строки. Также будет использоваться все функции описанные в задании 2. Форма приложения будет такая же (3 кнопки, 1 Edit и 1 OpenDialog ). Можно назвать их также как и задании 2. Обработчик нажатия кнопки Открыть файл такой же. Весь прикол задания заключается вставкой пробела между слов. Вставляет одну строку в другую функция Insert.Вставлять пробел между слов будет следущая конструкция: If RecString[i]=’ ’ Then Insert(’ ’,RecString,i); Здесь мы вставляем на позицию i в строке RecString строку ’ ’,тобиш пробел. При расшифровке всё ещё проще: Если встретились два пробела то пишем 1,иначе пишем ноль. If(RecString[i]=’ ’) And (RecString[i+1]=’ ’) Then Bin:=Bin+’1’; If(RecString[i]=’ ’) And (RecString[i+1]<>’ ’) Then Bin:=Bin+’0’; Это естественно делается в цикле. Вот и все хитрости) Часть 1. Скрытие текста.
равен единице, то в тексте-контейнере меняем русскую букву на английский аналог. Если бит равен нулю, то очередную букву-аналог в тексте-контейнере оставляем без изменений. Буквы- аналоги - это буквы русского языка, имеющие аналогичное начертание в англ. языке. Задание довольно просто выполнить применив функции из Задания 2 (DecToBin, BinToDec, StrToBin и FirstEight). Форма приложения может быть такая же как и в предыдущих заданиях. Кнопка Открыть файл выполняет тоже самое что и задании 2 или задании 3, поэтому можно тупо скопировать код из задания 2 или 3. Часть 1. Скрытие сообщения.
![]() ![]()
23
|
|
01.04.2011, 08:30 | |
Ответы с готовыми решениями:
70
Стеганография Стеганография Стеганография.Шифрование текста в картинку Стеганография LSB BMP |
Волшебник
656 / 259 / 88
Регистрация: 18.12.2010
Сообщений: 545
|
|||||||||||||||||||||||||||||||
09.07.2011, 20:41 [ТС] | 2 | ||||||||||||||||||||||||||||||
Хотел предложить ещё один вариант решения данных задач с использованием побитовых операций. Преимущество - отпадет необходимость переводить сообщение в двоичный вид.
Весь код прокомментирован, а суть заданий изложена в предыдущем посте. Задание 2 ----------------------------------------------- СОКРЫТИЕ ------------------------------------------------
----------------------------------------------- СОКРЫТИЕ ------------------------------------------------
----------------------------------------------- СОКРЫТИЕ ------------------------------------------------
![]() ![]() ![]()
12
|
Заблокирован
|
|
09.08.2011, 11:28 | 3 |
Нет. Вся эта система с заменой схожих букв одного языка на другой неприемлима. Стоит запустить такой файл на машине без русского языка, он тут же привлечёт внимание специалиста. Или даже если попадётся шрифт без кириллицы.
Что касается удлинения пробела. Опять же. текст будет выглядеть очень подозрительно. Я предлагаю попробовать менять пробелы. Если , скажем бит равен 1, ставим обычный пробел. Если 0 - ставим код A0h Это знак забоя. Насколько помню, забой реализуется программно и срабатывает при вводе. А если он встречается в тексте, то отображается в виде пробела. Но вполне возможно что просто игнорируется. И ещё. подобную манипуляцию намного удобнее делать в RTF файле. Этот формат сам по себе нагромаждение символов, и такая замена наименее заметна.
1
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|
18.03.2012, 14:44 | 4 |
как зашифровать текст в картинку .BMP?
1
|
20.03.2012, 16:42 | 5 |
Тут имеется ввиду минимум 24-битная картинка, когда на один пиксель приходится 3 байта.
Если мы у байтов будем менять нулевой бит, то на конечной картинке это практически не скажется (никто не сможет на глаз отличить RGB(134, 56, 78) от RGB(135, 56, 79)). Таким образом для кодирования берем все байты растра, обнуляем у них нулевые биты и записываем вместо них биты нашей информации. Получается, что один байт нашей информации будет занимать 8 байт растра, или что-то около 2.66 пиксела (или 2 байта, если это 32-битный растр). Как-то так, в первом приближении. В джипег, естественно, засунуть проблематично, потому что там сжатие с потерями.
1
|
22.03.2012, 06:55 | 7 |
хм... я вот поразбирался на эту тему... кажется, в jpg можно сохранить любую инфу - тупо дописывать в конец,насколько я понял. Обычными просмотрщиками картинка будет просматриваться
![]() единственное - слишком много инфы не запихаешь - палевно будет, что jpg много весит. Ну и если кто-то догадается пересохранить картинку - вся ваша информация отправится в цифровой рай... только что экспериментировал ![]()
2
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|
22.03.2012, 07:35 | 8 |
это вроде архив на Unix. Исходник найти в нем не могу.Можете рассказать как вы сделали данныю процедуру?
1
|
22.03.2012, 07:42 | 9 |
aidoqa, нужно заархивировать RAR'ом любую инфу.
Затем просто дописать архив в конец файла jpg. Можни и в BMP и в любые картинки (почти в любые) Я воспользовался хексоредактором, но это можно сделать хоть через делфи. Прям через делфи открой картинку и архив (чтобы редактировать их в hex-режиме), а потом копипасть содержимое rar в самый конец jpg ![]() Добавлено через 1 минуту Не по теме: Я наверно как-нить так прикольнусь - пошлю кому-нить папку с обоями, а там будет куча всякой секретной инфы... ведь обычный юзер и не догадается :D
2
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|
22.03.2012, 07:46 | 10 |
2
|
22.03.2012, 08:02 | 11 |
Ну, возьми, например, и заархивируй архиватором WinRAR что-нибудь, например, какой-нибудь свой проект. Можешь даже запаролить его.
И возьми любую JPG картинку. 1) открой среду Delphi (закрой проект, если он там создался автоматически) 2) теперь мышью тупо на делфи перетащи картинку и архив. Либо открой их через File-->Open... 3) скопируй все кракозябры из кода с архивом, и вставь в самый конец кода jpg 4) Теперь сохрани картинку File-->Save As... Всё, инфа в картинке, и картинка нормально открывается просмотрщиками... можно ещё через командную строку сделать 1) помести картинку и архив на диск C 2) картинку назови "image.jpg", а архив "archive.rar" в командной строке выполни вот это: copy /B c:\image.jpg + /B c:\archive.rar c:\dest.jpg командная строка открывается так: жмёшь Windows + R, а затем вводишь туды cmd и жмёшь ввод Добавлено через 1 минуту а потом тупо получившуюся картинку переименуй в *.rar - и откроется она винраром. Переименуешь в jpg - откроется как картинка ![]() это уже древний велосипед ![]() http://habrahabr.ru/post/128433/
2
|
22.03.2012, 08:27 | 12 |
Точно так же оно работает и для архивов разбитых на тома
![]() ![]() rarimages.7z
2
|
22.03.2012, 08:56 | 13 |
Данный факт легко вскрывается с помощью анализа сигнатур внутри файла. Как антивирус смотрит на такие файлы?
Стеганография все-таки подразумевает сокрытие самого факта шифрования. Хотя для начала может и прокатит.
2
|
deathNC
|
22.03.2012, 09:22
#14
|
Не по теме: Антивирус по идее ничего не должен сказать (хотя я не пользуюсь ими, и не знаю :D)
2
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|
03.04.2012, 20:04 | 15 |
Кто нибудь встречал другие ввиды исходников по структуре форматов? кроме jpeg, bmp, gif, mpeg,
2
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|
03.04.2012, 20:42 | 17 |
deathNC, я даже не в курсе честно) давайте я на недел точно уточню какие можно взять форматы)
1
|
03.04.2012, 20:59 | 18 |
ну, я тоже не особо в курсе
![]() да и винрар не всегда воспринимает файл с мусором (когда мусор большой) как архив... просто это самый простой вариант спрятать важную информацию от простых юзеров. Ещё, насколько помню *.ico должно получиться... Добавлено через 3 минуты А при желании можно свою программку написать для раскидывания данных по папке с обоями... конец файла JPEG всегда обозначается двумя байтами $FF и $D9 Добавлено через 8 минут Не по теме: ico, png, cur
1
|
Волшебник
656 / 259 / 88
Регистрация: 18.12.2010
Сообщений: 545
|
|
03.04.2012, 22:27 [ТС] | 19 |
Было бы неплохо, если кроме описания, как это сделать, кто нибудь взял и сделал
![]() Я начал писать программу для стеганографии в bmp и jpeg, как допишу - выложу тут в виде небольшой статьи (как, например, пост1 или 2). Правда когда доделаю, незнаю ![]() Думаю, было бы неплохо, если несколько добровольцев написали по небольшой статье о стеганографии в конкретном формате файлов (необязательно в изображении) Не по теме: Просто есть некоторые идеи, качаемые реализации, но в дискусии решил не участвовать, чтобы не забивать тему "лишними" сообщениями:)
0
|
587 / 101 / 2
Регистрация: 08.02.2011
Сообщений: 842
|
|||||||||||
05.04.2012, 17:10 | 20 | ||||||||||
S9, у меня есть готовый вариант по jpeg и bmp, просто программу надо переделать чтоб она пряталала текстовый файл в другие форматы. Мне нужно ее переделать под PNG, CUR, Ico
Добавлено через 10 часов 0 минут это unit Steganos; производит вроде шифрование
сам я в дельфи плохо разбираюсь) S9, МОжете ее переделать под PNG, djvu, ico и т.д. (КРоме BMP, Jpeg, tiff, GIF,AVI, MP3) ?
2
|
05.04.2012, 17:10 | |
Помогаю со студенческими работами здесь
20
Стеганография Стеганография стеганография Стеганография Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |