Pull to refresh

Хэш-стеганография с использованием vkapi

Reading time3 min
Views6.1K

Привет, Хабр. Некоторое время назад решил разобраться, что такое стеганография, в чем её смысл и какая она бывает. И спустя несколько ссылок наткнулся на интересную статью про хэш-стеганографию. Возник вопрос — а почему бы не попробовать реализовать такой способ передачи на практике? Для начала — в виде proof of concept.
image


Хэш-стеганография?


Если читатель не захотел ознакомиться с упомянутой статьей (очень советую), вкратце передам смысл.
Что мы представляем когда слышим слово стеганография? У нас есть некий контейнер, в который мы вставляем информацию. Вставляем так, чтобы на первый (желательно и на второй) взгляд контейнер не изменился. Но есть ли способ передать информацию не трогая контейнер?


Тут на помощь приходит хэш-стеганография. Смысл прост — мы берем контейнер (лучший вариант — картинку с котиками) и берем от неё хэш. Отрезаем от хэша 1 (2,5,10) символ — допустим, получили букву z. Берем еще 25 картинок и если нам повезло, то мы получили некий словарь, содержащий в себе 26 записей вида "буква" — "картинка". Если не повезло, придется перебрать больше картинок. Таким образом, имеем алфавит, который можно использовать для отправки сообщений. Загружаем на сервер 10 определенных котиков, получатель их загружает с сервера, получает хэш, отрезает по 1 символу и получает "HelloWorld". А если еще и зашифровать это...


image


Что из этого получилось и причем здесь vkapi?


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


Теперь нужен удобный интернет сервис, который давал бы возможность свободно (в известной степени) загружать картинки на сервер и обратно. Я выбрал vk.com. Все нужно для нас там есть — удобные альбомы, которые сохраняют порядок загруженных фотографий, приятный api.


И последнее — нам где-то нужно хранить очень много картинок. Была выбрана MongoDB. Там хранятся записи вида "путь к картинке — хэш картинки — дата последнего использования". Находим нужный хэш, выбираем картинку, которая использовалась давно, загружаем, используя представленный путь.


И это работает?


Да, и это действительно работает. После загрузки и установки запускаем программу:


python vkhs.py -e -l [login] -aid [album id] -m HelloHabr

Password:
message = HelloHabr
len = 10

chip = b'....'
len = 18

upload message?
Total uploaded: 18

Бежим смотреть, что у нас получилось:



Мы получили сообщение, состоящее из 18 картинок. Это не вызывает подозрений — особенно если картинки на одну тему.


Теперь нужно получить наше сообщение:


python vkhs.py -l [login] -aurl [albumxxxxxxxx_xxxxxxxxx]

Password:
Login success
1
2
3
4
...
message: HelloHabr
очистить папку с фалами?

Вуаля, скрытый чат работает.


Проблемы


Вот некоторые из них:


  1. Алгоритм сжатия — как видно на предоставленных скринах, сообщение длинной в 11 символов превращается в сообщение длинной в 18 символов. На большой длине сообщения, этот алгоритм работает прекрасно, уменьшая больше чем в два раза исходный текст. На маленькой — ужасно.
  2. БД. Её нужно регулярно обновлять. Однако vk использует весьма интересный способ хранения фотографий. Когда мы заливаем туда фотографию, сервер автоматически её сжимает — значит изменяется и хэш. Однако, есть фотографии, хэш которых не изменяется. Причины я так и не понял. И поэтому заполнение БД происходит по следующему алгоритму — загружаем из интернета картинки (в идеале — сами фотографируем красивые пейзажи в парке). Затем заливаем их на сервер вк, загружаем обратно. Теперь снова заливаем, сохраняя хэши в бд, снова загружаем обратно. Проверяем изменившиеся, удаляем и повторяем процедуру. После "просеивания" остаются те фотографии, которые "нравятся" серверу. Их и загружаем в БД.
    Как можно увидеть, операция не очень приятная, нужно подумать, как сделать получше. Однако существуют так называемые сравнимые хеши. Например на хабре была классная статья. Для обхода данной "случайной атаки" вместо обычного хеша можно брать сравнимый хеш.

Заключение


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


Все материалы, касающиеся этого проекта представлены в моем репозитории.


Хочу выразить благодарность пользователю PavelMSTU за помощь в разработке концепции программы и данной статьи.

Tags:
Hubs:
Total votes 19: ↑17 and ↓2+15
Comments18

Articles