Nymchat tegniese witboek
Post-Quantum sleutel ooreenkoms in Nymchat
Die verspreiding van ML-KEM-768 openbare sleutels oor Nostr sonder 'n directory of 'n register, en hulle seed uit 'n geheim wat geen openbare waarde blootstel nie.
Die toevoeging van 'n post-kwantum sleuteluitruil aan 'n boodskapper is meestal nie 'n kriptografiese probleem nie. Die primitiewe is gestandaardiseer en die biblioteke bestaan. Tweede Hierdie artikel beskryf hoe Nymchat daarop antwoord - waar die tweede sleutel vandaan kom, hoe dit die mense bereik wat dit nodig het, en wat die koppelvlak mag beweer oor die resultaat - en, in die laaste afdeling, wat daardie resultaat nie beskerm nie.
Hierdie bladsy is gerieflikheidshalwe masjienvertaal. Die Engelse oorspronklike is die weergawe wat van toepassing is.
1Die probleem
Ons private boodskappe word versleutel met NIP-44, wat twee afsonderlike helfte het. Die helfte wat die plainteks scrambles — ChaCha20 met 'n HMAC-SHA256 tag, geklik deur Die HKDF (Die RFC 5869- is nie betekenisvol bedreig deur 'n kwantumrekenaar nie; Grover se algoritme kos 'n vierkante wortel versnelling teen 'n simmetiese sleutel, en 256 bits absorbeer dit. Aanvaar op die sleutel is elliptiese kromme Diffie-Hellman oor Skuif 256K1, en Shor se algoritme los die diskrete logaritme heeltemal. herstel van een private sleutel van sy openbare eweknie retroaktief blootstel elke gedeelde geheim wat sleutel ooit geproduseer het.
Die bedreiging wat dit skep, word nie uitgestel totdat so 'n masjien bestaan nie. 'n teenstander met opslag kan vandag kodeer en ontkryp wanneer die vermoë aankom. Alles wat nou gestuur word wat nog belangrik is, word reeds in gevaar gestel. Dit is die spesifieke aanval wat 'n post-quantum sleuteluitwisseling verloor, en dit is die rede waarom die werk nie kan wag vir die masjien om gebou te word nie.
1.1 Die vraag wat hierdie artikel beantwoord
Die vermindering is goed verstaan: loop 'n post-kwantum sleutel inkapseling meganisme langs die klassieke uitruil, so 'n aanvaller moet beide breek om iets te lees.Geskryf 203Dit bring onmiddellik 'n verspreidingsprobleem op:
Voeg 'n post-kwantum uitruil toe en jy benodig 'n tweede - haar ML-KEM openbare sleutel.
'NPUB is selfbestuur. Jy kan dit op papier skryf, dit hardop lees, of dit van 'n skerm skandeer, en dit is alles wat iemand nodig het om vir jou te kodeer. 'n ML-KEM-768 openbare sleutel is 1,184 bytes. Dit kan nie hardop lees word nie, dit sal nie in 'n gebruikersnaam pas nie, en dit behoort nie in 'n QR-kode nie, behalwe 'n identiteit wat slegs 32 bytes is.
Die moeilikste deel is dat 'n tweede sleutel drie verskillende probleme bring, en die res van hierdie papier is grotendeels 'n antwoord op hulle:
- Dit kan vervang word. 'N sleutel wat niemand op 'n oomblik kan lees, is presies die soort ding wat 'n aanvaller vir hul eie ruil.
- Dit moet oor 'n gebruiker se toestelle ooreenstem. Die dieselfde rekening op 'n telefoon en 'n laptop moet dieselfde sleutel toon, of boodskappe wat aan een gesegeld is, kan nie op die ander oopgemaak word nie.
- Dit kan verlore gaan. Die openbare sleutel word weer gepubliseer uit 'n geheim, dus wat eintlik moet oorleef, is daardie geheim - en deur konstruksie herbou niks anders dit nie.
2Ontwerp beperkings
Vier beperkings het die antwoord gevorm, en hulle sluit die meeste van die voor die hand liggende ontwerpe uit voordat enige kode geskryf word.
- So min geheimenisse as moontlik. Ons gebruikers dra reeds presies een geheim, die nsec. Elke bykomende geheim is 'n ander manier om jou geskiedenis te verloor, en iemand wat weet om 'n nsec te back-up, sal nie weet om iets anders te back-up nie. Afdeling 3.1 toon hierdie een kan nie reguit ontmoet word nie - 'n post-kwantum sleutel wat uit die nsec afgelei is, bied geen post-kwantum beskerming nie - so die ontwerp spandeer presies een geheim en nie meer nie: 'n enkele stukke sleutelmateriaal, wat een keer per identiteit gegenereer word, in dieselfde vorm as die nsec en op dieselfde plek aangebied word, sodat elkeen wat weet hoe om een te hou, weet hoe om die ander te hou. Afdeling 10.1 is eerlik oor wat dit nog kos.
- Geen gesag nie. Daar is geen bediener wat betroubaar kan word om te sê watter sleutel aan wie behoort nie.
- Verskeie toestelle, een identiteit Watter sleutelmateriaal ookal bestaan, moet op al hulle dieselfde eindig, en die padne wat dit daar dra, mag nie self leesbaar wees deur die teenstander teen wie die funksie verdedig nie.
- Geen onderhandeling nie. Enige in-band uitruil van “watter cifers ondersteun jy?” is 'n oppervlak wat 'n aanvaller kan sny om die swakker opsie te dwing.
3'n Onafhanklike wortelgeheim
Die lasbeslissing is dat die ML-KEM-dekapsulasie sleutel uit sleutelmateriaal geplant word wat geen openbare waarde blootstel nie.
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)
Die wortel word aan die gebruiker aangebied soos 'n nsec is: Sjoe32 met die mens-leesbare voorvoegsel
nympqDit lees as nympq1…, getoon langs die nsec in die identiteitsskerm agter dieselfde openbare interaksie, gekopieer met dieselfde beheer, nooit aangemeld en nooit enige plek in die duidelik gestuur nie.
Die sout is doelbewus domein-afgeskei, sodat geen ander geheim ooit dieselfde sleutelpaar kan afgelei nie. epoch Die versekering van die rotasie (Seksie 9).
3.1 Waarom die sleutel nie van die identiteits sleutel afgelei kan word nie
Die voor die hand liggende ontwerp is om die sleutelpaar uit die geheim wat die gebruiker reeds het, te zaai:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Dit is aantreklik om vier redes, almal werklik: niks nuuts om te back-up nie, want die nsec is reeds die back-up; elke toestel wat ooreenstem deur konstruksie, met geen sinchronisasie protokoll om verkeerd te gaan nie; een vervangbare aankondiging per identiteit wat duidelik korrek is, want toestelle kan nie ooreenstem oor die sleutel nie; en die sleutel wat bestaan voordat dit ooit gepubliseer word, sodat 'n kliënt iets vir homself kan verzegel.
Alle vier voordele is waardeloos, om een rede. Shor se algoritme hardloop teen 'n gepubliseerde npub lewer die nsec. Die saad aflewering is 'n openbare algoritme oor die nsec. So die teenstander wat die klassieke helfte breek, herbou die post-kwantum helfte deur dieselfde HKDF te hardloop wat almal anders hardloop. teen oes-nu-decrypt-later - die een bedreiging wat die funksie bestaan om te stop - 'n sleutel wat op hierdie manier afgelei word, voeg niks by nie.
Die ML-KEM dekapsulasie sleutel moet afkomstig wees van entropie wat nie van die nsec afgelei kan word nie en ook nie onder klassieke enkripsie oorgedra word nie.
'N Onafhanklik gegenereerde geheim wat dan tussen 'n gebruiker se toestelle binne 'n gewone NIP-44-boodskap gesynchroniseer word, is dieselfde mislukking met ekstra stappe: 'n teenstander registreer daardie boodskap vandag en herstel sy klassieke sleutel later, en die wortel val uit.
3.2 Gaan die wortel na die ander toestelle van die gebruiker
Beperking 3 van Afdeling 2 - een identiteit, verskeie toestelle - kan nie hier deur aritmetiek bevredig word nie, want die hele punt is dat die sleutel nie 'n funksie is van iets wat die toestelle reeds deel nie. nympq1… Kodeer jouself
Die wortel word getoon as nympq1… na die nsec, en 'n tweede toestel aanvaar dit in dieselfde paneel geplaas. Dit is die hele meganisme. 'N toestel wat nie die kode gegee is nie kan deelneem nie, wat Afdeling 4.2 beskryf.
Handmatige oordrag is 'n doelbewuste vloer eerder as 'n eerste stap. Die reël in Afdeling 3.1 sê dat die wortel nooit onder klassieke slegs-versleutelings kan reis nie, en elke meganisme wat dit outomaties sal maak - synchroniseer dit deur middel van 'n relais, omhels dit met die identiteits sleutel - breek presies dit.
Die formaat laat ruimte vir 'n verpakte pad: 'n rekord kan 'n lys van wraps dra, elkeen 'n AEAD blob onder 'n sleutel wat die gebruiker op 'n ander toestel kan reproduseer - 'n passkey PRF-uitvoer, byvoorbeeld. nympq1… Dit is die enigste manier om deur te gaan. § 10.1 verduidelik wat dit kos.
Die rekenaar self leef in sy eie instellingskategorie, nymchat-pq-rootSelfs om geen wraps te dra nie, doen dit die nodige werk: sy teenwoordigheid is hoe 'n tweede toestel leer dat hierdie identiteit reeds 'n wortel het, wat dit stop om 'n mededingende een te mint (Seksie 3.3).
die nymchat-pq-root kategorie moet nie Die ry dra die enigste kopie van die wortel, dus sluit dit onder 'n sleutel wat van die wortel afkomstig is, is 'n slot waarvan die sleutel binne die boks is: geen toestel kan dit ooit oopmaak nie, insluitend die een wat dit geskryf het nie.
Elke ander instellings kategorie kan en moet die wortel afgeleide sleutel gebruik.Dit is die enkele uitsondering, en dit is 'n uitsondering oor sirkulariteit eerder as oor sterkte.
3.3 Generasie en adopsie
Op boot, met 'n volhoubare identiteit, werk 'n kliënt in hierdie volgorde:
- Soek 'n bestaande
nymchat-pq-rootDie rekord. - Rekord gevind, en hierdie toestel kan dit losmaak - aanvaar dit en aankondig hierdie identiteit as post-kwantum in staat.
- Rekord gevind, en hierdie toestel kan dit nie losmaak nie — nie 'n nuwe wortel genereer nie, en nie enige aankondiging publiseer nie. Moedig die gebruiker aan om hierdie toestel te skakel deur die
nympq1…die kode van 'n toestel wat dit reeds het. - Geen rekord nie - 'n wortel genereer, die rekord publiseer, aankondig en die
nympq1…'n kode aan die gebruiker een keer sodat hulle dit kan red.
Stap 3 is die stap wat maklik verkeerd kan word, en dit is die rede waarom die bestelling geskryf word in plaas van na elke implementasie.Twee toestelle wat elkeen besluit om 'n wortel te genereer, produseer twee onafhanklike wortels onder een identiteit, en dit is die mislukking wat hierdie bestelling bestaan om te voorkom.
4Aankondiging van die vermoë
Die openbare helfte van die afgeleide sleutelpaar word gepubliseer as 'n adresbare
Geskryf-01
gebeurtenis — soort 30078, getagged 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": [ ... ]
}
}
Aanspreekbaar beteken dat die relay een gebeurtenis per (kind, pubkey, d-tag) hou, so 'n republiek vervang die vorige aankondiging in plek.
Die handtekening is bindend. Die gebeurtenis word onderteken deur die identiteit sleutel, so die bewering “ hierdie ML-KEM sleutel behoort aan hierdie npub” is presies so sterk as die npub self. Die vervanging van 'n ander inkapseling sleutel vereis die vervaardiging van 'n secp256k1 handtekening. 'N aanvallers wat dit kan doen, hoef nie te bekommer met die KEM nie.
Die aankondigings verval. Die sewende dag NIP-40 Vervaldatum, wat elke 24 uur weer gepubliseer word, hou in die rekord 'n verklaring oor 'n kliënt wat nog hardloop in plaas van een wat voorheen was.
'N gemiste aankondiging word presies soos een gelees wat nooit 'n sleutel gehad het nie: peers stuur gewone NIP-44, wat elke login kan lees, en die kliënt herhaal die post-kwantum-uitruil op sy volgende verbinding, wanneer dit weer gepubliseer word.
Dit asymmetrie is die rede vir die verval eerder as 'n ongeluk daarvan. sonder een, 'n rekord oorleef die sleutel wat dit noem: 'n toestel wat gewys, herstel, of het sy wortel vervang, laat 'n staande instruksie om te inkapsuleer na 'n sleutel niemand meer hou nie, en boodskappe wat onder dit gestuur word, word verlore sonder foute aan beide kante.
Die sleutelveld noem sy formaat. Die veld is pk2, en die getal is deel van die kontrak eerder as versiering: dit noem die nutgehalteformaat waarmee die sleutel gebruik kan word. 'N leser wat nie die veld erken nie, sluit die “Nymchat kliënt, geen post-kwantum sleutel” en stuur gewone NIP-44, wat elke inskrywing kan lees. Dit is die korrekte mislukking rigting, en dit is die moeite werd om te sê as 'n reël dat die formaat nommering bestaan om te handhaaf: 'n onherkenbare vermoë eis moet beskerming kos, nooit lewer nie. 'N sleutel wat 'n peer nie kan gebruik nie, is erger as geen sleutel nie, want die boodskap wat dit produseer word verlore met geen fout aan beide kante.
4.1 Afwesigheid is betekenisvol, en drie-gewaardeer
'N Subtiele maar belangrike detail: die aankondiging word gepubliseer deur elke Nymchat kliënt, nie net die post-kvantum-bekwaam, en die sleutelveld is optioneel.
| waargeneem | Beteken | Stuur gedrag |
|---|---|---|
| Aankondiging met 'n sleutel | Nymchat, post-kwantum in staat | Hybride |
| Aankondiging, geen sleutel nie | Nymchat, klassieke slegs - post-quantum af, of 'n toestel wat nog nie gekoppel is aan die wortel van die identiteit nie | Klassieke NIP-17 |
| Geen aankondiging | Onbekende kliënt. Miskien enige Nostr of Bitchat gebruiker | Klassieke, plus 'n verenigbaarheid wrap |
'N sleutellose aankondiging is 'n ondertekende verklaring dat die afsender Nymchat hardloop, wat toelaat dat die stuurpad 'n spekulatiewe kruisprotocol wrap kan skip wat dit anders sal hê om te insluit vir almal wat dit nie kan identifiseer nie.
4.2 'N toestel wat nie die wortel kan oopmaak nie, bly stil
Die aankondiging is vervangbaar: een gebeurtenis per identiteit, laaste skryf wen.Dit is wat die enkele rekordsontwerp werk, en dit is ook wat 'n ongebindde toestel gevaarlik maak as dit gepubliseer. 'n toestel wat 'n sleutel aangekondig het wat dit vir homself gemint het, sal die werklike rekord klop en elke peer stuur om te kodeer onder 'n sleutel wat die ander toestelle nie kan oopmaak nie.
So 'n toestel wat 'n wortel ken, bestaan, maar dit nie kan oopmaak nie, publiseer geen aankondiging nie. Dit word nie gebreek nie en dit word nie uit die aansoek gesluit nie: dit lees steeds elke boodskap vir wat dit die sleutels het en stuur steeds klassiek, terwyl die gebruiker gevra word om dit te koppel. stilte is die korrekte gedrag vir 'n toestel wat nie vir die identiteit kan praat nie.
5Ontdekking en die stuur besluit
Kliënte leer peer sleutels op twee maniere. 'n Standing-abonnement dek die mense met wie 'n gebruiker eintlik korrespondeer - oop gesprekke en groepslede - sodat hul aankondigings as gewone gebeure aankom. Vir 'n peer ontmoet vir die eerste keer, 'n enkele vraag loop by stuur tyd, beperk tot 2,5 sekondes; as dit nie oplos nie, gaan die boodskap klassiek, wat die gedrag is wat bestaan voordat post-kvantum bygevoeg is eerder as 'n nuwe mislukkingsmodus.
'N Gebruiker wat 'n nuwe toestel verbind, of wat van 'n leser-uitbreiding login na 'n plaaslike sleutel beweeg, word post-kwantum in staat mid-gesprek, en 'n permanente cached “no” sou hulle op klassieke versleuteling vir die lewe van die aankondiging hou.
5.1 Waarom daar geen downgrade aanval is nie
Die routing besluit verminder tot 'n enkele vraag:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Daar is geen vermoë onderhandelings, geen ondersteun algoritmes lys, en geen veld 'n aanvaller kan duidelik om te dwing 'n swakker pad. is Die mislukkingsmodus van 'n ontnugte of terughoudende aankondiging is dat die boodskap klassiek gaan - die status quo voor hierdie funksie - eerder as dat 'n hibridboodskap na iets verwerpbaar afgedaal word.
Die omgekeerde hou ook en maak meer saak: 'n kliënt stuur hybride Alleen wanneer dit 'n sleutel hou, en die sleutel hou, is die bewys dat die ontvanger kan ontkapsel nie.
6Hybride konstruksie
Nymchat vervang nie NIP-44. Dit wraak dit. 'n Ongemodifiseerde NIP-44-kryptekst is die innerlike laag, en ML-KEM sleutels 'n eksterne AEAD rondom dit:
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)
Beide geheime moet nog herstel word om die boodskap te lees: die buitenste laag lewer slegs 'n NIP-44-kryptekst, en die opening wat die klassieke ECDH benodig. 'n kwantum teenstander wat secp256k1 breek, kry die innerlike sleutel en staan steeds in die gesig van ML-KEM; 'n breek van ML-KEM sny die buitenste laag en laat NIP-44 staan.
kem_ssNiks in hierdie derivasie raak die ruwe ECDH-uitvoer nie, wat is wat Afdeling 6.1 draai op.kem_ct,recip_kem_pkEn beide identiteits sleutels is gebind in as geassosieerde data, so die eksterne laag is verbind tot die presiese transkripsie wat dit geproduseer het.
Die ML-KEM sleutel van die ontvanger is lanklewendig, maar elke boodskap dra 'n onafhanklike ciferteks en dus 'n onafhanklike
kem_ssDit is wat dit maak om die nonce te afgelei eerder as om dit te randomiseer:
Hoofstuk 20 - Poly1305
is gebreek deur 'n (n sleutel, nonce) paar te hergebruik, en hier is die sleutel self nuut vir elke boodskap, sodat geen paar kan herhaal nie.
6.1 Waarom die lae afsonderlik bly
Die alternatief is om beide geheime in 'n enkele gesprek sleutel te meng en dit aan NIP-44 te gee:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Hierdie konstruksie klink soos kriptografie. Dit het een struktuurprobleem: dit benodig
ecdh_x, die ruwe x-koördinaat van die ECDH-uitvoer, as sleutelmateriaal - en 'n leser-uitbreiding (NIP-07) of 'n afstandsondertekener (NIP-46Dit voer NIP-44 namens die oproeper uit en gee terug 'n kriptografiese teks, wat die hele punt is om die sleutel ergens te hou waar die aansoek nie kan bereik nie.
Die menging van die geheime sluit dus elke login uitsluit wat die identiteits sleutel in 'n handtekener hou, wat die mees versigtige gebruikers is, en geen hoeveelheid werk op die sleutelderivasie kan dit verander nie. Layering verwyder die afhanklikheid: NIP-44 bly heeltemal en word geproduseer deur wat die identiteits sleutel, handtekener insluit, terwyl die KEM helfte bereken word uit die herstel kode wat die kliënt direk hou.
Die koste is bandbreedte, en dit is nie klein nie. Die ML-KEM-kryptekst is 1,088 bytes en ry op elke boodskap, base64url-gekodeer tot 1,451 karakters; die eksterne AEAD voeg 'n 16-byte Poly1305 tag by en brei die NIP-44 nutbelasting deur 'n derde. 'n 50-karakter boodskap groei van 176 bytes tot 1,712, en 'n 2000-karakter een van 2,820 tot 5,238.
6.2 Selfbeskryfde payloads
die pq2. die voorvoegsel maak die uitbreiding incrementeel: dit is selfbeskryf, dus kies 'n kliënt die ontkryppad deur die nuttige lading te inspekteer eerder as deur 'n tag te vertrou of te onthou wat 'n peer ondersteun. 'n leser wat nie 'n voorvoegsel herken nie, misluk die nuttige lading eerder as om dit verkeerd te lees, en boodskappe wat voor beide kante gesluit is, kan post-kwantum as gewone NIP-44 leesbaar bly sonder migrasie.
ML-KEM-dekapsulasie is ontwerp om nooit te misluk nie: aangesien die Fujisaki-Okamoto-transformasie 'n misvormde cifertekst het, gee dit eerder 'n deterministiese pseudo-willekeurige geheim as 'n fout. 'n verkeerde sleutel kom dus nie op die KEM-laag op nie - dit verskyn as 'n HMAC-fout binne NIP-44, wat op dieselfde manier is as 'n verkeerde klassieke sleutel oppervlakke. Belers behandel beide identies, dus dra die mislukking geen onderskeidende signaal nie. Dit is ook wat die kandidaatlijst van Afdeling 9.1 werkbaar maak: 'n kliënt probeer elke sleutel op sy beurt en laat NIP-44 sê wat reg was.
6.3 Beide lae van die geskenk wrap
A NIP-17 Persoonlike boodskap is 'n NIP-59 geskenk wrap: 'n onondertekende gerug, gesel onder die afsender se identiteit sleutel (soort 13), dan gewikkeld onder 'n gooi sleutel gegenereer per boodskap (soort 1059). Op 'n login wat die identiteit sleutel direk hou, hybridiseer Nymchat beide lae, elkeen met sy eie inkapseling.
'N handtekener login kry slegs die eksterne laag. Die seël word deur die handtekener geproduseer as gewone NIP-44 - die aansoek sien nooit die sleutel wat dit maak - dus kan dit nie hibridiseer word nie. Dit kos niks teen die aanval in kwessie: die seël is slegs bereikbaar deur die wrap, en die wrap is wat 'n rekenaar besit. 'N teenstander wat geregistreerde verkeer hou, moet ML-KEM breek voordat 'n seël selfs sigbaar is om aan te val.
7Groepsboodskappe en gedeeltelike dekking
'N Groepsboodskap is nie 'n enkripteks nie. Dit is dieselfde eenvoudige teks wat aan elke lid uitgesaai word, elke kopie wat in die lid se eie ML-KEM sleutel gekapsuleer word. 'n Lid wat 'n sleutel gepubliseer het, kry 'n hibrid wrap; een wat nie 'n klassieke wrap het nie.
Dit skep 'n boekhoudprobleem dat 'n naïeve implementering verkeerd raak. As agt van die tien lede 'n hibridkopie ontvang, is die boodskap nie 'N teenstander benodig een klassieke kopie van 'n eenvoudige teks wat identies is in alle tien, so die boodskap word slegs beskerm as elke Kopieer dit.
Nymchat volg dus dekking per boodskap tydens die fan-out - die telling is slegs kenbaar terwyl die wraps gebou word - en die badge rapporteer “quantum-weerstandig tot 8 van 10 lede” eerder as om te beweer dat die boodskap beskerm is. ontvang groepsboodskap (slegs die afsender tel die fan-out), die koppelvlak rapporteer gedeeltelike eerder as volle beskerming.
7.1 Wat die skild rapporteer
Die skild vertel die waarheid oor die boodskap, nie oor die sagteware wat dit gestuur het nie:
- Volledige beskerming: elke kopie van hierdie plaintext het hybride uitgekom.
- Deellike: sommige kopieë van 'n groepboodskap het klassiek uitgegaan. getrek gedegradeer eerder as vol, want een klassieke kopie van 'n plainteks identiese in al hulle is almal 'n teenstander behoeftes.
- Klassieke word uitdruklik aangedui eerder as as geen badge nie, want 'n afwesige aanduiding is duidelike tussen “onbeskermde”, “gebroke”, en “ hierdie bou ontbreek die funksie”.
Ciphertekst wat reeds bestaan, kan nie beter beskerm word as wat dit was nie, en 'n koppelvlak wat ou boodskappe op die sterkte van 'n nuwe aankondiging herstel, sou iets vals beweer oor bytes op 'n oordraaier.
Die groep reëls hierbo stapel op die top van hierdie eerder as om dit te vervang: 'n groepboodskap is ten volle beskerm slegs wanneer elke lid se kopie was, en 'n ontvangsgroepboodskap met geen dekking telling toon gedeeltelik.
8Kopieë wat aan jouself gerig is
Verskeie dinge wat 'n kliënt stoor, word gekryp vir die gebruiker se eie identiteit: gesynchroniseerde instellings, die gesprekslijst, groep sleutels en die boodskap archief. Hierdie dra meer oor 'n gebruiker as die meeste enkele boodskappe doen, so om hulle klassiek te laat, sou hulle die swakste opgeslagen artefak maak, ongeag hoe versigtig die boodskappe self geselecteer is. nymchat-pq-root die kategorie self, wat nie onder 'n sleutel verzegel kan word wat alleen dit kan produseer nie.
'N instellingsblob of 'n lêerreël sit al jare lank in een plek, wat presies die vorm is van iets wat 'n oes-nou-ontkryp-later teenstander versamel - veel meer as enige enkele boodskap, wat ten minste effemeraal is in die gebruiker se eie gedagtes.
Een beperking regeer die formaat hier eerder as die sleutel. 'N self-adres kopie moet leesbaar wees deur elke 'n toestel op die rekening, sodat elke toestel adverteer wat dit kan oopmaak in die rooster wat sy aankondiging dra, en die rekening skryf slegs wat hulle almal kan lees.
Dit is 'n doelbewuste gevolg, nie 'n oorsig nie, en daarom het Afdeling 3.3 so 'n toestel oproep vir koppeling in plaas van 'n nuwe wortel te mint: 'n tweede wortel sal die blob nie leesbaar maak nie, dit sal slegs die sleutel materiaal van die identiteit in twee verdeel. totdat die gebruiker dit koppel, werk die toestel voort - dit lees wat dit die sleutels vir en stuur klassiek.
'N toestel wat 'n browser-uitbreiding of 'n remote signer (NIP-46) bedryf, hou geen nsec om van te afgelei nie, maar dit hou die herstel kode, en onder die gelaagde konstruksie van Afdeling 6.1 wat al die post-kwantum helfte benodig: die signer produseer die NIP-44 laag soos dit altyd het, en die kliënt sleutel die eksterne laag self.
9die rotasie
die epoch Die teler in die afgeleide is wat rotasie moontlik maak sonder nuwe sleutelmateriaal. Om dit te verhoog, word 'n nuwe sleutelpaar van dieselfde wortel en 'n weer gepubliseerde aankondiging. peers haal die nuwe sleutel uit die vervangbare rekord. rotasie vra dus nie die gebruiker om iets 'n tweede keer neer te skryf nie: die wortel word een keer per identiteit gegenereer en die epok doen die draai.
9.1 Ou tydperke word bewaar, en niks word herversleutel nie
Niks word herschryf wanneer 'n sleutel draai nie. 'n Kliënt bou decryption kandidaat van die huidige era af na epoch − 3, sodat 'n boodskap wat kort voor 'n draai gesegeld is, steeds oopmaak teen die sleutelpaar wat huidige was toe dit gestuur is.
Dit is die venster wat rotasie veilig maak om te doen: sonder dit sal elke rotasie alles wat in vlug was, verpletter. Alles wat reeds verzegel is, bly leesbaar vir die lewe van die identiteit, want 'n boodskap wat die gebruiker nie meer kan oopmaak nie, is streng erger vir hulle as een wie se beskerming nie retroaktief kan verbeter word nie (Seksie 10.5).
10Wat dit nie beskerm nie
'N Papier wat slegs lys wat 'n ontwerp bereik, beskryf nie 'n stelsel nie, en 'n sekuriteitseienskap in 'n koppelvlak oordryf is erger as om dit te verlaat.
10.1 Die wortel is 'n tweede geheim, en dit verloor is onherstelbaar
Dit is die werklike prys van die ontwerp. Die beperking in Afdeling 2 dat 'n gebruiker presies een ding moet hou, kan nie vervul word nie: die nsec alleen herbou nie die post-kwantum sleutel nie, want die hele punt is dat geen openbare waarde en geen ander geheim dit blootstel nie. As geen toestel die wortel hou en geen van die verpakkings van Afdeling 3.2 geopen kan word nie, is materiaal wat tot die wortel afgeleide sleutel gesluit is, nie herstelbaar nie.
Met die handmatige oordrag die enigste pad, dit is skerper as wat dit eers kan lees. nympq1… code enige plek het presies een kopie van dit, op een toestel, en die verlies van daardie toestel verloor elke post-kwantum boodskap, instellings blob en arkiewe rigting gesluit aan dit.
nsec Dit help nie; dit is die eiendom waarop die hele ontwerp rus.
'N Aanvaller aanval die goedkoopste pad wat beskikbaar is, so 'n skema is die moeite werd wat sy swakste herstelroete is - 'n memorabele passphrase, byvoorbeeld, sou die hele ding op wat die passphrase waard is, en die verpakte rigting is presies die artefak wat 'n oes-nu-dekrypte-later teenstander onmiddellik versamel en grind.
10.2 Authentifikasie, as afsonderlik van vertroulikheid
Elke handtekening in Nostr is Schnorr oor secp256k1, en dit is hier onveranderd. 'n teenstander met 'n kwantumrekenaar kan handtekenings verval en 'n gebruiker in werklike tyd voorgee. Wat die hibrid sleuteluitwisseling verslaan, is oogst- nou-dekrypte-later: 'n aanvaller wat vandag verkeer opneem, kan dit nie later lees nie. Dit maak nie 'n boodskap onvergeetbaar teen 'n teenstander wat reeds die masjien het nie. Hierdie onderskeid word doelbewus in die programme oorgedra - die padlock-indikator rapporteer oortreding, die skild rapporteer vertroulikheid, en hulle is afsonderlike glyfies omdat 'n boodskap een sonder die ander kan hê.
Die binding tussen 'n npub en 'n ML-KEM sleutel is 'n secp256k1 handtekening, so 'n teenstander wat hulle kan vervals, kan 'n sleutel van hul eie vervang.
10.3 Die metadata
Gift wraping verberg die afsender, die ontvanger buite 'n enkele p Dit verberg nie dat 'n gebeurtenis bestaan, sy grootte, of wanneer 'n omroep dit ontvang het nie.
10.4 Die offline mesh
Nymchat se Bluetooth mesh vervoer is 'n aparte protokoll met sy eie handshake, en dit word nie deur hierdie werk gedek nie.
10.5 Boodskappe wat reeds gestuur is
Ciphertekst wat opgespoor word terwyl beide kante nog klassieke klassieke klassieke bly permanent. Dit bestaan reeds en kan nie weer verzegel word nie. Beskerming begin by die boodskap waar beide kante post-kwantum sleutels gehou het, nie op die oomblik dat die funksie geaktiveer is nie.
11Alternatiewe oorweeg
| Die nadering | Hoekom nie |
|---|---|
| Verwyder die post-quantum sleutel van die identiteits sleutel | Die afgeleide is 'n openbare algoritme oor die nsec, en 'n kwantum teenstander herstel die nsec van die gepubliseerde npub, so breek die klassieke helfte hande oor die post-kwantum helfte met dit. |
| Stuur die wortel na die gebruiker se ander toestelle via NIP-44 | 'N Wortel wat onder klassieke-alleen-versleuteling oorgedra word, kan herstel word deur elkeen wat daardie boodskap opgeneem het en sy sleutel later breek, wat die teenstander is wat die wortel bestaan om te stop. |
| 'N afsonderlik gegenereerde ML-KEM sleutelpaar op elke toestel | Verwerp. toestelle sou verskillende decapsulation sleutels hou, en een vervangbare aankondiging per identiteit kan hulle nie almal dra nie. Peers sou versleutel na watter sleutel die laaste gepubliseer is, en elke ander toestel sou nie in staat wees om die resultaat te lees nie. |
| Wrap die wortel onder 'n PIN | 'N Viercijferige PIN is ongeveer 13 bits teen 'n off-line aanvaller wat die verpakte ry hou. |
| Uitbrei die npub om beide sleutels te dra | 1,184 bytes is nie 'n gedeelbare identifikasie nie, en dit sou elke bestaande Nostr-kliënt se parsing van 'n adres wat as 32 bytes gedefinieer word, verbreek. |
| 'N sleutel direktiewe diens | Herintroduceer die gesag wat die netwerk bestaan om te vermy.Wie die opname beantwoord, bepaal wie die boodskap kan lees. |
| Voeg die sleutel by elke boodskap | Oplos niks: die afsender benodig die Die ontvanger die sleutel voor die eerste boodskap, wat presies die geval is met geen voorafgaande boodskap om dit te dra nie. |
| In-band kapasiteit onderhandeling | 'N aanvaller wat 'n vermoë vlag kan ontneem, dwing die klassieke pad. |
| Post-quantum slegs, geen klassieke been nie | Verwerp dekades van analise van secp256k1 in ruil vir 'n baie jonger primitiewe. albei die faal. |
12Uitvoeringspariteit
Nymchat verskaf twee onafhanklike implementasies van hierdie konstruksie - een in JavaScript vir die webtoepassing, een in Dart vir die mobiele toepassings, insluitend 'n vanaf die grond 'n ML-KEM-768-poort.
Die implementering van die Dart ML-KEM word gekwaliteer teen die amptelike
Die ACVP
Verwys na die algemeen gehalte van produkte (ML-KEM-*-FIPS203) — 25 sleutelgenerasie, 25 encapsulation en 10 decapsulation gevalle, hardloop as hul eie suite. Dit is die vektore wat NIST publiseer om 'n implementasie te valideer, dus deur hulle is bewyse dat die poort korrek is, nie net bewyse dat die twee kliënte saamstem met mekaar nie. Bovendien word 'n gedeelde fikstuur van toetsvektore — seed derivation, encapsulation, beide payload formats, en volledige geskenk wraps — gegenereer uit die JavaScript-verwysing en getoets deur beide toetsuite. Die wortelgeheim brei daardie fikstuur uit eerder as om dit te vervang: wortel na sade, wortel na sleutelpaar, die openbare vingerafdruk van die wortel, en die afgeleide sleutel, non
nympq1… 'N afwyking in beide implementasies misluk die bou eerder as om 'n boodskap te produseer wat die ander kliënt nie kan oopmaak nie.
Dit is wat 'n toestel vertel “dit is die wortel wat ek hou” van “dit is 'n ander een”, en 'n kliënt wat nie die vingerafdruk van 'n ander kliënt kon reproducer nie, sou 'n volmaakt goeie rekord lees as geen rekord nie - en dan, na Afdeling 3.3, 'n tweede wortel myn en die identiteit verdeel.
Nymchat is die Open bron onder die AGPL-3.0. Die kriptografiese kern wat hier beskryf word, is
js/nym-crypto.js en js/modules/pq.js in die web kliënt, en
lib/core/crypto/ met lib/features/identity/pq_registry.dart In die mobiele kliënte.
Vir die kortste, nie-tegniese verduideliking, sien die Knowledge Base bladsy op kwantum-weerstand kryptering.