- Ferramenta de comunicação em estilo walkie-talkie baseada em Bash que envia e recebe voz e texto de forma anônima e com criptografia de ponta a ponta (E2EE) pela rede Tor
- Conecta-se diretamente à outra parte apenas com um endereço
.onion, sem servidor, conta ou número de telefone, em uma estrutura push-to-talk (PTT) que grava a mensagem de voz antes de enviá-la
- Oferece recursos robustos de segurança, como escolha entre 21 cifras, incluindo AES, ChaCha20, Camellia e ARIA, autenticação HMAC-SHA256 e derivação de chave PBKDF2
- Compatível com Linux e Android Termux, funcionando apenas com ferramentas padrão como sox, opus-tools, Tor e openssl
- Composto por um único script, tem instalação e manutenção simples e pode ser usado em pesquisas de segurança e experimentos de comunicação focados em privacidade
Visão geral
- TerminalPhone é um script Bash que permite que dois usuários troquem voz e texto anonimamente usando Tor Hidden Services
- Toda a comunicação é protegida por cifras selecionáveis, como AES-256-CBC (padrão)
- O endereço
.onion funciona como identificador do usuário
- Não exige infraestrutura de servidor nem registro de conta
Principais recursos
- Mensagens de voz no estilo walkie-talkie: grava e depois envia, sem streaming em tempo real
- Chat criptografado durante a chamada: envio e recebimento de mensagens de texto com a tecla
T
- Detecção automática de encerramento e exibição do estado da outra parte (gravando/em espera)
- Escolha entre 21 cifras e exibição da negociação em tempo real, com possibilidade de trocar a cifra durante a chamada
- Suporte a bridge Snowflake para contornar censura
- Vários recursos adicionais, como compartilhamento de endereço por QR code, modificador de voz (voice changer), som de notificação PTT e recebimento automático (auto-listen)
- Autenticação de protocolo HMAC-SHA256 para evitar ataques de replay
- Suporte à exibição da rota do circuito Tor e configuração para excluir países específicos
- Arquivo Bash único, sem necessidade de privilégios de root, funcionando até em ambientes de baixa largura de banda (16 kbps)
Instalação
- Linux: executar
git clone e depois bash terminalphone.sh, com instalação automática de dependências pela opção 7 do menu
- Pacotes instalados:
tor, opus-tools, sox, socat, openssl, alsa-utils
- Android Termux:
- Instale os apps Termux e Termux:API pelo F-Droid
- Após
pkg install termux-api, execute bash terminalphone.sh
- Pacotes adicionais:
ffmpeg, openssl-tool, tor, sox, socat etc.
Como usar
- Procedimento básico
- Execute
bash terminalphone.sh
- Instale as dependências pela opção 7 do menu
- Inicie o Tor pela opção 8 do menu
- Defina a chave secreta compartilhada na opção 4 do menu
- Envie o endereço
.onion para a outra parte
- Receber: opção 1 do menu, “Listen for calls”
- Ligar: opção 2 do menu, “Call an onion address”
- Exemplos de comandos no modo CLI:
bash terminalphone.sh call ADDRESS
bash terminalphone.sh listen
Como funciona
- Modelo gravar e depois enviar (record-then-send)
- A voz gravada passa por codificação Opus → criptografia AES → codificação Base64 → envio via Tor
- No recebimento, o processo é invertido para descriptografia e reprodução
- As mensagens de protocolo são baseadas em texto e incluem
ID, CIPHER, PTT_START, AUDIO, MSG, HANGUP, PING etc.
- No Termux, o
ffmpeg converte M4A em PCM antes do processamento
Estrutura de segurança
- Criptografia: usa chaves derivadas com PBKDF2 (10.000 iterações), adicionando proteção na camada de aplicação além da criptografia de transporte do Tor
- Negociação de cifra: ocorre na conexão e nas trocas posteriores; em caso de divergência, o cabeçalho é exibido em vermelho
- Caminho de transmissão: comunicação via circuito de Hidden Service do Tor, sem expor o IP
- Resistência à análise de tráfego: padrões de transmissão irregulares evitam fingerprinting
- Autenticação: se a chave secreta compartilhada não corresponder, a descriptografia falha
- Assinatura HMAC-SHA256: todas as mensagens incluem um nonce aleatório, bloqueando ataques de replay
- Limitações:
- A chave secreta precisa ser trocada por um canal externo seguro
- Não há sigilo de encaminhamento (forward secrecy); se a chave vazar, comunicações passadas podem ser descriptografadas
- Não oferece proteção se a segurança do endpoint for comprometida
Licença
1 comentários
Comentários do Hacker News
A arquitetura de usar um endereço onion v3 ao mesmo tempo como ID criptográfico e camada de travessia de NAT é realmente elegante
Sem precisar de servidor STUN/TURN nem hole punching, basta executar o script e o Tor cuida do roteamento
Fico curioso sobre qual é a latência real ao transmitir chunks de áudio Opus de cerca de 20 KB pelo Tor — algo como 2–3 segundos, ou pior que isso
O formato de walkie-talkie faz o usuário respeitar a ordem de “ouvir e depois falar”, então a latência não vira um grande problema
Com STUN, o tráfego circula só entre os dois dispositivos, mas uma VPN como o Tor passa por todos os servidores intermediários, então o custo de tráfego é alto
Se você tem um limite mensal de alguns GB em um VPS, isso vira uma restrição séria
Talvez mensagens de texto fossem melhores. Ainda assim, o projeto em si é muito legal
Foi interessante ver um caso real de uso de serviços onion como backend
Em breve também deve haver suporte ao cliente onion Arti, que permite embutir o Tor diretamente no app em forma de biblioteca Rust
Quanto mais tentativas desse tipo surgirem, mais cover traffic a rede também terá
Por isso, em ambientes controlados como redes corporativas ou Wi‑Fi público, usar Tor quase sempre é impossível
Se não for em tempo real, o lado receptor poderia aplicar ajuste de velocidade de reprodução ou remoção de pausas para reduzir a latência
Também seria possível reproduzir rapidamente o áudio enviado por várias pessoas ao mesmo tempo
Se já está usando Opus, talvez valha testar o recurso experimental esquema de recuperação de erros DRED como parte do codec
Dá para estruturar de modo que, se o Tor cair durante a transmissão, o receptor ainda consiga receber o mínimo de voz enviando primeiro os dados DRED
A parte de “são oferecidos 21 algoritmos de criptografia” chama atenção. Parece demais
Eu queria usar AES-GCM, mas com OpenSSL sozinho era difícil lidar com autenticação
O próprio Tor já é E2EE, então esta camada é basicamente criptografia redundante. Ainda assim, gosto da ideia de estar criptografado mais uma vez antes mesmo de tocar a rede
O GitLab parece ter ficado mais rápido recentemente; fico me perguntando se realmente otimizaram algo ou se é só ilusão causada por lazy loading
Gostei muito deste projeto. Como os usuários deveriam trocar credenciais com segurança? E‑mail com PGP seria ok?
Se possível, o ideal é trocar isso pessoalmente ou por meio de um mensageiro seguro
ou deixá-lo em um espaço físico (quadro, mural, placa etc.)
Assim, dá para se conectar com alguém no futuro mesmo estando totalmente offline
Achei interessante a função de excluir países (Exclude Countries) no circuito do Tor
Há presets como Five Eyes, Nine Eyes e Fourteen Eyes, e isso usa ExcludeNodes e StrictNodes na configuração do torrc
Fico curioso se isso realmente ajuda a melhorar a segurança
É fato que existem nós comprometidos, então, funcione ou não, é interessante ter esse controle
Considerando as características de latência do Tor, o modelo de walkie-talkie é uma escolha de design muito inteligente
Áudio bidirecional em tempo real fica estranho acima de 150 ms de ida e volta, mas o Tor acrescenta de 50 a 200 ms por hop
Se for projetado em modo store-and-forward, não precisa brigar contra as características da rede
Fico curioso sobre qual codec está sendo usado — se não é em tempo real, os trade-offs do Opus podem ser diferentes
Fiquei surpreso com o quão alta ainda era a inteligibilidade da fala mesmo em 6 kbps
No Termux não há acesso ao microfone, então é preciso converter o áudio com o app Termux API e ffmpeg
Só alguns segundos de atraso já bastam para reduzir conversas supérfluas
Fico curioso se seria possível configurar isso como comunicação em grupo, com várias pessoas participando do mesmo canal
Pareceu divertido, então dei uma olhada rápida no código,
'|| true'aparece 76 vezes,'echo ""'50 vezes,' [ '261 vezes,'=$('90 vezes'['não é recomendado,mas queria saber por que padrões como
'|| true'seriam um problema. Eu uso bastante isso comset -euo pipefailpara tratamento de erro customizado