Open Source · Post-Quantum · Kein Konto

Ein Code.
Ein Raum.
Niemand sonst.

Nullraum ist ein Chat für geschlossene Räume. Du erstellst einen Raum und bekommst einen Code. Den gibst du weiter, wie du willst: auf Papier, persönlich oder per Messenger. Wer den Code hat, kann anklopfen. Hinein kommt nur, wen du bestätigst. Texte, Bilder, Videos und Sprachnachrichten sind dabei post-quantum Ende-zu-Ende verschlüsselt.

  • ML-KEM-768 + X25519
  • ML-DSA-65
  • XChaCha20-Poly1305
  • Argon2id
0Konten, Telefonnummern oder E-Mails
0Bytes Klartext auf dem Server
150 BitZufall in jedem Raumcode
1Binary für Linux, macOS und Windows, dazu ein Docker-Image
So funktioniert's

Vom Zettel zum verschlüsselten Raum
in vier Schritten.

  1. 01

    Raum erstellen

    Dein Gerät erzeugt einen zufälligen Code mit 8 Blöcken zu je 4 Zeichen, einen zufälligen Raumschlüssel und deine post-quantum Schlüsselpaare. Auf Wunsch kommen ein Passwort, ein Zweitschlüssel oder drei Sicherheitsfragen dazu.

  2. 02

    Code weitergeben

    Schreib den Code auf Papier, druck ihn aus oder schick ihn über einen Messenger. Du entscheidest, wer ihn bekommt. Verwechselbare Zeichen wie O/0 und I/1 sind ausgeschlossen, und eine Prüfsumme erkennt Tippfehler.

  3. 03

    Anklopfen & bestätigen

    Wer den Code eingibt, klopft an. Du als Initiator siehst Name und Sicherheitsnummer und klickst auf Aufnehmen. Erst dann bekommt die Person den Raumschlüssel, verschlüsselt mit ML-KEM-768 + X25519 nur für ihr Gerät.

  4. 04

    Sicher chatten

    Jede Nachricht wird mit dem Raumschlüssel verschlüsselt und mit ML-DSA-65 signiert. Entfernst du jemanden, wird der Schlüssel sofort gewechselt. Die Person kann danach nichts mehr mitlesen.

Funktionen

Alles, was ein privater Raum braucht.
Mehr nicht.

⚛︎

Post-Quantum von Anfang an

Der Schlüsselaustausch nutzt den hybriden HPKE-KEM aus ML-KEM-768 (FIPS 203) und X25519. Ein Angreifer müsste beide Verfahren brechen. Damit hilft auch „heute mitschneiden, später mit Quantencomputer entschlüsseln“ nicht. Signaturen nutzen ML-DSA-65 (FIPS 204).

Nachricht→ML-DSA-65 Signatur→XChaCha20-Poly1305→Padding→Relay
✓

Initiator bestätigt jeden

Der Code allein reicht nicht. Jede Beitrittsanfrage muss aktiv angenommen werden, und eine Sicherheitsnummer deckt Man-in-the-Middle-Angriffe auf.

🔐

Zweite Schutzschicht

Optional sichern ein Passwort, ein separater Zweitschlüssel oder drei Sicherheitsfragen den Raum zusätzlich ab. Das Geheimnis wird mit Argon2id gehärtet und fließt in alle Schlüssel ein.

🎙

Bilder, Videos, Sprachnachrichten

Bis 50 MB pro Datei. Jede Datei bekommt einen eigenen Schlüssel. Bei Fotos werden Metadaten wie der GPS-Standort vor dem Senden entfernt.

⧉

Redundant, aber nur im Raum lesbar

Jedes Mitglied hält eine verschlüsselte Kopie des Verlaufs. Fehlt einem Gerät etwas, liefern die anderen es Peer-to-Peer nach. Lokal liegen nur Chiffretexte, und ohne Code ist nichts lesbar.

↻

Schlüsselwechsel & Rauswurf

Wer entfernt wird oder geht, bekommt den nächsten Schlüssel nicht mehr. Neue Mitglieder sehen ältere Nachrichten nur, wenn du das erlaubst.

⌁

Blindes Relay

Der Server leitet nur Rauschen weiter. Er kennt weder Codes noch Namen, Raumnamen oder Schlüssel, speichert nichts auf der Festplatte und schreibt keine IP-Logs.

⏻

Panik-Knopf

Ein Klick löscht alle Räume, Schlüssel und Medien vom Gerät. Der Initiator kann einen Raum außerdem für alle schließen. Dann löschen alle Geräte ihre Kopie.

Sicherheit

Was der Server sieht und was nicht.

Nullraum ist auf ein nicht vertrauenswürdiges Relay ausgelegt. Selbst wenn der Server kompromittiert ist, bleiben Inhalte, Namen und Codes geheim.

Relay sieht

  • eine zufällig wirkende Raum-ID (Hash, aus dem Code abgeleitet)
  • wie viele Verbindungen in einem Raum sind
  • Zeitpunkt und gepolsterte Größe verschlüsselter Pakete
  • IP-Adressen der Verbindungen (nicht geloggt; nutze VPN/Tor, wenn das wichtig ist)

Relay sieht nie

  • den Raumcode, das Passwort, den Zweitschlüssel oder die Antworten
  • Nachrichten, Bilder, Videos, Sprachnachrichten
  • Namen der Mitglieder und des Raums
  • wer welche Nachricht geschrieben hat
  • irgendeinen Schlüssel
CodeArgon2idMasterHKDFRaum-ID · Beitrittsschlüssel · Tresorschlüssel
+ Passwort / Zweitschlüssel / 3 AntwortenArgon2id + Saltfließt in Beitritt und Tresor ein
Raumschlüssel (256 Bit, zufällig)HPKE · ML-KEM-768 + X25519nur an bestätigte Mitglieder
NachrichtML-DSA-65 · XChaCha20-Poly1305signiert, verschlüsselt, gepolstert
ZweckVerfahrenWarum
SchlüsselzustellungHPKE (RFC 9180) mit ML-KEM-768 + X25519, HKDF-SHA256, ChaCha20-Poly1305Hybrid: sicher, solange eines der beiden Verfahren hält
Absender-AuthentizitätML-DSA-65 (FIPS 204)Quantensichere Signaturen, keine Fälschung durch andere Mitglieder
Inhalte & MedienXChaCha20-Poly1305, 256-Bit-Schlüssel, 192-Bit-Nonces256-Bit-Symmetrie bleibt auch gegen Grover sicher
Code & PasswörterArgon2id (64 MiB, 3 Durchläufe)Macht Raten teuer, auch mit GPUs
Längen verschleiernPadding auf Zweierpotenzen bzw. 64-KiB-Blöcke„ok“ und ein langer Absatz sehen gleich aus
ImplementierungGo-Standardbibliothek, im Browser als WebAssemblyKeine selbstgebaute Kryptografie in JavaScript

Ehrlich gesagt: Was Nullraum nicht kann

  • Kompromittierte Geräte. Schadsoftware auf einem Gerät oder ein Screenshot liest mit. Keine Verschlüsselung der Welt hilft dagegen.
  • Vertrauen in den App-Code. Öffnest du die App über einen fremden Server, könnte dessen Betreiber manipulierten Code ausliefern. Am sichersten ist es, den Server selbst zu betreiben oder nullraum client lokal zu starten. Dann kommt der Code von deinem eigenen Rechner.
  • Metadaten. Wann wie viel gesendet wird, ist für das Relay sichtbar. IP-Adressen werden nicht geloggt, sind technisch aber vorhanden.
  • Forward Secrecy pro Nachricht. Der Raumschlüssel wechselt bei jedem Rauswurf, bei jeder Aufnahme (wenn neue Mitglieder den Verlauf nicht sehen dürfen) und auf Knopfdruck, aber nicht bei jeder Nachricht.
  • Kein Audit. Das Projekt ist neu und noch nicht unabhängig geprüft. Reviews sind willkommen.
Installation

Eigenen Server starten.
Ein Befehl, fertig.

Nur eine Person muss das machen. Alle anderen installieren nichts und öffnen einfach den Link.

  1. 01

    Server besorgen

    Irgendein Linux-Server mit öffentlicher IP reicht, zum Beispiel ein kleiner VPS für 3–5 € im Monat. Eine eigene Domain brauchst du nicht.

    Beim Hoster müssen Port 80 und 443 offen sein.

  2. 02

    Diesen Befehl ausführen

    Per SSH auf dem Server einfügen. Der Befehl installiert Docker, startet Nullraum und besorgt automatisch ein echtes HTTPS-Zertifikat.

    curl -fsSL https://raw.githubusercontent.com/maliceatthepalace/nullraum/main/deploy/install.sh | sudo sh
  3. 03

    Link teilen

    Am Ende zeigt der Befehl deinen Link, etwa so:

    https://203-0-113-7.sslip.io/app/

    Diesen Link schickst du allen. Raum erstellen, Code weitergeben, fertig.

Ich habe eine eigene Domain

Zeig mit einem DNS-Eintrag (A-Record) auf die IP deines Servers und gib die Domain beim Befehl mit an:

curl -fsSL https://raw.githubusercontent.com/maliceatthepalace/nullraum/main/deploy/install.sh | sudo NULLRAUM_DOMAIN=chat.example.org sh
Was ist dieses „sslip.io“?

Ohne Domain gibt es kein gültiges HTTPS-Zertifikat. Ein „selbstsigniertes“ Zertifikat würde in jedem Browser eine Warnung anzeigen, und gegen Angreifer im Netz schützt es dann nicht mehr richtig. sslip.io ist ein kostenloser Dienst: Der Name 203-0-113-7.sslip.io zeigt automatisch auf die IP 203.0.113.7. So bekommt dein Server ein echtes Zertifikat, ganz ohne Domain.

Nur zu Hause im WLAN nutzen

1. Programm herunterladen (für den Rechner, auf dem der Server laufen soll):

Windows macOS (Apple-Chip M1–M4) macOS (Intel) Linux Raspberry Pi / Linux ARM

2. Im Terminal starten (im Ordner, in dem die Datei liegt):

Windows (PowerShell):

.\nullraum-windows-amd64.exe serve -self-signed -addr :8443

macOS (bei Intel-Macs arm64 durch amd64 ersetzen):

chmod +x nullraum-darwin-arm64
xattr -d com.apple.quarantine nullraum-darwin-arm64
./nullraum-darwin-arm64 serve -self-signed -addr :8443

Linux (beim Raspberry Pi amd64 durch arm64 ersetzen):

chmod +x nullraum-linux-amd64
./nullraum-linux-amd64 serve -self-signed -addr :8443

Fragt die Firewall nach, ob der Zugriff erlaubt ist: für das private Netzwerk erlauben.

3. Öffnen: Auf allen Geräten im Heimnetz https://<IP-des-Rechners>:8443/app/ aufrufen und die Zertifikatswarnung einmal bestätigen. Die IP findest du unter Windows mit ipconfig, unter macOS/Linux mit ipconfig getifaddr en0 bzw. hostname -I. Für zu Hause ist das in Ordnung, fürs Internet nicht.

Für Vorsichtige: App vom eigenen Rechner laden

Normalerweise lädt dein Browser die App vom Server. Ein böswilliger Betreiber könnte dir theoretisch eine manipulierte App unterschieben. Wenn du dem Server nicht vertraust, startest du die App auf deinem eigenen Rechner. Über den Server läuft dann nur noch der verschlüsselte Datenverkehr.

Programm für dein System herunterladen: Windows · macOS (Apple-Chip) · macOS (Intel) · Linux. Dann im Terminal:

nullraum client -relay https://203-0-113-7.sslip.io

Der Browser öffnet sich automatisch. Wer den Server selbst betreibt oder dem Betreiber vertraut, braucht das nicht.

Ohne Skript / mit Docker von Hand
git clone https://github.com/maliceatthepalace/nullraum && cd nullraum
NULLRAUM_DOMAIN=203-0-113-7.sslip.io docker compose up -d

Aus dem Quellcode: make (Go ≥ 1.26), dann ./bin/nullraum serve.

Wichtig: Alle in einem Raum müssen denselben Server benutzen. Ein Raum auf Server A ist auf Server B nicht sichtbar.

FAQ

Häufige Fragen

Was passiert, wenn jemand Fremdes meinen Code findet?

Die Person kann anklopfen, mehr nicht. Du siehst die Anfrage und lehnst sie ab. Ist der Raum zusätzlich geschützt, scheitert sie schon vorher, und nach drei Fehlversuchen wird sie ignoriert. Erstelle im Zweifel einfach einen neuen Raum.

Muss der Initiator online sein?

Zum Aufnehmen neuer Mitglieder ja, denn nur sein Gerät kann den Raumschlüssel an Neue verteilen. Zum Chatten nicht. Nachrichten an Offline-Mitglieder hält das Relay verschlüsselt bis zu 72 Stunden im Arbeitsspeicher, und andere Mitglieder liefern fehlende Nachrichten Peer-to-Peer nach.

Wo werden meine Nachrichten gespeichert?

Verschlüsselt im Browser jedes Mitglieds (IndexedDB). Ohne Code, und gegebenenfalls ohne Passwort oder Antworten, sind sie nicht lesbar. Auf dem Server liegt nichts dauerhaft.

Ich habe meinen Code verloren. Kann man ihn wiederherstellen?

Nein, und das ist Absicht. Der Code wird nirgends gespeichert. Bitte ein anderes Mitglied, ihn dir auf demselben Weg noch einmal zu geben. Dein Gerät öffnet den Raum dann wieder.

Warum „post-quantum“?

Künftige Quantencomputer könnten heutige Public-Key-Verfahren wie RSA oder klassisches Diffie-Hellman brechen. Wer heute verschlüsselten Verkehr mitschneidet, könnte ihn später entschlüsseln. Nullraum nutzt dafür die 2024 standardisierten Verfahren ML-KEM und ML-DSA, kombiniert mit X25519 als klassischer Absicherung.

Ist Nullraum ein Ersatz für Signal?

Nullraum hat einen anderen Zweck: kurzlebige oder geschlossene Räume ohne Konto und ohne Telefonnummer, die du selbst hostest. Signal ist deutlich länger erprobt und bietet Forward Secrecy pro Nachricht. Wähle, was zu deinem Bedrohungsmodell passt.

Mach einen Raum auf.
Und lass nur rein, wen du willst.