Да, уважаемый читатель, вы правильно прочитали: совершенно секретная. Причем, прошу заметить, совершенно секретная в самом строгом математическом смысле: совершенно секретная по Кашену, ибо расстояние Кульбака — Лейблера в моей математической конструкции будет равно нулю; причем не «почти нулю», а всамделишному нулю, без всяких «бесконечно малых» и иных вульгарных приближений!
Каким образом? А очень просто — я вообще не буду ничего вкраплять в стегоконтейнер. Действительно, если мы ничего не вкрапляем, то пустой контейнер неотличим от стегоконтейнера, верно?
«Подождите, но ведь если мы совсем ничего не вкрапляем, то мы совсем ничего не передаем!!!» — разумно поспорит со мной читатель.
Абсолютно верно! Вкраплять мы и не будем! Есть способ, не искажая контейнер, тем не менее передать информацию. Как?
Cхематично Хеш-стеганографию ??
можно представить так:
Текстовое пояснение к картинке под катом.
Идея очень проста. Берем большую кучу картинок. В современном мире переизбытка гаджетов, селфяшниц и дешевой памяти для хранения полученных фотографий, генерация большого количества картинок, я думаю, не составит особых проблем…
Если лень генерировать, существует множество сайтов, предоставляющие огромное количество фотографий (и других картинок).
Пишем простой скриптик на Python и выгружаем данные.
Теперь берем некую хорошую хеш-функцию. Из всех свойств «хорошести» хеш-функции нас интересует только равновероятность; то есть можно даже взять (с криптографической точки зрения) не самое лучшее хеш-преобразование, например MD5, справедливо потерявший доверие общественности.
Прогоняем все картинки через хеш-функцию, данные заносим в таблицу:
картинка --> хеш
Например:
Фиксируем некое целое число n.
Например n=2.
Составляем новую табличку, выбирая первые (или последние, кто как любит) n нибблов(полубайтов) из хеш'а.
Для нашего примера:
Так как без определений уже не обойтись, введем понятие хеш-кода.
Хеш-код — это первые n нибблов хеш'а изображения.
Фунцию вычисления обозначим за H(...).
Для примера: H(котик1.jpg) = 0xd1; H(котик2.jpg) = 0x55
Составляем индекс по хеш-коду в нашей таблице. Это необходимо, чтобы мы достаточно быстро (а именно за O(log(M), где M — количество картинок в базе) могли найти нужную строку в базе данных по хеш-коду.
Предположим, что мы хотим передать сообщение (в шестнадцатиричном виде): 55d134237598. Разобъем его по n нибблов. В качестве примера мы выбрали n=2, значит следует сообщение 55d134237598 разбить по 2 ниббла. Если «разбивать» будем пробелами, то выглядить это будет так: 55 d1 34 23 75 98. Полученные «кусочки», каждый из которых содержит n нибблов будем называть словами. То есть всего у нас получилось 6 слов.
Далее мы делаем следующее.
Еще раз для понимания посмотрим на GIF'ку, в которой показан принцип передачи 3-х слов: 55 d1 34
Прошу заметить, что если мы возьмем произвольным образом картинку в базе данных, то вероятность того, что
её хеш-код будет совпадать с произвольно заданным словом равна (1 / 2^(4*n)) (эх, почему на хабре до сих пор нет LaTeX'a).
Для n=1 эта величина равна 1/16, для n=2 эта величина равна уже 1/256.
Чем меньше эта вероятность, тем больше фотографий необходимо поместить в базу данных для удовлетворения наших стеганографических потребностей.
С другой стороны, чем больше n, тем больше скорость кода.
К сожалению с увеличением n, скорость увеличивается линейно, а вот потребность в количестве фотографий экспоненциально.
По этой причине хеш-стеганография очень медленна. Тем не менее, для передачи коротких сообщений, она вполне приемлима.
Теперь давайте дадим формальное описание стегосистемы.
Определим стегосистему как множество объектов I.
Определим множество слов S
Определим функцию H(i), которое для каждого i из I ставит в соответсвие слово s из S.
Назовем эту функцию хеш-кодом.
Для передачи сообщения s1,s2,s3,...,sm следует найти такие i1, i2, i3, ..., im,
для которых справедливо: H(i1)=s1, H(i2)=s2, ..., H(im)=sm.
Вот собственно и вся математическая модель. Как видите — ничего сложного.
Для того, чтобы для каждого слова s не перебирать картинки, пока H(i) не станет равным s
разумно выбрать достаточно большое количество изображений, предварительно рассчитать их хеш-коды, записать в базу данных и построить индекс по хеш-кодам.
Сколько должно быть изображений, чтобы с вероятностью 99.999% можно было передать произвольное сообщение s1,s2,s3,...,sm длины m? Обозначим это число за M.
Для меня этот вопрос открытый… Никаких иных способов, кроме как методом Монте-Карло, для расчета M от m и n я не вижу.
Заметим, что наша хеш-стеганография, это типичная pure-стеганография, поэтому было бы неплохо сами данные зашифровать. Например, можно использовать потоковый шифр; в этом случае, перед тем как подать искомое стегосообщение на вход стегосистемы, его следует просуммировать с некой гаммой. К примеру искомое сообщение 55 d1 34 23 75 98 можно зашифровать шифром Вернама и уже шифрованную последовательность подавать на вход стегосистемы.
Другой, на мой взгляд важный апгрейд — это удаление картинки из базы данных после её использования; чтобы после использования картинки её повторно не использовать.
Так же можно попытаться поиграть с вероятностями и с надежностью системы. Например что будет, если мы хотим передать слово 0x55, но у нас в базе данных уже закончились изображения с хеш-кодом 0x55?
Пока варианта два: либо передать с ошибкой, либо каким-либо способом нагенерировать много новых фотографий в надежде, что среди них окажется хотя бы одна с хеш-кодом равным 0x55…
Однако можно придумать и другой вариант: использовать помехоустойчивое кодирование. Тогда у нас есть возможность совершить несколько ошибок и ECC их исправит.
Ну и, конечно, разбивать можно не на нибблы, а на байты, на биты, на произвольные числа произвольной системы счисления.
Следует так же дать пояснение по поводу канала. Под каналом я подразумевал абстракцию в самом общем смысле этого слова. Самое главное — должен быть задан порядок следования одного слова после другого. В принципе можно просто поместить файлы скопом в папку, пронумеровав их. В этом случае папка с файлами будет каналом.
Навскидку несколько примеров конкретной реализации хеш-стеганографии.
По пунктам.
Каким образом? А очень просто — я вообще не буду ничего вкраплять в стегоконтейнер. Действительно, если мы ничего не вкрапляем, то пустой контейнер неотличим от стегоконтейнера, верно?
«Подождите, но ведь если мы совсем ничего не вкрапляем, то мы совсем ничего не передаем!!!» — разумно поспорит со мной читатель.
Абсолютно верно! Вкраплять мы и не будем! Есть способ, не искажая контейнер, тем не менее передать информацию. Как?
Cхематично Хеш-стеганографию ??
можно представить так:
Текстовое пояснение к картинке под катом.
Хеш-стеганография
Идея очень проста. Берем большую кучу картинок. В современном мире переизбытка гаджетов, селфяшниц и дешевой памяти для хранения полученных фотографий, генерация большого количества картинок, я думаю, не составит особых проблем…
Если лень генерировать, существует множество сайтов, предоставляющие огромное количество фотографий (и других картинок).
Пишем простой скриптик на Python и выгружаем данные.
Теперь берем некую хорошую хеш-функцию. Из всех свойств «хорошести» хеш-функции нас интересует только равновероятность; то есть можно даже взять (с криптографической точки зрения) не самое лучшее хеш-преобразование, например MD5, справедливо потерявший доверие общественности.
Прогоняем все картинки через хеш-функцию, данные заносим в таблицу:
картинка --> хеш
Например:
- котик1.jpg --> 0xd131dd02c5e6eec4693d9a0698aff95c
- котик2.jpg --> 0x55ad340609f4b30283e488832571415a
- …
Фиксируем некое целое число n.
Например n=2.
Составляем новую табличку, выбирая первые (или последние, кто как любит) n нибблов(полубайтов) из хеш'а.
Для нашего примера:
- котик1.jpg --> 0xd1
- котик2.jpg --> 0x55
- ...
Так как без определений уже не обойтись, введем понятие хеш-кода.
Хеш-код — это первые n нибблов хеш'а изображения.
Фунцию вычисления обозначим за H(...).
Для примера: H(котик1.jpg) = 0xd1; H(котик2.jpg) = 0x55
Составляем индекс по хеш-коду в нашей таблице. Это необходимо, чтобы мы достаточно быстро (а именно за O(log(M), где M — количество картинок в базе) могли найти нужную строку в базе данных по хеш-коду.
Предположим, что мы хотим передать сообщение (в шестнадцатиричном виде): 55d134237598. Разобъем его по n нибблов. В качестве примера мы выбрали n=2, значит следует сообщение 55d134237598 разбить по 2 ниббла. Если «разбивать» будем пробелами, то выглядить это будет так: 55 d1 34 23 75 98. Полученные «кусочки», каждый из которых содержит n нибблов будем называть словами. То есть всего у нас получилось 6 слов.
Далее мы делаем следующее.
- Берем слово. Ищем картинку у которой хеш-код совпадает с нашим словом. Если таковых картинок несколько, берем любую из них.
- Передаем картинку в канал
- берем второе слово, ищем хеш-код совпадающий со вторым словом
- Передаем картинку в канал
- переходим к третьему слову… и так далее...
Еще раз для понимания посмотрим на GIF'ку, в которой показан принцип передачи 3-х слов: 55 d1 34
Прошу заметить, что если мы возьмем произвольным образом картинку в базе данных, то вероятность того, что
её хеш-код будет совпадать с произвольно заданным словом равна (1 / 2^(4*n)) (
Для n=1 эта величина равна 1/16, для n=2 эта величина равна уже 1/256.
Чем меньше эта вероятность, тем больше фотографий необходимо поместить в базу данных для удовлетворения наших стеганографических потребностей.
С другой стороны, чем больше n, тем больше скорость кода.
К сожалению с увеличением n, скорость увеличивается линейно, а вот потребность в количестве фотографий экспоненциально.
По этой причине хеш-стеганография очень медленна. Тем не менее, для передачи коротких сообщений, она вполне приемлима.
Формальное описание
Теперь давайте дадим формальное описание стегосистемы.
Определим стегосистему как множество объектов I.
Определим множество слов S
Определим функцию H(i), которое для каждого i из I ставит в соответсвие слово s из S.
Назовем эту функцию хеш-кодом.
Для передачи сообщения s1,s2,s3,...,sm следует найти такие i1, i2, i3, ..., im,
для которых справедливо: H(i1)=s1, H(i2)=s2, ..., H(im)=sm.
Вот собственно и вся математическая модель. Как видите — ничего сложного.
Для того, чтобы для каждого слова s не перебирать картинки, пока H(i) не станет равным s
разумно выбрать достаточно большое количество изображений, предварительно рассчитать их хеш-коды, записать в базу данных и построить индекс по хеш-кодам.
Сколько должно быть изображений, чтобы с вероятностью 99.999% можно было передать произвольное сообщение s1,s2,s3,...,sm длины m? Обозначим это число за M.
Для меня этот вопрос открытый… Никаких иных способов, кроме как методом Монте-Карло, для расчета M от m и n я не вижу.
Апгрейды
Заметим, что наша хеш-стеганография, это типичная pure-стеганография, поэтому было бы неплохо сами данные зашифровать. Например, можно использовать потоковый шифр; в этом случае, перед тем как подать искомое стегосообщение на вход стегосистемы, его следует просуммировать с некой гаммой. К примеру искомое сообщение 55 d1 34 23 75 98 можно зашифровать шифром Вернама и уже шифрованную последовательность подавать на вход стегосистемы.
Другой, на мой взгляд важный апгрейд — это удаление картинки из базы данных после её использования; чтобы после использования картинки её повторно не использовать.
Так же можно попытаться поиграть с вероятностями и с надежностью системы. Например что будет, если мы хотим передать слово 0x55, но у нас в базе данных уже закончились изображения с хеш-кодом 0x55?
Пока варианта два: либо передать с ошибкой, либо каким-либо способом нагенерировать много новых фотографий в надежде, что среди них окажется хотя бы одна с хеш-кодом равным 0x55…
Однако можно придумать и другой вариант: использовать помехоустойчивое кодирование. Тогда у нас есть возможность совершить несколько ошибок и ECC их исправит.
Ну и, конечно, разбивать можно не на нибблы, а на байты, на биты, на произвольные числа произвольной системы счисления.
Следует так же дать пояснение по поводу канала. Под каналом я подразумевал абстракцию в самом общем смысле этого слова. Самое главное — должен быть задан порядок следования одного слова после другого. В принципе можно просто поместить файлы скопом в папку, пронумеровав их. В этом случае папка с файлами будет каналом.
Примеры
Навскидку несколько примеров конкретной реализации хеш-стеганографии.
- Публикация изображений в социальной сети в определенной последовательности.
- Передача данных по протоколу BitTorrent в нужной последовательности (чтобы были нужные хеш-коды для передачи нужных слов)
- Если в протоколе X есть возможность кодирования одних и тех же данных различными способами, то выбор такого способа кодирования, чтобы передавать нужные слова. Например подойдет протокол ZIP
- Совершенно произвольная осмысленная замена в человеческом языке до тех пор, пока не получим нужных хеш-код. Например предложение «Я пошёл в лес и увидел серого волка» можно заменить на аналогичное осмысленное предложение «Я отправился в лес и увидел серого волка». Смысл одинаков, но хеш-код, возможно, окажется другим. Следует производить замену до тех пор, пока не получим нужный нам хеш-код.
Подведем итоги
По пунктам.
- Хеш-стеганография не искажает данные контейнера. Поэтому она совершенно секретна (по Кашену)
- Хеш-стеганография достаточно медленна. С ростом n увеличивается скорость линейно, а сложность экспоненциально.
- Хеш-стеганография не чувствительна к данным контейнера. Не существует LSB для MP3, нельзя применить стеганографию в просодиях для JPEG… Для хеш-стеганографии важно только то, что данные представимы в цифровом виде.
- По причине п.1, п.2, п.3 хеш-стеганография может быть неплохим решением для передачи коротких сообщений
- Так как хеш-стеганография — это pure стеганография (стеганография без ключа), то для защиты данных необходимо шифрование
- Хеш-стеганография может быть «подалгоритмом» другого алгоритма стеганографии. Правда в этом случае нам, скорее всего придется пожертвовать совершенностью. Напрмер в LSB можно изображение разбить на U частей. Берем часть и изменяем в ней 1 бит данных, высчитываем для этой части хеш-код. Если он совпал со словом, то переходим к следующей части и берем следующее слово. Если нет, то пытаемся изменить другой бит данных. Таким образом мы изменили всего U бит данных, но передали 4*U*n бит данных. Увеличивая n и U можно добиться весьма хороших результатов.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
maaGames
Котостенография может использоваться для передачи сообщений террористами! Срочно запретить котиков в интернетах!
PavelMSTU
А вот смех смехом, а согласно данным USA Today от 5 февраля 2001 именно котиков использовал Усама бен Ладен ;))
mihmig
Может вместо борьбы с технологиями начать бороться с причинами появления террористов?
Ведь с помощью одной книги и вековых устоев ни бомбы(химия), ни автомата(станкостроение) не изготовить…
maaGames
Надо запретить секс. Говорят, все террористы появились на свет из-за секса.
PavelMSTU
Я думаю maaGames с юмором это сказал. ;))
Вы, конечно, правы, еще Норберт Винер говорил об этом аж в 1947 году:
Мощно сказано!
(пруф под спойлером. Цитата жирным текстом выделена)
Быть может, исторические корни настоящего положения вещей станут яснее, если вспомнить, что I промышленная революция — революция «темных сатанинских фабрик» — была обесценением человеческих рук вследствие конкуренции машин. Любая заработная плата, на которую мог бы прожить землекоп в Соединенных Штатах, будет слишком высока, чтобы позволить ему конкурировать с экскаватором. Современная промышленная революция должна обесценить человеческий мозг, по крайней мере в его наиболее простых и рутинных функциях. Разумеется, подобно тому, как квалифицированный плотник, квалифицированный механик или квалифицированный портной пережили так или иначе I промышленную революцию, квалифицированный ученый и квалифицированный администратор могут пережить и вторую. Но представим себе, что вторая революция завершена. Тогда средний человек со средними или еще меньшими способностями не сможет предложить для продажи ничего, за что стоило бы платить деньги.
Выход один — построить общество, основанное на человеческих ценностях, отличных от купли-продажи. Для строительства такого общества потребуется большая подготовка и большая борьба, которая при благоприятных обстоятельствах может вестись в идейной плоскости, а в противном случае — кто знает как? Поэтому я счел своим долгом передать мои сведения и мое понимание положения тем, кто активно заинтересован условиями и будущим труда, т.е. профсоюзам. Я принял меры к установлению контактов с одним-двумя лицами из руководства Конгресса производственных профсоюзов. Они выслушали меня с большим пониманием и сочувствием. Более этого ни я, ни они сделать не смогли. По их мнению, как и по моим предыдущим наблюдениям и сведениям, профсоюзы и рабочее движение в Соединенных Штатах и в Англии находятся в руках группы весьма ограниченных лиц, хорошо разбирающихся в специальных вопросах деятельности цеховых старост и борьбы за заработную плату и условия работы, но совершенно не подготовленных для занятия большими политическими, техническими, социологическими и экономическими проблемами, касающимися самого существования труда. Причины ясны. Профсоюзный работник, переходя от напряженной жизни рабочего к напряженной жизни администратора, обычно лишен возможности получить широкое образование. Тех же, кто имеет такое образование, обычно не привлекает карьера профсоюзного деятеля. В свою очередь, профсоюзы, вполне естественно, не заинтересованы в приеме таких людей.
Те из нас, кто способствовал развитию новой науки — кибернетики, находятся, мягко говоря, не в очень-то утешительном моральном положении. Эта новая наука, которой мы помогли возникнуть, ведет к техническим достижениям, создающим, как я сказал, огромные возможности для добра и для зла. Мы можем передать наши знания только в окружающий нас мир, а это — мир Бельзена и Хиросимы. Мы даже не имеем возможности задержать новые технические достижения. Они носятся в воздухе, и самое большее, чего добился бы кто-либо из нас своим отказом от исследований по кибернетике, был бы переход всего дела в руки самых безответственных и самых корыстных из наших инженеров. Самое лучшее, что мы может сделать, — это позаботиться о том, чтобы широкая публика понимала общее направление и значение этой работы, и ограничиться в своей собственной деятельности такими далекими от войны и эксплуатации областями, как физиология и психология. Как упоминалось выше, есть и такие, кто надеется, что польза от лучшего понимания человека и общества, которое дает эта новая наука, сможет предупредить и перевесить наше невольное содействие концентрации власти (которая всегда — по самим условиям своего существования — сосредоточивается в руках людей, наиболее неразборчивых в средствах). Но я пишу это в 1947 г. и должен заявить, что надежда на такой исход очень слаба.
devpony
В вашем случае DKL = 0 только тогда, когда распределение сообщений PE также равномерное, что невозможно в реальном мире.
PavelMSTU
Почему должно быть равномерным? Это достаточное, но не необходимое условие…
PS неотличим от PE, поэтому D(PS || PE) = 0…
Или есть ошибка?..
devpony
Стеганография совершенно секретна, если
DKL(PC || PS) = 0
Где PC — распределение передаваемых сообщений без зашифрованной информации — предполагается у вас равномерным.
Тогда DKL(PC || PS) = 0 <=> PC = PS = PE.
Чем «менее нормально» распределены исходные сообщения, тем больше величина DKL(PC || PS).
Говоря более прикладным языком, если у вас в исходных сообщениях байт 0x00 повторяется чаще других, то и некоторые картинки из всего потока будут повторяться чаще других, что позволит наблюдателю делать предположения относительно ключа и того, включён ли сейчас канал или нет.
AllexIn
не надо повторяющихся картинок. ничто не мешает использовать несколько картинок для кодирования одного и того же числа.
devpony
Множество таких картинок всё-равно конечно.В итоге вероятности всех изображений этого множества будут отличны от вероятностей остальных картинок и DKL(PC || PS) будет больше нуля.
AllexIn
Почему оно конечно?
AllexIn
UPD: Ну, то есть, понятно, что множество конечно. Но множество картинок в интернете несоизмеримо больше чем может понадобится чтобы зашифровать любое разумное сообщение.
devpony
Не важно насколько оно большое. Важно, что оно конечно. Автор утверждает, что DKL(PC || PS) = 0. Я хочу сказать, что если распределение сообщений не нормальное, DKL(PC || PS) никогда не будет равно нулю, а сможет лишь к нему приблизиться.
PavelMSTU
Нет, по Кашену у вас есть «private random source R», и есть источник пустых контейнеров C (см под спойлером картинку). Плевать на Интернет. Есть он, нет его… Не важно.
mayorovp
При наличии под рукой кота и фотоаппарата множество возможных картинок — бесконечно :)
PavelMSTU
А еще лучше шимпанзе вместо кота.
Дать обезьяне в руки пальцетык и научить делать селфи…
Говорят интеллект у шимпанзе достигает 5-тилетнего ребенка — можно воспользоваться. ;)
PavelMSTU
Теперь понял.
Первое: необходимо чтобы вероятность любого байта в стегосообщении была 1/256, то есть все байты должны быть распределены равновероятно. Для этого стегосообщение (если оно большое) следует пожать, и зашифровать. Или вместо шифрования наложить детерминированную, но хорошо распределенную гамму.
Второе: сама хеш-функция, по которой вычисляется хеш-код должна быть «хорошей» с точки зрения равновероятности распределения.
О втором я написал в статье, про первое как-то не подумал.
Спасибо за замечание!
Если эти два условия выполняются, то стегосистема совершенна.
Маленькая ремарка.
Вы написали: DKL(PC || PS) = 0 <=> PC = PS = PE; но эквивалентность не верна.
Верно DKL(PC || PS) = 0 <= PC = PS = PE, хотя конечно сложно придумать привести конкретный пример, когда DKL(PC || PS) = 0, но PC != PS…
devpony
Почему эквивалентность не верна?
DKL(P || Q) = 0 <=> ln(p(x)/q(x)) = 0 <=> p(x)/q(x) = 1 <=> p(x) = q(x) ?x
devpony
Напомню, что p(x) и q(x) неотрицательны, поэтому все слагаемые суммы больше нуля.
PavelMSTU
Вы забыли про суммирование.
Почему все слагаемые больше нуля? ln(p(x)/q(x)) > 0 если p(x)/q(x) > 1 и ln(p(x)/q(x)) < 0 если p(x)/q(x) < 1.
При чем здесь «неотрицательность» p(x) и q(x)? Например p(x) = 0.1, а q(x)=0.2, тогда p(x)/q(x) = 0.5,
ln(p(x)/q(x)) <0 будет, потому что логарифм от числа, меньшее 1 будет меньше нуля…
Теоретически какие-нибудь слогаемые p(x)*ln(p(x)/q(x)) могут быть меньше нуля, а какие-нибудь больше…
devpony
Теоретически, могут. Теоретически даже q(x) могут быть равны нулю для некоторых x и мы получим бесконечное расстояние. Однако такие случаи не имеют смысла. В теоретической информатике определяется, что DKL(P || Q) = 0 <=> P = Q почти всюду.
OldFisher
В итоге получается нечто вроде «пляшущих человечков» — шифр подстановки, только начертаний символа будет больше одного. В принципе, с большой базой картинок и дополнительным шифрованием сообщений может быть более-менее безопасно, но вряд ли практично. При наличии большой базы картинок сообщения можно передавать куда как эффективнее.
PavelMSTU
Это первый шаг :)
Но в принципе вы правы.
Использование шифрования перед стеганографией, разумеется, обязательно.
Mercury13
Это называется «книжный шифр» с откровенно необычной книгой.
PavelMSTU
Нет!
Во-первых: в книжном шифре и отправитель и получатель должны иметь книгу. Здесь базу данных должен иметь только отправитель. Получателю совершенно все равно, сколько котиков (или собачек) в базе данных отправителя.
Во-вторых: в книжном шифре книга статична. Здесь (по причине «во-первых») вы можете дополнять свою базу новыми изображениями (или другими сущностями), не уведомляя об этом получателя.
Таким образом отправитель и получатель должны иметь разную информацию. У отправителя должна быть база данных, а получателью ничего не нужно, только хеш функция и ключ, при использовании шифрования.
Mercury13
Если так…
С технической стороны: все картинки надо заранее перевести в общую палитру (помните, GIF — 256-цветный формат?) Затем закодировать каким-то простым кодеком — настолько простым, чтобы особенности реализации не мешали и уж от этого брать хэш. Даже в BMP, возможно, слишком много заголовков; больше подходит TGA.
С шифровальной стороны: это называется «безопасность через неясность», и если способ передачи информации вскроется, он вскрыт. Научная стеганография интересна именно тем, что можно и информацию хранить, и обходить те статистические методы, которыми обнаруживают картинки с подвохом.
Чем трудна борьба с национальной преступностью? А тем, что трудно выучить язык и трудно посадить «крота». С кротом не наше дело, а язык — та же «неясность».
mayorovp
Добавляем общий ключ-соль — и теперь зная алгоритм, но не зная ключа, будет невозможно отличить сообщение от случайной последовательности котиков
Заодно можно исключить из схемы шифрование.
Mercury13
А если так — перед нами самое настоящее шифрование.
С другой стороны, есть и другие способы протащить один байт в картинке, чтобы гэбня не заметила.
icoz
Мне одному кажется, что если запостить разом пару сотен картинок, то это может вызвать какие-то подозрения?
И второе, а что будет, если доблестный facebook, vk и прочие возьмут и пережмут оригинальную картинку? Для оптимизации трафика, например…
michael_vostrikov
Это аналог книжного шифра, только в книжном шифре одна книга и разные координаты букв в сообщении, а у вас много книг и одна и та же координата. Книга в данном случае — это одна фотография кота. Вернее, коты здесь даже ни при чем, книга — это хеш передаваемого файла, а сама фотография — просто протокол передачи. Соответственно, все достоинства и недостатки книжного шифра имеют место быть.
mva
А за что человека минусуют? Он правду говорит: получается книжный шифр «наоборот»:
в оригинале у обоих «переписывающихся» должна быть книга, а передаются координаты, но, тем не менее, в текущем виде, получателю всё равно нужно знать чем снимать хеш, и сколько и откуда брать нибблов. А это, по сути, то же самое имение книги :)
khim
Так всю электронику можно свести к штрику Шеффера или стрелке Пирса и, на этом основании, объяснять что в электронике никакая инновация невозможна.
b_oberon
Не всю: схемы с памятью одной булевой логикой не опишешь.
qw1
Речь шла о сведении элементов к базовым, а не логическом описании
dic.academic.ru/pictures/wiki/files/82/RS_Trigger_Logic.gif
Loki3000
Так и в случае с книгой нужен ключ (книга) и правила его применения.
MuLLtiQ
Напомнило
WeslomPo
А почему обязательно использовать изображения и только изображения.
Любая папка или архив, с любыми файлами отсортированными в алфавитном или любом другом порядке известному отправителю и получателю. Например «Новая папка (5)» в которой лежат вперемешку отпускные фотографии, какие-то текста статьи, ярлыки, архивы и т.д. Сортируем по какому-то параметру (алфавит, размер, дата создания/изменения и т.д.) вычисляем некий хеш (md5, sha и т.д.) берем какие-то символы из хеша (1 и 3, первый и последний, первые два, последние 4 и т.д., абсолютно любые по алгоритму известному и отправителю и получателю), затем компонуем из этого например байты в шестнадцатеричной системе счисления и вуаля, наша криптоконтейер, который можно расшифровать.
Похоже на идеальную систему.
PavelMSTU
Я в главке «Примеры» же написал…
WeslomPo
Я понял, но примеры шибко академические и с упором на единообразие, поэтому в комментариях зациклились на кошках. Я же говорю о том, что любая комбинация любых данных может служить контейнером сообщения. Не нужно искать какие-то картинки создающие определённый хэш, достаточно любого файла. Т.е. я пытаюсь расширить ваши примеры.
Не нужно переделывать предложение чтобы там был смысл. Например текстовой документ с ссылками, вырезанными цитатами, словарными словами, пустыми строками, паролями и прочими списками покупок — могут служить контейнером — да смысл есть, но такой список можно подготовить алгоритмически, например на основе существующих списков. Вы, кстати, сами зациклились на кошках и утверждаете что алгоритм медленный, я думаю, что можно подготовить огромную базу различных файлов из которых потом можно создавать сообщение не вызывающего особого подозрения и это не обязательно будут фотографии кошек, и необязательно это будут только фотографии.
PavelMSTU
Верно.
При чем здесь кошки? ;) Котики только в качестве примера, т.к. во-первых забавно, во-вторых… традиция.
Если по сути, то как я уже написал: при увеличении n, скорость растет линейно, а вот требуемое количество вычислений/памяти растет экспоненциально!!! Именно поэтому хеш-стеганографию я назвал медленной.
WeslomPo
Вы правы, я был невнимателен.
ComodoHacker
Поскольку количество хороших хэш функций весьма ограничено, схема палится на раз профессиональным аналитиком. Добавим к этому то, что схема не предусматривает никакого разделяемого секрета, то есть держится исключительно на секретности алгоритма.
Поэтому вопрос о практичности даже ставить как-то неудобно.
khim
Вау.
Вы либо троллите, либо вообще ничего не понимаете «в колбасных обрезках». И не читаете комментарии. В частности — этот
Хороших хеш функций — неограниченное количество (ну хорошо: ограниченное… примерно 2512… для практических использований этого более, чем достаточно). Добавьте к вашей котографии произвольную «соль», обработайте всё это SHA512 — всё, «новая» хорошая хеш функция готова. Дальше — криптоаналитики могут хоть убиться об стену.
ComodoHacker
2512 это количество всех хэш-функций. А хороших — то есть хорошо изученных и используемых на практике — можно пересчитать по пальцам. Случай применения неизвестной хэш функции «назло всем» давайте рассматривать не будем.
Это будет уже другая схема, не так ли? А я критиковал ту, которая предложена в статье.
hellman
Хэш функций (с 512 битным хэшем) бесконечно много, кроме того их даже несчётное число (континуум). И даже если ограничить размер входа, 2^512 будет в экспоненте, т.е. число будет порядка 2^(2^512). И «хороших» хэш функций, в том числе и удобных для вычисления, там достаточно, уж поверьте.
PavelMSTU
Нет!
По пунктам.
PavelMSTU
Хех… пока писал, уже ответили.…
ComodoHacker
1. Причем здесь шифрование? К надежности вашей стеганографии оно ничего не добавит.
2. Можно. Какую и как?
3. Можно. Думаете, аналитики об этом не знают? Или у них нет инструментов автоматизирующих проверку этих цепочек?
mayorovp
2. Любую.
Дана хорошая хеш-функция H(x). Берем любую строку s (эта строка будет общим секретом отправителя и получателя) и формируем функцию H1(x) = H(x + s). Эта функция будет столь же хорошей, что и исходная — но при этом не зная s невозможно отличить последовательность картинок, несущую скрытое послание, от случайной.
ComodoHacker
Да, с общим секретом уже лучше. Но насчет «любую» надо ещё подумать.
Слишком примитивно. Known plaintext во все поля.a_batyr
Достаточно, например, раз 500 вычислить какой-нибудь CRC16. И попробуй потом догадайся что там было.
mayorovp
(комментарий был удален)
encyclopedist
Я боюсь, что если вы с вашим другом начнётё обмениваться тысячами фотографий котиков, то спецслужбы обратят на вас внимание даже быстрее, чем если бы вы использовали обычное шифрование. Надо прятять в чем-то более обыденном.
Egor3f
Тысячи фотокарточек нагих барышень?
PavelMSTU
Говорят, уже использовали. Не знаю, фейк ли это, но технически возможно не фейк…
Как сообщает издание New York Times, с помощью закодированных сообщений боевики не только общались друг с другом, но даже координировали свои дальнейшие действия и планировали теракты. Раскрыть действия террористов помогла работа группы дешифровщиков из Израиля, Великобритании и США.
Как выяснили специалисты, боевики группировки использовали технологию шифрования сообщений на товарах, которые продавались на eBay. Использовали для своих нужд радикалы и порносайты, где сообщения кодировались картинками, а также новостной сайт Reddit, где информация передавалась шестнадцатеричными числами.
lgorSL
Не обязательно котиками. Выше в статье приводился пример произвольных замен в тексте. Правда, тут есть косяк: не думаю, что нормальный человек будет этим заниматься. Довольно тяжко подбирать разные слова. Лучше выбирать простейший способ хеширования и передавать в слове бит. Я сейчас попробовал взять чётность количества букв. Ужасно долго:( Куча усилий для передачи даже одного простого слова.
PavelMSTU
Смотрите.
Пока вы правы, т.к. технически сейчас это действительно трудоемко.
Однако при большой базе; хорошем сервере; распараллеливании (а ведь легко масштабируется!) можно сделать работающее решение даже на этой скудной теории…
Самый интересный нюанс — это то, что не требуется аналогичных ресурсов у получателя, только у отправителя.
Говоря на пальцах, связь типа: «ТОЛСТЫЙ штаб» (отправитель) --> «ТОНКИЙ разведчик в Гондурасе» (получатель) вполне возможна.
На счет теории — интуитивно чувствую, что можно многое улучшить… Но нужно еще подумать. Может быть хабрасообщество подкинет несколько идей…
FishDude
«Хеш-стеганография не искажает данные контейнера» — ну да, не искажает, — потому что информация находится в другом месте.
alexkuzko
Можно модифицировать торрент траффик, чтобы передавать определённые последовательности конкретной раздачи. И поди догадайся что ты что-то передал. Либо если зациклиться на той же идее из статьи, можно раздавать не все файлы, а нужные.
PavelMSTU
Да, я написал об этом в «Примерах», пункт 2.
Осталось только реализовать…
mihaild
Кажется что вы просто переложили задачу преобразования распределения на сообщениях в равномерное на какую-то внешнюю хеш-функцию.
Wesha
Мне нравится Ваш способ котирования информации!
(Смайлики, к сожалению, на хабре запрещены.)
janatem
По-моему, уязвимость следующая. Имея подозрение в том, что серия котиков — это стеганографическое сообщение, можно попробовать применить описанный алгоритм и увидеть либо само сообщение, либо сигнатуры шифра, которым оно было защищено.
Таким образом, чтобы стеганография работала, нужно иметь общий секрет о параметрах алгоритма (какой хэш, какие биты из него берутся), но тогда мы сваливаемся к общим проблемам крипто- и стеганографии.
За ссылки в статье спасибо.
Scratch
Сигнатуры шифра? Нуканука, давайте я вам дам два фрагмента, один зашифрован AES, второй Twofish, а вы мне скажете где какой?
maximw
Вы бы еще предложили AES и Rijndael-256
PavelMSTU
Не удержался…
Простите, но AES и есть Rijndael…
mwizard
Подозреваю, что это и была шутка от maximw. «Одну строку мы захэшируем SHA3, а другую — Keccak».
PavelMSTU
Жаль, что текст не передает сарказма ;)
Этот профессиональный анекдот нужно устно рассказывать…
maximw
Да, если быть точным, то не просто Rijndael, а именно Rijndael-256. Это была шутка.
PavelMSTU
Была 128-битная версия или появилась 512-битная?
maximw
Простите, ошибся. Память подвела.
AES-N, где N — длина ключа.
Rijndael-M, где M — длина блока.
AES это Rijndael-128, с вариациями длины ключа.
janatem
Сам я не умею на глаз выделять сигнатуры, но если бы шифротекст этих форматов был неотличим от высокоэнтропийного мусора, то (почти все) стеганографические проблемы были бы решены.
mayorovp
А он и так не отличим. Но, во-первых, кроме алгоритмов шифрования, есть еще и форматы, протоколы и контейнеры, которые содержат заголовки с сигнатурами — в них-то и проблема.
А во-вторых, высокая энтропия — это и есть признак шифрованного сообщения, который также надо прятать.
hellman
Если вы сможете отличить шифротекст AES от «мусора» — это уже считается взломом AES.
khim
Да, но что-то зашифрованное AES достаточно просто отличить от, скажем, текста на русском языке. Потому и возникает потребность в стеганографии, собственно…
mwizard
А это вы не AES обнаруживаете, а энтропию текста глазами меряете. Поэтому в стеганографической передаче высокую энтропию сообщения разбавляют низкоэнтропийным «осмысленным» мусором — котиками.
andreymironov
Мне ваша статья почему-то напомнила эту работу (не стеганография). Странный душевный порыв из области иррационального. Извините меня, личное мнение.
PavelMSTU
А вы самоироничны ;)
Ограниченность я показал. (экспоненциальный рост памяти/вычислений при линейном росте полезной нагрузки при увеличении n).
Применимость для малых сообщений очевидна…
Что в моем посте иррационального?
andreymironov
В вашем посте иррационального ничего. «Странный душевный порыв из области иррационального» — это я о себе, а не о вас. Читай так: «Мне ваша статья почему-то напомнила эту работу. Странно, с чего бы вдруг?!».
PavelMSTU
Если это вопрос ко мне, то я не знаю с чего бы вдруг.
andreymironov
К счастью, это риторический вопрос!
PavelMSTU
;)
b_oberon
Поздравляю, Павел, Вы изобрели шифр простой замены. При бесконечном множестве котиков получается что-то, отдалённо напоминающее шифр Вернама. Но стеганография ли это?
PavelMSTU
Нет.
Если удалять котика при использовании, то это уже не шифр простой замены.
Каждое слово будет кодированно новым котиком.
Хотя, если вам очень хочется, то можно использовать как шифр простой замены. (Вот только зачем?)
Если котики никого не смутят, то это стеганография. Например, Egor3f предложил использовать нагих барышень вместо котиков.
Котики — это пример и дань традициям…
b_oberon
Тогда предлагаю передавать исходное сообщение, назвав его выгрузкой с random.org. В принципе, не более подозрительно, чем длинная череда котиков (хомячков, голых женщин).
PavelMSTU
Абсолютно верно.
Вы можете взять хеш от чего угодно. Поэтому можете передавать что угодно.
То есть данный вид стеганографии работает с любыми контейнерами.
На счет «подозрительности» — вопрос спорный… Так и не может научное сообщество решить, что считать «подозрительным», а что не считать…
b_oberon
Для random.org даже хеш не нужен, этот сайт выдаёт истинно случайные последовательности.
То, что Вы описываете, больше похоже на шифр подстановки с бесконечным выходным алфавитом (почему, собственно, такие шифры и не рассматриваются в классической криптографии).
PavelMSTU
Да неужели? И почему же не рассматриваются?
Шифры простой замены взламываются частотным анализом. Как вы будете ломать в случае бесконечного выходного алфавита?
b_oberon
Потому и не рассматриваются, что бесконечный алфавит — это математическая абстракция, не достижимая в реальности.
С бесконечным алфавитом конструкция напоминает шифр Вернама, поскольку P(c=b) = P(c=b | m=a) = 0.
При конечном выходном алфавите Ваш подход вырождается в шифр простой замены: каждому символу открытого текста ставится в соответствие определённое конечное множество, из которого случайным образом выбирается один представитель. Имея достаточный объем шифртекстов, такой алгоритм можно ломать частотным анализом.
PavelMSTU
Так у меня бесконечный алфавит. Что мешает вам в >2015 году выгрузить по одной сущности на каждое слово?
Согласно вашим же словам — у меня шифр Вернама…
Не понимаю о чем спорим…
Мое множество конечное, но количество элементов в этом множестве больше количества всех передаваемых слов. В случае использования одной сущности из множества — эта сущность сразу удаляется.
В случае, когда множество «заканчивается», я просто подгружаю новые сущности (котики, ёжики, барышни, можно вообще не картинки, главное, чтобы хеш можно было взять. А хеш берется от всего, заданное в виде последовательности байт...)
b_oberon
Необходимость спрятать 1 Гб данных. По картинке на каждый байт — это миллиард изображений. Миллиард, Карл! А перебрать придется в худшем случае (все байты сообщения одинаковые) порядка 256?109 изображений
(для таких формул LaTeX не нужен). В то же время, запрятать 1 Гб данных в 500 Гб HD-видео вполне можно.Кроме того, объясните мне, пожалуйста:
1. Чем хеш-стеганография лучше метода LSB? Могу предложить сразу два варианта LSB: либо шифровать данные перед встраиванием и использовать контейнеры, у которых младшие биты естественным образом имеют равномерное распределение, либо подбирать контейнеры, у которых определенные младшие биты уже совпадают с сообщением.
2. Почему я не могу сообщение из вашего примера передать безо всяких котиков просто в виде 0x55 0хD1 0x34 0х23 0x75 0х98? В чем принципиальное отличие?
Также напомню, что по Кошену the embedding function F and the distributions of all random variables are known to Eve, т.е. злоумышленник знает способ встраивания, given a covertext distribution, the embedding function F is universal for information embedding, т.е. способ встраивания не зависит от распределения встраиваемых сообщений, и the key has been chosen at random and communicated over a secure channel prior to the use of the stegosystem, т.е. ключ (если Вы будете его использовать) выбирается независимо от сообщения.
PS (с надеждой) Это ведь не кандидатская диссертация в МГТУ, правда?
PavelMSTU
Однако просторно…
Отвечу кратко. Он уменя «бесконечен по-гречески». «Прямая — это отрезок, который можно бесконечно долго продливать».
База данных бесконечна с точки зрения процесса стеганографической передачи данных, но в реальности (разумеется) она конечна. Если у нас не хватает данных — мы добавляем их в базу.
Почитайте название. там есть фраза "очень медленная".
Я не приводил методы сравнения чем хуже, а чем лучше.
Простите, не понял. Как именно? в каком контейнере?
Я не хочу вас обижать… Но это не верно. Во первых не естественным образом, а во-вторых не равномерное.
У меня pure-стеганография (стеганография без ключа). Криптография отдельно, стеганография отдельно.
PS. моя кандидатская о другом, не переживайте.
b_oberon
Вы спросили, что мне мешает использовать по картинке на каждое слово, я ответил.
Изобретать что-то, что во всех отношениях хуже имеющихся аналогов, немного бессмысленно. Следовательно, должны быть какие-то сильные стороны — вот про них и хотелось услышать.
Да без контейнера! Если уж следовать Кашену, то злоумышленник знает способ встраивания (см. цитату из его работы выше) и без труда восстановит последовательность хешей. Также напомню, что «так и не может научное сообщество решить, что считать «подозрительным», а что не считать…» (это Ваш ответ), поэтому не вижу отличий в передаче последовательности изображений или последовательности байтов.
Вы вибираете изображения с определенным хешем, я — с определенным распределением и значениями младших битов (исходное сообщение предварительно зашифрую на константном ключе, чтобы поправить его статистику). Принципиальных отличий так и не увидел.
Наконец, если уж говорить о секретности по Кашену, то в вашей системе между пустым и заполненным стегоконтейнерами существует одно огромное отличие: длина пустого контейнера равна нулю, заполненного — количеству байтов (если считать длину контейнера в изображениях). Так что тезис о совершенной секретности тоже не выполняется.
PS Если единственный минус на моем комментарии от Вас, то это выглядит как-то неприлично, дискуссия все же. Если же от другого хабраюзера, то я призываю присоединиться к обсуждению и высказать, чем вызван минус.
PavelMSTU
Он восстановит, потому что у стеганографии нет ключа. Для этого не нужно никаких допущений…
Вот только польза какая?
Вы меряете длину контейнера как? Пустой контейнер — это котик, в котором ничего не передаем, заполненный — тот, в котором передаем. Как может быть равно нулю? 0_о
PS Странно, у вас вообще нет публикаций… По идее, пока вы ничего не разместите, по правилам хабра никто никогда за вас не голосонет. 0_о
b_oberon
Эмм… Странно, что ниже Вы просите привести критику. Мне казалось, что все обсуждение выше — это, собственно, и есть критика.
Давайте кратко по пунктам:
1. Отсутствие преимуществ перед известными методами при наличии недостатков.
2. Отсутствие преимуществ перед передачей исходного сообщения без использования стеганографии (не обеспечивается факт скрытой передачи).
3. Ограниченная область применения в связи с низкой скоростью.
4. Недостаточная строгость формулировок в статье, из-за чего возникли варианты двойного толкования в комментариях (это затрудняет обсуждение, но на сам метод, разумеется, не влияет).
PavelMSTU
Спасибо, я вас понял.
Наверное нужно хорошо обдумать и сделать отдельный пост…
Если конечно это кроме меня будет интересно. ;)
PavelMSTU
Точно!
(1 / 2^(4*n)) можно заменить на (1 / 24?n), тег sup,
а как теперь тегами HTML под дробь это убрать?
Кто-нибудь знает??
mayorovp
1/24?n
Теги sub и sup можно вкладывать друг в друга :)
b_oberon
Также можно использовать отрицательные значения степени.
PS Сорри, из-за плевка в карму теперь не могу использовать теги.
hellman
Интересно, как вы получили минус. Пытаюсь поставить плюс — «Нельзя голосовать за пользователей, у которых нет размещённых публикаций».
b_oberon
Видимо, нельзя голосовать только вверх. Все-таки придётся что-нибудь запостить! Но за попытку большое спасибо!
PavelMSTU
Не туда. УдалилВот еще одно правило хабра: предельный рост глубины форума = 12...
PavelMSTU
Напишите на мою идею критику;)
Нет, я серьезно. Критика — это всегда хорошо. А то и у меня и у вас получаются очень просторные комменты…
Будем антагонистами. Я за хеш-стеганографию — а вы против.
Может быть что-то родиться совместными усилиями…
PavelMSTU
Гениально! Только это не совсем дробь, это знак / в скобках… ;)) 1<sub>/2<sup>4n</sup></sub> = 1/24n
mayorovp
Я сделал немного по-другому:
<sup>1</sup>/<sub>2<sup>4n</sup></sub>
grumbler66rus
В статье описан алгоритм с алфавитом, несколько превышающим длину шифротекста. Он не является бесконечным, но по эффективности идентичен ему.
PavelMSTU
Да, именно это я и имел в виду.
Количество картинок много больше количества слов.
mwizard
А вы, как автор, видите какие-то (пусть даже граничные) сценарии атаки на подобную схему? Что должно пойти не так (кроме хренового генератора случайных чисел на стороне отправителя), чтобы все стало плохо?
PavelMSTU
mwizard
Скорость не проблема, когда речь идет о безопасности — это, конечно, недостаток, но не уязвимость.
PavelMSTU
Просто если для передачи, скажем 256 байт вам нужно 256 Мегабайт, не всегда это практически применимо…
Almazen
Реализация вариации на тему пункта 4 из ваших примеров была темой моего диплома в далеком 2008. В качестве разделителей хешируемых элементов выступал набор знаков препинания, задавалось количество вкладываемых в каждый хэшируемый блок бит, производилась подсветка удачно подобранных и еще не готовых фрагментов в тексте-контейнере и т.д. Так что идея хоть и любопытна, но совсем, совсем не нова.
PavelMSTU
Классно! Прямо как по Томасу Куну, который говорил, что любая идея всегда рождается не реже чем два раза…
Что ж ничего не написали?..
Код уже помер, или где-то завалялся?
Almazen
Думал, что потерял, но нашел. В виду того, что это был мой первый опыт использования c#, да и вообще в программирование я ушел только после диплома, код там… аховый. Но если интересно, могу выслать в личку. Стоит?
PavelMSTU
Высылайте, я все равно студентам в качестве курсовой дам ;))
Тут главное не код, главное подход.
Almazen
Отправил в личку.
Almazen
удалено
Loki3000
Стеганография подразумевает сокрытие самого факта передачи информации. Передача же большого количества изображений, да еще в определенном порядке, сразу наталкивает на подозрение об использовании кода.
mayorovp
Как вы отличите упорядоченный набор котиков от неупорядоченного? :)
igormu
Можно постоянно передавать.
khim
Военные так и делают, насколько я знаю: по шифрованным каналам всё время гонится «мусор», чтобы по возникновению активности нельзя было понять, что в стране началась подготовка к чему-то…
MichaelBorisov
Автор, ваше изобретение не является стеганографией. Как тут уже говорили, вы изобрели шифр простой замены. Какая разница вообще, хеш используется или не-хеш? Можно, например, задать на изображении X такую функцию:
F(X) = 1, если на картинке изображен кот;
F(X) = 0 в противном случае.
Или более сложную функцию:
F(X)=0, если изображен дом
F(X)=1, если река
F(X)=2, если человек
F(X)=3, если мотоцикл
и т.д. для произвольных объектов, число которых в нашем мире достаточно велико, чтобы получился алфавит приличного объема.
Такие функции, кроме прочего, будут весьма устойчивы к помехам, включая многие виды обработки и пережатия изображений, в отличие от хешей. По сути дела главная ваша идея — это задать на множестве изображений {X} функцию a=F(X), множество возможных значений которой существенно меньше множества возможных значений аргумента.
Вы сможете передавать таким образом информацию (зашифрованную, незашифрованную), по несколько бит на картинку. Но стеганография ли это? Для этого надо правильно определить термины.
Если рассматривать вашу систему как стеганографию — то стегоконтейнером будет ваш профиль в социальной сети или блог, куда вы выкладываете картинки. Стегосообщение — значения функции F(X) на этих картинках. Сообщение внедряется путем определения последовательности публикуемых картинок. При таком рассмотрении ваша система предстает среди прочих стеганографических систем вполне заурядно.
PavelMSTU
Не понимаю за что минусуют…
У меня такая идея тоже была — скрестить кода с ужом: стеганографию & Machine Learning…
Мне кажется, что хотя бы стоит эту идею развить — а там посмотреть, рабочая она или нет.
На счет того, что это не простой шифр замены — напишу на выходных FAQ и добавлю в статью.
Тут уже неоднократно обсуждалось.
mwizard
Мне кажется, я придумал хорошее практическое применение для подобного механизма. Обычные криптопротоколы, которые используются на данный момент, всегда начинаются с общения открытым текстом — для передачи, например, версии протокола, поддерживаемых алгоритмов шифрования, установления общего секрета DH и т.д.
Преступное правительствозлонамеренный MITM может использовать эти открытые данные для классификации траффика, разрыва соединения, постановки на карандаш, выезда опергруппы и т.д.Вместо этого, открытые данные можно поделить на слова, а каждому восьмибитному слову сопоставить, скажем, 2048 бит случайных данных, подобранных таким образом, чтобы младшие 8 бит sha256 совпадали с требуемым словом. Таким образом, по каналу вообще никогда не передается ничего в открытом виде, и метрик, пригодных для блокировки этого трафика, не существует.
mayorovp
Это всего лишь означает, что придется в метрики добавлять вычисление младших 8 бит sha256. И ведь добавят как только такой способ станет достаточно популярным.
mwizard
Ага, но при этом невозможно отличить протокол от случайного совпадения. Будут ложные сработки. Много ложных сработок.
mwizard
Еще, как вариант, вычислять хэш не один раз, а, например, 100 тысяч итераций (т.е. использовать принцип PBKDF2). Таким образом, получатель, которому эту операцию нужно будет выполнить единожды для установления подключения, не заметит существенной разницы. А вот
РКНMITM захлебнется.Хотя да что уж там sha256… Использовать в качестве хэш-функции scrypt, чтобы еще и аппаратные ускорители построить нельзя было.