Пользователи наноборды создают нанопосты - изображения, являющиеся стеганографическими контейнерами, затем постят их на обычной имиджборде, в тумблере, инстаграме, где угодно. Затем создают правило в клиенте наноборды, по этому правилу клиент загружает нанопосты. Все нанопосты шифруются ключем борды.
Терминология: нанопост - данные, содержащиеся в стеганографическом контейнере (пока что это PNG LSB), они зашифрованы с AES, но можно попробовать и другие алгоритмы. Нанопост содержит: - Свой SHA-256 хеш - SHA-256 хеш того поста, на который он отвечает (хеш родителя), либо нули, если он не отвечает на какой-либо пост - Пакет данных в формате JSON, в котором содержится таймстемп создания и текст поста, в будущем там могут содержаться любые данные, в том числе правила для других нанопостов,что угодно - Данные аттача, если аттач есть. Аттачем может быть любой файл, который может уместиться в контейнере
правило - набор данных, по которому клиент наноборды может в будущем подбирать другие нанопосты из известных ему расположений (напр. альбомов или тредов). Правило состоит из: - URL страницы, на которой расположены ссылки на изображения - Регулярное выражение, по которому будут извлекаться (обычно из HTML-кода) адреса изображений - Имя правила Клиент наноборды загружает все изображения, которые подходят по правилу, затем пытается декодировать их содержимое, используя ключ борды и принимая заранее тот факт, что изображение может хранить данные стеганографически. Если произошла неудача на одном из шагов (обычно это сбой проверки хеша, либо сбой при попытке дешифровать данные), то картинка не считается нанопостом и пропускается. Успешно декодированные нанопосты сохраняются в папку nanoposts и добавляются к дереву постов.
ключ борды - набор байт (пароль), по которому клиент будет пытаться расшифровать стеганографический контейнер нанопоста. Использование разных ключей позволяет создавать бесконеное множество наноборд, даже если все изображения будут находиться в одном месте и будут доступны по одному правилу.
Реквестирую критику (конструктивную) и предложения, а может даже и помощь в улучшении реализации. На данный момент это самая доведённая до ума реализация того, что уже много раз обсасывалось в целой цепочке наноборда-тредов.
>>169 Зашёл по ссылке, скачал зип. И что мне теперь с ним делать чтоб ЦП? Ты бы хоть мануал запили бы в вики для тех у кого джавы нет. А этот свой пост как readme положил бы в репу что ли.
Или если хочется всё делать самому, то вот тебе паста для начала:
Если ради лулзов делать стеганографию в png или wav (файлы с сжатием без потерь или вообще без сжатия), то я бы поступил так: 1. Берём 24-битную картинку и представляем её в виде массива байт. Типа [R, G, B, R, G, B, R, G, B…] - назовём его с[] 2. Создаём второй массив такой же длинны, но в нём каждый элемент это порядковый номер байта в массиве c[]. То есть [0, 1, 2, 3, 4, 5, 6, 7….] - назовём его i[] 3. Данные, которые надо спрятать, помещаем в другой массив. Назовём его d[]. При этом в начале массива добавляем 4 байта в которые записываем длину данных. Получается как-то так [0, 0, 12, 130, 77, 90, 0, 3…] 4. Просим у пользователя пароль и с его помощью инициализируем наш PRNG (можно взять от пароля SHA-256 и запустить с него RC4 PRGA - для простоты. Гуглите википедию) 5. Используя PRNG перемешиваем наш i[]. Один и тот же пароль будет выдавать один и тот же перемешанный массив. К примеру такой: [135, 23567, 2, 3562, 123, 5246, 6891…] 6. Сразу после предыдущего шага, мы каждый байт в массиве d[] XOR-им с рандомным байтом возвращаемым нашим PRNG, чтобы наши данные стали больше походить на шум. 7. Теперь начинаем ПО БИТАМ обходить массив d[]. Берём первый бит. Берём первый элемент из i[] который у нас 135. Берём 135-й элемент из c[] и делаем его младший бит равным биту прочитанному из d[]. И так продолжаем пока биты в d[] не кончатся. Что в итоге получится: если мы встраиваем в картинку сообщение длинной 100 байт (всего 104 байта), ту нас в картинке будет 832 (или чуть меньше) пикселей которые чуть-чуть отличаются от оригинала. И пикселы эти будут разбросаны по картинке "случайно". Для картинки размером 800х600 это будет около 0,15% пикселей, на глаз такое вряд ли заметишь. И ещё совет - картинку надо выбирать такую, чтоб было как можно меньше областей залитых одним и тем же цветом. Лучше всего подойдут фотографии, так как в них и так уже есть шум. Теперь как это всё из картинки достать: 1. Выполняем из первого алгоритма шаги 1, 2, 4, 5. 2. Используя массив i[] читаем из картинки первые 32 бита (чтобы получит длину встроенных данных). 3. XOR-им полученные байты со "случайными" байтами из нашего PRNG. Так как он инициирован из того же пароля, байты он будет выдавать те же самые, что и при встраивании. 4. Зная длину данных - создаём массив d[] и по биту заполняем его тем же методом, как и в шаге 7 первого алгоритма. 6. Получив все байты внедренных данных, XOR-им их с нашим PRNG. What's all, folks! Таким методом мы можем встроить в bmp-ашку весом 800кб данные размером до 100кб. Вполне внушительно. Можно впихнуть и больше используя вместо одного младшего бита два, вот только картинку это исказит сильнее и встроенные данные станут более заметными. А вот если встраивать коротенькие сообщения, то выходит вполне отлично. Дальше можно углубиться в теорию кодирования и запихивать в одно изменение бита в картинке 3-4 бита данных. А вот с форматами использующими сжатие с потерями всё хоть и выглядит примерно так же, но вот результат визуально другой, так как там чаще всего мы работаем с частотами, а не непосредственно с пикселами. При этом изменение одного бита может повлиять на значения аж 64-х пикселов (для jpeg). Вот только сказать действительно ли эти изменения вызваны встраиванием сообщения, а не есть результат сжатия с потерями, не так-то просто. (хотя статистика довольно сурьёзная штука, всё может выпалить)
>>170 Установи JRE 1.7 Скачай релиз с гитхаба, распакуй. Потом запусти JNanoBoard.jar Например командой: java -jar JNanoBoard.jar
Сейчас один байт пишется в R, G, B сразу, в первых двух в 3 бита, а в последнем в 2. Но детектируется легко сильной заливкой, ибо пикселы искажаются заметно, если картинка с фоном и без шума. Есть куда шагать в плане улучшения скрытности.
Какая-то хуйня не даёт скачивать картику с сосача, с других сайтов качается хорошо, странно. Исключений никаких не вылетает нигде.
Починил загрузку картинок, теперь наноборда берёт протокол загрузки из урла правила, а не просто подставляет http://, ибо сосач, например, не котирует http:// и перенаправляет на https://.
ну тогда дайте кнопку очистки этого закешированного говна. я понимаю, что оно для того, что бы не делать повторно расшифровку, но все же, иногда надо все совсем по свежачку.
2) запускаешь батником в консоли: java -jar JNanoBoard.jar
3) в первом окне вводишь пароль (внизу оп поста)
4) в 1 окне жмешь кнопку синхронизировать
5) в 4 окне жмешь кнопку рефреш.
6) чтоб ответить в тренд, в 4 окне жмешь "реплай"
7) в 3 окне пишешь текст, выбираешь фоточку в пост, и PNG в который будешь заливать свой пост с картинкой.
8) после того как охуеешь все это нажимать, и при отсутствии ошибок, пиздуешь в корень папки куда распаковал, переходишь в "outbox" и ищешь свой стеганографированный файл вида 5da19............8b83dddc.nanopost.png, который и засылаешь в открытый инет.
>>230 1) а сможешь прикрутить? 2) на какую борду конкретно заливать будешь? на какую то одну - глупо. надо готовить и поддерживать тогда список стабильно работающих борд. - 4чан - сосач - кайзерчан
Отлично, нанооп жив. Только зря отказался от первичной идеи распространять архив доски, а не отдельные нанопосты. И на java перешел. Параноики завопят, начнут критиковать реализацию. А так отлично. Есть архив 8 альфы, которую еще через синк пускали
>>233 Могу тебя огорчить, я, скорее всего, не тот нанооп, о котором ты думаешь. Я - одиз из немногих продолжателей идеи.
>>232 Контейнер шифруется встроенной в джаву реализацией AES/CBC/PCKS7Padding, да, знаю, что может быть подвержена закладкам, но я не настолько спец, чтобы реализовывать криптографию вручную. Ключ шифрования - ключ борды (даже не хеш от него).
>>232 Для этого потребуется сделать двжок, который будет иметь набор правил для постинга на разные борды.
>>232 >а сможешь прикрутить? С программированием у меня не сложилось, если только анон насоветует мне с чего начать (у меня затык на уровне понятий класса, цикла итд, в школе вместо информатики был ворд+эксель+клац+клац)
>>242 Чем аргументируешь? inb4: кококо сисярп лучше
Сейчас основная задача это разработать окончательный формат нанопоста и протоколов стеганографии/шифрования. То, что PoC написан на жабе ни о чём не говорит и камнем ни в чей огород не является, важна идея и архитектура, которую следует продумать и провести её анализ на предмет фундаментальных косяков, а реализовать её потом можно хоть на крестах, асме, хоть в железе на ПЛИС, было бы желание и возможности.
>>1135 > исследую сохранение контейнера при сжатии изображения Сам бы хотел в этом поковыряться. Видимо начинать надо с ватермарков, они такое переживают. вот только вместимость резко упадёт.
>>170 Неплохой алгоритм, но в нём фундаментальный косяк - чтобы узнать длину данных, нужно знать длину данных. А всё потому, что для того, чтобы правильно перемешать массив индексов, нужно знать его длину. Иначе перемешанный массив будет отличаться от того, который был создан при записи в изображение.
А создавать массив индексов для всего изображения целиком это идиотизм и будет работать очень и очень медленно и жрать очень много
Стеганография детектится заливкой минимальной чувствительности на сплошном фоне. Меняется один младший бит случайно выбранного R, G или B байта случайно выбранного пиксела. При этом можно обнаружить только единичные биты. Нулевые, разумеется, обнаружить невозможно.
Противодействие -- использовать картинки с большим числом шумов и без сплошных областей одного цвета.
ГПСЧ -- RC4, инициализируется SHA-256 хешем от пароля.
Пользователи наноборды создают нанопосты - изображения, являющиеся стеганографическими контейнерами, затем постят их на обычной имиджборде, в тумблере, инстаграме, где угодно. Затем создают правило в клиенте наноборды, по этому правилу клиент загружает нанопосты. Все нанопосты шифруются ключем борды.
Терминология:
нанопост - данные, содержащиеся в стеганографическом контейнере (пока что это PNG LSB), они зашифрованы с AES, но можно попробовать и другие алгоритмы.
Нанопост содержит:
- Свой SHA-256 хеш
- SHA-256 хеш того поста, на который он отвечает (хеш родителя), либо нули, если он не отвечает на какой-либо пост
- Пакет данных в формате JSON, в котором содержится таймстемп создания и текст поста, в будущем там могут содержаться любые данные, в том числе правила для других нанопостов,что угодно
- Данные аттача, если аттач есть. Аттачем может быть любой файл, который может уместиться в контейнере
правило - набор данных, по которому клиент наноборды может в будущем подбирать другие нанопосты из известных ему расположений (напр. альбомов или тредов).
Правило состоит из:
- URL страницы, на которой расположены ссылки на изображения
- Регулярное выражение, по которому будут извлекаться (обычно из HTML-кода) адреса изображений
- Имя правила
Клиент наноборды загружает все изображения, которые подходят по правилу, затем пытается декодировать их содержимое, используя ключ борды и принимая заранее тот факт, что изображение может хранить данные стеганографически. Если произошла неудача на одном из шагов (обычно это сбой проверки хеша, либо сбой при попытке дешифровать данные), то картинка не считается нанопостом и пропускается. Успешно декодированные нанопосты сохраняются в папку nanoposts и добавляются к дереву постов.
ключ борды - набор байт (пароль), по которому клиент будет пытаться расшифровать стеганографический контейнер нанопоста. Использование разных ключей позволяет создавать бесконеное множество наноборд, даже если все изображения будут находиться в одном месте и будут доступны по одному правилу.
Исходный код доступен на гитхабе: https://github.com/Cr0s/JNanoBoard
Реквестирую критику (конструктивную) и предложения, а может даже и помощь в улучшении реализации. На данный момент это самая доведённая до ума реализация того, что уже много раз обсасывалось в целой цепочке наноборда-тредов.
Этот тред - тоже нанобордовый, ключ: anuspes