
Зашифрованная голосовая связь (нажми и говори) и текстовая коммуникация через скрытые сервисы Tor со сквозным шифрованием, настраиваемыми шифрами, релейным режимом для групповых вызовов и анти-криминалистическим уничтожением данных.
Шифрованная голосовая связь в режиме PTT через скрытые сервисы Tor.
TerminalPhone — это один автономный Bash-скрипт, который обеспечивает анонимную, сквозную шифрованную голосовую и текстовую связь между двумя или более сторонами через сеть Tor. Он работает как рация: вы записываете голосовое сообщение, и оно сжимается, шифруется и передаётся удалённой стороне как единый блок. Вы также можете отправлять зашифрованные текстовые сообщения во время вызова. Никакой серверной инфраструктуры, никаких аккаунтов, никаких номеров телефонов. Ваш адрес .onion скрытого сервиса Tor — это ваша личность.
T для ввода сообщения..onion при подключении. Удалённый адрес отображается в заголовке вызова.S во время вызова для доступа к настройкам. Измените свой шифр на лету; отображение у удалённой стороны обновится автоматически.jq (устанавливается по запросу). Громкость автоматически восстанавливается после каждого нажатия..onion служит постоянной маршрутизируемой конечной точкой. Не требуется перенаправления портов или публичного IP..onion в виде сканируемого QR-кода в терминале. Если qrencode не установлен, появится запрос на установку. QR-код отображается на альтернативном экранном буфере и уничтожается при закрытии. Предупреждение: некоторые QR-сканеры автоматически добавляют префикс http://; этот префикс автоматически удаляется при наборе..tmp и случайные шестнадцатеричные идентификаторы. Никакие метаданные о типе файла или времени не раскрываются файловой системе.ExcludeNodes с StrictNodes в torrc./dev/urandom перед удалением. Размер файла считывается, соответствующее количество байт случайных данных записывается поверх файла с помощью dd и conv=notrunc, запись сбрасывается на устройство хранения с помощью sync, а затем файл удаляется командой rm. Охватывает все критически важные файлы времени выполнения: сырые PCM-записи, аудио в кодировке Opus, зашифрованные полезные нагрузки, расшифрованные входящие аудио и чат, промежуточные данные эффектов голоса, ключевые материалы шифра и HMAC, журналы одноразовых номеров, флаги сессии, PID-файлы, именованные каналы, ключи скрытых сервисов Tor при ротации и данные сессии реле. Для каталогов все файлы внутри затираются рекурсивно. Встроенная тестовая опция создаёт образец файла, показывает исходное содержимое в открытом виде и в шестнадцатеричном формате, затирает его и отображает затирание в шестнадцатеричном формате, чтобы пользователь мог визуально убедиться, что данные уничтожены. Выключено по умолчанию — для большинства пользователей стандартная rm вполне подходит. Временные файлы TerminalPhone малы и недолговечны, и дисковое пространство обычно быстро переиспользуется нормальной активностью системы. Эта функция предназначена для пользователей, желающих дополнительный уровень защиты от восстановления криминалистическими методами. Примечание: на SSD и флеш-накопителях из-за выравнивания износа затирание может попасть на другие физические ячейки NAND — полнодисковое шифрование является единственной надёжной защитой на флеш-носителях. На традиционных HDD затирание заменяет данные в том же физическом месте и эффективно против всех программных методов восстановления.RELAY:1 и отображают в реальном времени количество участников группы. Уход одного вызывающего не отключает остальных. Панель оператора показывает количество вызывающих, время работы и пропускную способность.Поддерживаемые дистрибутивы: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman).``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git cd terminalphone bash terminalphone.sh
Выберите опцию **7** в меню для автоматической установки всех зависимостей. Будут установлены следующие пакеты:
| Пакет | Назначение |
|---|---|
| `tor` | Луковая маршрутизация и скрытый сервис |
| `opus-tools` | Сжатие голоса (кодек Opus) |
| `sox` | Утилиты обработки аудио |
| `socat` | Двунаправленный TCP-ретранслятор через SOCKS-прокси Tor |
| `openssl` | Шифрование и дешифрование AES-256-CBC |
| `alsa-utils` | Запись и воспроизведение аудио (`arecord`, `aplay`) |
### macOS``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
Выберите опцию 7, чтобы автоматически установить все зависимости. Если Homebrew не установлен, скрипт сначала установит его, а затем установит следующие пакеты:
Примечание: В macOS sox используется как для записи (rec), так и для воспроизведения (play) вместо ALSA. Дополнительные аудиопакеты не требуются.
Apple Silicon (M1/M2/M3+): Если ваш терминал работает под Rosetta 2 (процесс x86_64), а Homebrew установлен в нативный префикс ARM (/opt/homebrew), brew install обычно завершается ошибкой Cannot install under Rosetta 2 in ARM default prefix. Установщик зависимостей теперь обнаруживает это и автоматически запускает Homebrew через arch -arm64, поэтому опция 7 работает независимо от того, как был запущен скрипт.
TerminalPhone поддерживает устройства Android через Termux. Из-за песочной архитектуры аудио в Android требуются два дополнительных компонента.
Шаг 1: Установите Termux
Установите Termux из F-Droid. Не используйте версию из Play Store, так как она устарела и больше не получает обновлений.
Шаг 2: Установите приложение Termux:API
Установите Termux:API из F-Droid. Это отдельное приложение Android (не пакет Termux), которое обеспечивает мост между Termux и системными API Android. TerminalPhone требует его для доступа к микрофону устройства и воспроизведению медиа.
Без установленного приложения Termux:API на устройстве команды termux-microphone-record и termux-media-player не будут работать, а запись и воспроизведение аудио будут завершаться без сообщения об ошибке.
После установки приложения Termux:API предоставьте ему разрешения на доступ к микрофону при появлении запроса.
Шаг 3: Установите пакет Termux:API внутри Termux```bash pkg install termux-api
Это устанавливает утилиты командной строки, которые взаимодействуют с приложением Termux:API.
**Step 4: Run TerminalPhone**```bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
Выберите опцию 7 для установки всех оставшихся зависимостей. Установщик сначала выполнит pkg upgrade для устранения возможных проблем с привязкой пакетов, а затем установит tor, opus-tools, sox, socat, openssl-tool, ffmpeg и termux-api.
Зависимости, специфичные для Termux:
| Пакет | Назначение |
|---|---|
termux-api | Мост CLI к микрофону и медиаплееру Android |
ffmpeg | Преобразует записи M4A Android в сырой PCM для кодирования Opus |
To receive a call: Select option 1 (Listen for calls) To make a call: Select option 2 (Call an onion address)
Обе стороны должны иметь запущенный Tor и настроенный один и тот же общий секрет перед началом вызова.
---
## Использование
### Параметры меню```
1 Listen for calls Wait for an incoming connection
2 Call an onion address Connect to a remote .onion endpoint
3 Show my onion address Display your .onion address (with optional QR code)
4 Set shared secret Configure the pre-shared encryption key
5 Test audio (loopback) Record and play back audio locally
6 Show status Display Tor, secret, and connection status
7 Install dependencies Install all required packages
8 Start Tor Start the Tor process and hidden service
9 Stop Tor Stop the Tor process
10 Restart Tor Stop and restart Tor
11 Rotate onion address Generate a new .onion address (destroys the old one)
12 Settings Configure Opus quality, PTT chime, Snowflake, auto-listen, PTT key, voice changer, security, Tor settings
13 Relay mode Start a zero-knowledge group bridge for N callers
0 Quit Stop Tor and exit
Linux (режим «удержание для разговора»):
| Клавиша | Действие |
|---|---|
| Удерживайте ПРОБЕЛ | Запись голосового сообщения. Отправляется автоматически при отпускании. |
| T | Отправить зашифрованное текстовое сообщение. |
| S | Открыть настройки во время звонка (сменить шифр, настроить качество). |
| Q | Завершить звонок и вернуться в меню. |
Termux (режим переключения):
Программная клавиатура Android отправляет события клавиш при отпускании, а не при нажатии. TerminalPhone адаптируется, используя режим переключения в Termux.
| Клавиша | Действие |
|---|---|
| Нажмите ПРОБЕЛ | Начать запись. Нажмите снова, чтобы остановить и отправить. |
bash terminalphone.sh install # Install dependencies bash terminalphone.sh test # Audio loopback test bash terminalphone.sh status # Show status bash terminalphone.sh listen # Listen for incoming calls bash terminalphone.sh call ADDRESS # Call a .onion address bash terminalphone.sh relay # Start relay mode (group bridge)
## Как это работает
TerminalPhone использует модель «запись-затем-отправка». Когда вы активируете PTT, микрофон непрерывно записывает, пока вы не отпустите кнопку. Затем полная запись обрабатывается через следующий конвейер:```
SENDER RECEIVER
────── ────────
Microphone Speaker
│ ▲
▼ │
Raw PCM (8kHz, 16-bit, mono) Opus decode
│ ▲
▼ │
Opus encode (16kbps) AES-256-CBC decrypt
│ ▲
▼ │
AES-256-CBC encrypt Base64 decode
│ ▲
▼ │
Base64 encode ──▶ socat ──▶ Tor ──▶ socat ──▶ Receive
Протокол передачи основан на текстовых строках через TCP-соединение:
В Termux дополнительный этап преобразования обрабатывает собственный формат записи M4A в Android, используя ffmpeg для преобразования в сырой PCM перед кодированием Opus.
Шифрование: Всё аудио шифруется с помощью настраиваемого пользователем шифра (по умолчанию: AES-256-CBC) перед передачей. Доступен 21 тщательно отобранный шифр, от самых сильных (256-битных) до адекватных (128-битных). Ключ выводится из предварительно согласованного секрета с использованием PBKDF2 с 10 000 итераций. Шифрование применяется на уровне приложения, независимо от транспортного шифрования Tor. Секреты передаются OpenSSL через файловые дескрипторы (-pass fd:3), а не через аргументы командной строки, поэтому они никогда не отображаются в таблице процессов.
Согласование шифра: Обе стороны обмениваются названиями шифров при подключении и при смене шифра во время вызова. Названия шифров не являются секретными (принцип Керкгоффса). Если локальный и удалённый шифры не совпадают, обе стороны видят красные индикаторы в заголовке вызова.
Транспорт: Все данные маршрутизируются через цепи скрытых сервисов Tor. IP-адрес ни одной из сторон не раскрывается. Трафик в открытой сети отсутствует. Сетевой наблюдатель не может установить связь между участниками соединения.
Устойчивость к анализу трафика: Модель «запись-затем-отправка» создаёт нерегулярные паттерны передачи (сообщения переменной длины через нерегулярные интервалы), которые сложнее профилировать, чем непрерывная потоковая передача.
Аутентификация: Общий секрет служит неявной аутентификацией. Если у обеих сторон нет одного и того же секрета, расшифровка не удаётся, и аудио не воспроизводится. При подключении обе стороны обмениваются .onion-адресами для идентификации звонящего. Секрет может быть опционально зашифрован в состоянии покоя с помощью парольной фразы; при запуске скрипт запрашивает парольную фразу для его разблокировки.
Подпись протокола HMAC (опционально): При включении каждое сообщение протокола передачи — включая управляющие сигналы, такие как HANGUP, PTT_START и PING — подписывается с помощью HMAC-SHA256, полученного из общего секрета. В каждое сообщение включается случайный одноразовый номер, так что идентичные команды создают уникальные подписи. Использованные одноразовые номера отслеживаются в рамках вызова, а дубликаты отклоняются, предотвращая атаки повторного воспроизведения. Настройка HMAC фиксируется при запуске вызова через файл времени выполнения, так что пути отправки и получения всегда согласованы, даже если настройка переключается во время вызова (изменения вступают в силу при следующем вызове). На принимающей стороне любое сообщение с недействительной, отсутствующей или повторной подписью молча отбрасывается. Это предотвращает внедрение или повторение команд атакующим, который скомпрометировал цепь Tor (но не имеет общего секрета). Обе стороны должны включить HMAC для работы вызовов. Несовместимо с версиями до 1.1.3.
Ограничения:
Безопасность режима ретранслятора: Ретранслятор архитектурно является «нулевого знания». Он никогда не владеет общим секретом и не может расшифровать никакой контент. Аудиоданные проходят через буферы каналов ядра (FIFO), которые существуют только в памяти — ничего не записывается на диск. Когда ретранслятор останавливается, все временные файлы удаляются. Оператор ретранслятора не может определить, что было сказано, кто звонил или прочитать какие-либо сообщения. Ретранслятор фильтрует все управляющие сигналы (HANGUP, ID:, CIPHER:, PTT_START, PTT_STOP) и пересылает только AUDIO:, MSG: и PING. Глобальный пассивный противник может провести корреляционный анализ трафика для связывания звонящих с ретранслятором, но содержание сообщений остаётся непрозрачным.
Производительность ретранслятора: Основным узким местом является пропускная способность Tor. Пропускная способность скрытых сервисов Tor сильно варьируется и зависит от качества цепи, загруженности ретрансляторов и географического расстояния. Типичное голосовое сообщение длительностью 10 секунд составляет ~20 КБ в зашифрованном виде, и каждая передача рассылается N-1 слушателям.
Реалистичная ёмкость — 3–5 звонящих для ретранслятора, работающего на телефоне (Termux), или 5–10 звонящих на выделенной машине под Linux со стабильным подключением. Ретрансляторы, работающие на мобильных устройствах, сталкиваются с дополнительными ограничениями: мобильные данные добавляют задержку поверх Tor, Android может завершить фоновые процессы Termux для освобождения памяти, а расход батареи увеличивается с каждым подключённым звонящим. Пропускная способность цепей Tor может варьироваться от 50 КБ/с до 500 КБ/с в зависимости от качества пути, и цепи могут деградировать или переключаться во время сеанса. Режим с одним перескоком улучшает пропускную способность, но не устраняет загруженность ретрансляторов Tor. Эти оценки предполагают модель PTT, где только один человек передаёт одновременно — одновременные передачи ухудшили бы производительность ещё сильнее. Звонящим в групповом вызове следует рассмотреть снижение битрейта Opus (Настройки → Кодирование Opus), чтобы уменьшить размер сообщений и снизить нагрузку на ретранслятор.
Вся конфигурация хранится в .terminalphone/ относительно расположения скрипта:```
.terminalphone/
tor_data/ Tor data directory and hidden service keys
audio/ Temporary audio files (cleaned on exit)
pids/ Process ID tracking
shared_secret Encrypted shared secret file
torrc Generated Tor configuration
Параметры звука по умолчанию (определены в начале скрипта):
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
| `LISTEN_PORT` | 7777 | TCP-порт для входящих соединений |
| `TOR_SOCKS_PORT` | 9050 | Порт SOCKS-прокси Tor |
| `OPUS_BITRATE` | 16 | Битрейт кодирования Opus в кбит/с |
| `CIPHER` | aes-256-cbc | Шифр шифрования (настраивается через Settings) |
| `SNOWFLAKE_ENABLED` | 0 | Мост Snowflake для обхода цензуры |
| `AUTO_LISTEN` | 0 | Автоматический приём вызовов при запуске Tor |
| `PTT_KEY` | SPACE | Клавиша PTT (настраивается через Settings) |
| `VOL_PTT` | 0 | Двойное нажатие на громкость для PTT, только Termux (экспериментально) |
| `EXCLUDE_NODES` | (пусто) | Список стран для ExcludeNodes Tor (например `{US},{GB}`) |
| `HMAC_AUTH` | 0 | Подписывать все сообщения протокола HMAC (опционально, обе стороны должны совпадать) |
| `OVERWRITE_DELETE` | 0 | Перезаписывать временные файлы случайными данными перед удалением (по умолчанию выкл) |
| `PTT_CHIME` | выкл | Набор уведомлений PTT (выкл, tone, double, chirp, ding, click, custom) |
| `SINGLE_HOP` | 0 | Одношаговый режим Tor для меньшей задержки (отключает анонимность сервера) |
| `SAMPLE_RATE` | 8000 | Частота дискретизации звука в Гц |
| `CHUNK_DURATION` | 1 | Длительность тестовых аудиофрагментов в секундах |
---
## Устранение неполадок
**Tor не удаётся выполнить начальную загрузку:**
Проверьте журнал Tor по пути `.terminalphone/tor_data/tor.log`. Частые причины: рассинхронизация часов, сетевые ограничения, блокирующие Tor, или другой экземпляр Tor, использующий тот же SOCKS-порт.
**Нет звука на Termux:**
Убедитесь, что приложение Termux:API установлено из F-Droid (не только пакет `termux-api`). Предоставьте разрешения на доступ к микрофону приложению Termux:API в настройках Android. Запустите тест звуковой петли (пункт 5) для проверки.
**Установка ffmpeg на Termux завершается ошибкой:**
Выполните `pkg upgrade` перед установкой зависимостей. Установщик делает это автоматически, но если вы устанавливали пакеты вручную, устаревшие общие библиотеки могут вызывать ошибки линковки.
**Звуковой тест работает, но во время звонков тишина:**
Убедитесь, что обе стороны используют один и тот же общий секрет. Несовпадающие секреты приведут к неудаче расшифровки без сообщения об ошибке — звонок устанавливается, но звука не слышно.
**Мост Snowflake медленно подключается:**
Snowflake направляет трафик через WebRTC-прокси, что добавляет дополнительное время начальной загрузки. Это нормально, когда Tor достигает 100% за 30–60 секунд (или дольше) при включённом Snowflake. Скрипт выведет уведомление о терпении во время загрузки.
**Первая загрузка Tor медленная:**
При первом запуске Tor должен загрузить полный сетевой консенсус с нуля, что может занять минуту или две. Скрипт определяет это и выводит уведомление. Тайм-аут загрузки автоматически увеличивается с 120 до 300 секунд при первом запуске. Последующие запуски используют кэшированные данные консенсуса и выполняются намного быстрее.
**Завершение вызова не возвращает в меню:**
Если скрипт зависает после нажатия Q, нажмите Ctrl+C для принудительной очистки и возврата в оболочку.
**`Cannot install under Rosetta 2 in ARM default prefix` на macOS:**
Это происходит на Apple Silicon, когда терминал работает под Rosetta 2 (процесс `x86_64`), но Homebrew находится в нативном ARM-префиксе (`/opt/homebrew`). Установщик зависимостей (пункт **7**) теперь обнаруживает это и автоматически запускает `brew` с `arch -arm64`. Если вы устанавливаете пакеты вручную, указывайте префикс самостоятельно: `arch -arm64 brew install <pkg>`. Альтернативно, запустите скрипт в нативном режиме с помощью `arch -arm64 bash terminalphone.sh`.
---
[ЗЕРКАЛО V1.0.0](https://bin.disroot.org/?e1356291b098cb75#FMQ4gxFwgdr3rjR1dpGS2csLmDPzDEkQW16fQ5P2Vt4y)
[ЗЕРКАЛО V1.0.1](https://bin.disroot.org/?d3bc0b8976113f58#AuUm4ev4vfeVmPyrh2KjAdhDP6WN4UX6yKQh9ERGD5Qt)
[ЗЕРКАЛО V1.0.2](https://bin.disroot.org/?6bc5b2fd046de1d7#G7TmnytrMeaM5AZYWth6BjjdqUb9RDf3K9erHUExKcGX)
[ЗЕРКАЛО V1.0.3](https://bin.disroot.org/?c5010f039e4693fd#Brp1w7LRQH9d5Ye5npZDPxNVR855SW9QUAk9cJaUuLYX)
[ЗЕРКАЛО V1.0.4](https://bin.disroot.org/?1831f6b78e349142#7zaAMVPNJL3MfbGJzjtm6cCPcvQftf4ULXupdne5dRKw)
[ЗЕРКАЛО V1.0.5](https://bin.disroot.org/?edfcfc844987ed03#56LuBbqbkfNDXfHpydyaB3VcWYhYenX18dtSvNumERY9)
[ЗЕРКАЛО V1.0.6](https://bin.disroot.org/?6c7b4774108b0c1c#GQPst46zjAYidndmNvytforX7MK2LyHanL4d829vVcv4)
[ЗЕРКАЛО V1.0.7](https://bin.disroot.org/?047003637623b4fa#EwmaysciDpiDkht8xV7ce3QcR9oxFXaxSikh4cLheXBB)
[ЗЕРКАЛО V1.0.8](https://bin.disroot.org/?06e38bd64e6fbdad#88MYs3dmq9rSMkmocpW3NYaaG4YfSdRCc9LJnEEzqGYp)
[ЗЕРКАЛО V1.0.9](https://bin.disroot.org/?950218a9a7c71c66#E7Z94VCGBZozrfXYhGwKyAdMeTxuavg92tA1pn2DbrrB)
[ЗЕРКАЛО V1.1.0](https://bin.disroot.org/?0b0da14f31521b3a#B1c23J8xFoZZKErvGG28PgbtfgtMUcDABWmQEoSZfXgh)
[ЗЕРКАЛО V1.1.1](https://bin.disroot.org/?d8e2d4f0300eb5af#9Y1C8CkcH9jAmv1fh4GZs1yYpJmWCG5xG3SvDYdwnJam)
[ЗЕРКАЛО V1.1.2](https://bin.disroot.org/?b1059616f880925f#8ef2oscZXUkPAsJZwGfWvLPQagVAk5GgW4DyssmLvQpG)
[ЗЕРКАЛО V1.1.3](https://bin.disroot.org/?b02658801518aaa7#JE6CsBLWUwAnTdBqeHgeXL7QF5UExgi9rnygcfyMZjCJ)
[ЗЕРКАЛО V1.1.4](https://bin.disroot.org/?d31248fc44c287a0#HQELFWFEMpM9kfTZSGDXTdGFMVKTejox5CajF9Vm4Www)
[ЗЕРКАЛО V1.1.5](https://bin.disroot.org/?284b723ed6aad15f#8VCrrri6yRpdg3uVDSY94wpx7LYkw5uYhm4Vbhka83sM)
[ЗЕРКАЛО V1.1.5.1](https://bin.disroot.org/?26aaef1eff20c271#4GxQQPSDhrszTu1RmERySNVqD2fZW5GZwm3JeL1parpB)
[ЗЕРКАЛО V1.1.6](https://bin.disroot.org/?ae8270578cd9e081#BbcDLU49XqhecvwviHRcdfrZ4vhKdL2AMeKaT5v9oLV1)
[ЗЕРКАЛО V1.1.7](https://bin.disroot.org/?457e4308abe582d8#B9LJG88rmUwrGHHuCof8WpE8CXGmkc2tyrXXicEiJFWk)
---
## Лицензия
MIT
| Пакет | Назначение |
|---|
tor | Маршрутизация через Tor и скрытый сервис |
opus-tools | Сжатие голоса (кодек Opus) |
sox | Запись и воспроизведение аудио (rec, play) |
socat | Двунаправленный TCP-ретранслятор через SOCKS-прокси Tor |
openssl | Шифрование и дешифрование AES-256-CBC |
| T | Отправить зашифрованное текстовое сообщение. |
| S | Открыть настройки во время звонка (сменить шифр, настроить качество). |
| Q | Завершить звонок и вернуться в меню. |
| Громкость вниз ×2 | Переключение записи с помощью кнопки громкости (требуется включить «Volume PTT» в настройках). |
| Сообщение | Описание |
|---|
ID:<onion> | Идентификатор звонящего — .onion-адрес отправителя |
CIPHER:<name> | Шифр шифрования отправителя. Передаётся при подключении и при смене. |
PTT_START | Отправитель начал запись |
PTT_STOP | Отправитель закончил; аудио следует или уже отправлено |
AUDIO:<base64> | Полное зашифрованное аудиосообщение |
MSG:<base64> | Зашифрованное текстовое сообщение |
HANGUP | Отправитель отключается |
PING | Сигнал поддержания соединения |
RELAY:1 | Приветствие ретранслятора — отправляется ретранслятором при подключении, активирует групповой режим |
GROUP:<n> | Обновление размера группы — распространяется ретранслятором при присоединении или выходе звонящих |
| Звонящие | Исходящий трафик на сообщение | Ожидаемый опыт |
|---|
| 2–3 | 20–40 КБ | Надёжно на большинстве соединений |
| 3–5 | 40–80 КБ | Хорошо на стабильных цепях, возможны задержки на мобильных данных |
| 5–10 | 80–180 КБ | На пределе, заметные задержки между передачами |
| 10+ | 180 КБ+ | Ненадёжно, значительное накопление и возможная потеря сообщений |