
Mensajero cifrado basado en terminal con criptografía post-cuántica, protocolo Double Ratchet y anonimato de Tor. Incluye frase de paso de coacción, autenticación negable y endurecimiento a nivel de sistema operativo mediante seccomp-bpf y mlockall.
op4 — Mensajero seguro para terminal
Op4 es una aplicación de mensajería cifrada basada en terminal, escrita en Rust. Proporciona mensajería privada cifrada de extremo a extremo con criptografía post-cuántica, enrutada íntegramente a través de la red Tor, de modo que ni el contenido de tus mensajes ni tu dirección IP quedan expuestos a nadie — ni siquiera a la persona con la que hablas.
op4 permite que dos personas intercambien mensajes privados sin que ninguna de las dos revele su dirección IP ni su identidad real. Cada mensaje está:
op4 se ejecuta íntegramente en la terminal. No tiene interfaz gráfica, ni componente de navegador, ni cuenta en la nube. El único proceso externo con el que se comunica es el demonio Tor que se ejecuta en tu propia máquina.
Todas las opciones de descarga — AppImage, tarball de código fuente, clonar y compilar, e instalador automatizado — están documentadas en la Guía de descargas e instalación. La última versión está disponible en la página de Releases.
En Debian y Ubuntu, install/setup.sh se encarga de todo con un solo comando:
cadena de herramientas de Rust, dependencias de compilación, Tor, configuración del puerto de control, compilación
del binario, usuario del sistema, directorio de datos y perfil de AppArmor.
git clone https://github.com/Opfour/op4.git
cd op4
sudo bash install/setup.sh
Después de que el script termine, debes cerrar la sesión y volver a iniciarla antes de ejecutar op4. El instalador añade tu usuario al grupo
debian-torpara que pueda leer el archivo de cookie de Tor. Linux no aplica los cambios de grupo a sesiones ya abiertas — se requiere un nuevo inicio de sesión.Si omites este paso, op4 fallará al arrancar con:
Permission denied reading /run/tor/control.authcookie
A continuación, verifica que el hash de código fuente mostrado por el script coincide con el hash de la versión publicada para tu versión antes de confiar en el binario.
Cuando op4 arranca, muestra un hash de código fuente que cubre todos los archivos fuente de Rust,
Cargo.toml, Cargo.lock y build.rs. Compáralo con el valor
siguiente para la versión que instalaste.
También puedes comprobarlo sin iniciar la aplicación completa:
op4 --print-hash
Si el hash no coincide, no uses el binario — o fue compilado a partir de un commit diferente o ha sido manipulado.
Instala primero las dependencias y luego ejecuta el script:
Cadena de herramientas de Rust (fijada en 1.89.0 mediante rust-toolchain.toml):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Tor y dependencias de compilación:
# Fedora
sudo dnf install tor gcc pkg-config openssl-devel
# Arch
sudo pacman -S tor base-devel pkg-config openssl
Configurar el puerto de control de Tor — añade a /etc/tor/torrc:
ControlPort 9051
CookieAuthentication 1
sudo systemctl restart tor
Añade tu usuario al grupo de Tor:
sudo usermod -aG tor $USER # Fedora / Arch
Debes cerrar la sesión y volver a iniciarla después de este paso. Los cambios de pertenencia a grupos no se aplican a sesiones activas. Hasta que lo hagas, op4 fallará con
Permission denied reading /run/tor/control.authcookie.Para aplicar el cambio sin cerrar sesión por completo, ejecuta:
newgrp tor
Compilar e instalar:
git clone https://github.com/Opfour/op4.git
cd op4
cargo build --release
sudo bash install/setup.sh
op4
# o, sin instalación en el sistema:
./target/release/op4
En el primer arranque, op4 te guiará para establecer una frase de contraseña normal
y una frase de contraseña de coacción; después generará tus claves de identidad. Tu bóveda se
almacena en ~/.local/share/op4/vault.op4.
Kernel mínimo: 4.15 (se recomienda 5.4+). Arquitectura: x86-64 (aarch64 debería funcionar pero no está probada).
Cada persona necesita op4 instalado, Tor en ejecución y su bóveda desbloqueada. El intercambio es asimétrico: una persona envía su código de contacto primero, la otra lo añade y luego envía su primer mensaje, que llega como una solicitud pendiente que la primera persona acepta.
En el primer arranque, op4 solicita una frase de contraseña normal y una frase
de contraseña de coacción, y luego genera tus claves de identidad. Esto solo ocurre una vez.
Tu bóveda se almacena en ~/.local/share/op4/vault.op4.
$ op4
Tu código de contacto contiene tu paquete completo de claves públicas y tu dirección .onion.
La otra persona necesita esto para llegar hasta ti.
2 o →)e para exportar tu código de contactoop4:Tu código de contacto no es secreto. Es seguro compartirlo públicamente. Contiene solo tus claves públicas y tu dirección onion — ningún material privado.
Una vez que tengas su código de contacto:
a para añadir un contactoop4: y pulsa Enter↑/↓ y luego Enter)3 o →)Este primer mensaje inicia el protocolo de enlace cifrado y se entrega
a su dirección .onion a través de Tor. Lo verán como una solicitud de
contacto pendiente.
Cuando alguien te envía un primer mensaje, aparece una insignia en la pestaña Contactos que indica cuántas solicitudes están esperando.
2)p para revisar las solicitudes pendientesEsc para rechazar y descartar)Una vez aceptado, el Double Ratchet se inicializa y la conversación está disponible de inmediato en la pestaña Mensajes.
Antes de confiar en un contacto, confirma que su huella digital coincide con la que esa persona ve en su propia pantalla. Esto evita un ataque de intermediario (man-in-the-middle) durante el intercambio inicial de contactos.
A3F2:91BC:…Si crees que tus claves de identidad pueden estar comprometidas:
4 o navega a la derecha)r para rotar las clavesop4 utiliza un protocolo Double Ratchet (similar al Protocolo Signal) para el secreto directo (forward secrecy). Esto significa:
El paso de KEM combina X25519 y ML-KEM-768 de la siguiente manera:
shared_secret = HKDF(X25519_ss || MLKEM_ss)
Un atacante debe romper ambos algoritmos para comprometer el intercambio de claves. Esto protege contra un adversario cuántico (ML-KEM-768) mientras sigue siendo seguro contra ataques clásicos si ML-KEM-768 tiene un fallo desconocido (respaldo de X25519).
Los mensajes se autentican con HMAC-SHA256 usando una clave derivada del estado compartido del ratchet. Dado que ambas partes poseen la misma clave HMAC, cualquiera de las dos podría haber producido un MAC dado. Esta es la misma propiedad de negación usada por OTR y Signal: los mensajes no pueden atribuirse criptográficamente a un remitente específico en un procedimiento judicial.
El archivo de bóveda en ~/.local/share/op4/vault.op4 almacena todos los contactos,
conversaciones y claves de identidad. Está protegido con dos claves independientes
derivadas de Argon2id:
op4 crea un servicio oculto de Tor v3 para tu bandeja de entrada. Tu dirección .onion
se deriva de forma determinista de tu clave de identidad (mediante HKDF), por lo que es
estable entre reinicios sin necesidad de almacenar una clave separada. Los mensajes
salientes se envían a través del proxy SOCKS5 de Tor. Tu dirección IP real nunca aparece
en ningún paquete de red relacionado con op4.
El tráfico de cobertura (mensajes ficticios distribuidos según Poisson enviados a uno mismo, intervalo medio de 30 segundos) impide que un observador de la red pueda saber si estás enviando mensajes activamente a alguien mediante la observación del volumen de tráfico.
apparmor/op4.profile) — restringe el acceso al sistema de archivos
únicamente al directorio de la bóveda, los dispositivos de terminal y Tor.┌─────────────────────────────────────────────────────────────┐
│ proceso op4 │
│ │
│ ┌──────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ TUI │ │ Double Ratchet │ │ Tor Transport │ │
│ │ (ratatui)│──▶│ + Hybrid PQ │──▶│ nym_client.rs │ │
│ │ │ │ Crypto │ │ │ │
│ └──────────┘ └──────────────────┘ └───────┬────────┘ │
│ │ │
│ ┌──────────────────────────────┐ │ │
│ │ Bóveda cifrada │ SOCKS5 / puerto de │
│ │ ~/.local/share/op4/vault.op4│ control │
│ └──────────────────────────────┘ │ │
└────────────────────────────────────────────────┼───────────┘
│
┌────────────▼────────────┐
│ Demonio Tor │
│ 127.0.0.1:9050 (SOCKS) │
│ 127.0.0.1:9051 (ctrl) │
└────────────┬────────────┘
│
Red Tor
│
┌────────────▼────────────┐
│ Dirección .onion del │
│ interlocutor │
│ (su servicio oculto) │
└─────────────────────────┘
op4/
├── src/
│ ├── main.rs Punto de entrada, secuencia de arranque
│ ├── error.rs Tipos de error unificados
│ ├── crypto/
│ │ ├── keys.rs Pares de claves KEM híbrido + firmas
│ │ ├── primitives.rs AEAD, HKDF, HMAC, Argon2id
│ │ ├── ratchet.rs Implementación de Double Ratchet
│ │ ├── hmac_auth.rs Etiquetas de autenticación negable
│ │ └── handshake.rs Acuerdo de claves inicial (estilo X3DH)
│ ├── network/
│ │ ├── nym_client.rs Transporte de servicio oculto de Tor
│ │ └── message.rs Formato de mensaje por cable + relleno
│ ├── storage/
│ │ └── vault.rs Bóveda cifrada (Argon2id + AEAD)
│ ├── identity/
│ │ ├── profile.rs Códigos de contacto, contactos almacenados
│ │ └── revocation.rs Registros de revocación de claves
│ ├── hardening/
│ │ ├── memory.rs mlockall, RLIMIT_CORE, dumpable
│ │ └── seccomp.rs Filtro de llamadas al sistema seccomp-bpf
│ └── ui/
│ ├── app.rs Bucle de eventos de la TUI y máquina de estados
│ ├── contacts.rs Renderizado de la pestaña Contactos
│ ├── conversation.rs Renderizado de la pestaña Mensajes
│ ├── settings.rs Renderizado de la pestaña Ajustes
│ ├── duress.rs Renderizado de la bandeja de coacción
│ ├── input.rs Saneamiento de entrada (eliminación de CSI/OSC)
│ └── passphrase.rs Solicitudes seguras de frase de contraseña
├── apparmor/
│ └── op4.profile Perfil MAC de AppArmor
├── install/
│ └── setup.sh Script de instalación del sistema
├── build.rs Incorpora el hash del código fuente en tiempo de compilación
├── deny.toml Reglas de licencias y avisos de cargo-deny
├── rust-toolchain.toml Fija Rust 1.89.0
└── docs/ Esta documentación
Versión: 0.2.0-dev (pre-lanzamiento)
op4 está en desarrollo activo. Las siguientes capas están completas y probadas:
Todas las capas están ahora conectadas de extremo a extremo:
PublicKeyBundle real codificado en Base58
(tu conjunto completo de claves públicas + dirección onion).Todas las limitaciones conocidas se han resuelto. La aplicación está ahora en estado de funcionalidad completa para 0.2.0-dev:
Autenticación negable HMAC está completamente conectada. Cada mensaje de datos saliente
lleva una etiqueta HMAC-SHA256 calculada a partir de la clave de ratchet por mensaje
sobre (conversation_id || message_counter || ciphertext). Los mensajes
entrantes se verifican antes de ser aceptados; las etiquetas rellenas con ceros de pares
más antiguos se toleran por compatibilidad con versiones anteriores.
El historial de mensajes persiste entre reinicios. El registro completo de la conversación
se cifra con una clave derivada de HKDF por conversación y se almacena en el
campo message_log_ct de la bóveda. Los mensajes se cargan desde la bóveda cuando
se abre una conversación y se vuelven a escribir después de cada envío o recepción.
Las solicitudes de contacto entrantes de partes desconocidas se ponen en cola en lugar de
descartarse. La pestaña Contactos muestra una insignia cuando hay solicitudes en espera.
Pulsa [p] para revisarlas: verás la huella digital del remitente y su primer
mensaje, escribe un nombre y pulsa Enter para aceptar (o Esc para rechazar). Al
aceptar, el contacto se añade, el Double Ratchet se inicializa y
el mensaje inicial se guarda en la bóveda.
La bóveda de coacción se conserva entre guardados. El formato de archivo de la bóveda (v2) almacena
las longitudes exactas del texto cifrado en la cabecera, de modo que el descifrado AEAD opera sobre
los bytes reales en lugar de secciones rellenas con ceros. La sección cifrada de coacción
se almacena textualmente en cada llamada a save(), lo que mantiene la frase de contraseña de coacción
válida indefinidamente.
Clave de arranque dedicada para Double Ratchet. Un par de claves X25519 separado
(identity_ratchet_secret) se genera en el primer arranque y se incluye en el
código de contacto como ratchet_pub. El ratchet de Alice se inicializa con el
de Bob en lugar de con su clave de identidad KEM, separando los roles de las claves.
| Versión | Hash de código fuente |
|---|
0.3.0 | 80820cb41a63575d2c139dadd425d13d1e87e62a9d60200ae7b894ae2e9ad8ed |
0.3.1 | 48115efb12747fa78b627ddbf7a56c46169f59e777d7d7508941bf89e4fe7521 |
0.2.0-dev | 35740577f6c4a4f19c5a08fe85b1f78a10347f2ba9dd7642d126552266bfa5a5 |
0.1.0 | e1a94761c7d3fa589ba892b47d5295aa417f95aee126809d51a7e7fb7e78982c |
| Distribución | Estado |
|---|
| Ubuntu 22.04 / 24.04 | Compatible |
| Debian 12 | Compatible |
| Fedora 39+ | Compatible |
| Arch Linux (actual) | Compatible |
| Tails OS | Compatible (guía de instalación) |
| macOS / Windows / WSL1 | No compatible |
| Tecla | Acción |
|---|
1 / ← → | Cambiar de pestaña (Contactos / Mensajes / Ajustes) |
↑ ↓ | Mover la selección |
Enter | Abrir conversación / confirmar |
Esc | Cancelar / volver atrás |
e | Exportar tu código de contacto (pestaña Contactos) |
a | Añadir un contacto (pestaña Contactos) |
p | Revisar solicitudes pendientes (pestaña Contactos) |
d | Eliminar el contacto seleccionado (pestaña Contactos) |
r | Rotar tus claves (pestaña Ajustes) |
q | Salir |
| Propósito | Algoritmo |
|---|
| Derivación de la clave de la bóveda | Argon2id (m=64 MiB, t=3, p=1) |
| Cifrado de la bóveda | ChaCha20-Poly1305 (clave de 256 bits, nonce de 96 bits) |
| Cifrado de mensajes | ChaCha20-Poly1305 (clave por mensaje derivada del ratchet) |
| Derivación de claves (ratchet) | HKDF-SHA256 |
| Autenticación negable | HMAC-SHA256 |
| Intercambio de claves clásico | X25519 |
| Intercambio de claves post-cuántico | ML-KEM-768 (FIPS 203) |
| Firmas clásicas | Ed25519 |
| Firmas post-cuánticas | ML-DSA-65 (FIPS 204) |
| Anonimato del transporte | Servicios ocultos de Tor v3 (.onion) |
ratchet_pubPestaña Ajustes totalmente funcional. La dirección SOCKS5 de Tor y el umbral de auto-eliminación pueden editarse en línea. La rotación de claves (genera un nuevo par de claves, difunde un certificado de revocación firmado a todos los contactos y actualiza el código de exportación) y la revocación por retirada de claves están ambas conectadas y operativas.
Revocación de claves conectada de extremo a extremo. Las estructuras RevocationCertificate se
firman con el par de claves híbrido Ed25519+ML-DSA-65 y se envían a todos los contactos
como mensajes WireMessageType::Revocation a través de Tor.