PrivChat — это одноранговый зашифрованный мессенджер для Android. Нет аккаунта, который нужно создавать, нет номера телефона, который нужно давать, и нет компании, хранящей ваши разговоры, — включая нас. Два телефона разговаривают друг с другом напрямую, через сеть Tor.
Большинство мессенджеров зашифрованы и централизованы: ваши слова защищены, но компания всё равно видит, с кем вы разговариваете, когда и как часто. Такая запись зачастую красноречивее самих слов. PrivChat убирает компанию, вместо того чтобы просить вас ей доверять.
Когда вы пишете сообщение, ваш телефон шифрует его и передаёт сети Tor, которая проводит его через цепочку узлов, поддерживаемых независимыми добровольцами по всему миру. Каждый узел знает только предыдущий и следующий шаг. Первый узел знает, что вы что-то отправляете, но не кому; последний знает, куда это идёт, но не кто отправил. Никто по пути не может это прочитать, потому что ключ существует только на двух телефонах.
Ваш интернет-провайдер находится в том же положении. Он видит, что вы подключаетесь к сети Tor, — это неизбежно для любого инструмента, построенного на Tor, — но он не может прочитать ни слова из того, что вы пишете, и это не вопрос доброй воли: сообщение уже зашифровано, когда покидает ваш телефон, так что по его сети не проходит ничего читаемого. То же касается wifi, к которому вы подключены, и любого, кто следит за линией.
Нет ни входящего ящика, ни очереди, ни облака. Если собеседник не в сети, сообщение остаётся на вашем телефоне и пробует снова позже. Ничто никогда не паркуется на машине, принадлежащей кому-то другому.
Сообщение проходит через несколько слоёв, каждый из которых решает свою задачу.
Ключи не используются повторно. Каждое сообщение шифруется своим собственным ключом, выведенным заново и тут же выброшенным, а цепочка движется вперёд с каждым сообщением в обе стороны. Если бы какой-то ключ когда-нибудь был скомпрометирован, он открыл бы одно сообщение — а не разговор. И как только два телефона снова обмениваются сообщениями, цепочка сама себя восстанавливает: даже злоумышленник, который каким-то образом завладел текущим состоянием, снова оказывается заперт снаружи.
Зашифровать слова — простая часть. Обычно утекает всё вокруг них: кто, когда, как часто, как долго. PrivChat заворачивает каждое сообщение в запечатанный конверт, единственная читаемая часть которого — случайный одноразовый ключ, и даже внутренний маршрутный заголовок шифрования сам зашифрован — так что два пакета от одного человека нельзя опознать как принадлежащие друг другу.
Ответ из одной буквы и длинный абзац дают пакеты одинакового размера, так что длина ничего не выдаёт. Вдобавок приложение отправляет пакеты-приманки через случайные промежутки, неотличимые от настоящих. И вот что здесь главное: наблюдатель, следящий за вашим соединением, не может определить, ведёте ли вы разговор вообще.
Есть одна атака, от которой нельзя защититься задним числом. Противник может записать ваш зашифрованный трафик сегодня и просто сохранить его. Ничто этому не мешает. Если через годы квантовые компьютеры смогут взломать обмен ключами, применявшийся в 2026 году, всё, что они сохранили, станет читаемым — задним числом, и тогда вы уже ничего не сможете с этим поделать, потому что запись уже произошла.
Согласование ключей PrivChat сочетает классический алгоритм (X25519) с ML-KEM-768 — постквантовым алгоритмом, стандартизированным NIST в 2024 году. Два секрета смешиваются вместе, так что злоумышленнику нужно взломать оба — а этот общий секрет засевает весь разговор, в обе стороны, на всё время его существования.
Это важнее всего как раз для тех, кому такое приложение нужно: то, что вы говорите сегодня, всё ещё стоит защищать через пятнадцать лет.
Сообщения, контакты, вложения и сами ключи — всё зашифровано в состоянии покоя ключом, который хранится в хранилище ключей Android и привязан к оборудованию устройства. Вы можете добавить PIN-код, и тогда ключу нужны обе половины — ваш PIN-код и секрет устройства, — так что даже сам телефон не может открыть собственное хранилище без вас.
Приложение исключает себя из автоматических резервных копий Android, поэтому ваши разговоры никогда не выгружаются ни в какое облако, даже в ваше собственное. Исчезающие сообщения удаляют себя через 24 часа, а «стереть личность и начать заново» уничтожает ключи, а не просто удаляет файлы: после этого старые данные невозможно восстановить даже с телефоном в руках.
Архитектура одноранговая, и именно эта часть решает, правда ли всё остальное на этой странице. Каждый телефон запускает свой собственный Tor onion-сервис и говорит напрямую с другим. Нет ни нашего узла, ни очереди сообщений, ни базы аккаунтов — так что нет и места, где могла бы накапливаться запись о том, кто с кем говорит, даже для того, кто пришёл бы за ней. Убрать сервер — не функция, привинченная к шифрованию. Это то, что делает шифрование стоящим.
Поверх этого работает тот же набор стандартов, на котором сошлись правительства и индустрия. Здесь нет ничего самодельного, и каждая часть публично специфицирована — ссылки ведут на сами спецификации, а не на нас.
| Назначение | Что используется |
|---|---|
| Архитектура | Одноранговая: каждый телефон — это свой Tor v3 onion-сервис, без сервера посередине |
| Согласование ключей | PQXDH — X25519 в сочетании с ML-KEM-768 (FIPS 203) |
| Обновление ключей | Double Ratchet, с зашифрованными заголовками |
| Шифрование сообщений | ChaCha20-Poly1305 |
| Подписи | Ed25519 |
| Вывод ключей | HKDF-SHA256 |
| Вывод из PIN-кода | Argon2id |
| Локальная база данных | SQLCipher (AES-256) |
| Транспорт | Tor, через реализацию arti |
Контакты опознаются по отпечатку, который вы можете сверить вслух, так что вы можете убедиться, что говорите именно с тем человеком, с которым думаете, а не с тем, кто перехватил знакомство.
PrivChat бесплатен, без рекламы и не собирает ничего на продажу. Если вы хотите его поддержать, вот единственные два адреса. Сверьте отпечаток, прежде чем что-либо отправлять.
Почему отпечаток важен. Адрес для пожертвований записан внутри приложения, в открытом виде. Пересобрать приложение с другим адресом — классическое мошенничество против приложений, принимающих пожертвования: вы копируете адрес, который не наш, и у вас нет способа это заметить.
Приложение показывает короткий отпечаток рядом с адресом. Если он совпадает с тем, что на этой странице, значит, адрес в вашей копии приложения настоящий. Это тот же жест, о котором приложение уже просит вас, чтобы проверить контакт.
45hRduLUQD5Ek4qGgHTuWAZnncwroMET1WsLUDC9AF6DNSt5qMP1Fk7WUsN4EwzJdA1ypfL7TtJQQ8uqutAJWwJy5jzp8Pa
Отпечаток: 1D63 68D5 7653 1887
sp1qqf2jvtz0k7rsy7f0cka9ejz6e4lmakz6v9zgae02ks0qpck3a6dxzqn73fp9gj6y632q8th2nfv2lv7rua49s5unzjpau3ahp29ssw689vwu9ksy
Отпечаток: 63BB FA03 F806 BC55
Потому что в публичной цепочке все жертвователи платили бы в одно и то же место, и это осталось бы видимым навсегда. Кто угодно мог бы вытащить список людей, пожертвовавших приложению для зашифрованного общения. Именно такой список это приложение и создано предотвращать — так что мы не станем создавать его сами ради сбора пожертвований.
Адрес Silent Payments работает иначе: ваш кошелёк выводит свежий адрес назначения, тратить с которого можем только мы, так что ничто в цепочке не связывает пожертвования друг с другом. Нужен кошелёк с поддержкой BIP-352.
Два отпечатка выше также опубликованы как подписанное заявление, так что изменить их было бы недостаточно, скомпрометировав этот сайт, — понадобился бы ещё и наш ключ подписи.
Подписанное заявление: donations.txt
Открытый ключ: privchat-pgp.asc
Отпечаток ключа:
BC8D E53F D8D1 6F63 AD8A 33EA 10EC 8069 37D6 8502
Как проверить: импортируйте ключ, затем выполните gpg --verify donations.txt. Отпечаток ключа, который он покажет, должен совпасть с тем, что выше.
Тот же отпечаток ключа опубликован на нашей странице в Google Play. Это два отдельных места, которыми владеют разные компании: поддельный отпечаток должен был бы появиться в обоих сразу и оставаться согласованным. Если эти два когда-нибудь разойдутся, ничего не отправляйте и напишите нам.
Впервые здесь? Как пользоваться PrivChat проведёт вас через добавление первого контакта, сверку отпечатка и то, что означают состояния сообщений.