
Mensageiro criptografado baseado em terminal com criptografia pós-quântica, protocolo Double Ratchet e anonimato via Tor. Inclui frase-senha de coação, autenticação negável e endurecimento ao nível do sistema operacional por meio de seccomp-bpf e mlockall.
op4 — Mensageiro Seguro de Terminal
O op4 é um aplicativo de mensagens criptografadas para terminal escrito em Rust. Ele oferece mensagens privadas com criptografia de ponta a ponta usando criptografia pós-quântica, roteadas inteiramente pela rede Tor, de modo que nem o conteúdo das suas mensagens nem o seu endereço IP sejam expostos a ninguém — nem mesmo à pessoa com quem você está conversando.
O op4 permite que duas pessoas troquem mensagens privadas sem que nenhuma das partes revele seu endereço IP ou identidade real. Cada mensagem é:
O op4 é executado inteiramente no terminal. Não tem GUI, nenhum componente de navegador e nenhuma conta na nuvem. O único processo externo com o qual ele se comunica é o daemon Tor em execução na sua própria máquina.
Todas as opções de download — AppImage, tarball do código-fonte, clone e compilação, e instalador automatizado — estão documentadas no guia de Downloads e Instalação. A versão mais recente está disponível na página de Releases.
No Debian e no Ubuntu, o install/setup.sh cuida de tudo em um único comando:
toolchain Rust, dependências de compilação, Tor, configuração da porta de controle, compilação
do binário, usuário do sistema, diretório de dados e perfil AppArmor.
git clone https://github.com/Opfour/op4.git
cd op4
sudo bash install/setup.sh
Depois que o script terminar, você deve sair da sessão e entrar novamente antes de executar o op4. O instalador adiciona seu usuário ao grupo
debian-torpara que ele possa ler o arquivo cookie do Tor. O Linux não aplica alterações de grupo a sessões já abertas — é necessário um novo login.Pular esta etapa fará o op4 falhar na inicialização com:
Permission denied reading /run/tor/control.authcookie
Em seguida, verifique se o hash do código-fonte impresso pelo script corresponde ao hash da versão publicada da sua versão antes de confiar no binário.
Quando o op4 inicia, ele imprime um hash do código-fonte que cobre todos os arquivos-fonte Rust,
Cargo.toml, Cargo.lock e build.rs. Compare-o com o valor
abaixo para a versão que você instalou.
Você também pode verificá-lo sem iniciar o aplicativo completo:
op4 --print-hash
Se o hash não corresponder, não use o binário — ele foi compilado a partir de um commit diferente ou foi adulterado.
Instale as dependências primeiro e depois execute o script:
Toolchain Rust (fixada em 1.89.0 via rust-toolchain.toml):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Tor e dependências de compilação:
# Fedora
sudo dnf install tor gcc pkg-config openssl-devel
# Arch
sudo pacman -S tor base-devel pkg-config openssl
Configure a porta de controle do Tor — adicione ao /etc/tor/torrc:
ControlPort 9051
CookieAuthentication 1
sudo systemctl restart tor
Adicione seu usuário ao grupo do Tor:
sudo usermod -aG tor $USER # Fedora / Arch
Você deve sair da sessão e entrar novamente após esta etapa. Alterações na associação de grupos não são aplicadas a sessões ativas. Até que você faça isso, o op4 falhará com
Permission denied reading /run/tor/control.authcookie.Para aplicar a alteração sem um logout completo, execute:
newgrp tor
Compile e instale:
git clone https://github.com/Opfour/op4.git
cd op4
cargo build --release
sudo bash install/setup.sh
op4
# or, without system install:
./target/release/op4
Na primeira execução, o op4 o guiará pela definição de uma senha normal
e uma senha de coação e, em seguida, gerará suas chaves de identidade. Seu cofre é
armazenado em ~/.local/share/op4/vault.op4.
Kernel mínimo: 4.15 (5.4+ recomendado). Arquitetura: x86-64 (aarch64 deve funcionar, mas não é testado).
Cada pessoa precisa ter o op4 instalado, o Tor em execução e o cofre desbloqueado. A troca é assimétrica: uma pessoa envia seu código de contato primeiro, a outra o adiciona e depois envia sua primeira mensagem, que chega como uma solicitação pendente que a primeira pessoa aceita.
Na primeira execução, o op4 pede uma senha normal e uma senha
de coação e, em seguida, gera suas chaves de identidade. Isso só acontece uma vez.
Seu cofre é armazenado em ~/.local/share/op4/vault.op4.
$ op4
Seu código de contato contém seu conjunto completo de chaves públicas e seu endereço
.onion. A outra pessoa precisa disso para entrar em contato com você.
2 ou →)e para exportar seu código de contatoop4:Seu código de contato não é secreto. É seguro compartilhá-lo publicamente. Ele contém apenas suas chaves públicas e o endereço onion — nenhum material privado.
Quando você tiver o código de contato dela:
a para adicionar um contatoop4: dela e pressione Enter↑/↓ e depois Enter)3 ou →)Essa primeira mensagem inicia o handshake criptografado e é entregue
ao endereço .onion dela via Tor. Ela aparecerá como uma solicitação
de contato pendente.
Quando alguém envia uma primeira mensagem, um selo aparece na aba Contatos mostrando quantas solicitações estão aguardando.
2)p para revisar as solicitações pendentesEsc para rejeitar e descartar)Após a aceitação, o Double Ratchet é inicializado e a conversa fica imediatamente disponível na aba Mensagens.
Antes de confiar em um contato, confirme se a impressão digital dele corresponde ao que ele vê na própria tela. Isso evita um ataque man-in-the-middle durante a troca inicial de contatos.
A3F2:91BC:…Se você acredita que suas chaves de identidade podem ter sido comprometidas:
4 ou navegue para a direita)r para rotacionar as chavesO op4 usa um protocolo Double Ratchet (semelhante ao Signal Protocol) para sigilo de encaminhamento. Isso significa:
A etapa KEM combina X25519 e ML-KEM-768 da seguinte forma:
shared_secret = HKDF(X25519_ss || MLKEM_ss)
Um invasor precisa quebrar ambos os algoritmos para comprometer a troca de chaves. Isso protege contra um adversário quântico (ML-KEM-768) enquanto permanece seguro contra ataques clássicos se o ML-KEM-768 tiver uma falha desconhecida (fallback X25519).
As mensagens são autenticadas com HMAC-SHA256 usando uma chave derivada do estado compartilhado do ratchet. Como ambas as partes possuem a mesma chave HMAC, qualquer uma delas poderia ter produzido qualquer MAC. Essa é a mesma propriedade de negação usada por OTR e Signal: as mensagens não podem ser criptograficamente atribuídas a um remetente específico em um processo judicial.
O arquivo de cofre em ~/.local/share/op4/vault.op4 armazena todos os contatos,
conversas e chaves de identidade. Ele é protegido com duas chaves independentes
derivadas de Argon2id:
O op4 cria um serviço oculto Tor v3 para sua caixa de entrada. Seu endereço .onion
é derivado deterministicamente da sua chave de identidade (via HKDF), portanto,
ele é estável entre reinicializações sem precisar armazenar uma chave separada. Mensagens
de saída são enviadas através do proxy SOCKS5 do Tor. Seu endereço IP real nunca
aparece em nenhum pacote de rede relacionado ao op4.
O tráfego de cobertura (mensagens fictícias com distribuição de Poisson enviadas para você mesmo, intervalo médio de 30 segundos) impede que um observador de rede descubra se você está conversando ativamente com alguém ao observar o volume de tráfego.
apparmor/op4.profile) — restringe o acesso ao sistema
de arquivos apenas ao diretório do cofre, dispositivos de terminal e Tor.┌─────────────────────────────────────────────────────────────┐
│ op4 process │
│ │
│ ┌──────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ TUI │ │ Double Ratchet │ │ Tor Transport │ │
│ │ (ratatui)│──▶│ + Hybrid PQ │──▶│ nym_client.rs │ │
│ │ │ │ Crypto │ │ │ │
│ └──────────┘ └──────────────────┘ └───────┬────────┘ │
│ │ │
│ ┌──────────────────────────────┐ │ │
│ │ Encrypted Vault │ SOCKS5 / control port │
│ │ ~/.local/share/op4/vault.op4│ │ │
│ └──────────────────────────────┘ │ │
└────────────────────────────────────────────────┼───────────┘
│
┌────────────▼────────────┐
│ Tor daemon │
│ 127.0.0.1:9050 (SOCKS) │
│ 127.0.0.1:9051 (ctrl) │
└────────────┬────────────┘
│
Tor network
│
┌────────────▼────────────┐
│ Peer's .onion address │
│ (their hidden service) │
└─────────────────────────┘
op4/
├── src/
│ ├── main.rs Entry point, startup sequence
│ ├── error.rs Unified error types
│ ├── crypto/
│ │ ├── keys.rs Hybrid KEM + signature keypairs
│ │ ├── primitives.rs AEAD, HKDF, HMAC, Argon2id
│ │ ├── ratchet.rs Double Ratchet implementation
│ │ ├── hmac_auth.rs Deniable authentication tags
│ │ └── handshake.rs Initial key agreement (X3DH-style)
│ ├── network/
│ │ ├── nym_client.rs Tor hidden-service transport
│ │ └── message.rs Wire message format + padding
│ ├── storage/
│ │ └── vault.rs Encrypted vault (Argon2id + AEAD)
│ ├── identity/
│ │ ├── profile.rs Contact codes, stored contacts
│ │ └── revocation.rs Key revocation records
│ ├── hardening/
│ │ ├── memory.rs mlockall, RLIMIT_CORE, dumpable
│ │ └── seccomp.rs seccomp-bpf syscall filter
│ └── ui/
│ ├── app.rs TUI event loop and state machine
│ ├── contacts.rs Contacts tab rendering
│ ├── conversation.rs Messages tab rendering
│ ├── settings.rs Settings tab rendering
│ ├── duress.rs Duress inbox rendering
│ ├── input.rs Input sanitization (CSI/OSC strip)
│ └── passphrase.rs Secure passphrase prompts
├── apparmor/
│ └── op4.profile AppArmor MAC profile
├── install/
│ └── setup.sh System installation script
├── build.rs Embeds source hash at compile time
├── deny.toml cargo-deny licence + advisory rules
├── rust-toolchain.toml Pins Rust 1.89.0
└── docs/ This documentation
Versão: 0.2.0-dev (pré-lançamento)
O op4 está em desenvolvimento ativo. As seguintes camadas estão completas e testadas:
Todas as camadas agora estão integradas de ponta a ponta:
PublicKeyBundle real codificado em Base58
(seu conjunto completo de chaves públicas + endereço onion).Todas as limitações conhecidas foram resolvidas. O aplicativo agora está em status de funcionalidades completas para 0.2.0-dev:
Autenticação negável HMAC está totalmente integrada. Toda mensagem de dados
de saída carrega uma tag HMAC-SHA256 calculada a partir da chave de ratchet por mensagem
sobre (conversation_id || message_counter || ciphertext). Mensagens recebidas
são verificadas antes de serem aceitas; tags preenchidas com zeros de pares
mais antigos são toleradas para compatibilidade retroativa.
O histórico de mensagens persiste entre reinicializações. O log completo da conversa
é criptografado com uma chave derivada de HKDF por conversa e armazenado no
campo message_log_ct do cofre. As mensagens são carregadas do cofre quando
uma conversa é aberta e gravadas de volta após cada envio ou recebimento.
Solicitações de contato recebidas de partes desconhecidas são enfileiradas em vez de
descartadas. A aba Contatos mostra um selo quando há solicitações aguardando.
Pressione [p] para revisar: você vê a impressão digital do remetente e a primeira
mensagem dele, digita um nome e pressiona Enter para aceitar (ou Esc para rejeitar). Ao
aceitar, o contato é adicionado, o Double Ratchet é inicializado e
a mensagem inicial é salva no cofre.
Cofre de coação preservado entre salvamentos. O formato do arquivo de cofre (v2) armazena
os comprimentos exatos do texto cifrado no cabeçalho para que a descriptografia AEAD opere nos
bytes reais em vez de seções preenchidas com zeros. A seção de coação criptografada
é armazenada literalmente em cada chamada de save(), mantendo a senha de coação
válida indefinidamente.
Chave de inicialização dedicada do Double Ratchet. Um par de chaves X25519 separado
(identity_ratchet_secret) é gerado na primeira execução e incluído no
código de contato como ratchet_pub. O ratchet da Alice é inicializado com o
do Bob em vez da chave de identidade KEM dele, separando as funções das chaves.
| Versão | Hash do código-fonte |
|---|
0.3.0 | 80820cb41a63575d2c139dadd425d13d1e87e62a9d60200ae7b894ae2e9ad8ed |
0.3.1 | 48115efb12747fa78b627ddbf7a56c46169f59e777d7d7508941bf89e4fe7521 |
0.2.0-dev | 35740577f6c4a4f19c5a08fe85b1f78a10347f2ba9dd7642d126552266bfa5a5 |
0.1.0 | e1a94761c7d3fa589ba892b47d5295aa417f95aee126809d51a7e7fb7e78982c |
| Distribuição | Status |
|---|
| Ubuntu 22.04 / 24.04 | Suportado |
| Debian 12 | Suportado |
| Fedora 39+ | Suportado |
| Arch Linux (atual) | Suportado |
| Tails OS | Suportado (guia de configuração) |
| macOS / Windows / WSL1 | Não suportado |
| Tecla | Ação |
|---|
1 / ← → | Alternar abas (Contatos / Mensagens / Configurações) |
↑ ↓ | Mover a seleção |
Enter | Abrir conversa / confirmar |
Esc | Cancelar / voltar |
e | Exportar seu código de contato (aba Contatos) |
a | Adicionar um contato (aba Contatos) |
p | Revisar solicitações pendentes (aba Contatos) |
d | Excluir o contato selecionado (aba Contatos) |
r | Rotacionar suas chaves (aba Configurações) |
q | Sair |
| Objetivo | Algoritmo |
|---|
| Derivação da chave do cofre | Argon2id (m=64 MiB, t=3, p=1) |
| Criptografia do cofre | ChaCha20-Poly1305 (chave de 256 bits, nonce de 96 bits) |
| Criptografia de mensagens | ChaCha20-Poly1305 (chave por mensagem do ratchet) |
| Derivação de chave (ratchet) | HKDF-SHA256 |
| Autenticação negável | HMAC-SHA256 |
| Troca de chaves clássica | X25519 |
| Troca de chaves pós-quântica | ML-KEM-768 (FIPS 203) |
| Assinaturas clássicas | Ed25519 |
| Assinaturas pós-quânticas | ML-DSA-65 (FIPS 204) |
| Anonimato de transporte | Serviços ocultos Tor v3 (.onion) |
ratchet_pubAba Configurações totalmente funcional. O endereço SOCKS5 do Tor e o limite de exclusão automática podem ser editados inline. A rotação de chaves (gera um novo par de chaves, transmite um certificado de revogação assinado a todos os contatos, atualiza o código de exportação) e a revogação por aposentadoria de chave estão ambas integradas e operacionais.
Revogação de chave integrada de ponta a ponta. Estruturas RevocationCertificate
são assinadas com o par de chaves híbrido Ed25519+ML-DSA-65 e enviadas a todos os contatos
como mensagens WireMessageType::Revocation via Tor.