|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
Стеганография. Метод Коха и Жао01.05.2015, 10:45. Показов 19008. Ответов 40
Метки стеганография (Все метки)
Метод Коха и Жао. Реализую на C#. Хотел заказать в разделе фриланса, но пообщавшись с форумчанином Ev_Hyper , понял, что тема не супер-сложная. Немного разобрался и ниже сформулировал вопросы.
Сначала опишу сам алгоритм. Скрытие: 1. Первичное изображение разбиваем на блоки 8 на 8 пикселей. 2. К каждому блоку применяется дискретное косинусное преобразование. В результате получаем матрицы 8 на 8 коэффициентов ДКП. 3. Выбирается любой блок (в каждый блок записывается 1 бит информации) 4. Псевдослучайно выбираются два коэффициента ДКП в каждом блоке из среднечастотных коэффициентов. 5. Для передачи бита 0 необходимо, чтобы разница модулей коэффициентов ДКП превышает некоторую положительную величину (задается вручную); для передачи бита 1 разница должна быть меньшей по сравнению с некоторой отрицательной величиной. Таким образом, при передаче 0 увеличиваем модуль первого коэффициента и уменьшаем модуль второго. При передаче 1 уменьшаем модуль первого коэффициента и увеличиваем модуль второго. где 6. Проходим по каждому блоку и выполняем пункты 4 и 5. 7. Для каждого блока выполняем обратное ДКП Извлечение: 1. Пункты 1,2,3 скрытия. 2. Нужно «найти» те два коэффициента ДКП, которые мы изменяли, и посчитать разность их модулей. 3. В результате проверки разности модулей извлекаемому биту присваивается или 0 или 1. 4. Для каждого блока выполняем обратное ДКП. Последний раз кодил 2.5 года назад, поэтому много непонятного по синтаксису. С терминологией не очень, поэтому какие-то вопросы наверно звучат некорректно. С чего начать: 1. Как в программе открыть файл с текстом? Как получить из исходного текста строку бит? Что именно нужно: строка бит или массив бит? И вообще, нужно ли заранее выделять память под такой массив(строку) или лучше в процессе срытия получать биты из исходных символов исходного текста? 2. 1-й пункт алгоритма. Как открыть изображение (*.bmp) в программе? В каком виде оно будет представлено в программе? Для наших целей нужно его представить в виде двумерного массива пикселей? Если да, то как это сделать, и как затем разбить этот двумерный массив на двумерные массивы поменьше? Не понятен сам алгоритм такого разбиения… 3. 2-й пункт алгоритма. К чему именно применяется ДКП: к матрице пикселей, к пикселю, к каждой цветовой компоненте пикселя, к каждому биту значения цветовой компоненты? Как будет выглядеть ДКП на c#? 4. 4-й пункт. Как выбрать коэффициенты псевдослучайно? 5. Как уменьшить абсолютное значение одного коэффициента и увеличить другого, чтобы разность достигла приемлемого значения? В цикле прибавлять/отнимать по 1 и сравнивать разность с нужным значением? 6. 2-й пункт извлечения. Как найти те самые коэффициенты, ведь мы их выбрали псевдослучайно?
0
|
|
| 01.05.2015, 10:45 | |
|
Ответы с готовыми решениями:
40
Алгоритм Коха и Жао
|
|
Заблокирован
|
|||||||||||||||||||||||||||||||||
| 01.05.2015, 12:48 | |||||||||||||||||||||||||||||||||
|
OpenFileDialog Для чтения информации из выбранного файла воспользуйтесь методом из класса File
Если хотите провести встраивание в "синюю компоненту", то:
https://www.cyberforum.ru/blog... g3507.html https://www.cyberforum.ru/post1936578.html ...
Но вам все равно нужно будет их знать для извлечения.
2
|
|||||||||||||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
||
| 01.05.2015, 13:24 [ТС] | ||
|
Ev_Hyper, [QUOTE]
Спасибо за оперативный ответ, сейчас начну пробовать!
0
|
||
|
Заблокирован
|
||||||||||||
| 01.05.2015, 13:59 | ||||||||||||
|
8Ball, вам нужно будет работать с битами, вот класс (взят из статьи на хабре о методе LSB): Bits
В принципе можно воспользоватся стандартным классом BitArray, но с ним неудобно работать. И вот обратное дискретно-косинусное преобразование:
2
|
||||||||||||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
| 02.05.2015, 14:45 [ТС] | |
|
Ev_Hyper
Ну, "альфа-версия" наверно готова. Пока сделал только скрытие. Блоки беру по порядку, в блоках беру коэффициенты с координатами (4;5) и (5;4). И меняю эти два коэффициента не одновременно, а как у Конаховича в М.48. Может если плавно менять, то искажения меньше будут.. Пока изображения выглядят вот так (пересохранил пэинтом bmp в jpeg, чтоб меньше весили. визуально то же самое): Кликните здесь для просмотра всего текста
Завтра продолжу работу. Пока продвигается медленнее, чем я думал. Если бы не ваши алгоритмы разбиения на блоки и ДКП, то вобще б застрял...)
0
|
|
|
Заблокирован
|
||||
| 02.05.2015, 14:57 | ||||
|
1
|
||||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
| 03.05.2015, 11:55 [ТС] | |
|
Ev_Hyper,
Кликните здесь для просмотра всего текста
У меня с извлечением проблема... Не знаю, где ошибка. Но выяснил, что измененные на этапе скрытия матрицы 8на8 коэффициентов ДКП не совпадают с матрицами коэффициентов ДКП, которые получаем из измененного изображения.
0
|
|
|
Заблокирован
|
|||||||||||
| 03.05.2015, 12:49 | |||||||||||
|
8Ball, на первый взгляд ошибок нет. Разве что меня немного смущает эта часть:
И небольшие замечания на будущее: 1. Желательно добавить нормировку:
3. Проверять исходное изображение на то что высота/ширина кратна 8. 4. В качестве модификации можно подумать над первичным анализом изображения, чтобы определять в какую компоненту лучше всего встраивать информацию.
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
| 03.05.2015, 14:38 [ТС] | |
|
Ev_Hyper, кажется я понял, где ошибка.. После того, как при скрытии мы меняем коэффициенты ДКП в матрицах 8на8, я взял одну матрицу и сделал с ней ДКП(ОДКП(матрица)). В итоге получились другие коэффициенты.
Вы привели метод ДКП, в который входит массив byte, а выходит массив double. А в приведенном вами примере ОДКП входит и выходит double, и я попытался изменить его так, чтобы он возвращал массив byte. И видимо с типами данных тут загвоздка (скорее всего я неправильно меняю тип данных в ОДКП)
0
|
|
|
Заблокирован
|
||
| 03.05.2015, 14:45 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
| 03.05.2015, 15:27 [ТС] | |
|
Ev_Hyper,
Вот так получилось. Может так и должно быть?... С извлечением все равно что-то не то. Ладно, завтра буду разбираться дальше.
0
|
|
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
|
| 03.05.2015, 15:35 [ТС] | |
|
В предыдущем сообщении это я применял нормализацию к каждой матрице 8на8. Ее же надо ко всему массиву применить? Если да, то вот так получается. Ну, я просто устал сегодня с этой программой, поэтому туплю наверно.
0
|
|
|
Заблокирован
|
||||||||||||||||||||||||||||
| 04.05.2015, 02:57 | ||||||||||||||||||||||||||||
![]() Добавлено через 11 часов 4 минуты 8Ball, вообщем мне удалось разобраться в чем была ошибка. Их было несколько: 1. Массивы ссылочный тип, поэтому просто писать "=" нельзя. Вот метод-костыль, можно использовать Array.Copy, то это уже в бета-версии:
Так что теперь нужно привести код в порядок: 1. Вынести параметры метода как свойства класса 2. Проверять исходное изображение на то что высота/ширина кратна 8. 3. Встраивать или длину текст или спец. символ для обрезки. 4. В качестве модификации можно подумать над первичным анализом изображения, чтобы определять в какую компоненту лучше всего встраивать информацию. 5. Добавить progressBar 6. Возможно поместить контролы в лэйаутпанель, для красивого изменения при масштабировании 7. Провести непосредственно рефакторинг кода.
3
|
||||||||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 9
|
||||||
| 04.05.2015, 15:57 [ТС] | ||||||
|
Ev_Hyper, спасибо, все работает!
1. Первый пункт не совсем понял. Вы имеете ввиду, создать переменные в классе и использовать get и set? И в метод hide и extract никаких параметров не передавать? 2. Я сделал так: область, которую меняем, ограничил ближайшими размерами к размерам изображения, которые делятся на 8. Если размеры сами делятся на 8, значит их оставляем. Примерно так:
3. Да, сделал символом, работает! 4. Еще сегодня сделал выбор блоков для встраивания (в Конаховиче это дальше описано) сделал скрытие и извлечение, вроде работает. Над тем, что вы предлагаете, завтра подумаю, идея хорошая. 5. Это да, нужная вещь, иначе некрасиво будет заторможенность выглядеть. 6. А что такое лэйаутпанел? Сейчас начал искать про масштабирование, похоже это не такая уж простая задача, но кое-что нашел по этому поводу. Буду пробовать. 7. Да, в коде трудно ориентироваться, несмотря на то, что он небольшой. Еще у меня есть мысль сделать интерфейс "стеганография", от него наследовать Коха и от Коха наследовать его модификацию. Но для этого нужно сначала провести тот самый рефакторинг. Вобщем пока не ясно, как это сделать. Буду думать!
0
|
||||||
|
Заблокирован
|
||||||||||||||||||||||||||||||
| 04.05.2015, 17:26 | ||||||||||||||||||||||||||||||
Также можно вынести некоторые важные переменные как поля:
![]() и вот эту часть нужно переписать:
0
|
||||||||||||||||||||||||||||||
|
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29
|
|
| 23.05.2015, 23:14 | |
|
Здравствуйте, а не могли бы вы подсказать, каким образом можно улучшить алгоритм Коха-Жао, для снижения уровня вносимых визуальных искажений? Кроме улучшений: выбора наиболее подходящих блоков для встраивания или добавление третьего коэффициента ДКП.
Спасибо.
0
|
|
|
Заблокирован
|
||
| 23.05.2015, 23:56 | ||
|
Я так понимаю раз искажение значительное, значит объем информации существенный? Если вы уверены, что изображение будет "в целости", то можно попробывать сжать данные, чтобы уменьшить объем. P.S. А с чем связан выбор именно метода Коха-Жао?
0
|
||
|
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29
|
||||
| 24.05.2015, 01:15 | ||||
А мне, наоборот хотелось бы даже увеличить количество встраиваемой информации, пусть это даже несколько увеличит искажения, или сложность алгоритма. Вот думаю, как можно это сделать например записывать два бита в блок, а не один. Может быть изменить размер блока с 8х8 на 10х10 например. Не знаю, что из этого получится.
В общем цель именно усовершенствовать алгоритм Коха-Жао (т.е. уменьшить вероятность успешного стегоанализа, при этом значительно те теряя пропускную способность алгоритма(а лучше ее увеличить еще). Интересуют вопросы, как будет влиять изменение размерности блоков для ДКП? изменение количества коэффициентов? количество встраиваемых бит в блок? может перевести в другое цветовое пространство? может еще что-то? спасибо
0
|
||||
|
Заблокирован
|
||||
| 24.05.2015, 08:47 | ||||
|
1. Объем встраивания возрастет, визуальное искажение увеличиться 2. Так ведь тут есть зависимость от предыдущего вопроса, разве нет? 3. Можно перевести, но выигрыша от объема не будет. Вы задаете такие вопросы, на которые легко ответить внеся соответствующие изменения в программу. Реализуйте и напишите ответы, было бы интересно узнать результаты ![]() Все же в стеганографии делается упор на скрытии самого факта передачи информации. Вы также должны учитывать, что первичную информацию вам прийдется передать по незащищенному каналу (коэф. выбранные для встраивания, палитру и её компоненты...)
1
|
||||
|
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29
|
|
| 24.05.2015, 23:07 | |
|
спасибо, буду проверять
Добавлено через 10 часов 40 минут В результате, проведенных тестов выяснил следующее: Влияние различных факторов на отношение искажений контейнера сигнал/шум 1) изменение цветовой модели перед ДКП значительно ухудшило результат отношения сигнал/шум (по пункту 1) Хотя, читал, что это должно улучшить отношение сигнал/шум 2) встраивание в высокочастотную область спектра незначительно улучшило результат 3) встраивание в низкочастотную область спектра значительно ухудшило результат (по пунктам 2 и 3) Кстати в какой-то статье читал, что наоборот писали, что встраивание в низкочастотную область улучшает отношение сигнал/шум, исследование показали обратное Но наверное, уменьшится устойчивость к компрессии 4) увеличение блока до размерности 10х10 ухудшило результат 5) увеличение блока до размерности 16х16 ухудшило результат (по пунктам 4 и 5) Короче здесь тоже читал, что это улучшает результат, но он ухудшился 6) уменьшение блока до размерности 6х6 незначительно улучшило результат 7) уменьшение блока до размерности 4х4 незначительно улучшило результат, лучше чем 6х6 (по пунктам 6 и 7) Но наверное, уменьшится устойчивость к компрессии 8) встраивание 2 бит в блок в среднечастотную область улучшило результат 9) встраивание 2 бит в блок в срч и всч область улучшило результат (по пунктам 8 и 9) странно Но наверное, уменьшится устойчивость к компрессии 10) 3 коэффициента значительно улучшило результаты 11) выбор подходящих блоков + 3 коэффициента улучшило, но в 1,5 раза меньше, чем в предыдущем случае (по пунктам 10 и 11) единственное, что совпало теория и практика, правда опять странность, что при выборке наиболее подходящих блоков результат хуже чем просто способ с тремя коэффициентами 12) 2 бита по 3 коэффициента результаты значительно улучшились Но наверное, уменьшится устойчивость к компрессии похоже это и будет моим улучшением алгоритма плюсы по сравнению с алгоритмом Коха Жао пропускная способность увеличивается вдвое уменьшение успешного стегоанализа, за счет значительного улучшения отношения сигнал/шум минусы увеличена сложность алгоритма нужно проверить ослабилась ли и насколько устойчивость к компрессии Жду комментарии, уважаемого Ev_Hyper
1
|
|
| 24.05.2015, 23:07 | |
|
Помогаю со студенческими работами здесь
20
Построение Анти-Снежинки Коха (Снежинка Коха внутрь) на языке Pascal. Стеганография. Написать метод для расшифровывания текста из картинки bmp Стеганография: как реализовать метод избыточных пробелов сокрытия информации в текстовом файле?
Снежинка Коха Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|