
Comunicação de voz por push-to-talk e texto criptografada através de serviços ocultos Tor com criptografia de ponta a ponta, cifras configuráveis, modo de retransmissão para chamadas em grupo e destruição de dados antiforense.
Comunicação de voz push-to-talk criptografada através de serviços ocultos Tor.
TerminalPhone é um único script Bash autocontido que fornece comunicação anônima de voz e texto criptografada de ponta a ponta entre duas ou mais partes através da rede Tor. Opera como um walkie-talkie: você grava uma mensagem de voz, que é comprimida, criptografada e transmitida para a parte remota como uma unidade única. Você também pode enviar mensagens de texto criptografadas durante uma chamada. Sem infraestrutura de servidor, sem contas, sem números de telefone. O endereço .onion do seu serviço oculto Tor é sua identidade.
T para digitar uma mensagem..onion ao conectar. O endereço remoto é exibido no cabeçalho da chamada.S durante uma chamada para acessar as configurações. Altere sua cifra em tempo real; a exibição da parte remota é atualizada automaticamente.jq (instalado sob demanda). O volume é restaurado automaticamente após cada acionamento..onion serve como um endpoint roteável permanente. Sem encaminhamento de porta ou IP público necessário..onion como um código QR escaneável no terminal. Se o qrencode não estiver instalado, você será solicitado a instalá-lo. O código QR é renderizado no buffer de tela alternativo e é destruído ao ser dispensado. Uma nota avisa que alguns scanners QR pré-adicionam http://; este prefixo é removido automaticamente ao discar..tmp genéricas e identificadores hexadecimais aleatórios. Nenhum tipo de arquivo ou metadado de tempo é vazado para o sistema de arquivos.ExcludeNodes com StrictNodes no torrc./dev/urandom antes da exclusão. O tamanho do arquivo é lido, essa quantidade de bytes de dados aleatórios é escrita sobre o arquivo com dd usando conv=notrunc, a escrita é liberada para o dispositivo de armazenamento com sync, e então o arquivo é removido com rm. Abrange todos os arquivos sensíveis em tempo de execução: gravações PCM brutas, áudio codificado Opus, payloads criptografados, áudio e chat descriptografados recebidos, intermediários de efeitos de voz, material de chave de cifra e HMAC, logs de nonce, flags de sessão, arquivos PID, pipes nomeados, chaves de serviço oculto Tor em rotação e dados de sessão de relay. Para diretórios, todos os arquivos internos são sobrescritos recursivamente. Uma opção de teste integrada cria um arquivo de amostra, mostra o conteúdo original em texto simples e hex, sobrescreve e exibe o hex sobrescrito para que o usuário possa confirmar visualmente que os dados foram destruídos. Desativado por padrão — para a maioria dos usuários, rm padrão é perfeitamente adequado. Os arquivos temporários do TerminalPhone são pequenos e de curta duração, e o espaço em disco é tipicamente reutilizado rapidamente pela atividade normal do sistema. Este recurso é para usuários que desejam uma camada extra de proteção contra recuperação forense. Nota: em SSDs e armazenamento flash, o nivelamento de desgaste significa que a sobrescrita pode atingir diferentes células NAND físicas — criptografia de disco completo é a única defesa confiável em mídia flash. Em HDDs tradicionais, a sobrescrita substitui os dados na mesma localização física e é eficaz contra toda recuperação baseada em software.RELAY:1 e exibem contagem de chamadores do grupo em tempo real. A saída de um chamador não desconecta os outros. Painel do operador mostra contagem de chamadores, tempo de atividade e throughput de dados.Distribuições suportadas: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman).``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git cd terminalphone bash terminalphone.sh
Seleccione a opção **7** no menu para instalar todas as dependências automaticamente. Os seguintes pacotes serão instalados:
| Pacote | Finalidade |
|---|---|
| `tor` | Roteamento onion e serviço oculto |
| `opus-tools` | Compressão de voz (codec Opus) |
| `sox` | Utilitários de processamento de áudio |
| `socat` | Relé TCP bidirecional através de proxy SOCKS do Tor |
| `openssl` | Criptografia e descriptografia AES-256-CBC |
| `alsa-utils` | Gravação e reprodução de áudio (`arecord`, `aplay`) |
### macOS``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
Selecione a opção 7 para instalar todas as dependências automaticamente. Se o Homebrew não estiver instalado, o script o instalará primeiro e, em seguida, instalará os seguintes pacotes:
Nota: O macOS usa sox para gravação (rec) e reprodução (play) em vez do ALSA. Nenhum pacote de áudio adicional é necessário.
Apple Silicon (M1/M2/M3+): Se o seu terminal estiver sendo executado sob o Rosetta 2 (um processo x86_64) enquanto o Homebrew está instalado no prefixo ARM nativo (/opt/homebrew), o brew install normalmente falha com Cannot install under Rosetta 2 in ARM default prefix. O instalador de dependências agora detecta isso e executa automaticamente o Homebrew sob arch -arm64, então a opção 7 funciona independentemente de como o script foi iniciado.
O TerminalPhone suporta dispositivos Android através do Termux. Devido à arquitetura de áudio isolada (sandbox) do Android, dois componentes adicionais são necessários.
Passo 1: Instalar o Termux
Instale o Termux a partir do F-Droid. Não use a versão da Play Store, pois está desatualizada e não recebe mais atualizações.
Passo 2: Instalar o aplicativo Termux:API
Instale o Termux:API a partir do F-Droid. Este é um aplicativo Android separado (não um pacote Termux) que fornece uma ponte entre o Termux e as APIs do sistema Android. O TerminalPhone precisa dele para acessar o microfone e a reprodução de mídia do dispositivo.
Sem o aplicativo Termux:API instalado no dispositivo, os comandos termux-microphone-record e termux-media-player não funcionarão, e a gravação e reprodução de áudio falharão silenciosamente.
Após instalar o aplicativo Termux:API, conceda a ele permissões de microfone quando solicitado.
Passo 3: Instalar o pacote Termux:API dentro do Termux```bash pkg install termux-api
Isto instala os utilitários de linha de comando que comunicam com o aplicativo Termux:API.
**Passo 4: Executar o TerminalPhone**```bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
Selecione a opção 7 para instalar todas as dependências restantes. O instalador executará primeiro pkg upgrade para resolver problemas de vinculação de pacotes, depois instalará tor, opus-tools, sox, socat, openssl-tool, ffmpeg e termux-api.
Dependências específicas do Termux:
| Package | Purpose |
|---|---|
termux-api | Interface de linha de comando para o microfone e player de mídia do Android |
ffmpeg | Converte gravações M4A do Android para PCM bruto para codificação Opus |
To receive a call: Select option 1 (Listen for calls) To make a call: Select option 2 (Call an onion address)
Ambas as partes devem ter o Tor em execução e o mesmo segredo compartilhado configurado antes de iniciar uma chamada.
---
## Uso
### Opções do Menu```
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 (pressionar para falar):
| Tecla | Ação |
|---|---|
| Segurar ESPAÇO | Gravar mensagem de voz. Envia automaticamente ao soltar. |
| T | Enviar uma mensagem de texto criptografada. |
| S | Abrir configurações durante a chamada (alterar cifra, ajustar qualidade). |
| Q | Desligar e retornar ao menu. |
Termux (modo alternância):
O teclado de software do Android envia eventos de tecla ao soltar, não ao pressionar. O TerminalPhone se adapta usando o modo alternância no Termux.
| Tecla | Ação |
|---|---|
| Tocar ESPAÇO | Iniciar gravação. Toque novamente para parar e enviar. |
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)
---
## Como Funciona
TerminalPhone usa um modelo de gravar-depois-enviar. Quando você ativa o PTT, o microfone grava continuamente até você soltar. A gravação completa é então processada através do seguinte pipeline:```
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
O protocolo de fio é baseado em texto sobre linhas, através de uma conexão TCP:
No Termux, um passo de conversão adicional lida com o formato de gravação nativo M4A do Android, usando ffmpeg para converter para PCM bruto antes da codificação Opus.
Encriptação: Todo o áudio é encriptado com uma cifra configurável pelo utilizador (predefinição: AES-256-CBC) antes da transmissão. Estão disponíveis 21 cifras selecionadas, classificadas das mais fortes (256 bits) às adequadas (128 bits). A chave é derivada de um segredo pré-partilhado usando PBKDF2 com 10.000 iterações. A encriptação é aplicada na camada de aplicação, independentemente da encriptação de transporte do Tor. Os segredos são passados para o OpenSSL através de descritores de ficheiro (-pass fd:3), não argumentos de linha de comandos, por isso nunca são expostos na tabela de processos.
Negociação de cifra: Ambas as partes trocam os nomes das cifras na conexão e sempre que uma cifra é alterada durante a chamada. Os nomes das cifras não são secretos (princípio de Kerckhoffs). Se as cifras local e remota não coincidirem, ambas as partes veem indicadores vermelhos no cabeçalho da chamada.
Transporte: Todos os dados são encaminhados através de circuitos de serviço oculto do Tor. O endereço IP de nenhuma das partes é exposto. Não há tráfego em rede limpa. A conexão não pode ser atribuída a nenhuma das partes por um observador de rede.
Resistência à análise de tráfego: O modelo de gravar-depois-enviar produz padrões de transmissão irregulares (mensagens de comprimento variável em intervalos irregulares), que são mais difíceis de identificar do que streaming contínuo.
Autenticação: O segredo partilhado serve como autenticação implícita. Se ambas as partes não tiverem o mesmo segredo, a desencriptação falha e nenhum áudio é reproduzido. Na conexão, ambas as partes trocam endereços .onion para identificação do chamador. O segredo pode ser opcionalmente encriptado em repouso com uma frase-chave; ao iniciar, o script solicita a frase-chave para desbloqueá-lo.
Assinatura de protocolo HMAC (opcional): Quando ativada, todas as mensagens do protocolo de fio — incluindo sinais de controlo como HANGUP, PTT_START e PING — são assinadas com HMAC-SHA256 derivado do segredo partilhado. Um nonce aleatório é incluído por mensagem para que comandos idênticos produzam assinaturas únicas. Os nonces vistos são rastreados por chamada e duplicados são rejeitados, prevenindo ataques de repetição. A definição HMAC é congelada no início da chamada através de um ficheiro em tempo de execução para que tanto o caminho de envio como o de receção estejam sempre de acordo, mesmo que a definição seja alternada durante a chamada (as alterações têm efeito na próxima chamada). No lado recetor, qualquer mensagem com uma assinatura inválida, ausente ou repetida é descartada silenciosamente. Isto impede que um atacante que comprometa o circuito Tor (mas não tenha o segredo partilhado) injete ou repita comandos. Ambas as partes devem ativar HMAC para que as chamadas funcionem. Não é compatível com versões anteriores a 1.1.3.
Limitações:
Segurança do modo relay: O relay é arquitetonicamente de conhecimento zero. Nunca possui o segredo partilhado e não pode desencriptar nenhum conteúdo. Os dados de áudio fluem através de buffers de pipe do kernel (FIFOs) que existem apenas na memória — nada é escrito em disco. Quando o relay para, todos os ficheiros temporários são eliminados. O operador do relay não pode determinar o que foi dito, quem são os chamadores ou ler quaisquer mensagens. O relay filtra todos os sinais de controlo (HANGUP, ID:, CIPHER:, PTT_START, PTT_STOP) e apenas encaminha AUDIO:, MSG: e PING. Um adversário passivo global poderia realizar análise de correlação de tráfego para associar os chamadores ao relay, mas o conteúdo da mensagem permanece opaco.
Capacidade do relay: O principal gargalo é a largura de banda do Tor. A taxa de transferência do serviço oculto do Tor é altamente variável e depende da qualidade do circuito, congestão do relay e distância geográfica. Uma mensagem de voz típica de 10 segundos tem ~20KB encriptados, e cada transmissão é difundida para N-1 ouvintes.
A capacidade realista é de 3–5 chamadores para um relay a executar num telemóvel (Termux), ou 5–10 chamadores numa máquina Linux dedicada com uma conexão estável. Relays a executar em dispositivos móveis enfrentam restrições adicionais: os dados móveis adicionam latência ao Tor, o Android pode matar processos Termux em segundo plano para recuperar memória, e o consumo de bateria aumenta com cada chamador conectado. A largura de banda do circuito Tor pode variar de 50KB/s a 500KB/s dependendo da qualidade do caminho, e os circuitos podem degradar-se ou rodar durante a sessão. O modo de salto único melhora a taxa de transferência, mas não elimina a congestão do relay Tor. Estas estimativas assumem o modelo PTT onde apenas uma pessoa transmite de cada vez — transmissões simultâneas degradariam ainda mais o desempenho. Os chamadores numa chamada de grupo devem considerar reduzir a sua taxa de bits Opus (Definições → Codificação Opus) para reduzir os tamanhos das mensagens e aliviar a carga no relay.
Toda a configuração é armazenada em .terminalphone/ relativo à localização do script:```
.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
Parâmetros de áudio padrão (definidos no topo do script):
| Parâmetro | Padrão | Descrição |
|---|---|---|
| `LISTEN_PORT` | 7777 | Porta TCP para conexões de entrada |
| `TOR_SOCKS_PORT` | 9050 | Porta do proxy SOCKS do Tor |
| `OPUS_BITRATE` | 16 | Taxa de bits de codificação Opus em kbps |
| `CIPHER` | aes-256-cbc | Cifra de encriptação (configurável via Configurações) |
| `SNOWFLAKE_ENABLED` | 0 | Ponte Snowflake para contornar censura |
| `AUTO_LISTEN` | 0 | Escuta automática de chamadas quando o Tor inicia |
| `PTT_KEY` | SPACE | Tecla push-to-talk (configurável via Configurações) |
| `VOL_PTT` | 0 | PTT com toque duplo no botão de volume, apenas Termux (experimental) |
| `EXCLUDE_NODES` | (vazio) | Lista ExcludeNodes do Tor por país (ex.: `{US},{GB}`) |
| `HMAC_AUTH` | 0 | Assinar HMAC todas as mensagens do protocolo (opcional, ambos os lados devem coincidir) |
| `OVERWRITE_DELETE` | 0 | Sobrescrever ficheiros temporários com dados aleatórios antes da eliminação (desligado por padrão) |
| `PTT_CHIME` | desligado | Predefinição de som de notificação PTT (desligado, tom, duplo, gorjeio, ding, clique, personalizado) |
| `SINGLE_HOP` | 0 | Modo Tor de salto único para menor latência (desativa o anonimato do servidor) |
| `SAMPLE_RATE` | 8000 | Taxa de amostragem de áudio em Hz |
| `CHUNK_DURATION` | 1 | Duração dos blocos de teste de áudio em segundos |
---
## Resolução de problemas
**Falha na inicialização do Tor:**
Verifique o registo do Tor em `.terminalphone/tor_data/tor.log`. Causas comuns incluem desvio de relógio, restrições de rede a bloquear o Tor, ou outra instância do Tor a usar a mesma porta SOCKS.
**Sem áudio no Termux:**
Confirme que a aplicação Termux:API está instalada a partir do F-Droid (não apenas o pacote `termux-api`). Conceda permissões de microfone à aplicação Termux:API nas definições do Android. Execute o teste de loopback de áudio (opção 5) para verificar.
**Falha na instalação do ffmpeg no Termux:**
Execute `pkg upgrade` antes de instalar as dependências. O instalador faz isto automaticamente, mas se instalou pacotes manualmente, bibliotecas partilhadas desatualizadas podem causar erros de ligação.
**Teste de áudio funciona, mas as chamadas estão mudas:**
Confirme que ambas as partes estão a usar o mesmo segredo partilhado. Segredos diferentes resultam em falha de desencriptação sem mensagem de erro — a chamada liga mas nenhum áudio é ouvido.
**Ponte Snowflake demora a ligar:**
A Snowflake encaminha o tráfego através de proxies WebRTC, o que acrescenta tempo extra de inicialização. É normal o Tor demorar 30–60 segundos (ou mais) para atingir 100% quando a Snowflake está ativada. O script mostrará um aviso de paciência durante a inicialização.
**Primeira inicialização do Tor é lenta:**
No primeiro arranque, o Tor tem de descarregar o consenso total da rede de raiz, o que pode demorar um ou dois minutos. O script deteta isso e exibe um aviso. O tempo limite de inicialização é automaticamente estendido de 120 para 300 segundos na primeira execução. Os arranques subsequentes usam dados de consenso em cache e são muito mais rápidos.
**Desligar não retorna ao menu:**
Se o script ficar preso após pressionar Q, prima Ctrl+C para forçar a limpeza e regressar à shell.
**`Cannot install under Rosetta 2 in ARM default prefix` no macOS:**
Isto acontece em Apple Silicon quando o terminal está a correr sob Rosetta 2 (um processo `x86_64`) mas o Homebrew reside no prefixo ARM nativo (`/opt/homebrew`). O instalador de dependências (opção **7**) agora deteta isto e executa automaticamente o `brew` sob `arch -arm64`. Se estiver a instalar pacotes manualmente, prefixe-os você mesmo: `arch -arm64 brew install <pkg>`. Em alternativa, execute o script nativamente com `arch -arm64 bash terminalphone.sh`.
---
[ESPELHO V1.0.0](https://bin.disroot.org/?e1356291b098cb75#FMQ4gxFwgdr3rjR1dpGS2csLmDPzDEkQW16fQ5P2Vt4y)
[ESPELHO V1.0.1](https://bin.disroot.org/?d3bc0b8976113f58#AuUm4ev4vfeVmPyrh2KjAdhDP6WN4UX6yKQh9ERGD5Qt)
[ESPELHO V1.0.2](https://bin.disroot.org/?6bc5b2fd046de1d7#G7TmnytrMeaM5AZYWth6BjjdqUb9RDf3K9erHUExKcGX)
[ESPELHO V1.0.3](https://bin.disroot.org/?c5010f039e4693fd#Brp1w7LRQH9d5Ye5npZDPxNVR855SW9QUAk9cJaUuLYX)
[ESPELHO V1.0.4](https://bin.disroot.org/?1831f6b78e349142#7zaAMVPNJL3MfbGJzjtm6cCPcvQftf4ULXupdne5dRKw)
[ESPELHO V1.0.5](https://bin.disroot.org/?edfcfc844987ed03#56LuBbqbkfNDXfHpydyaB3VcWYhYenX18dtSvNumERY9)
[ESPELHO V1.0.6](https://bin.disroot.org/?6c7b4774108b0c1c#GQPst46zjAYidndmNvytforX7MK2LyHanL4d829vVcv4)
[ESPELHO V1.0.7](https://bin.disroot.org/?047003637623b4fa#EwmaysciDpiDkht8xV7ce3QcR9oxFXaxSikh4cLheXBB)
[ESPELHO V1.0.8](https://bin.disroot.org/?06e38bd64e6fbdad#88MYs3dmq9rSMkmocpW3NYaaG4YfSdRCc9LJnEEzqGYp)
[ESPELHO V1.0.9](https://bin.disroot.org/?950218a9a7c71c66#E7Z94VCGBZozrfXYhGwKyAdMeTxuavg92tA1pn2DbrrB)
[ESPELHO V1.1.0](https://bin.disroot.org/?0b0da14f31521b3a#B1c23J8xFoZZKErvGG28PgbtfgtMUcDABWmQEoSZfXgh)
[ESPELHO V1.1.1](https://bin.disroot.org/?d8e2d4f0300eb5af#9Y1C8CkcH9jAmv1fh4GZs1yYpJmWCG5xG3SvDYdwnJam)
[ESPELHO V1.1.2](https://bin.disroot.org/?b1059616f880925f#8ef2oscZXUkPAsJZwGfWvLPQagVAk5GgW4DyssmLvQpG)
[ESPELHO V1.1.3](https://bin.disroot.org/?b02658801518aaa7#JE6CsBLWUwAnTdBqeHgeXL7QF5UExgi9rnygcfyMZjCJ)
[ESPELHO V1.1.4](https://bin.disroot.org/?d31248fc44c287a0#HQELFWFEMpM9kfTZSGDXTdGFMVKTejox5CajF9Vm4Www)
[ESPELHO V1.1.5](https://bin.disroot.org/?284b723ed6aad15f#8VCrrri6yRpdg3uVDSY94wpx7LYkw5uYhm4Vbhka83sM)
[ESPELHO V1.1.5.1](https://bin.disroot.org/?26aaef1eff20c271#4GxQQPSDhrszTu1RmERySNVqD2fZW5GZwm3JeL1parpB)
[ESPELHO V1.1.6](https://bin.disroot.org/?ae8270578cd9e081#BbcDLU49XqhecvwviHRcdfrZ4vhKdL2AMeKaT5v9oLV1)
[ESPELHO V1.1.7](https://bin.disroot.org/?457e4308abe582d8#B9LJG88rmUwrGHHuCof8WpE8CXGmkc2tyrXXicEiJFWk)
---
## Licença
MIT
| Pacote | Objetivo |
|---|
tor | Roteamento onion e serviço oculto |
opus-tools | Compressão de voz (codec Opus) |
sox | Gravação e reprodução de áudio (rec, play) |
socat | Retransmissão TCP bidirecional através do proxy SOCKS do Tor |
openssl | Criptografia e descriptografia AES-256-CBC |
| T | Enviar uma mensagem de texto criptografada. |
| S | Abrir configurações durante a chamada (alterar cifra, ajustar qualidade). |
| Q | Desligar e retornar ao menu. |
| Vol Down ×2 | Alternar gravação via botão de volume (requer "Volume PTT" ativado nas configurações). |
| Mensagem | Descrição |
|---|
ID:<onion> | ID do chamador — endereço .onion do remetente |
CIPHER:<name> | Cifra de encriptação do remetente. Trocada na conexão e na alteração. |
PTT_START | O remetente começou a gravar |
PTT_STOP | O remetente terminou; o áudio segue ou foi enviado |
AUDIO:<base64> | Mensagem de áudio encriptada completa |
MSG:<base64> | Mensagem de texto encriptada |
HANGUP | O remetente está a desligar |
PING | Sinal de keepalive |
RELAY:1 | Saudação do relay — enviada pelo relay na conexão, ativa o modo de grupo |
GROUP:<n> | Atualização do tamanho do grupo — transmitida pelo relay quando os chamadores entram ou saem |
| Chamadores | Saída por mensagem | Experiência esperada |
|---|
| 2–3 | 20–40KB | Fiável na maioria das conexões |
| 3–5 | 40–80KB | Boa em circuitos estáveis, atrasos possíveis em dados móveis |
| 5–10 | 80–180KB | Atingindo limites, atrasos notáveis entre transmissões |
| 10+ | 180KB+ | Não fiável, fila significativa e potencial perda de mensagens |