
Безопасный терминальный чат. E2E-шифрование, сервер с нулевыми метаданными и слепой пересылкой. PyNaCl XSalsa20-Poly1305 + Ed25519 + прямая секретность. Кроссплатформенный Python.
Сквозное шифрование для групповых чатов, личных сообщений и передачи файлов в вашем терминале. Сервер — это слепой форвардер: он не может читать ваши сообщения, не знает вашего имени пользователя, не знает, в какой комнате вы находитесь, и не может связать два сообщения от одного человека, даже если полностью скомпрометирован.
https://github.com/user-attachments/assets/d9faabfb-73bd-46dd-92b2-23f63daf5b06
https://github.com/user-attachments/assets/e8e0220d-cd7d-45a2-9443-9a5f20b57f12
https://github.com/user-attachments/assets/15fb383d-a02a-433e-bbd9-8ebadecf9481
https://github.com/user-attachments/assets/bca10cb1-6959-425d-96d6-fc1fbf845538
NoEyes — это инструмент для чата в терминале на Python для небольших доверенных групп. Сервер никогда ничего не расшифровывает и никогда не видит, кто вы — он только обрабатывает непрозрачные токены и пересылает зашифрованные байты.
Вы генерируете ключ, передаёте его по стороннему каналу, и сервер не узнаёт ничего о ваших разговорах.
Полезно для небольших доверенных групп, желающих зашифрованное общение без доверия любому стороннему серверу, для самостоятельного хостинга приватного чата с настоящим сквозным шифрованием, или для тех, кто хочет точно понимать, что сервер может и не может видеть.
| Возможность | Подробности |
|---|---|
| Сервер с нулевой метаинформацией | Сервер никогда не видит имена пользователей, названия комнат или открытые ключи, только непрозрачные токены |
| Закрытый отправитель | Личность отправителя находится внутри зашифрованной полезной нагрузки, никогда в заголовке маршрутизации |
| Сервер-слепой форвардер | Нулевое расшифрование, сервер пересылает зашифрованные блоки, которые не может прочитать |
| Прямая секретность | /ratchet start — протокол Sender Keys, каждое сообщение шифруется уникальным производным ключом, прошлые сообщения защищены даже при утечке текущего ключа |
| Групповой чат | Ключи для комнат на основе XSalsa20-Poly1305, полученные через BLAKE2b, комнаты криптографически изолированы |
| Личные сообщения | X25519 DH рукопожатие при первом контакте, парный ключ, который есть только у двух сторон |
| Передача файлов | Потоковая передача ChaCha20-Poly1305, любой размер, низкое использование ОЗУ, пауза/возобновление при переподключении |
| Идентификация Ed25519 | Автоматически генерируемый ключ подписи, все сообщения и файлы подписаны |
| TOFU | Доверие к ключам при первом увиденном; несовпадение ключей вызывает видимое предупреждение безопасности |
| Случайная соль PBKDF2 | Каждое развёртывание получает уникальную случайную соль, радужные таблицы бесполезны |
| TLS + закрепление сертификатов | Транспорт зашифрован, сертификат сервера закрепляется при первом контакте через TOFU |
| Защита от повторного воспроизведения | Очередь идентификаторов сообщений для каждой комнаты, повторные кадры молча отбрасываются |
| Разделённая боковая панель | Комнаты (сверху) и пользователи (снизу) всегда видны, каждая половина прокручивается независимо |
| Анимация загрузки CRT | Полноэкранный эффект фосфора со звуком при запуске |
| Анимация активации Ratchet | Полноэкранный эффект CRT с брайлевским шестерёнчатым артом, мерцанием глитча, прожектором, синхронизированным звуковым сопровождением и переходом TUI-интерфейса в красный цвет |
| Управляемый лаунчер | Меню с клавишами-стрелками, не требуется опыт командной строки |
| Автоматический установщик зависимостей | Обнаруживает вашу платформу, устанавливает недостающее, спрашивает перед любыми изменениями |
python ui/setup.py
python ui/launch.py
`ui/launch.py` проведет вас через запуск сервера или подключение к нему.
---
### Вариант B — Если Python ещё не установлен
| Платформа | Сначала выполните это |
|---|---|
| Linux / macOS / Termux / iSH | `sh install/install.sh` |
| Windows | `install\install.bat` |
Оба скрипта устанавливают Python, если он отсутствует, и автоматически передают управление `setup.py`.
---
### Вариант C — Вручную```bash
# 1. Install dependencies
pip install cryptography PyNaCl
# 2. On the server machine — generate the access key
python noeyes.py --generate-access-key
# Prints an access code hex string — share with clients via USB
# 3. On a client machine — generate chat.key from the access code
python noeyes.py --generate-chat-key <ACCESS_CODE_HEX> --key-file ./chat.key
# Distribute chat.key to all other clients via USB. Never put it on the server.
# 4. Start the server (does NOT need the key file)
python noeyes.py --server --port 5000
# Start without bore tunnel (LAN / static IP / custom tunnel)
python noeyes.py --server --port 5000 --no-bore
# Start without adding a firewall rule (not needed when using bore tunnel)
python noeyes.py --server --port 5000 --no-firewall
# 5. Connect clients - each person needs their own identity file
python noeyes.py --connect SERVER_IP --port 5000 --username alice --key-file ./chat.key --identity-path ~/.noeyes/identity_alice.key
python noeyes.py --connect SERVER_IP --port 5000 --username bob --key-file ./chat.key --identity-path ~/.noeyes/identity_bob.key
Важно: Каждый пользователь должен иметь собственный файл идентификации. Два клиента, использующих один и тот же файл идентификации, получают одинаковый токен почтового ящика, и сервер отклонит второй как дубликат сессии. Файл идентификации создаётся автоматически при первом запуске, просто укажите уникальный
--identity-pathдля каждого пользователя.
Скачайте Termux из F-Droid (рекомендуется): https://f-droid.org/packages/com.termux/
Держите сессию активной - установите tmux, чтобы NoEyes продолжал работать при переключении приложений:```bash pkg install tmux -y tmux python ui/launch.py
**Разрешения на хранение** - передача файлов не удастся без этого:```bash
termux-setup-storage
| Команда | Описание |
|---|---|
/help | Показать все команды |
/quit | Отключиться и выйти |
/clear | Очистить сообщения с экрана |
/users | Список пользователей в текущей комнате |
/join <room> | Переключиться в комнату (предупреждает, если есть активный ratchet) |
/leave | Вернуться в общую комнату (предупреждает, если есть активный ratchet) |
/msg <user> <text> | Отправить E2E-зашифрованное личное сообщение |
/send <user> <file> | Отправить зашифрованный файл |
/whoami | Показать ваш идентификационный отпечаток |
/trust <user> | Доверять новому ключу пользователя после переустановки |
/notify on|off | Включить/выключить звуки уведомлений |
/ratchet start | Предложить всем участникам комнаты использовать ключи с прямой секретностью (все должны подтвердить) |
/ratchet invite <u> | Повторно пригласить пользователя в ratchet после его возвращения (вызывает полный перезапуск — цепочки ключей не передаются) |
/proceed | Во время ожидания миграции проголосовать за исключение отключённого участника и продолжить |