
Terminal-basierter verschlüsselter Messenger mit Post-Quanten-Kryptographie, Double Ratchet-Protokoll und Tor-Anonymität. Bietet Notfall-Passphrase, abstreitbare Authentifizierung und OS-Level-Härtung via seccomp-bpf und mlockall.
op4 — Sicherer Terminal-Messenger
Op4 ist eine terminalbasierte, verschlüsselte Messaging-Anwendung, geschrieben in Rust. Es bietet Ende-zu-Ende-verschlüsselte private Nachrichtenübermittlung mit Post-Quanten-Kryptografie, die vollständig über das Tor-Netzwerk geleitet wird, sodass weder der Inhalt Ihrer Nachrichten noch Ihre IP-Adresse jemandem offengelegt wird – nicht einmal der Person, mit der Sie sprechen.
op4 ermöglicht es zwei Personen, private Nachrichten auszutauschen, ohne dass eine der beiden Parteien ihre IP-Adresse oder ihre wirkliche Identität preisgibt. Jede Nachricht ist:
op4 läuft vollständig im Terminal. Es hat keine GUI, keine Browser-Komponente und kein Cloud-Konto. Der einzige externe Prozess, mit dem es kommuniziert, ist der Tor-Daemon auf Ihrem eigenen Rechner.
Alle Download-Optionen — AppImage, Quell-Tarball, Klonen und Bauen sowie automatisierter Installer — sind im Downloads & Install-Leitfaden dokumentiert. Die neueste Version ist auf der Releases-Seite verfügbar.
Unter Debian und Ubuntu erledigt install/setup.sh alles in einem Befehl: Rust-Toolchain, Build-Abhängigkeiten, Tor, Control-Port-Konfiguration, Binär-Kompilierung, Systembenutzer, Datenverzeichnis und AppArmor-Profil.
git clone https://github.com/Opfour/op4.git
cd op4
sudo bash install/setup.sh
Nach Abschluss des Skripts müssen Sie sich ab- und wieder anmelden, bevor Sie op4 ausführen. Der Installer fügt Ihren Benutzer zur Gruppe
debian-torhinzu, damit er die Tor-Cookie-Datei lesen kann. Linux wendet Gruppenänderungen nicht auf bereits geöffnete Sitzungen an – eine erneute Anmeldung ist erforderlich.Wenn Sie diesen Schritt überspringen, schlägt op4 beim Start mit folgendem Fehler fehl:
Permission denied reading /run/tor/control.authcookie
Dann überprüfen Sie den vom Skript ausgegebenen Quell-Hash mit dem veröffentlichten Release-Hash für Ihre Version, bevor Sie der Binärdatei vertrauen.
Wenn op4 startet, gibt es einen Quell-Hash aus, der alle Rust-Quelldateien, Cargo.toml, Cargo.lock und build.rs abdeckt. Vergleichen Sie ihn mit dem untenstehenden Wert für die von Ihnen installierte Version.
Sie können es auch überprüfen, ohne die vollständige App zu starten:
op4 --print-hash
Wenn der Hash nicht übereinstimmt, verwenden Sie die Binärdatei nicht – sie wurde entweder aus einem anderen Commit erstellt oder manipuliert.
Installieren Sie zuerst die Abhängigkeiten, dann führen Sie das Skript aus:
Rust-Toolchain (festgelegt auf 1.89.0 via rust-toolchain.toml):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Tor und Build-Abhängigkeiten:
# Fedora
sudo dnf install tor gcc pkg-config openssl-devel
# Arch
sudo pacman -S tor base-devel pkg-config openssl
Tor-Control-Port konfigurieren — zu /etc/tor/torrc hinzufügen:
ControlPort 9051
CookieAuthentication 1
sudo systemctl restart tor
Fügen Sie Ihren Benutzer zur Tor-Gruppe hinzu:
sudo usermod -aG tor $USER # Fedora / Arch
Sie müssen sich nach diesem Schritt ab- und wieder anmelden. Gruppenmitgliedschaftsänderungen werden nicht auf aktive Sitzungen angewendet. Bis Sie dies tun, schlägt op4 mit
Permission denied reading /run/tor/control.authcookiefehl.Um die Änderung ohne vollständige Abmeldung anzuwenden, führen Sie aus:
newgrp tor
Bauen und installieren:
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
Beim ersten Start führt Sie op4 durch die Einrichtung einer normalen Passphrase und einer Notfall-Passphrase und generiert dann Ihre Identitätsschlüssel. Ihr Tresor wird unter ~/.local/share/op4/vault.op4 gespeichert.
Minimaler Kernel: 4.15 (5.4+ empfohlen). Architektur: x86-64 (aarch64 sollte funktionieren, ist aber ungetestet).
Zwei Personen benötigen jeweils op4 installiert, Tor läuft und ihren Tresor entsperrt. Der Austausch ist asymmetrisch: Eine Person sendet zuerst ihren Kontaktcode, die andere fügt ihn hinzu, sendet dann ihre erste Nachricht, die als ausstehende Anfrage eingeht, die die erste Person annimmt.
Beim ersten Start fragt op4 nach einer normalen Passphrase und einer Notfall-Passphrase und generiert dann Ihre Identitätsschlüssel. Dies geschieht nur einmal. Ihr Tresor wird unter ~/.local/share/op4/vault.op4 gespeichert.
$ op4
Ihr Kontaktcode enthält Ihr vollständiges öffentliches Schlüsselbündel und Ihre .onion-Adresse. Die andere Person benötigt dies, um Sie zu erreichen.
2 oder →)e, um Ihren Kontaktcode zu exportierenop4: beginntIhr Kontaktcode ist nicht geheim. Es ist sicher, ihn öffentlich zu teilen. Er enthält nur Ihre öffentlichen Schlüssel und die Onion-Adresse – kein privates Material.
Sobald Sie ihren Kontaktcode haben:
a, um einen Kontakt hinzuzufügenop4:-Kontaktcode ein und drücken Sie Enter↑/↓, dann Enter)3 oder →)Diese erste Nachricht initiiert den verschlüsselten Handshake und wird über Tor an ihre .onion-Adresse zugestellt. Sie werden sie als ausstehende Kontaktanfrage sehen.
Wenn Ihnen jemand eine erste Nachricht sendet, erscheint ein Badge auf dem Kontakte-Tab, der anzeigt, wie viele Anfragen warten.
2)p, um ausstehende Anfragen zu prüfenEsc, um abzulehnen und zu verwerfen)Sobald akzeptiert, wird der Double Ratchet initialisiert und die Unterhaltung ist sofort im Nachrichten-Tab verfügbar.
Bevor Sie einem Kontakt vertrauen, bestätigen Sie, dass sein Fingerabdruck mit dem übereinstimmt, was er auf seinem eigenen Bildschirm sieht. Dies verhindert einen Man-in-the-Middle-Angriff während des initialen Kontaktaustauschs.
A3F2:91BC:…Wenn Sie glauben, dass Ihre Identitätsschlüssel kompromittiert sein könnten:
4 oder navigieren Sie nach rechts)r, um Schlüssel zu rotierenop4 verwendet ein Double-Ratchet-Protokoll (ähnlich dem Signal-Protokoll) für Vorwärtssicherheit. Das bedeutet:
Der KEM-Schritt kombiniert X25519 und ML-KEM-768 wie folgt:
shared_secret = HKDF(X25519_ss || MLKEM_ss)
Ein Angreifer muss beide Algorithmen brechen, um den Schlüsselaustausch zu kompromittieren. Dies schützt gegen einen Quantenangreifer (ML-KEM-768), während es sicher gegen klassische Angriffe bleibt, falls ML-KEM-768 eine unbekannte Schwachstelle hat (X25519-Fallback).
Nachrichten werden mit HMAC-SHA256 authentifiziert, wobei ein aus dem gemeinsamen Ratchet-Zustand abgeleiteter Schlüssel verwendet wird. Da beide Parteien denselben HMAC-Schlüssel besitzen, könnte jede Partei jeden beliebigen MAC erzeugt haben. Dies ist die gleiche Abstreitbarkeitseigenschaft, die von OTR und Signal verwendet wird: Nachrichten können in einem Gerichtsverfahren nicht kryptografisch einem bestimmten Absender zugeordnet werden.
Die Tresor-Datei unter ~/.local/share/op4/vault.op4 speichert alle Kontakte, Unterhaltungen und Identitätsschlüssel. Sie ist mit zwei unabhängigen, von Argon2id abgeleiteten Schlüsseln geschützt:
op4 erstellt einen Tor v3 Hidden Service für Ihr Postfach. Ihre .onion-Adresse wird deterministisch aus Ihrem Identitätsschlüssel abgeleitet (via HKDF), sodass sie über Neustarts hinweg stabil ist, ohne dass ein separater Schlüssel gespeichert werden muss. Ausgehende Nachrichten werden über den Tor-SOCKS5-Proxy gesendet. Ihre echte IP-Adresse erscheint nie in einem Netzwerkpaket, das mit op4 zusammenhängt.
Tarnverkehr (Poisson-verteilte Dummy-Nachrichten, die an sich selbst gesendet werden, mittleres Intervall 30 Sekunden) verhindert, dass ein Netzwerkbeobachter durch Beobachtung des Verkehrsvolumens erfährt, ob Sie aktiv mit jemandem Nachrichten austauschen.
apparmor/op4.profile) – schränkt den Dateisystemzugriff auf nur das Tresorverzeichnis, Terminalgeräte und Tor ein.┌─────────────────────────────────────────────────────────────┐
│ 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
Version: 0.2.0-dev (Vorabversion)
op4 befindet sich in aktiver Entwicklung. Die folgenden Schichten sind vollständig und getestet:
Alle Schichten sind jetzt Ende-zu-Ende verdrahtet:
PublicKeyBundle (Ihr vollständiger öffentlicher Schlüsselsatz + Onion-Adresse).Alle bekannten Einschränkungen wurden behoben. Die Anwendung hat jetzt den Funktionsumfang für 0.2.0-dev erreicht:
HMAC-abstreitbare Authentifizierung ist vollständig verdrahtet. Jede ausgehende Datennachricht trägt ein HMAC-SHA256-Tag, das aus dem pro-Nachricht-Ratchet-Schlüssel über (conversation_id || message_counter || ciphertext) berechnet wird. Eingehende Nachrichten werden vor der Annahme verifiziert; mit Nullen gefüllte Tags von älteren Peers werden aus Gründen der Abwärtskompatibilität toleriert.
Nachrichtenverlauf bleibt über Neustarts hinweg erhalten. Das vollständige Unterhaltungsprotokoll wird mit einem pro-Unterhaltung von HKDF abgeleiteten Schlüssel verschlüsselt und im Feld message_log_ct des Tresors gespeichert. Nachrichten werden aus dem Tresor geladen, wenn eine Unterhaltung geöffnet wird, und nach jedem Senden oder Empfangen zurückgeschrieben.
Eingehende Kontaktanfragen von unbekannten Parteien werden in eine Warteschlange gestellt, anstatt verworfen zu werden. Der Kontakte-Tab zeigt ein Badge, wenn Anfragen warten. Drücken Sie [p] zur Ansicht: Sie sehen den Fingerabdruck des Absenders und seine erste Nachricht, geben einen Namen ein und drücken Enter zum Akzeptieren (oder Esc zum Ablehnen). Bei Annahme wird der Kontakt hinzugefügt, der Double Ratchet initialisiert und die erste Nachricht im Tresor gespeichert.
Notfall-Tresor bleibt über Speicherungen hinweg erhalten. Das Tresor-Dateiformat (v2) speichert genaue Chiffratlängen im Header, sodass die AEAD-Entschlüsselung mit den echten Bytes und nicht mit null-gepolsterten Abschnitten arbeitet. Der verschlüsselte Notfallabschnitt wird bei jedem save()-Aufruf wörtlich gespeichert, sodass die Notfall-Passphrase unbegrenzt gültig bleibt.
Dedizierter Double-Ratchet-Bootstrap-Schlüssel. Ein separates X25519-Schlüsselpaar (identity_ratchet_secret) wird beim ersten Start generiert und als ratchet_pub in den Kontaktcode aufgenommen. Alices Ratchet wird mit Bobs initialisiert anstatt mit seinem KEM-Identitätsschlüssel, wodurch die Schlüsselrollen getrennt werden.
| Version | Quell-Hash |
|---|
0.3.0 | 80820cb41a63575d2c139dadd425d13d1e87e62a9d60200ae7b894ae2e9ad8ed |
0.3.1 | 48115efb12747fa78b627ddbf7a56c46169f59e777d7d7508941bf89e4fe7521 |
0.2.0-dev | 35740577f6c4a4f19c5a08fe85b1f78a10347f2ba9dd7642d126552266bfa5a5 |
0.1.0 | e1a94761c7d3fa589ba892b47d5295aa417f95aee126809d51a7e7fb7e78982c |
| Distribution | Status |
|---|
| Ubuntu 22.04 / 24.04 | Unterstützt |
| Debian 12 | Unterstützt |
| Fedora 39+ | Unterstützt |
| Arch Linux (aktuell) | Unterstützt |
| Tails OS | Unterstützt (Einrichtungsanleitung) |
| macOS / Windows / WSL1 | Nicht unterstützt |
| Taste | Aktion |
|---|
1 / ← → | Tabs wechseln (Kontakte / Nachrichten / Einstellungen) |
↑ ↓ | Auswahl bewegen |
Enter | Unterhaltung öffnen / bestätigen |
Esc | Abbrechen / zurück |
e | Kontaktcode exportieren (Kontakte-Tab) |
a | Kontakt hinzufügen (Kontakte-Tab) |
p | Ausstehende Anfragen prüfen (Kontakte-Tab) |
d | Ausgewählten Kontakt löschen (Kontakte-Tab) |
r | Schlüssel rotieren (Einstellungen-Tab) |
q | Beenden |
| Zweck | Algorithmus |
|---|
| Tresor-Schlüsselableitung | Argon2id (m=64 MiB, t=3, p=1) |
| Tresor-Verschlüsselung | ChaCha20-Poly1305 (256-bit key, 96-bit nonce) |
| Nachrichtenverschlüsselung | ChaCha20-Poly1305 (pro-Nachrichtenschlüssel aus Ratchet) |
| Schlüsselableitung (Ratchet) | HKDF-SHA256 |
| Abstreitbare Authentifizierung | HMAC-SHA256 |
| Klassischer Schlüsselaustausch | X25519 |
| Post-Quanten-Schlüsselaustausch | ML-KEM-768 (FIPS 203) |
| Klassische Signaturen | Ed25519 |
| Post-Quanten-Signaturen | ML-DSA-65 (FIPS 204) |
| Transportanonymität | Tor v3 Hidden Services (.onion) |
ratchet_pubEinstellungen-Tab voll funktionsfähig. Tor-SOCKS5-Adresse und Auto-Delete-Schwellwert können inline bearbeitet werden. Schlüsselrotation (erzeugt neues Schlüsselpaar, sendet ein signiertes Widerrufszertifikat an alle Kontakte, aktualisiert den Exportcode) und Schlüsselrücknahme sind beide verdrahtet und betriebsbereit.
Schlüsselwiderruf Ende-zu-Ende verdrahtet. RevocationCertificate-Strukturen werden mit dem hybriden Ed25519+ML-DSA-65-Schlüsselpaar signiert und als WireMessageType::Revocation-Nachrichten über Tor an alle Kontakte gesendet.