Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Алгоритмы _ "спрятать предложение" в файле формата bmp

Автор: Тёмный Эльф 17.05.2007 2:18

Нужно в bmp файл "засунуть" текстовый файл. Не очень понимаю как это осуществить. Может быть представить два массива. В один считывать инфу из текстового файла ,а в другой из графического? Но можно ли будет потом простым присваиванием заменить байты??

Надо заменой байтов получить скрытое предложение в графическом файле... Я знаю еще, что для скрытия текста можно воспользоваться методом замены наименее значимых бит в глобальной палитре графического файла по алгоритму: в каждом байте палитры записывается в результирующий файл. не совсем ясный алгоритм.
и еще: палитра здесь имеется ввиду,что 256 элементов по 4 байта (из структуры bmp) ?

Есть ли у кого-нибудь есть идеи насчет этого, то напишите пожалуйста.




Автор: Lapp 17.05.2007 5:51

Цитата(Тёмный Эльф @ 16.05.2007 23:18) *

в bmp файл "засунуть" текстовый файл

Идея уже высказана тобой.
Ты скажи, сколь велик этот "текстовый файл". Мне кажется, что много тут не упрячешь.

Автор: Тёмный Эльф 17.05.2007 6:05

Мне кажется, что текстового файла, состоящего из 10 символов достаточно. Здесь же важно будет посмотреть, сильно ли изменится изображение после замены байтов. А потом можно будет изображение чуть-чуть изменить в какой-нибудь программе, например, переставить пиксели, и в результате после декодирования мы получим уже искаженную строку.
Вроде идея ясна ,но хочется разобраться во всех тонкостях алгоритма.

Автор: Lapp 17.05.2007 7:40

Цитата(Тёмный Эльф @ 17.05.2007 3:05) *

но хочется разобраться во всех тонкостях алгоритма.

Ну что ж, желание похвальное, очень Темный Эльф. Я готов помочь, и в качестве первой помощи, вот примерный список, что тебе нужно сделать:
1. Найди полное и точное описание формата BMP. Положи ссылку сюда.
2. Постарайся в нем разобраться. Если что-то неясно - спрашивай тут.
До встречи.

Автор: Тёмный Эльф 17.05.2007 12:42

Цитата
1. Найди полное и точное описание формата BMP. Положи ссылку сюда.

http://pascal.sources.ru/articles/099.htm
http://ru.wikipedia.org/wiki/BMP

Вроде неплохие ресурсы. Вечером буду разбираться, что к чему. =)

Автор: hardcase 17.05.2007 15:11

Цитата(Тёмный Эльф @ 16.05.2007 23:18) *
Нужно в bmp файл "засунуть" текстовый файл.
Велосипеды...... еле его отыскал. За глупое название - не ругать, писал лет сто назад, под blind Guardian.

Идея: Берём битмап с форматом пикселя 32 бита. В каждую компоненту цвета пишем младшим битом бит данных. Т.о. для записи байта нам нужно 2 пикселя.

Прога практического смысла не несёт и лишь иллюстрирует саму идею стеганографии.
В реале стоит использовать JPEG, хотя бы потому как в этом формате изображения в основном и распростараняются. Для записи overlay-данных нужно менять кое какие коеффициенты (нада смотреть формат jpeg) - на глаз разницы никакой, а инфы записать можно очень много (это со слов одного нашего преподавателя).


Прикрепленные файлы
Прикрепленный файл  Blind.zip ( 25.05 килобайт ) Кол-во скачиваний: 268

Автор: Тёмный Эльф 18.05.2007 3:53

Цитата
Прога практического смысла не несёт и лишь иллюстрирует саму идею стеганографии.

прога к сожалению не откомпилировалась, но все-равно спасибо.
Кстати,хочу на Си это написать.
Вот примерный алгоритм.
1. проверить формат рисунка. Если не bmp, выход из программы. (искать надо будет по сигнатуре "BM". Так как я с графическими файлами еще не работала, я плохо представляю как это можно сделать. Ладно там строку "BM" найти в текстовом файле, но в графическом..)
2. найти общую информацию о файле (глобальная палитра, размер файла). если палитра не найдена, то выход из программы, иначе узнать размер палитры. (что такое палитра пока плохо понимаю)
3. узнать размер файла, коорый требуется застенографировать. Нужно знать степень упаковки (которая указывает на количество бит , помещаемое в один байт графического изображения) и проанализировать, поместится ли файл в глобальную палитру.
4. занести информацию о типе стеганографируемого файла и его размер в байтах. Затем занести текст.
5. скопировать оставшийся графичекий файл в новый и завершить работу.
(приступила к первому пункту всего-лишь и уже неясности. )

Автор: volvo 18.05.2007 4:42

Цитата
прога к сожалению не откомпилировалась
blink.gif Очень странно... А чем компилировала? Версия Дельфи, в смысле, какая? D6 скомпилировала без проблем...

Автор: Тёмный Эльф 18.05.2007 4:59

Цитата(volvo @ 18.05.2007 1:42) *

blink.gif Очень странно... А чем компилировала? Версия Дельфи, в смысле, какая? D6 скомпилировала без проблем...


Ёлки. wacko.gif Изучить что-ли Дельфи чтобы не спутать в следующий раз с Паскалем!??
(ясно теперь, почему не откомпилировалось...)

Автор: Unknown 24.11.2007 4:38

а каким образом можно реализовать сокрытие информации в текстовом файле? с картинками вроде все понятно... даже прогу начал делать...
А вот что с текстовыми документами делать пока не придумал... можно добавлять нечитаемые символы, подменять кириллические символы на латинские, поизвращаться над пробелами... но что-то мне все это не нравится...

Автор: Tan 24.11.2007 4:42

Ну один из простых способов сместить коды символов на определённую величину N. Можно придумать какую - то формулу по смещению и применить её. Просто в этом случае не надо ничего добавлять в файл, здесь упор на то, что нам известны эти самые коды. Это конечно, если я правильно понял термин "скрыть".

Автор: hardcase 24.11.2007 7:05

Судя по вопросу, речь идет о http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%B3%D0%B0%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F.

Цитата(Unknown @ 24.11.2007 0:38) *
а каким образом можно реализовать сокрытие информации в текстовом файле?
Использовать кодовые фразы, как в шпионском боевике. Типа "бабушка пошла за покупками" = "запущена баллистическая ракета". Это сокртыие информации на основе замещения смысла слов. Вставив подобные фразы в безобидный текст позволит спрятать полезную информацию, но для этого фраза должна корректно ложиться на текст и получатель должен знать смысл фраз.

Альтернативный способ - использование БОЛЬШИХ текстов, по 2 Мб например, когда визуально очень трудно заметить полезную информацию в общем потоке. Идея - включить наше сообщение известным обеим сторонам образом в этот большой текст. Например слова открытого текста помещаются в любые места текста-носителя - заметить их можно будет лишь прочитав большую часть текста-носителя. Места вставки можно задавать, например, с помощью какого-нибудь сдвигового регистра (неплохо использовать регистр из алгоритма RC4) также можно использовать генератор псевдослучайных чисел.

Автор: Unknown 26.11.2007 9:10

Речь, действительно, идет о стеганографии. Смещение кодов - не то, что нужно.
Шпионские фразы - это да )))
Второй способ не устраивает, т.к. визуально текст все-таки меняется...
В общем, я свой выбор остановил на подмене символов:
смотрим текст, и если какой-то символ можно подменить (к примеру, "о" на "o"), то замененный символ - это 1, незамененный - 0. Каждые восемь символов дают один скрытый символ.
Смущает, правда, что если такой файл открыть каким-нибудь Word'ом, то будут найдены ошибки...

Цитата
Идея: Берём битмап с форматом пикселя 32 бита. В каждую компоненту цвета пишем младшим битом бит данных. Т.о. для записи байта нам нужно 2 пикселя.

А может кто-нибудь объяснить, что за формат пикселя в 32 бита? 24 бита - это RGB? а еще 8 - на что?

Автор: volvo 26.11.2007 13:42

Цитата(Википедия)
В реальности 32-битный цвет является 24-битным (Truecolor) с дополнительным 8-битным каналом, который либо заполнен нулями (пустотой), либо представляет Альфа-канал, который задает прозрачность изображения в определенных пикселях.

Автор: Unknown 26.11.2007 14:28

А как к этому дополнительному 8-битному каналу можно получить доступ в Билдере? Как его можно изменить?

Автор: hardcase 26.11.2007 17:17

Цитата(Unknown @ 26.11.2007 10:28) *
А как к этому дополнительному 8-битному каналу можно получить доступ в Билдере? Как его можно изменить?
Аналогично способу в Делфи, посмотри мой код. (Хотя, конечно, работу с битами в нем можно было бы сделать несколько проще.)

Автор: Unknown 13.12.2007 4:28

Цитата(hardcase @ 26.11.2007 13:17) *

Аналогично способу в Делфи, посмотри мой код. (Хотя, конечно, работу с битами в нем можно было бы сделать несколько проще.)

Честно говоря, ничего не понял )
Я Делфи вообще не знаю ( Хотя бы примерно намекни, плз.

Автор: andriano 14.12.2007 0:10

Цитата(hardcase @ 17.05.2007 11:11) *

Велосипеды...... еле его отыскал. За глупое название - не ругать, писал лет сто назад, под blind Guardian.

Идея: Берём битмап с форматом пикселя 32 бита. В каждую компоненту цвета пишем младшим битом бит данных. Т.о. для записи байта нам нужно 2 пикселя.

Прога практического смысла не несёт и лишь иллюстрирует саму идею стеганографии.
В реале стоит использовать JPEG, хотя бы потому как в этом формате изображения в основном и распростараняются. Для записи overlay-данных нужно менять кое какие коеффициенты (нада смотреть формат jpeg) - на глаз разницы никакой, а инфы записать можно очень много (это со слов одного нашего преподавателя).

1. Известно, что "родным" форматом Windows является BMP, причем 32-разрядный BMP она прекрасно понимает и отображает. Увы, этого же нельзя утверждать о всех существующих в природе графических пакетах, поэтому некоторые из них такой файл открывать не будут.
2. Если уж использовать лишний байт на каждый пиксель, (в BMP не предусмотрено хранение прозрачности) то логичнее всего будт использовать именно этот байт целиком, не корежа оригинальное изображение. Тогда для одного байта достаточно одного пикселя.
3. Jpeg - формат сжатия с потерями, поэтому гарантии сохранности информации там нет.

Автор: andriano 14.12.2007 0:36

Цитата(Unknown @ 26.11.2007 10:28) *

А как к этому дополнительному 8-битному каналу можно получить доступ в Билдере? Как его можно изменить?
Что значит "доступ"?
У тебя есть один лишний байт на пиксель. Что хочешь с ним, то и делаешь.

Автор: hardcase 14.12.2007 1:27

Цитата(andriano @ 13.12.2007 20:10) *
3. Jpeg - формат сжатия с потерями, поэтому гарантии сохранности информации там нет.
Jpeg - в первую формат сжатия ИЗОБРАЖЕНИЯ (с потерями). Никто понятное дело не использует исходные изображения для записи скрытой-информации.
С Jpeg все иначе - нужно менять косинусные коеффициенты в самом jpeg-файле.

Автор: andriano 15.12.2007 5:05

Цитата(hardcase @ 13.12.2007 21:27) *

С Jpeg все иначе - нужно менять косинусные коеффициенты в самом jpeg-файле.
В принципе это логично, но насколько такой способ оказывается стойким к преобразованию, скажем jpg->bmp или просто к пережатию jpg с другим коэффициентом сжатия?

Автор: Lapp 15.12.2007 12:08

Цитата(andriano @ 15.12.2007 1:05) *

насколько такой способ оказывается стойким к преобразованию, скажем jpg->bmp или просто к пережатию jpg с другим коэффициентом сжатия?

А оно кому-то надо??.. blink.gif

Добавлено через 10 мин.
А кодирование в bmp устойчиво к изменению размера, увеличению контраста или к коррекции цветового баланса?

Автор: andriano 15.12.2007 15:52

Вообще-то перекодировка изображения в другой формат и его обработка - вещи немного различные.
При обработке изменяется количество информации, содержащейся в файле, поэтому сохранение информации НЕ МОЖЕТ быть гарантировано. Перекодировка же может быть осуществлена без потерь.
JPEG - формат с потерей информации, поэтому, на мой взгляд, он также не может гарантировать сохранение информации.
Поскольку в обсуждении была высказана иная точка зрения, я и хочу ее уточнить.

Автор: Lapp 15.12.2007 18:01

Цитата(andriano @ 15.12.2007 11:52) *

Вообще-то перекодировка изображения в другой формат и его обработка - вещи немного различные.

Никто особо и не спорит. Царапанье гвоздиком диска с ценной секретной информацией - тоже различная вещь. Но мне трудно представить себе агента, который в свободное от работы время развлекается пересжатием своих жипегов с украденной информацией.. smile.gif Ну, или хотя бы переводит бмп-шки в гифы..

Цитата(andriano @ 15.12.2007 11:52) *

JPEG - формат с потерей информации, поэтому, на мой взгляд, он также не может гарантировать сохранение информации.
Поскольку в обсуждении была высказана иная точка зрения, я и хочу ее уточнить.

А бмп перевести в жипег, конечно, никто не догадается.. Решительно не понимаю, о какой гарантии ты ведешь речь. Файл есть файл. К тому же, в теме не было ничего про стойкость к перекодировкам или кислотам..

Автор: andriano 15.12.2007 18:19

Все понял: никто также не гарантирует, что при загрузке и сохранении BMP в редактор даже без редактирования неиспользуемые байты палитры не окажутся забитыми нулями.
Вопрос, как всегда, в следующем: прежде, чем говорить о СПОСОБАХ сокрытия информации следует определиться с ЦЕЛЯМИ данного действа.

Автор: Unknown 15.12.2007 22:51

Цитата
Что значит "доступ"?
У тебя есть один лишний байт на пиксель. Что хочешь с ним, то и делаешь.


Я имею ввиду, как можно изменить этот байт по своему желанию? К РГБ доступ получается с помощью GetPixel и т.п., а вот к четвертому байту как?

Автор: andriano 15.12.2007 23:19

Речь изначально шла о файле.
В файле искомые байты находятся по смещению 57+i*4, i=0..255

Автор: Scorp_Freeman 16.12.2007 4:10

У меня была такая лабораторная работа, я ее еще писал на делфи) Если кому то интересно то я ее прикреплю вместе с экзешкой и кодом smile.gif


Я открывал кодируемый файл как поток, поэтому если подобрать необходимые размеры то можно закодить не только текстовый файл а и другое изображение))


Прикрепленные файлы
Прикрепленный файл  Прога.rar ( 800.04 килобайт ) Кол-во скачиваний: 173

Автор: Unknown 19.12.2007 4:09

Цитата(andriano @ 15.12.2007 19:19) *

Речь изначально шла о файле.
В файле искомые байты находятся по смещению 57+i*4, i=0..255


Ага, пасиб! только 57 - это для какого типа файлов? bmp?

Автор: Unknown 19.12.2007 4:51

Цитата(andriano @ 15.12.2007 19:19) *

Речь изначально шла о файле.
В файле искомые байты находятся по смещению 57+i*4, i=0..255


Ага, пасиб! только 57 - это для какого типа файлов? bmp?
Прошу прощения за дабл-постинг...

Автор: Scorp_Freeman 19.12.2007 5:31

Цитата(Unknown @ 19.12.2007 1:51) *

Ага, пасиб! только 57 - это для какого типа файлов? bmp?
Прошу прощения за дабл-постинг...



ну да... или 39 в шестнадцатиричной)

Автор: hardcase 19.12.2007 5:46

Править двоичный файл - некрасиво.
Что мешает в память загрузить BMP файл в объект типа TBitmap?
Тем более, что этот класс позовляет работать с двоичными данными через ScanLine.
И никаких "волшебств" со смещениями в файле и прочим.

Автор: andriano 19.12.2007 12:29

Цитата(Unknown @ 19.12.2007 0:09) *

Ага, пасиб! только 57 - это для какого типа файлов? bmp?

Для единственного типа - с глубиной цвета 8 бит (256 цветов). Речь шла именно о палитре с 256-ю 4-байтовыми элементами. При бОльшей глубине цвета палитры в файле вообще нет, а при меньшей - сам массив палитры слишком короткий.

Добавлено через 2 мин.
Цитата(hardcase @ 19.12.2007 1:46) *

Править двоичный файл - некрасиво.
Что мешает в память загрузить BMP файл в объект типа TBitmap?
Тем более, что этот класс позовляет работать с двоичными данными через ScanLine.
И никаких "волшебств" со смещениями в файле и прочим.

Напротив, самый простой способ - blockread, change, blockwrite, и никаких заморочек со специфичечкими библиотеками.