Stiger · iOS / iMessage

Сообщения, которые не выглядят как сообщения.

Отправь стикер с сообщением внутри. Если задан пароль, прочитает только тот, у кого есть Stiger Pro и тот же пароль. Для любопытного взгляда, листающего чат, это просто стикер.

Публичная бета в TestFlight. На проверке в App Store. Без аккаунтов. Без серверов. Открытая спецификация.

Почему сейчас

Среда для мессенджеров: шесть фактов со ссылками.

Досмотр устройств, варианты шифрования и доступ к мессенджерам отличаются от страны к стране и продолжают меняться. У каждого пункта ниже есть ссылка на официальный или технический источник. Stiger ничего из этого не меняет: это ещё одно место, куда можно положить сообщение, не похожее на сообщение.

США · FY2025

55 318 досмотров устройств на границе.

92% из них — базовые досмотры. По политике CBP обоснованное подозрение требуется только для расширенных. Источник: CBP.

Великобритания · 2025

Advanced Data Protection недоступна в Великобритании.

Apple больше не предлагает ADP — опциональное сквозное шифрование iCloud — новым пользователям в Великобритании. Privacy Guides связывает это с уведомлением о технических возможностях (technical capability notice) от властей страны. Источники: Apple Support, Privacy Guides.

Евросоюз · с 2022

Правила сканирования сообщений обсуждаются.

Позиция Совета ЕС, ноябрь 2025: добровольное сканирование платформами становится постоянным, обязательные приказы об обнаружении не включены. Переговоры с Европарламентом продолжались. Источник: Совет ЕС.

Россия · 2024–2026

Signal, WhatsApp и Telegram ограничены.

Роскомнадзор ограничил Signal в августе 2024-го. В феврале 2026-го исключил домены WhatsApp из национальной системы DNS, а Telegram, по сообщениям, замедляли. Источники: BleepingComputer, 2024, BleepingComputer, 2026, gHacks.

Беларусь · МВД

Подписка на признанные экстремистскими Telegram-каналы — правонарушение.

ГУБОПиК МВД сообщает: подписка на Telegram-каналы и чаты, признанные экстремистскими, влечёт административную ответственность по ст. 19.11 — штраф, общественные работы или арест. Источник: заявление ГУБОПиК.

Венесуэла · 2025

Проверки телефонов на блокпостах.

В годовом отчёте IACHR за 2025 год отмечены выборочные проверки телефонов в общественных местах и, около инаугурации 10 января, на блокпостах по всей стране. Источник: IACHR (ОАГ), глава IV.B.

На практике

Зачем это может понадобиться.

Когда мессенджеры ограничены.

В местах, где основные мессенджеры ограничены и телефоны могут проверять, но iMessage работает, стикер может нести ключ доступа, контакт или инструкцию — и поиск по ключевым словам ничего из этого не найдёт.

Когда твою переписку читают.

Партнёр, который листает твои сообщения. Родитель, который проверяет. Связь с другом снаружи, когда нужна такая, что не похожа на связь. Поставь пароль и включи блокировку по Face ID — и помни о пределах: приложение видно на телефоне, а кто знает твой код разблокировки, откроет и его.

То, что не должно лежать открытым текстом.

Одноразовые пароли. Wifi для гостей. Доступ к серверу для друга. Код от подъезда. Отправляешь стикер — строка не попадает ни в историю чата, ни в превью на экране блокировки.

Записка самому себе.

Подсказка к паролю, код от шкафчика, напоминание, которому не место в открытом тексте. Отправляешь стикер самому себе — он лежит в истории Сообщений и выглядит как ничто. Только не делай его единственной копией чего-то критичного: пересжатая картинка или забытый пароль — и всё потеряно.

Любовные записки и свои шутки.

«Скучаю» под стикером с кактусом. План на субботу, который общему чату видеть не обязательно. Бесплатно и без пароля — но без пароля прочитать может любой, у кого есть Stiger. Для важного поставь пароль.

Просто для удовольствия.

Ключ к загадке в ARG. Записка от себя‑прошлого в капсулу времени. Пасхалка, спрятанная внутри открытки на день рождения. Стеганография не обязана быть «жизнь или смерть», чтобы быть кайфовой.

За 30 секунд

Весь путь, от начала до конца.

Находишь Stiger среди приложений iMessage, пишешь секрет, ставишь пароль, отправляешь. На другой стороне стикер снова превращается в текст.

Записано в симуляторе iOS, интерфейс в ролике английский.

Как это работает

Открытая математика, спрятанная в чём-то обычном.

Текст шифруется AES-256-GCM, ключ выводится из пароля через PBKDF2-SHA256, 600 000 итераций. Шифротекст встраивается в младший бит синего канала стикера, в порядке пикселей, перетасованном тем же паролем.

Без пароля — даже зная, какой канал и какой бит — спрятанные байты выглядят случайными: ни magic-байтов, ни поля длины, ничего, что говорило бы «Stiger». Но случайное — не то же самое, что нетронутое: статистический стегоанализ может понять, что внутри что-то спрятано. Что именно — нет.

На стороне iMessage Stiger отправляет каждый носитель как обычное вложение‑картинку, а не через API стикеров Apple. Это осознанный выбор — и проверенный: API стикеров перекодирует изображения в HEIC и уменьшает их при пересылке (я измерил: PNG 512×512 / 207 KB приходит к получателю как HEIC 320×320 / 12 KB), что уничтожило бы скрытое сообщение. Слово «стикер» здесь и в приложении — бытовое название для картинки, а не ссылка на фреймворк.

// из spec/stealth-v3.md
permKey = PBKDF2-SHA256(pwd, PERM_SALT)
mainKey = PBKDF2-SHA256(pwd, salt)
          // оба: 600 000 итераций

STREAM  = salt(16) | marker(4)
        | maskedVer(1) | maskedRsv(1)
        | nonce(12)
        | AES-256-GCM(mainKey,
            len(2) | msg | padding)
        | tag(16)

EMBED   = LSB(blue, STREAM)
          в пиксели, перетасованные permKey
// ни magic-байтов, ни открытой длины

Живая демо

Расшифруй свой стикер прямо здесь.

Полная имплементация stealth-v3 в браузере. Картинка не уходит ни в какие сервисы — биты считаются прямо на этой странице. Открой DevTools → Network и проверь.

Свой стикер не открывается? iMessage иногда пересжимает — см. ниже.

Или возьми один из этих стикеров — каждый прячет своё:

Пароль для всех stealth-примеров: correct horse battery staple

— результат появится здесь

Челлендж

Найдёшь, что спрятано?

Всё на открытой спецификации — ни приложение, ни iPhone не нужны.

Начать

Шаг за шагом

Что происходит при decode.

Реальный stealth-v3 на тестовом стикере stealth-hello.png. Все байты ниже — то, что выдал production iOS-движок. Пароль публикуется в спецификации и здесь не секрет.

  1. 1

    Стикер → подходящие пиксели

    128×128 пикселей. Все 16 384 полностью непрозрачны (alpha = 0xFF), значит каждый даёт один бит. Вместимость — 2 048 байт.

  2. 2

    Перестановка π из пароля

    PBKDF2-SHA256 над паролем (600 000 итераций) → permKey. Из него HMAC-counter поток, по нему Fisher–Yates перетасовывает [0, N).

    permKey (первые 16 байт) 3b8448c5 30bb162c 284012e5 09b6eb5f
    π[0..7] — куда уйдут первые 8 логических битов [10561, 1462, 14909, 15013, 11089, 2928, 9260, 12068]
  3. 3

    Чтение 22-байтного заголовка через π

    Идём по перестановке, собираем первые 22 байта. Они структурированы как salt(16) | marker(4) | masked_version(1) | masked_reserved(1).

    salt (16 байт) eac76892 9b6426ba 9d888c3d de96c16d
    marker (4 байта) a5c1 e0f3
    masked version (1 байт) 53
    masked reserved (1 байт) ad
  4. 4

    Деривация ключей сообщения

    Ещё один PBKDF2 — теперь с тем salt из заголовка → mainKey. HKDF-SHA256 над mainKey даёт 34 байта: macKey (32) и mask (2).

    mainKey (первые 16 байт) 9f6ce6e0 f4fe242d 7b2a25a7 e90b61d6
    macKey (первые 16 байт) 455d8201 842b3338 0ac206bf 235a7daa
    mask (2 байта) 50ad
  5. 5

    Проверка marker

    HMAC-SHA256(macKey, salt || masked_version || masked_reserved)[:4] должен совпасть с marker из заголовка. Сравнение в постоянном времени. Без правильного пароля computed выглядит как случайный шум — отсюда «неверный пароль неотличим от не-Stiger-стикера».

    computed a5c1 e0f3
    read a5c1 e0f3
    ✓ совпадение

    masked_version XOR mask[0] = 0x03

  6. 6

    AES-256-GCM открывает остаток

    Оставшиеся байты LSB-потока — это nonce(12) | ciphertext | tag(16). Расшифровываем AES-256-GCM с mainKey и nonce.

    nonce bb76 cca9 8c65 16f6 30d6 33c5
    ciphertext 1,998 bytes
    GCM tag b29c 1512 a4c3 f6ad 3b4c 27f3 5ce7 8051
  7. 7

    Разбор plaintext

    Внутри расшифрованного блока: u16-be длина | сообщение | случайный padding до конца ёмкости. Длина внутри шифра, не в открытом виде — поэтому стикеры одного размера всегда выглядят одинаково независимо от длины сообщения.

    длина 11
    сообщение "hello world"
    padding 6eec f515 fdc0 f9e5 b516 5477 d79a 63ab … (1,985 байт случайного паддинга)

Честность

Чего Stiger не делает.

Privacy-инструменты строят доверие через честность о том, чего они не умеют. Прочти, прежде чем доверять приложению что-то важное.

Скриншоты ломают сообщение.

Фотография стикера — просто фотография. By design — скриншот переписки не утечка.

iMessage может пересжать.

Чаще не пересжимает. Иногда пересжимает. Я тестирую, гарантировать не могу. Если такое — декод просто не проходит.

Нет forward secrecy.

Утёкший пароль раскрывает все предыдущие сообщения. Меняй.

Компрометация устройства — вне зоны.

Если телефон разблокирован в чужих руках, никакое приложение не спасёт. Full-disk шифрование и биометрия.

Без пароля — не приватно.

Шифрование входит в Pro (для русскоязычных бесплатно, в остальных странах цена зависит от местных доходов). Без него сообщение лежит в стикере открыто: прочитает любой, у кого есть Stiger, а фиксированный заголовок выдаёт Stiger любому LSB-сканеру. Спрятано от тех, у кого нет приложения, — не то же самое, что зашифровано.

Заметить можно, прочитать — нет.

Обученные инструменты стегоанализа видят, что в стикере есть скрытые данные, а при криминалистическом разборе чата видно, что это вложения-картинки, а не нативные стикеры. С кем и когда ты переписываешься, Apple видит, как и в любом iMessage.

Слабый пароль — слабый замок.

600 000 итераций PBKDF2 замедляют каждую попытку, но пароль из 6 символов всё равно подбирается за часы на обычных видеокартах. Используй длинную фразу и передавай её не через iMessage.

Сторонняя клавиатура видит, что ты печатаешь.

Клавиатура с полным доступом может отправлять каждое нажатие на свой сервер, и изнутри iMessage Stiger не может ей помешать. Отключи Full Access, прежде чем писать секреты. Поле пароля всегда получает системную клавиатуру.

Карты — от Apple.

Если в секрете есть место, Stiger показывает превью карты, и Apple Maps видит этот район — с IP того, кто читает. Для секрета-места это почти весь секрет. Чтобы место не попало к Apple, отправь его обычным текстом.

Если в твоём сторе нет

Это решаемо.

Stiger открыт во всех регионах App Store. Если из твоего он когда-нибудь пропадёт, поможет смена региона в Apple.

Как сменить регион стора

В приложении Stiger

Помимо расширения iMessage.

Расширение iMessage — место, где стикеры отправляются и читаются; именно там происходит кодирование. В самом приложении Stiger живёт остальное: paranoia guide, объясняющий каждую настройку безопасности и её компромисс, и таб Store, где можно взять ещё паков. Подписка и Store — модель монетизации проекта.

Что на самом деле защищает каждая настройка

Уровень паранойи: Спокойно

Stiger по умолчанию. Ничего не включено — стикеры выглядят как обычные, но их содержимое прочитает кто угодно с приложением.

СпокойноОсторожноПараноидально

Потяни ползунок — так работает настоящий виджет в приложении.

Паки стикеров

Кто-то приходит за криптографией, кто-то за кактусом.

В расширении есть паки — хакеры, шпионы, лето, любовные записки, мемы, полночь. Сообщение может нести любой стикер из любого.

Сделал

Павел Худяков — инди-разработчик.

OneGoodMan.studio. Пресса: [email protected].