Nymchat Technesch Whitepaper
Post-Quantum Key Agreement zu Nymchat
Distribuéiert ML-KEM-768 öffentlech Schlëssel iwwer Nostr ouni engem Verzeichnis oder e Register, an ze säen aus engem Geheimnis, datt keng öffentlech Wäert enthale.
Eng post-quantum Schlësselwechsel zu engem Messenger ass am meeschten net e Kryptographieproblem. d'Primitiven sinn standardiséiert an d'Bibliothéiken existéieren. Déi zweet Dëse Papier beschreift wéi Nymchat dat - wou de zweete Schlëssel kommen, wéi et d'Männchen erreecht, déi et braucht, an wat d'Interface iwwer de Resultat ze behaapten kann - an, am letzten Deel, wat dat Resultat net schützt.
Dës Säit ass Maschinn iwwersat fir Kamoudheet. Déi englesch Original ass d'Versioun déi gëlt.
1Problemer
D'Private Messagen sinn verschlüsselt mat NIP-44D'Halb, déi de Plaintext scrambles - ChaCha20 mat engem HMAC-SHA256-Tag, klengt duerch Wëllkomm (Mäerz 5869) - ass net bedeitend vun engem Quantencomputer bedroht; de Grover's Algorithmus kostet eng Quadrat-Wurzeschnellung géint eng symmetrischer Schlëssel, an 256 Biten absorbéiert dat. Accordéiert op der Schlëssel ass elliptesch-Kurve Diffie-Hellman iwwer Mäerz 256k1, an de Shor's Algorithmus löst de diskrete Logarithmus direkt. Recovering engem privaten Schlëssel vu sengem öffentlechen Kollegen retroaktiv exponéiert all geteelt Geheimnis datt Schlëssel jemols produzéiert.
D'Bedrohung, déi dëst schafft, gëtt net geschat, bis eng solle Maschinn existéiert. E Gegner mat Speicher kann de Verschlësseltext am Dag registréieren an decryptéieren wann d'Fähegkeet ankommt. Alles, wat elo geschéckt gëtt, wat nach wichteg ass, ass och kompromittéiert. Dëst ass de spezifesche Attack vun engem post-quantum Schlësselhandel, an dat ass de Grond datt d'Arbeit net warten kann fir d'Maschine ze bauen.
1.1 D'Fro vun dësem Papier beantwortet
D'Mitigatioun ass gutt verstoen: eng post-quantum Schlëssel Encapsulatioun Mechanismus zesumme mat dem klassesche Austausch lafen, sou datt en Attacker beide bréngen muss fir alles ze liesen.Mäerz 203Dat féiert direkt zu engem Distributiounsproblem:
Fir d'Message Alice haut, braucht Dir eng Sache: hir npub. Fëllt e post-quantum Austausch an Dir braucht eng zweet - hir ML-KEM Public Key.
Eng NPUB ass self-contained. Dir kënnt et op Papier schreiwen, liest et haut, oder scannen et vun engem Bildschirm, an et ass alles wat Dir braucht ze verschlüsselen. eng ML-KEM-768 öffentlech Schlëssel ass 1,184 Byte. Et kann net laut liesen, et gëtt net an engem Benotzername passen, an et ass net an engem QR Code ausser enger Identitéit déi nëmmen 32 Byte ass.
De schwieregste Deel ass, datt e zweete Schlüssel dräi distincte Problemer bréngt, an de Rescht vun dësem Papier ass haaptsächlech eng Antwort op se:
- Et kann ersetzt ginn. Eng Schlëssel, déi niemand an engem Bléck kann liesen, ass genau déi Art Sache, déi en Attacker fir hir eegen wechselt.
- Et muss iwwer d'Geräter vum Benotzer vereinbaren. Déi selwecht Kont op engem Telefon an engem Laptop muss déi selwecht Schlëssel presentéieren, oder Messagen versiegelt op eng kann net op der aner geoppt ginn.
- Et kann verléieren. Den öffentlechen Schlüssel gëtt aus engem Geheimnis publizéiert, also muss dat Geheimnis echt iwwerleefen - an duerch Konstruktioun gëtt et keng aner Rekonstruktioun.
2Design Restriktiounen
Vier Restriktiounen forméiert d'Antwort, an se eliminéieren déi meescht vun de offensichtlech Designs, ier e Code geschriwwen gëtt.
- Déi meescht Geheimnisser déi möglich sinn. All extra Geheimnis ass eng aner Wee fir Är Geschicht ze verluer, an e Mann, deen een nsec ze backup kann, wäert net wëssen, wat et anescht ze backup. Abschnitt 3.1 weist dës een kann net direkt erreecht ginn - eng post-quantum Schlëssel aus dem nsec liefert keng post-quantum Schutz überhaupt - also de Design verbréngt genau e Geheimnis an net méi: e eenzege Stéck vum Schlësselmaterial, eng Kéier pro Identitéit generéiert, an der selwechter Form wéi de nsec an am selwechten Plaz presentéiert, sou datt all déi wëssen, wéi een ze behalen wësse, wéi d'andere ze behalen.
- Et ass Autoritéit. Et gëtt keng Server, déi vertraut ginn kann ze soen, wat de Schlüssel zu wem gehéieren.
- Meeschte Instrumenter, eng Identitéit. Eng Nostr Identitéit gëtt allgemeng vun verschiddenen Clienten op der selwechter Zäit benotzt. Wat Schlësselmaterial existéiert, muss op all vun hinnen identesch sinn, an d'Plazen, déi et da hunn, mussen net selwecht vum Gegner, deen d'Funktioun géint verteidigt.
- No der Verhandlung. All in-band Austausch vun “wat Ziferen ënnerstëtzen Dir?” ass eng Uewerfläch, déi de Angreifer kann d'schwäizer Optioun ze forcéieren.
3Eng unabhängeg Root Geheimnis
De Load-bearing Decision ass, datt de ML-KEM Decapsulation Schlëssel aus Schlësselmaterial gesat ass, datt keng öffentlech Wäert exponéiert.
pqRoot = 32 bytes from a CSPRNG, generated ONCE per identity
seed = HKDF-Expand(
HKDF-Extract(salt = "nym-pq-root-v2", IKM = pqRoot),
info = "mlkem768/epoch/" || epoch,
64 bytes)
(ek, dk) = ML-KEM-768.KeyGen(seed)
D'Root gëtt dem Benotzer presentéiert wéi en nsec ass: Mäerz 32 Duerfir gëtt klenggeschriwwen:
nympqEt liest also als nympq1…, an der Identifikatiounszäit op der Identitéitszäit ënner der selwechter Offenbarungsinteraktioun ze gesinn, mat der selwechter Kontroll kopéiert, nie loggéiert an nie irgendwo an der Clear geschéckt.
D'Salz ass domein-separéiert op Zweck, sou datt kee anere Geheimnis kann jemols de selwechte Schlësselpaar erreechen. epoch D'Rotatioun vun de Counter drives (Sektioun 9).
3.1 Wou kann de Schlüssel net aus dem Identitéitsschlüssel abgeleet ginn
Déi offensichtlech Design ass de Keypair aus dem Geheimnis ze säen deen de Benotzer schon huet:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Et ass attraktiv fir véier Grënn, all déi real: Niets Neie ze Backup, well de nsec ass schon d'Backup; all Apparat vun der Konstruktioun, ouni e Synchroniséierungsprotokoll fir falsch ze ginn; eng ersetzbar Annonce pro Identitéit ass offensichtlech korrekt, well Apparater kann iwwer de Schlëssel net widersprechen; an de Schlëssel existéiert, ier et jemols publizéiert gëtt, sou datt en Client iets fir séngen kann.
D'Algorithmus vum Shor, deen géint eng publizéiert npub lafen, produzéiert den nsec. D'Seed-Derivatioun ass en öffentlech Algorithmus iwwer den nsec. Also de Gegner, deen d'klassesch Hälfte breet, rekonstruéiert d'post-quantum Hälfte duerch déi selwecht HKDF ze lafen, déi all aner lafen.
De ML-KEM Decapsulatioun Schlüssel muss aus Entropie kommen, déi weder aus dem nsec abgeleet gëtt, noch jemols ënner klassescher-enly Verschlësselung übertragen gëtt.
Déi zweet Klausel vun dëser Regel funktionnéiert net sou vill wéi déi éischt. Eng unabhängeg generéiert Geheimnis, déi dann tëscht de Geräter vun engem Benotzer an enger normaler NIP-44 Message synchroniséiert ass, ass déi selwecht Faal mat extra Schrëtt: e Gegner registreert déi Message haut an erhuelt seng klassesch Schlëssel spéider, an d'Wurzel fällt aus.
3.2 Bréngen d'Root op déi aner Apparater vum Benotzer
Begrenzung 3 vun Section 2 - eng Identitéit, verschidde Apparater - kann net mat der Arithmetik hier erreecht ginn, well de ganze Punkt ass, datt de Schlëssel net eng Funktioun vu alles ass déi Apparater schon deelen. nympq1… De Code gëtt selwecht.
D'Wurzel gëtt als nympq1… Et ass de ganze Mechanismus.Een Apparat deen de Code net kritt huet, kann net deelhuelen, wat Section 4.2 beschreift.
D'Regel am Abschnitt 3.1 heescht, datt d'Wurz kann nie ënner klassescher-enly-verschlüsselung reizen, an all Mechanismus, deen dëst automatesch maachen - synchroniséiert se duerch e Relais, wickelt se op de Identitéitsschlüssel - verletzt genau dat.
De Format liest Raum fir eng verpackt Path: eng Rekord kann eng Lëscht vu Wraps tragen, all eng AEAD blob ënner engem Schlüssel, deen de Benotzer op engem anere Apparat reproduzéieren kann - eng passkey PRF Ausgab, zum Beispill. nympq1… De Code ass den eenzege Wee iwwer. § 10.1 erkläert wat dat kostet.
D'Record selwecht leeft an der Eigenen Einstellungskategorie, nymchat-pq-rootOch no engem Wraps huet et néideg Aarbecht: D'Präsenz ass wéi eng zweet Apparat léiert datt dës Identitéit schon eng Wurzel huet, wat ass wat et stoppt eng rivaliséierend (Abschnitt 3.3).
Déi nymchat-pq-root Kategorie muss net Et ass déi eenzeg Kopie vun der Wurzel, also ass et ënner engem Schlëssel, deen vun der Wurzel abgeleet ass, e Schloss, wier de Schlëssel an der Box ass: Kein Apparat kann et jemols öffnen, och déi, déi et geschriwwen huet. Et ass klassesch verzegelt - NIP-44 op Selbst - oder net überhaupt.
All aner Einstellungen Kategorie kann an soll de Wurzel-derivéiert Schlëssel benotzen. Dëst ass déi eenzeg Ausnahme, an et ass eng Ausnahme iwwer Circularitéit anstatt iwwer Stärke.
3.3 Generatioun a Adoption
Op de Boot, déi eng dauerhaft Identitéit hält, funktionéiert en Client an dëser Reihenfolg:
- Et gëtt ee existent
nymchat-pq-rootRekord ass dat. - Rekord fonnt, an dëst Apparat kann et entwannen - adopt et an annoncéiert dës Identitéit als post-quantum Kapazitéit.
- Rekord fonnt, an dëst Apparat kann et net entwannen - generéiert net eng nei Root, an publizéiert net eng Annonce an all.
nympq1…De Code vun engem Apparat, deen et schon huet. - No Rekord - generéieren eng Root, publizéieren d'Record, annoncéieren, an de
nympq1…De Code gëtt de Benotzer eng Kéier, fir se ze sparen.
Schrëtt 3 ass de Schrëtt, deen einfach falsch ginn ass, an et ass de Grond datt d'Ordnung geschriwwen ass anstatt zu all Implementatioun. Zwee Apparater, déi all decidéieren eng Wurz ze generéieren, produzéieren zwee onofhängeg Wurzelen ënner enger Identitéit, an dat ass de Faillissement dës Ordnung existéiert ze verhënneren.
4Kapazitéit Ankündigung
Déi öffentlech Hälfte vun der derivéiert Schlësselpaar ass als adressabel publizéiert.
Mäerz-01
Event - Typ 30078, tagged nym-pq:
{
"kind": 30078,
"tags": [
["d", "nym-pq"],
["t", "nym-pq"],
["expiration", "<unix seconds>"]
],
"content": {
"v": 2,
"alg": "mlkem768",
"nym": 1,
"epoch": 0,
"pk2": "<base64url ML-KEM-768 encapsulation key>",
"exp": <unix seconds>,
"devices": [ ... ]
}
}
Addressable heescht, datt de Relay e Event pro (kind, pubkey, d-tag) hält, also eng republique ersetzt déi fréiere Annonce an der Plaz.
Déi Signatur ass obligatoresch. D'Event ass duerch d'Identitéit Schlëssel signéiert, sou datt d'Behauptung “déi ML-KEM Schlëssel zu dësem npub gehéieren” ass genau sou stark wéi de npub selwecht.
D’Announcement gëtt verëffentlecht. 7 Deeg NIP-40 D'Expiration, déi all 24 Stonnen publizéiert gëtt, hält an der Rekord eng Aussage iwwer e Client, deen nach funktionnéiert anstatt e Client, deen fréier war.
Eng verpasst Annonce gëtt genau wéi eng geléiert, déi nie e Schlüssel huet: Peers schécken ordinär NIP-44, déi all Login liesen kann, an de Client erneuert den post-quantum Austausch op senger nächster Verbindung, wann et publizéiert.
Dës Asymmetrie ass d'Ursaach fir d'Expiratioun anstatt e Accident vu se. Ohne e, eng Rekord iwwerleeft de Schlëssel, deen se genannt huet: e Gerät, deen gewisen, reset, oder huet seng Wurzel ersat huet, liest eng Standend Anweisung fir eng Schlëssel ze encapsulate no niemand hält méi, an Messagen ënner et geschéckt sinn ouni Fehler op all Säit verléieren.
De Schlësselfeld huet säin Format genannt. De Feld ass pk2, an d'Digit ass Deel vum Kontrakt anstatt d'Dekoratioun: et nennt de Payload-Format, mat deen de Schlëssel benotzt ginn kann. E Leser, deen de Feld net erkennt, schließt den “Nymchat Client, keng Post-Quantum-Schlëssel” an sendet ordinär NIP-44, déi all Login kann liesen. Dat ass d'korrekte Faillissement Richtung, an et ass d'Wert ze erklären als Regel déi Formatnumeratioun existéiert ze erhalen: eng unerkannt Kapazitéitsklage muss Schutz kosten, niemals Liwwerung.
4.1 Absenz ass bedeitend, a dreiewert
E subtile awer wichteg Detail: D'Announcement gëtt vun all Nymchat Client publizéiert, net nëmmen déi post-quantum-fähig, an de Schlësselfeld ass optional.
| Observéiert | heescht | Et gëtt Behaviour |
|---|---|---|
| Annonce mat engem Schlüssel | Nymchat, post-quantum kann | Hybrid gëtt |
| Announcement, keng Schlëssel | Nymchat, klassesch nëmmen - post-quantum off, oder eng Apparat déi nach net mat der Wurzel vun der Identitéit gekoppelt ass | Klassesch NIP-17 |
| No Ankündigung | Unbekannt Client. Konnte all Nostr oder Bitchat Benotzer sinn | Klassesch, plus eng Kompatibilitéit Wrap |
Eng Schlësselloser Annonce ass eng ënnerschriwwen Erklärung, datt de Sender Nymchat lafen, wat de Sender Path en spekulativ Cross-Protokoll-Wrack erlaabt, deen et anescht muss fir all déi et net identifizéieren.
4.2 En Apparat, deen d'Wurzel net öffnen kann, bleift still
D'Announcement ass ersetzbar: e Ereignis pro Identitéit, lescht Schreiben gewënnt. Dat ass wat d'Single-Record-Design funktionnéiert, an et ass och wat e onverbunden Apparat geféierlech mécht wann et publizéiert.
Et ass net gebrochen an et ass net aus der Applikatioun ausgeschloss: et liest nach all Message fir wat et d'Schlëssel huet an nach ëmmer klassesch sendt, während de Benotzer ze verbannen.
5D'Discovery an d'Envoi vun der Entscheidung
D'Clienten léieren d'Peer-Schlëssel op zwou Weeër. eng Standing Abonnement deckt d'Persounen, déi en Benotzer tatsächlech mat correspondéiert - offen Gespréicher a Gruppmitglieder - sou datt hir Annoncen als normale Evenementer kommen. Fir eng Peer-Meet fir de éischt Kéier, eng One-Shot Question lafen bei Send Time, begrenzt op 2,5 Sekonnen; wann et net geléist, ass d'Message klassesch, dat ass d'Verhalen, déi virun post-Quantum gouf anstatt eng nei Failure-Modus ugefaangen.
E Benotzer, deen eng nei Apparat verbënnt, oder deen aus engem Browser-Erweiderung Login op eng lokal Schlëssel bewegt, gëtt post-quantum fäheg mid-Conversation, an eng permanent cached “no” wäert se op klassesch Verschlësselung fir d'Liewen vun der Annonce halten.
5.1 Warum et keng Downgrade Attack ass
D'Routing Entscheedung reduzéiert op eng eenzeg Frage:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Et gëtt keng Kapazitéit Verhandlungen, eng Lëscht vun algorithmen, déi ënnerstëtzt ginn, an kee Feld kann e Angreifer klären fir e schwächeren Path ze forcéieren. ass De Failure-Modus vun enger entzogener oder entzogener Annonce ass, datt d'Message klassesch ass - de Status quo virun dëser Funktioun - anstatt datt eng hybride Message zu engem Falscht reduzéiert gëtt.
De Converse hält och a mat enger Wichtegkeet: e Client sendet Hybrid Déi Wann et e Schlëssel hält, an de Schlëssel hält ass de Beweis datt de Empfänger kann decapsulate.
6Hybrid Konstruktioun
Nymchat ersetzt net NIP-44. Et wickelt et. Eng unmodifiéiert NIP-44 Cryptertext ass d'innerer Schicht, an ML-KEM klickt eng äußerer AEAD ronderëm et:
inner = nip44_encrypt(plaintext, conversation_key(sender, recipient))
info = "nymchat-pq2" || sender_secp_pk || recip_secp_pk || kem_ct || recip_kem_pk
prk = HKDF-Extract(salt = "nymchat-pq2-v1", IKM = kem_ss)
key = HKDF-Expand(prk, info || "key", 32)
nonce = HKDF-Expand(prk, info || "nonce", 12)
outer = ChaCha20-Poly1305(key, nonce, plaintext = inner, aad = info)
payload = "pq2." || base64url(kem_ct) || "." || base64url(outer)
Déi zwee Geheimnisser mussen nach nach erofgelueden ginn fir d'Message ze liesen: d'externer Schicht produzéiert nëmmen en NIP-44 Cryptertext, an d'Öffnung braucht déi klassesch ECDH. E quantum Gegner, deen secp256k1 bréngt, kritt den Innere Schlëssel an nach ML-KEM konfrontiert; eng Bréckung vun ML-KEM strippt d'externer Schicht an liest NIP-44 Stand.
kem_ssKeen an dëser Derivatioun berührt de raue ECDH-Ausgang, dat ass wat Section 6.1 geschitt.kem_ct,recip_kem_pkOch déi zwee Identitéitsschlëssel sinn als assoziéiert Daten gebunden, sou datt d'externer Schicht dem exakte Transkript engagéiert ass, deen et produzéiert huet.
D'ML-KEM Schlëssel vum Empfänger ass laanglebend, awer all Message huet eng onofhängeg Verschlësseltext an also eng onofhängeg Schlëssel.
kem_ssDat ass wat d'Derivatioun vun der Nonce anstatt d'Randomiséierung hëlt:
De ChaCha20-Poly1305 ass eng vun hinnen.
Et handelt sech ëm zwéi Stären, déi no beienee leien.
6.1 Warum d'Schichten separat bleiwen
D'Alternativ ass, déi zwee Geheimnisser an eng eenzeg Konversatioun Schlëssel ze mischen an dat zu NIP-44 ze handelen:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Dat Konstruktioun ass klengt wéi Kryptographie. Et huet e strukturellen Problem: et braucht
ecdh_x, d'Roh x-Koordinat vun der ECDH Output, als Schlësselmaterial - an eng Browser Extension (NIP-07Oder op anerersäits wierklech, dat esou.NIP-46Et féiert NIP-44 am Numm vum Caller an huet e Verschlësseltext zréck, wat den ganze Punkt ass fir de Schlëssel irgendwo ze halen, wou d'Applikatioun net erreechen kann.
D'Mëschung vun de Geheimnissen schéngt also all Login aus, deen den Identitéitsschlüssel an engem Signer hält, dat ass déi bescht Benotzer, an keng Menge vun der Aarbecht op der Schlüsselderivatioun kann dat änderen.
D'ML-KEM Cryptertext ass 1088 Byte an reist op all Message, base64url-codéiert op 1,451 Charaktere; d'externer AEAD féiert eng 16-Bytes Poly1305 Tag an erweidert d'NIP-44 payload et wraps mat engem Drëttel. Eng 50-Charakter Message wäert vun 176 Byte op 1,712, an eng 2.000-Charakter eng vun 2,820 op 5,238.
6.2 Selbsterklärende Payloads
Déi pq2. Präfix mécht Deployment incremental: et ass self-describing, sou datt e Client de Entschlüsselungspfad wählt duerch d'Payload ze inspizéieren anstatt mat engem Tag ze vertrauen oder ze erënneren, wat e Peer ënnerstëtzt.
D'ML-KEM-Dekapsulatioun ass entworf fir nie ze falen: mat engem falsch geformten Kryptertext féiert d'Fujisaki-Okamoto-Transformatioun e deterministesch Pseudo-Random Geheimnis anstatt e Fehler. Eng falsch Schlëssel féiert also bei der KEM-Schicht überhaupt net op - et féiert als HMAC-Fehler an der NIP-44, dat ass déi selwecht klassesch Schlësseloberflächen. D'Callers behandelen déi zwee identesch, sou datt d'Fehler net e Unterscheidungssignal huet. Et ass och wat d'Kandidatenliste vun Section 9.1 funktionnéiert: e Client probéiert all Schlëssel op turnéi an erlaabt NIP-44 ze soen wat e Richteg war.
6.3 Beide Schichten vun der Geschenk Wrap
A NIP-17 Déi privat Message ass a NIP-59 Geschenkverpackung: eng onfirmen Geruch, ënner dem Identitéitsschlüssel vum Sender verzegelt (Kind 13), dann ënner engem gewëssenen Schlüssel vergläichen, deen pro Message generéiert gëtt (Kind 1059).
A signer Login kritt nëmmen d'externer Schicht. D'Siegel gëtt vum signer als normal NIP-44 produzéiert - d'Applikatioun sieht nie de Schlëssel, deen et schafft - also kann et net hybridiséiert sinn an der Plaz. Dëst kostet net géint d'Attack am Fall: d'Siegel ass nëmmen duerch d'Wrack erreecht, an d'Wrack ass wat e Recorder stëlt.
7Grupp Messagen a partiell Abdeckung
Et ass déi selwecht Plaintext fir all Member, all Kopie encapsulated op dat Member eegener ML-KEM Schlüssel.
Dëst schafft e Buchhaltungsproblem, datt eng naiv Implementatioun falsch gëtt. net E Gegner braucht eng klassesch Kopie vun engem Plaintext, déi an all 10 identesch ass, sou datt d'Message nëmmen geschützt ass wann all D’Kopie ass
Nymchat verfolgt also Per-Message Coverage während der Fan-Out - d'Zuel ass nëmmen kennbar während d'Wraps gebaut sinn - an d'Badge meldt “quantum-resistent op 8 vun 10 Memberen” anstatt d'Message geschützt ze behaapten. Receptéiert Gruppesch Message (nur de Sender zählt den Fan-Out), d'Schnittstelle meld partiell anstatt voll Schutz.
7.1 Wat de Schild meldt
De Schild huet d'Wahrheet iwwer d' Message gëtt, net iwwer d'Software déi et geschéckt huet:
- Voll Schutz: All Kopie vun dësem Plaintext gëtt hybrid.
- Partiell: e puer Kopien vun enger Grupp Message huet klassesch ausgeliwwert. gedréckt anstatt komplett, well eng klassesch Kopie vun engem Plaintext identesch an all vun hinnen ass eng Gegnerbedarf.
- Klassesch ass direkt erkläert anstatt als keng Badge ze gesinn, well e feindeg Indikator ass zweifelhaft tëscht “unprotected”, “broken”, an “dës Build fehlt de Feature”.
De Verdikt gëtt registréiert wann d'Message verstoppt ass anstatt aus dem, wat e Peer annoncéiert méi spéit. Ciphertext, deen och existéiert, kann net besser geschützt ginn wéi et war, an eng Interface, déi alen Messagen op d'Kraaft vun enger neier Annonce erreecht hätt, souwat falsch iwwer Byte op engem Relay ass.
D'Gruppenregel iwwer de Stack ass op dëser anstatt se ze ersetzen: eng Grupp Message ass komplett geschützt nëmmen wann all Member d'Kopie war, an eng empfangen Grupp Message mat kee Coverage Count weist partiell.
8D'Kopien Dir Dir Dir Dir Dir Dir Dir
Verschidde Dinge, déi e Client späichert, sinn op d'Identitéit vum Benotzer verschlüsselt: synchroniséiert Einstellungen, d'Konversatiounsliste, d'Gruppenschlüssel an d'Messagearchiv. Dës hunn méi iwwer engem Benotzer wéi déi meescht Single-Messagen, sou datt se klassesch sinn, souwéi se de schwächste archivéiert Artefakt sinn, egal wéi sorgfälteg d'Messagen selwecht waren. nymchat-pq-root D'Kategorie kann net ënner engem Schlëssel gesiegelt ginn, dat nëmmen et produzéieren kann.
Eng Einstellungen Blob oder eng Archiv Rei ass an engem Plaz fir Joer, wat genau d'Form vun der Sache ass, déi e Fräizäit-now-decrypt-later Gegner sammelt - vill méi wéi all eenzel Message, dat ass zumindest effeméral an der Besinn vum Benotzer.
Eng Restriktioun regelt de Format hier anstatt de Schlëssel. all D'Apparat op de Konto, sou datt all Apparat annoncéiert wat et kann op d'Roster seng Annonce huet, an d'Account schreift nëmmen wat all vun hinnen kann liesen.
Dat ass eng bewosst Konsequenz, net eng Iwwerwaachung, an dat ass de Grënner vun Section 3.3 fir eng Linkung anstatt eng fräi Wurzel ze minten: eng zweete Wurzel wäert de Blob net liessbar maachen, et wäert nëmmen de Schlësselmaterial vun der Identitéit an zwou gespalten.
En Apparat, deen eng Browser-Erweiderung oder e Remote-Signer (NIP-46) féiert, hält keng nsec ze kréien, awer et hält de Recovery-Code, an ënner der Layered Konstruktioun vun Section 6.1 dat ass all d'post-Quantum Half braucht: de Signer produzéiert d'NIP-44 Layer wéi et ëmmer huet, an de Client klickt d'externer Layer selwecht.
9Rotatioun
Déi epoch De Counter an der Derivatioun ass dat, wat Rotatioun ouni nei Schlësselmaterial méiglech ass. Incrementéiert et produzéiert e fräie Schlësselpaar aus der selwechter Wurzel an eng republizéiert Annonce; Peers huelen den nei Schlëssel aus der ersetzbarer Rekord.
9.1 Alte Epochen sinn gehalten, an nichts gëtt re-encrypted
Eng Client baut Entschlüsselungskandidaten aus der aktueller Epoch un bis zu Epoch − 3, sou datt e Message, dat kurz virum eng Rotatioun versiegelt ass, nach ëmmer géint de Schlësselpaar opmaachen, deen aktuell war wann et geschéckt gouf.
Dat Fenster ass dat, wat Rotatioun sécher ass ze maachen: ouni et, all Rotatioun hätt alles wat am Fliger war. Alles, wat schon versiegelt ass, bleift lesbar fir d'Liewen vun der Identitéit, well eng Message déi de Benotzer net méi öffnen kann ass strikt schlechter fir se wéi ee wier Schutz kann net retroaktiv verbessert ginn (Sektioun 10.5).
10Wat gëtt net geschützt
E Papier, deen nëmmen listet, wat e Design erreecht, beschreift net e System, an eng Sécherheetseigenschaft an enger Schnittstelle ze überschätzen ass schlechter wéi et ze verluer.
10.1 D'Wurzel ass e zweete Geheimnis, an et verluer ass onerkannbar
Dëst ass de eigentleche Präis vum Design. D'Beschränkung am Abschnitt 2, datt en Benotzer genau eng Sache ze behalen muss, kann net erfüllt ginn: de nsec allein rekonstruéiert de post-quantum Schlüssel net, well de ganze Punkt ass, datt keng öffentlech Wäert an keng aner Geheimnis et offenbaart.
Bei der manueller Übertragung ass de eenzege Path, dat ass schärfer wéi et éischt liesen kann. nympq1… Code iwwerall huet exakt eng Kopie vun et, op engem Apparat, an verluer dat Apparat verluer all post-quantum Message, Einstellungen blob an archivround versiegelt op et.
nsec Et handelt sech ëm zwéi Stären, déi no beienee leien.
Eng Attacker attackéiert de billigste Path verfügbar, sou datt e Schema de Wert ass wat seng schwächste Recovery Route ass - eng erënnerbar Passphrase, zum Beispill, wäert d'ganz Sache op wat d'Passphrase ass wert, an d'Walled Rue ass genau den Artefakt e Fräizäit-now-decrypt-later Gegner sammelt a grindt offline am Fräizäit.
10.2 Authentifizéierung, wéi getrennt vun der Vertraulichkeet
All Signatur am Nostr ass Schnorr iwwer secp256k1, an dat ass ongeännert. E Gegner mat engem Quantencomputer kann Signaturen gefälscht ginn an e Benotzer an real-time gefälscht ginn. Wat d'Hybrid Schlëssel-Exchange verluer ass-now-decrypt-later: e Angreifer, deen de Traffic am Dag registréiert, kann et nach net liesen. Et mécht eng Message unvergesslech géint e Gegner, deen och d'Maschinn huet. Dës Differenz ass an d'Applikatiounen bewosst - de Padlock Indikator meldt Authentifizéierung, de Shield meldt Vertraulichkeet, an se sinn gesonderte Glyphen, well eng Message kann een ouni déi aner hunn.
D'Bindung tëscht engem npub an engem ML-KEM-Schlüssel ass eng secp256k1 Signatur, sou datt e Gegner, deen dës verfälschen kann, en Eigen Schlüssel ersetzen kann.
10.3 Méthode
Et handelt sech ëm zwéi Stären, déi no beienee leien. p Et verbirgt net, datt e Event existéiert, seng Gréisst, oder wann e Relay et kritt huet.
10.4 Déi Offline Mesh
De Bluetooth Mesh Transport vun Nymchat ass e separat Protokoll mat sengem eegene Handschlag, an et gëtt net vun dëser Aarbecht gedeckt.
10.5 Messagen déi schon geschéckt sinn
D'Cyphertext, déi während eng Säit klassesch war, bleift klassesch permanent. Et existiert och an kann net re-versiegelt ginn. De Schutz fänkt bei der Message, wou déi zwee Parteien post-quantum Schlëssel gehalen hunn, net am Moment, wou d'Funktioun aktivéiert gouf.
11Alternativen sinn
| Approche | Warum also net |
|---|---|
| Den post-quantum Schlüssel aus dem Identitéitsschlüssel erreechen | Derivatioun ass e öffentlechen Algorithmus iwwer den nsec, an e quantum Gegner erhuelt den nsec aus dem publizéiert npub, sou de klassesche Hänn vun der post-quantum Hänn iwwer déi post-quantum Hänn mat him. |
| Senden d'Root op déi aner Apparater vum Benotzer iwwer NIP-44 | Eng Wurzel, déi ënner klassescher-nur Verschlësselung übertragen ass, ass recoverable vun all, déi dat Message opgemaach huet an bréngt seng Schlëssel méi spéit, dat ass de Gegner déi Wurzel existéiert fir ze stoppen. |
| Eng separat generéiert ML-KEM Schlësselpaar op all Apparat | D'Geräter hunn verschidden Decapsulation Schlëssel, an eng ersetzbar Annonce pro Identitéit kann se net all hunn. Peers wäert encrypt fir wat de Schlëssel zuletzt publizéiert gouf, an all aner Geräter kënnen d'Resultat net liesen. eng Root pro Identitéit, vun den Paths vum Abschnitt 3.2, ass wat dat vermeidet. |
| Wëllt d'Wurzel ënner engem PIN | Eng véierstelliger PIN ass ongeféier 13 Bit géint e Offline-Angreifer, deen d'verpackte Rei hält. |
| Extend den npub fir déi zwee Schlëssel ze tragen | 1,184 Bytes ass net e deelenbar Identifikatioune, an et bréngt all bestehend Nostr Client Parsing vun enger Adress déi als 32 Bytes definéiert ass. |
| A Key Directory Service | Reintroduciert d'Autoritéit déi de Netzwierk existéiert fir ze vermeiden.Wéi de Lookup beantwéiert, décidéiert wer d'Message liesen kann. |
| Eng Schlëssel fir all Message | Resolvéiert niks: de Sender braucht de Den Empfänger De Schlëssel ass de Schlëssel virun der éischt Message, dat ass just de Fall mat keng virdrun Message fir se ze tragen. |
| In-Band Kapazitéit Verhandlung | Eng Attacker, deen eng Kapazitéit Flag kann z'erreechen, d'klassesch Path forcéiert. |
| Post-Quantum nëmmen, keng klassesch Been | D'Analyse vu secp256k1 fir eng méi jonke Primitiv gëtt decennal verluer. souwuel Et féiert. |
12Implementatiounsparitéit
Nymchat Schëffer zwee onofhängeg Implementatiounen vun dëser Konstruktioun - eng an JavaScript fir d'Web Applikatioun, eng an Dart fir d'Mobile Applikatiounen, dorënner en aus-Kratch ML-KEM-768 Port.
Dart ML-KEM Implementatioun gëtt géint d'offiziell validéiert
Déi éischt ACVP
Et gëtt kee Gott awer Allah an de Muhammad ass de Messenger vum Allah.ML-KEM-*-FIPS203) — 25 Key-Generatioun, 25 Encapsulation an 10 Decapsulation Fäll, als hir eegene Suite lafen. Dat sinn d'Vektoren déi NIST publizéiert fir eng Implementatioun ze validéieren, also ze passéieren ass Beweis datt de Port korrekt ass, net einfach Beweis datt déi zwee Clienten mat eenzeg sinn. Iwwerdeems, eng gemeinsame Fixture vun TestVektoren - Seed Derivatioun, Encapsulation, och Payload Formater, an komplett Gift Wraps - ass aus der JavaScript Referenz generéiert an duerch déi zwee Test Suiten kontrolléiert. De Root Secret erweidert dat Fixture anstatt se ze ersetzen: Root zu Seed, Root zu Keypair, de Public Fingerprint vun der Root, an d'derivéiert Schlëssel, Nonce an assoziéiert Daten vun der
nympq1… A Divergenz an enger vun dësen Implementierungen féiert de Build anstatt eng Message ze produzéieren, déi de anere Client net öffnen kann.
De Fingerabdruck ass d'Nummer vun dësen. Et ass wat e Gerät “dit ass d'Wurzel ech hunn” aus “dit ass eng aner one”, an e Client deen de Fingerabdruck vun engem anere Client kann net reproduzéieren zou eng perfekt Rekord liesen wéi keng Rekord überhaupt - an dann, nach Section 3.3, mint eng zweet Wurzel an deelen d'Identitéit.
Nymchat ass Open Source gëtt An der AGPL-3.0. de kryptographesche Kern déi hier beschriwwen ass
js/nym-crypto.js an js/modules/pq.js op der Web Client, an
lib/core/crypto/ mat lib/features/identity/pq_registry.dart an den mobilen Clienten.
Fir d'kurz, net-technesch Erklärung, kuckt de Knowledge Base Page op quantum-resistant Verschlësselung.