- Herramienta de comunicación tipo walkie-talkie basada en Bash que permite intercambiar voz y texto de forma anónima y con cifrado de extremo a extremo (E2EE) a través de la red Tor
- Conexión directa con la otra persona usando solo una dirección
.onion, sin servidores, cuentas ni números telefónicos, con una estructura push-to-talk (PTT) que graba y luego envía mensajes de voz
- Ofrece funciones de seguridad robustas como selección de 21 cifrados, incluidos AES, ChaCha20, Camellia y ARIA, además de autenticación HMAC-SHA256 y derivación de claves PBKDF2
- Compatible tanto con entornos Linux como Android Termux, y funciona solo con herramientas estándar como sox, opus-tools, Tor y openssl
- Está compuesto por un solo script, lo que hace que la instalación y el mantenimiento sean simples, y puede usarse para investigación de seguridad y experimentos de comunicación centrados en la privacidad
Descripción general
- TerminalPhone es un script Bash que permite que dos usuarios intercambien voz y texto de forma anónima usando servicios ocultos de Tor
- Toda la comunicación está protegida con cifrados seleccionables como AES-256-CBC (predeterminado)
- La dirección
.onion funciona como identificador del usuario
- No requiere infraestructura de servidores ni registro de cuentas
Funciones principales
- Mensajes de voz estilo walkie-talkie: se graban y luego se envían, sin streaming en tiempo real
- Chat cifrado durante la llamada: envío y recepción de mensajes de texto con la tecla
T
- Detección automática de finalización y visualización del estado de la otra persona (grabando/en espera)
- Selección de 21 cifrados y visualización de la negociación en tiempo real, con posibilidad de cambiar el cifrado en medio de la llamada
- Soporte para puentes Snowflake para evadir censura
- Varias funciones adicionales como compartir direcciones por código QR, modulación de voz (voice changer), tono de notificación PTT y recepción automática (auto-listen)
- Autenticación del protocolo con HMAC-SHA256 para evitar ataques de repetición
- Soporte para mostrar la ruta del circuito Tor y excluir países específicos
- Un solo archivo Bash, sin necesidad de permisos root, y funcionamiento incluso en entornos de bajo ancho de banda (16 kbps)
Instalación
- Linux: ejecutar
git clone y luego bash terminalphone.sh; instalación automática de dependencias con la opción 7 del menú
- Paquetes de instalación:
tor, opus-tools, sox, socat, openssl, alsa-utils
- Android Termux:
- Instalar las apps Termux y Termux:API desde F-Droid
- Después de
pkg install termux-api, ejecutar bash terminalphone.sh
- Paquetes adicionales:
ffmpeg, openssl-tool, tor, sox, socat, etc.
Uso
- Procedimiento básico
- Ejecutar
bash terminalphone.sh
- Instalar dependencias con la opción 7 del menú
- Iniciar Tor con la opción 8 del menú
- Configurar la clave secreta compartida en la opción 4 del menú
- Entregar la dirección
.onion a la otra persona
- Recepción: opción 1 del menú, “Listen for calls”
- Llamada saliente: opción 2 del menú, “Call an onion address”
- Ejemplos de comandos en modo CLI:
bash terminalphone.sh call ADDRESS
bash terminalphone.sh listen
Cómo funciona
- Modelo grabar y luego enviar (record-then-send)
- La voz grabada pasa por codificación Opus → cifrado AES → codificación Base64 → envío por Tor
- El lado receptor realiza el proceso inverso para descifrar y reproducir
- Los mensajes del protocolo están basados en texto e incluyen
ID, CIPHER, PTT_START, AUDIO, MSG, HANGUP, PING, etc.
- En Termux,
ffmpeg convierte M4A a PCM antes del procesamiento
Estructura de seguridad
- Cifrado: usa claves derivadas con PBKDF2 (10,000 iteraciones), agregando protección adicional en la capa de aplicación aparte del cifrado de transporte de Tor
- Negociación de cifrado: se intercambia al conectarse y al cambiarlo; si no coincide, se muestra en rojo en el encabezado
- Ruta de transmisión: la comunicación pasa por circuitos de servicios ocultos de Tor sin exponer la IP
- Resistencia al análisis de tráfico: patrones de transmisión irregulares para evitar huellas distintivas
- Autenticación: si la clave secreta compartida no coincide, el descifrado falla
- Firmas HMAC-SHA256: todos los mensajes incluyen un nonce aleatorio para bloquear ataques de repetición
- Limitaciones:
- La clave secreta debe intercambiarse por un canal externo seguro
- No hay secreto hacia adelante, por lo que si la clave se filtra, las comunicaciones pasadas pueden descifrarse
- No puede proteger ante una vulneración de seguridad en los endpoints
Licencia
1 comentarios
Comentarios de Hacker News
La idea de usar una dirección onion v3 al mismo tiempo como ID criptográfico y capa de traversal de NAT está realmente muy bien lograda
Sin necesidad de servidores STUN/TURN ni hole punching, ejecutas el script y Tor se encarga del enrutamiento
Me da curiosidad cuál será la latencia real al enviar chunks de audio Opus de unos 20 KB por Tor — si anda por 2 o 3 segundos, o si es peor
El modo walkie-talkie hace que el usuario respete el turno de “escuchar y luego hablar”, así que la latencia no se vuelve un problema tan grande
Con STUN el tráfico va solo entre dos dispositivos, pero con una VPN como Tor pasa por todos los servidores intermedios, así que el costo de tráfico es alto
Si tu VPS tiene un límite de algunos GB al mes, eso se vuelve una gran restricción
Creo que preferiría mensajes de texto. Aun así, el proyecto está genial
Es interesante ver un caso real de uso de servicios onion como backend
Pronto también debería tener soporte para el cliente onion de Arti, que permitirá embeber Tor directamente dentro de una app en forma de biblioteca Rust
Mientras más intentos así haya, más cover traffic tendrá también la red
Por eso, en entornos controlados como redes corporativas o Wi‑Fi público, usar Tor casi siempre es imposible
Si no tiene que ser en tiempo real, el lado receptor podría aplicar ajuste de velocidad de reproducción o eliminación de silencios para reducir la latencia
Incluso sería posible reproducir rápidamente audio enviado por varias personas al mismo tiempo
Si ya están usando Opus, podría valer la pena probar la función experimental DRED error repair scheme como parte del códec
Se podría diseñar para enviar primero los datos DRED, de modo que aunque Tor se corte durante la transmisión, el receptor al menos reciba una parte mínima de la voz
Me llamó la atención la parte de “se ofrecen 21 algoritmos de cifrado”. Suenan demasiados
Quería usar AES-GCM, pero solo con OpenSSL es difícil manejar la autenticación
Como Tor ya es E2EE, esta capa es básicamente cifrado redundante. Aun así, me gusta la idea de que vaya cifrado una vez más antes de tocar la red
Siento que GitLab últimamente está más rápido; me pregunto si de verdad lo optimizaron o si es solo una ilusión por el lazy loading
Me gusta mucho este proyecto. ¿Cómo deberían hacer los usuarios para intercambiar de forma segura sus credenciales? ¿Un correo con PGP estaría bien?
Si es posible, lo ideal sería intercambiarlas en persona o por medio de un mensajero seguro
o dejarla en un espacio físico (pizarrón, tablero de anuncios, cartel, etc.)
Así incluso puedes conectar con alguien en el futuro estando completamente offline
Me parece interesante la función de excluir países (Exclude Countries) en los circuitos de Tor
Hay presets como Five Eyes, Nine Eyes y Fourteen Eyes, y usa ExcludeNodes y StrictNodes en la configuración de torrc
Me pregunto si realmente ayuda a mejorar la seguridad
Es un hecho que existen nodos comprometidos, así que, funcione o no, resulta interesante tener ese control
Considerando las características de latencia de Tor, el modelo walkie-talkie es un diseño muy inteligente
El audio bidireccional en tiempo real se siente raro si la ida y vuelta supera los 150 ms, pero Tor añade entre 50 y 200 ms por salto
Si lo diseñas como store-and-forward, no necesitas pelearte con la naturaleza de la red
Me da curiosidad qué códec usa — si no es en tiempo real, los trade-offs de Opus pueden cambiar
Me sorprendió que incluso a 6 kbps la inteligibilidad de la voz siga siendo bastante alta
En Termux no hay acceso al micrófono, así que hay que convertir el audio mediante la app Termux API y ffmpeg
Incluso unos pocos segundos de retraso pueden reducir bastante la conversación de relleno innecesaria
Me pregunto si esto se podría configurar para algo como comunicación grupal, con varias personas entrando al mismo canal
Se ve divertido, así que le eché una mirada rápida al código,
'|| true'aparece 76 veces,'echo ""'50 veces,' [ '261 veces y'=$('90 veces'[',pero quiero saber por qué patrones como
'|| true'serían un problema. Yo los uso seguido para manejo de errores personalizado junto conset -euo pipefail