Помощь - Поиск - Пользователи - Календарь
Полная версия: "спрятать предложение" в файле формата bmp
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Тёмный Эльф
Нужно в bmp файл "засунуть" текстовый файл. Не очень понимаю как это осуществить. Может быть представить два массива. В один считывать инфу из текстового файла ,а в другой из графического? Но можно ли будет потом простым присваиванием заменить байты??

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

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



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

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

Идея уже высказана тобой.
Ты скажи, сколь велик этот "текстовый файл". Мне кажется, что много тут не упрячешь.
Тёмный Эльф
Мне кажется, что текстового файла, состоящего из 10 символов достаточно. Здесь же важно будет посмотреть, сильно ли изменится изображение после замены байтов. А потом можно будет изображение чуть-чуть изменить в какой-нибудь программе, например, переставить пиксели, и в результате после декодирования мы получим уже искаженную строку.
Вроде идея ясна ,но хочется разобраться во всех тонкостях алгоритма.
Lapp
Цитата(Тёмный Эльф @ 17.05.2007 3:05) *

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

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

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

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

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

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

прога к сожалению не откомпилировалась, но все-равно спасибо.
Кстати,хочу на Си это написать.
Вот примерный алгоритм.
1. проверить формат рисунка. Если не bmp, выход из программы. (искать надо будет по сигнатуре "BM". Так как я с графическими файлами еще не работала, я плохо представляю как это можно сделать. Ладно там строку "BM" найти в текстовом файле, но в графическом..)
2. найти общую информацию о файле (глобальная палитра, размер файла). если палитра не найдена, то выход из программы, иначе узнать размер палитры. (что такое палитра пока плохо понимаю)
3. узнать размер файла, коорый требуется застенографировать. Нужно знать степень упаковки (которая указывает на количество бит , помещаемое в один байт графического изображения) и проанализировать, поместится ли файл в глобальную палитру.
4. занести информацию о типе стеганографируемого файла и его размер в байтах. Затем занести текст.
5. скопировать оставшийся графичекий файл в новый и завершить работу.
(приступила к первому пункту всего-лишь и уже неясности. )
volvo
Цитата
прога к сожалению не откомпилировалась
blink.gif Очень странно... А чем компилировала? Версия Дельфи, в смысле, какая? D6 скомпилировала без проблем...
Тёмный Эльф
Цитата(volvo @ 18.05.2007 1:42) *

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


Ёлки. wacko.gif Изучить что-ли Дельфи чтобы не спутать в следующий раз с Паскалем!??
(ясно теперь, почему не откомпилировалось...)
Unknown
а каким образом можно реализовать сокрытие информации в текстовом файле? с картинками вроде все понятно... даже прогу начал делать...
А вот что с текстовыми документами делать пока не придумал... можно добавлять нечитаемые символы, подменять кириллические символы на латинские, поизвращаться над пробелами... но что-то мне все это не нравится...
Tan
Ну один из простых способов сместить коды символов на определённую величину N. Можно придумать какую - то формулу по смещению и применить её. Просто в этом случае не надо ничего добавлять в файл, здесь упор на то, что нам известны эти самые коды. Это конечно, если я правильно понял термин "скрыть".
hardcase
Судя по вопросу, речь идет о стеганографии.
Цитата(Unknown @ 24.11.2007 0:38) *
а каким образом можно реализовать сокрытие информации в текстовом файле?
Использовать кодовые фразы, как в шпионском боевике. Типа "бабушка пошла за покупками" = "запущена баллистическая ракета". Это сокртыие информации на основе замещения смысла слов. Вставив подобные фразы в безобидный текст позволит спрятать полезную информацию, но для этого фраза должна корректно ложиться на текст и получатель должен знать смысл фраз.

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

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

А может кто-нибудь объяснить, что за формат пикселя в 32 бита? 24 бита - это RGB? а еще 8 - на что?
volvo
Цитата(Википедия)
В реальности 32-битный цвет является 24-битным (Truecolor) с дополнительным 8-битным каналом, который либо заполнен нулями (пустотой), либо представляет Альфа-канал, который задает прозрачность изображения в определенных пикселях.
Unknown
А как к этому дополнительному 8-битному каналу можно получить доступ в Билдере? Как его можно изменить?
hardcase
Цитата(Unknown @ 26.11.2007 10:28) *
А как к этому дополнительному 8-битному каналу можно получить доступ в Билдере? Как его можно изменить?
Аналогично способу в Делфи, посмотри мой код. (Хотя, конечно, работу с битами в нем можно было бы сделать несколько проще.)
Unknown
Цитата(hardcase @ 26.11.2007 13:17) *

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

Честно говоря, ничего не понял )
Я Делфи вообще не знаю ( Хотя бы примерно намекни, плз.
andriano
Цитата(hardcase @ 17.05.2007 11:11) *

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

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

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

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

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

С Jpeg все иначе - нужно менять косинусные коеффициенты в самом jpeg-файле.
В принципе это логично, но насколько такой способ оказывается стойким к преобразованию, скажем jpg->bmp или просто к пережатию jpg с другим коэффициентом сжатия?
Lapp
Цитата(andriano @ 15.12.2007 1:05) *

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

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

Добавлено через 10 мин.
А кодирование в bmp устойчиво к изменению размера, увеличению контраста или к коррекции цветового баланса?
andriano
Вообще-то перекодировка изображения в другой формат и его обработка - вещи немного различные.
При обработке изменяется количество информации, содержащейся в файле, поэтому сохранение информации НЕ МОЖЕТ быть гарантировано. Перекодировка же может быть осуществлена без потерь.
JPEG - формат с потерей информации, поэтому, на мой взгляд, он также не может гарантировать сохранение информации.
Поскольку в обсуждении была высказана иная точка зрения, я и хочу ее уточнить.
Lapp
Цитата(andriano @ 15.12.2007 11:52) *

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

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

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

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

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


Я имею ввиду, как можно изменить этот байт по своему желанию? К РГБ доступ получается с помощью GetPixel и т.п., а вот к четвертому байту как?
andriano
Речь изначально шла о файле.
В файле искомые байты находятся по смещению 57+i*4, i=0..255
Scorp_Freeman
У меня была такая лабораторная работа, я ее еще писал на делфи) Если кому то интересно то я ее прикреплю вместе с экзешкой и кодом smile.gif


Я открывал кодируемый файл как поток, поэтому если подобрать необходимые размеры то можно закодить не только текстовый файл а и другое изображение))
Unknown
Цитата(andriano @ 15.12.2007 19:19) *

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


Ага, пасиб! только 57 - это для какого типа файлов? bmp?
Unknown
Цитата(andriano @ 15.12.2007 19:19) *

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


Ага, пасиб! только 57 - это для какого типа файлов? bmp?
Прошу прощения за дабл-постинг...
Scorp_Freeman
Цитата(Unknown @ 19.12.2007 1:51) *

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



ну да... или 39 в шестнадцатиричной)
hardcase
Править двоичный файл - некрасиво.
Что мешает в память загрузить BMP файл в объект типа TBitmap?
Тем более, что этот класс позовляет работать с двоичными данными через ScanLine.
И никаких "волшебств" со смещениями в файле и прочим.
andriano
Цитата(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, и никаких заморочек со специфичечкими библиотеками.
finasteride on sale no prescript
Order Propecia No Rx
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.