Technyske whitepaper
Post-Quantum Key Agreement yn Nymchat
Distribúsje ML-KEM-768 publike sleutels oer Nostr sûnder in directory of in register, en seed them út in geheim dat gjin iepenbiere wearde blootstelt.
Om in post-quantum key exchange oan in messenger te voegen is meastlik gjin kriptografysk probleem. De primitives binne standert en de biblioteken binne. Tweede Dit papier beskriuwt hoe't Nymchat antwurde dat - wêr't de twadde sleutel komt, hoe't it de minsken berikt dy't it nedich hat, en wat de ynterface is gefoel om te befoarderjen oer it resultaat - en, yn it lêste seksje, wat dat resultaat net beskermt.
Dizze side is masine-oerset foar it gemak. It Ingelske orizjineel is de ferzje dy't jildt.
1It probleem
De private berichten binne ynkriptearre mei NIP-44De helte dy't scrambles de plaintext — ChaCha20 mei in HMAC-SHA256 tag, sleutel troch Hjoed (Oer klasseboek 5869It algorithm fan Grover kostet in square-root speedup tsjin in symmetryske sleutel, en 256 bits absorbearje dat. Ynsteld Op de sleutel is elliptysk-kurve Diffie-Hellman oer Hjoeddeistich 256k1Om in private sleutel fan syn iepenbiere kollega werom te krijen, blootst elke mienskiplike geheim dy't sleutel eartiids produsearre hat.
De dreiging dy't dit meitsje wurdt net ferwiderd oant in sa'n masine eksisteart. In fergeliker mei stockage kin opnimme encryptiontekst hjoed en ûntkripte it doe't de mooglikheid komt. Alles dy't no ferstjoerd wurdt dat noch wichtich is dan is al kompromittearre. Dit is de spesifike oanfal in post-quantum keyword-ûndersyk ferlies, en dat is de reden dat it wurk kin net wachten foar de masine te bouwen.
1.1 De fragen dy't dit papier antwurde
Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(Hjoed 203Dat stelt onmiddellik in distribúsjeprobleem op:
Om Alice hjoed te berichten, moatte jo ien ding nedich: har npub. Telle in post-quantum útwikseling en jo moatte in twadde - har ML-KEM iepenbiere sleutel.
In npub is self-contained. You can write it on paper, read it loud, or scan it from a screen, and it is all anyone needs to encrypt to you. A ML-KEM-768 publyske sleutel is 1,184 bytes. It kin net lêze loud, it sil net fitsje yn in brûkersnaam, en it belutsen net yn in QR-koade boppedat in identiteit dat is mar 32 bytes.
It harkere part is dat in twadde sleutel trije ferskillende problemen bringe, en de rest fan dit papier is in antwurd op harren:
- It kin net ferfongen wurde. In sleutel dy't niemand yn 'e blik leart, is krekt it soarte ding dat in oanfalder foar har eigen útwikselt. seksje 4 bindet it oan de identiteit mei in handtekening, dy't dit ien oerweldigje.
- It moat oankommen wurde yn alle apparaten fan in brûker. Itselde akkount op in telefoan en in laptop moat itselde sleutel presintearje, of berichten dy't ferdield wurde oan ien kin net op 'e oare geopene wurde.
- It kin verloren wurde. De iepenbiere sleutel is republikearre út in geheim, dus wat echt hat te oerleefjen is dat geheim - en troch konstruksje niks anders rekonstrueart it.
2Design begripen
De fjouwer beperkingen fersoarge it antwurd, en se útskeakelje de measte fan de iepenbiere ûntwerpen foardat gjin koade wurdt skreaun.
- Sa min geheimen as mooglik. Us brûkers hawwe al krekt ien geheim, de nsec. Elk ekstra geheim is in oare manier om jo histoary te ferliezen, en ien dy't wist om te backup in nsec sil net wist om te backup wat mear. Section 3.1 sjen dat dit ien net kin wurde fertsjintwurdlik - in post-quantum sleutel útfierd fan de nsec biedt gjin post-quantum beskerming yn alle gefallen - dus it ûntwerp spile krekt ien geheim en gjin mear: in ienige stuk fan sleutelmateriaal, generearre ien kear per identiteit, presintearre yn de selde foarm as de nsec en yn 'e selde plak, sa't elkenien weet hoe te hâlden ien weet hoe te hâlden de oare. Section 10.1 is eerlik oer wat dat noch kostet.
- No yn autoriteit. Der is gjin server dy't kin vertrouwd wurde om te sizzen dy't sleutel belutsen is fan wie.
- Mear apparaten, ien identiteit. In Nostr-identiteit wurdt gewoan brûkt fan ferskate kliïnten tegearre. Watter sleutelmateriaal der is, moat op alle fan harren identiteit endearje, en de paden dy't it der dragen, moatte sels net lesber wêze troch de tsjinsten dy't de funksje defindeart tsjin.
- No yn de onderhandelingen. Elke yn-band útwikseling fan “wat ciphers stypje jo?” is in oerflak dat in oanfalder kin strippje om de swakkere opsje te dwaan.
3In ûnôfhinklike geheim
De lading-bearing beslút is dat de ML-KEM decapsulation sleutel wurdt sjoen út sleutel materiaal dy't gjin iepenbiere wearde blootstelt.
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)
De wortel wurdt foar de brûker presintearre as in nsec is: Hjoed32 Yn de ûndersyk fan de Human-Readable Prefix.
nympqIt lêst as nympq1…, dy't oan 'e kant fan 'e nsec yn' e identiteitsskerm bûten itselde reveal-interaksje sjen is, kopiearre mei itselde kontrôle, nooit logged en gjin gewoane gewoane yn' e clear. It is gjin wachtwoord en it is gjin login.
De soal is domein-separated op doel, dus gjin oare geheimen kin eardere gefallen itselde sleutelpaar. epoch Yn de foarstelling fan de rûte (seksje 9).
3.1 Waarom de sleutel net kin útfierd wurde fan de identiteitssleutel
It iepenbiere ûntwerp is om de keywordpaar út it geheim dy't de brûker al hat:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
It is attraktiv foar fjouwer redenen, allegear echte: niks nije te backup, want de nsec is al de backup; elk apparaat dy't oankomme troch konstruksje, mei gjin synchronisaasje protokolle te gouden feroarge; ien ferfetsje oanmelde per identiteit is oankundigens korrekte, want apparaten kinne net oankommen oer de sleutel; en de sleutel besteande foardat it eartiids publisearre wurdt, dus in kliïnt kin iets foar him op 'e earste hân.
Alle fjouwer foardielen binne waardelose, om in reden. Shor's algoritme rjochtsje tsjin in publisearre npub yields de nsec. De seed derivation is in iepenbiere algoritme oer de nsec. Dus de opponent dy't brekt de klassike helte rekonstrueart de post-quantum helte troch te rjochtsjen itselde HKDF dy't alle anderen rjochtsje. tsjin oogst-nu-decrypt-later - de ienige dreiging dat de funksje eksisteart om te stoppen - in sleutel dy't op dizze manier ferwideret, fertsjintwurdiget niks.
De ML-KEM-dekapsulaasje sleutel moat komme fan entropy dy't noch ôfwurdlik is fan de nsec noch ien kear oerbrocht wurde ûnder klassike-alleen-kryptering.
In ûnôfhinklik generearre geheim dat dan synchroniseart tusken de apparaten fan in brûker yn in gewone NIP-44 berjocht is itselde mislukking mei ekstra stappen: in opponent registrearret dat berjocht hjoed en herstelt syn klassike sleutel letter, en de wortel falls út. Dat is de reden dat de pads yn 'e folgjende seksje de pads binne dy't se binne, en waarom gjin fan harren is “send it nei jo oare apparaat.”
3.2 Komme de wortel nei de oare apparaten fan de brûker
3 fan seksje 2 - ien identiteit, ferskate apparaten - kin net befetsje wurde troch aritmetyk hjir, want it hiele punt is dat de sleutel is net in funksje fan wat de apparaten al hawwe. nympq1… De eigen koade.
De wortel wurdt beskôge as nympq1… In apparaat dy't de koade net hat, kin net dielnimme, wat Section 4.2 beskriuwt.
De regel yn paragraaf 3.1 betsjut dat de wortel kin nooit reizen ûnder klassike-only encryption, en elke mekanisme dat soe meitsje dit automatysk - synchronisearjen it troch in relais, wrap it oan de identiteit sleutel - brekt krekt dat.
It format liedt ruimt foar in wrapped pad: in rekord kin in list fan wraps dragen, elk in AEAD blob ûnder in sleutel dy't de brûker op in oare apparaat kin reprodusearjen - in passkey PRF-output, bygelyks. nympq1… Yn § 10.1 is bepaald wat de kosten binne.
De rekken sels leeft yn syn eigen ynstellingskategory, nymchat-pq-rootSels it dragen fan gjin wraps it meitsje nedich wurk: syn presinsje is hoe't in twadde apparaat leart dat dizze identiteit al in wortel hat, dat is wat stopt it myntening in rivaal ien (Seksje 3.3).
De nymchat-pq-root Yn de kategory net Dat rûn draait de ienige kopie fan 'e wortel, dus seiljen it ûnder in sleutel dy't út de wortel komt, is in slot wiist de sleutel binne yn 'e kas: gjin apparaat kin it earst iepen, ynklusyf de dy't it skreaun hat. It is seild klassysk - NIP-44 oan harsel - of net yn alle gefallen. Dit is de ienste plak dy't ûntwerp aksepteart klassyske-enige beskerming, en it kin lûke: de rûn draait gjin wortel hjoed, mar it feit dat ien eksisteart.
Alle oare kategoryen fan ynstellings kinne en moatte de wortel-derivative sleutel brûke. Dit is de ienige útnoeging, en it is in útnoeging oer circularity ynstee as oer sterkte.
3.3 Generaasje en adoptie
Op boot, hâldt in duorsume identiteit, in kliïnt wurket yn dizze soarte:
- Sykje op in bestaande
nymchat-pq-rootDe rekord. - Record fûn, en dit apparaat kin it unwrap - adoptearje it en oankundige dizze identiteit as post-quantum mooglik.
- It rekken is fûn, en dit apparaat kin it net útwreide - meitsje gjin nije wortel, en publisearje gjin advertinsje yn alle gefallen. Befoarderje de brûker om dit apparaat te ferbine troch yn te
nympq1…De koade komt út in apparaat dat it al hat. - No rekken - generearje in wortel, publisearje de rekord, oankomme, en sjen de
nympq1…Koade oan de brûker ien kear, dy't se kinne bewarje it.
Stap 3 is de stap dy't maklik fergelykje, en dat is de reden dat de bestelling wurdt skreaun ynsteld ynsteld nei leafde nei elke útfiering. Twee apparaten dy't elk beslute om in wortel te generearjen produsearje twa ûnôfhinklike wortels ûnder ien identiteit, en dat is de mislukking dy't bestelling eksisteart om te foarkommen.
4De kapasiteit fan
De iepenbiere helte fan it derivative keywordpaar wurdt publisearre as adressabel.
Hjoed-01
event — type 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 betsjut dat de relay hâldt ien gebeurtenis per (kind, pubkey, d-tag), dus in republish ferfetsje de eardere oankondiging yn plak.
De handtekening is bindend. It evenemint wurdt tekene troch de identiteitssleutel, dus de claim “this ML-KEM-sleutel behoort oan dizze npub” is krekt sa sterk as de npub sels.
Advertinsjes binne útsteld. Yn 7 dagen NIP-40 De werjefte, herpublisearre alle 24 oeren, behâldt de rekord in statement oer in kliïnt dy't noch rûn is ynstee as ien dy't eartiids wie.
In mislearre aankondiging wurdt learde net as ien dy't noch gjin sleutel drage: peers stjoere ordinêre NIP-44, dy't elke ynlogging kin lêzen, en de kliïnt resintearret de post-quantum útwikseling op syn folgjende ferbining, doe't it republiseart. Dus rjochtsje foar langer as in wike kostet beskerming foar de berichten ferstjoerd yn 'e gaping - se binne klassike encrypted ynstee as quantum-resistant - en kostet niks anders.
Dat asymmetry is de reden foar it útwreidjen ynstee as in aksje fan it. sûnder ien, in rekst oerleeft de sleutel dy't it neamd: in apparaat dat is wiped, reset, of hat syn wortel ferfongen liedt in standing ynstruksje om te ynkapsulearjen nei in sleutel dy't niemand hâldt noch mear, en berichten ferstjoerd ûnder it binne ferlitte sûnder gjin fergelyk op beide kanten.
De keyweld neamt syn format. De fjild is pk2De skriuwer dy't it fjild net erkent, slút de “Nymchat-kliïnt, gjin post-kwantum-kleu” en sendt gewoane NIP-44, dy't elke ynlogging kin lêze. Dat is de korrekte mislukking rjocht, en it is de moeite waard om te stellen as in rjochtregel de format nummering is om te dwaan: in unrecognized kapasiteit claim moat kosten beskerming, nooit levering. In sleutel in peer kin net brûke is erger as gjin sleutel yn alle gefallen, want it berjocht dat it produsearret is verloren mei gjin fout op beide kanten.
4.1 Absence is betekenisvol, en trije-gewaardearre
In subtiel, mar wichtich detail: de aankondiging wurdt publisearre troch elke Nymchat-kliïnt, net allinich de post-quantum-kapabele, en it keyweld is opsjonele.
| Observearre | Middels | Skriuw dy yn |
|---|---|---|
| Advertinsje mei in sleutel | Nymchat, post-quantum mooglik | Hybride |
| Ynsteld, gjin sleutel yn alle gefallen | Nymchat, klassike allinich - post-quantum off, of in apparaat dy't noch net ferbûn is mei de wortel fan 'e identiteit | De klassike NIP-17 |
| No oanmelden | Unknown client. Miskien is elke brûker fan Nostr of Bitchat | Klassike, plus in kompatibiliteit wrap |
In keyless oankondiging is in tekene ferklearring dat de ferstjoerder rjochtet Nymchat, dy't de sending pad skippe in spekulearre cross-protocol wrap dat it oars moatte omfetsje foar elkenien dy't se net identifisearje kinne.
4.2 In apparaat dy't de wortel net iepene kin, bliuwt stil.
De oankundiging is feroarlik: ien event per identiteit, lêste skriuwen wint. Dat is wat makket it single-record-ûntwerp wurkje, en it is ek wat makket in unlinked apparaat gevaarlik as it publiseart. In apparaat dat in sleutel bekend makke dat it foar him mynde hie, soe de echte rekord kloppe en elk peer stjoere nei encryption ûnder in sleutel dy't de oare apparaten net iepen kinne.
Sa is in apparaat dy't in wortel ken, existet, mar kin it net iepen meitsje, publisearret gjin aankondiging yn alle gefallen. It is net gebroken en it is net lokaas út de applikaasje: it liedt noch alle berichten dy't de sleutels foar hat en stjoert noch klassyk, wylst it de brûker oanmelde om it te ferbine. Silence is it korrekte gedrach foar in apparaat dat net kin spreken foar de identiteit.
5De ûntdekking en de sending beslút
Kliïnten leare peer's keys op twa manieren. In standing-abonnement dekt de minsken dy't in brûker wer korrespondeart mei - iepene konversaasjes en groepsleden - dus harren oankundigingen komme as ordinêre eveneminten. Foar in peer meet foar de earste kear, in one-shot fraach rûn by send tiid, begrensd oan 2,5 sekonden; as it net oplost, de berjocht komt klassike, dat is it gedrach dat bestudearre waard foardat post-quantum waard oanfongen, ynsteld as in nije mislukkmodus.
In brûker dy't ferbûn in nije apparaat, of dy't ferwideret fan in browser-extension login nei in lokale sleutel, wurdt post-quantum mooglik mid-conversation, en in permanent cache “no” soe hâlde harren op klassike encryption foar it libben fan de advertinsje.
5.1 Waarom is der gjin downgrade-aanval
De routingbeslút fergrutset nei in ienige fraach:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Der is gjin kapasiteit onderhandeling, gjin stipe-algorithmen list, en gjin fjild in oanfalder kin klaren om te dwaan in swakkere pad. is De mislukkmodus fan in stripped of withholded oankundiging is dat it berjocht klassike wurdt - de status quo foardat dizze funksje - ynstee as dat in hybride oankundiging wurdt ôfgrutte nei wat fergelykber is.
De omgekearde hâldt ek en wichtiger: in klant sendt hybride Allegearre Der is gjin steat yn dy't in berjocht post-quantum wurdt ferstjoerd nei ien dy't it net kin lêzen.
6Hybride konstruksje
In unmodified NIP-44 ciphertekst is de ynterne layer, en ML-KEM keyst in eksterne AEAD om it:
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 geheimen moatte noch ûntdekke wurde om de boodschap te lêzen: de bûtenlânske laag leveret allinich in NIP-44-stiftertekst, en de opening dy't de klassike ECDH nedich hat. In kwantum-opponent dy't brekt secp256k1 krije de ynterne sleutel en hâlde ML-KEM oan; in brek fan ML-KEM striuwt de bûtenlânske laag en liedt NIP-44 standant.
kem_ssNoch ien ding yn dizze derivative berikt de raw ECDH-output, dat is wat Section 6.1 draait op.kem_ct,recip_kem_pkEn beide identiteit sleutels binne boande yn as ferbûn gegevens, dus de eksterne layer is boud oan de eksakte transkripsje dy't it produsearre.
De ML-KEM-sleutel fan 'e ûntvanger is langlebig, mar elk berjocht draait in ûnôfhinklike cifertekst en dêrom in ûnôfhinklike
kem_ssDat is wat makket deriving de nonce ynstee as randomize it klinken:
ChaCha20-Poly1305 yn Ljouwert
It is gebroken troch it re-brûken fan in (key, nonce) paar, en hjir is de sleutel sels nije foar elke berjocht, dus gjin paar kin herhaalje.
6.1 Hoekom de lagen bliuwe separe
De alternatyf is om beide geheimen te mengen yn ien konversaasje sleutel en handele dat nei NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Dat konstruksje is lûd as kriptografie. It hat ien struktuerprobleem: it
ecdh_xOer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(NIP-07It earste krantsje kaam út yn april (NIP-46It útfierd NIP-44 yn 'e naam fan' e roeper en hâldt werom in encryptertekst, dat is it hiele punt fan hâlding fan de sleutel wêr't de applikaasje net kin berikke.
Om de geheimen dêrom te ferbinen, fergrutsje elke ynlogging dy't de identiteitssleutel yn in signer behâldt, dat is om de meast foarsichtige brûkers te wêzen, en gjin hoeveelheid wurk op de sleutelderivatie kin it feroarjen. Layering ferwideret de ôfstân: NIP-44 bliuwt heule en wurdt produsearre troch wat de identiteitssleutel hat, signer ynklusyf, wylst de KEM helte berekke wurdt út de herstelcode dy't de kliïnt direkt hâldt.
De kosten binne bandbreedte, en it is net lytse. De ML-KEM ciphertext is 1,088 bytes en rides op elke berjocht, base64url-coded nei 1,451 karakters; de eksterne AEAD fertsjintwurdiget in 16-byte Poly1305 tag en fergrutset de NIP-44 payload it wraps mei in tredde. In 50-karakterbericht groeit fan 176 bytes nei 1,712, en in 2000-karakterbericht ien fan 2,820 nei 5,238. De vloer is likernôch 1,5 KB per berjocht ôfhinklik fan hoe kort it berjocht is, dat is de priis fan ynkapsulearjen ferslein elke tiid ynsteld as it re-brûkjen fan in mienskiplik geheim.
6.2 Self-describing payloads
De pq2. Prefix makket de útstjoering inkrementele: it is self-descriptive, dus in kliïnt kiest it decryption pad troch te inspektearjen de payload ynstee as troch te vertrouwen in tag of te herinneren wat in peer stypje. In reader dy't net erkenne in prefix mislearre te iepen dat payload ynstee as mislearre it, en berichten ferdield foardat beide kanten kinne post-quantum bliuwe lesber as ordinêre NIP-44 sûnder gjin migrasje.
De ML-KEM-dekapsulaasje is ûntwurpen om nooit te falen: fanwege in misformearre ciphertekst, de Fujisaki-Okamoto-transformaasje kearret in deterministyske pseudo-random geheim ynstee as in falen. In falen sleutel dus net oerflakje by de KEM-layer yn alle gefallen - it oerflakke as in HMAC-falen yn NIP-44, dat is de same manier as in falen klassike sleutel oerflakken. Callers behandele beide identysk, dus it falen draait gjin ûnderskiedingssignaal.
6.3 Beide lagen fan de gift wrap
A NIP-17 Private messaging is in NIP-59 Gift wrap: in unsignearre gerucht, ferdield ûnder de identiteitssleutel fan 'e ferstjoerder (type 13), dan wrapped ûnder in gout-key generearre per berjocht (type 1059). Op in login dy't de identiteitssleutel direkte hâldt, hybridisearret Nymchat beide lagen, elk mei syn eigen encapsulation.
De seal wurdt produsearre troch de signer as ordinêre NIP-44 - de applikaasje sjogge nooit de sleutel dy't it meitsje - dus it kin net hybridisearre wurde yn plak. Dit kostet niks tsjin de oanval yn kwestie: it seal is berikt allinich troch de wrap, en de wrap is wat in rekker stores.
7Grutte berichten en dielnimmende dekking
In groepsboodskap is net ien stiftertekst. It is itselde plaintekstiid útfûn oan elk lid, elk kopy ynkapsulearre oan it eigen ML-KEM-sleutel fan dat lid. In lid dy't in sleutel publisearre hat, krije in hybride wrap; ien dy't hat gjin klassike wrap.
Dit meitsje in boekhoudingsprobleem dat in naïeve útfiering fergelykje. As acht fan tien leden in hybride kopie krije, is it berjocht net In opponent hat in klassike kopie fan in plaintext dy't identysk is yn alle tien, dus it berjocht is beskerme mar as elk De kopie is.
Nymchat folgje dêrom per-message dekking yn 'e fan-out - it tellen is allinich bekend wylst de wraps wurde boud - en it badge rapportearret “quantum-resistant nei 8 fan 10 leden” ynstee fan bewearden dat it berjocht is beskerme. Skriuw dy yn groepsboarch (alleen de ferstjoerder telt de fan-out), de ynterface rapportearret partliks eerder as folsleine beskerming.
7.1 Wat de Shield rapportearret
De skriuwer stelt de waarheid oer de Beskriuwing, net oer de software dy't it sendte:
- Full Protection: Elke kopie fan dizze plaintext gie út hybride.
- Partial: guon kopysjes fan in groepsboodskapje gien klassysk út. Draaid degraded ynstee fan folslein, omdat ien klassike kopy fan in plaintext identyk yn alle fan harren is allegear in opponent behoeften.
- Klassike wurdt útfierd ynsteld ynsteld as gjin badge, omdat in absint ynstrumint is ambiguous tusken “unprotected”, “broken”, en “this build feart de funksje”.
De fertsjintwurdiging wurdt registrearre doe't it berjocht is ferdield ynstee fan wat in peer reklamearret letter. Ciphertext dy't al bestean kin net better beskerme wurde as it wie, en in ynterface dy't reservearre âlde berichten op de krêft fan in nije oankondiging soe bewearde wat falsk oer bytes op in relay.
De groepsregels boppedat stack op it boppestean fan dit ynstee as it ferfetsje it: in groepsboarch wurdt folslein beskerme allinnich doe't de kopie fan elk lid is, en in fertsjintwurdigende groepsboarch mei gjin dekking telle sjen partile.
8Skriuw dy yn foar jo eigen
In protte dingen dy't in kliïnt stjoert wurde ynkriptearre nei de eigen identiteit fan de brûker: synchronearre ynstellingen, de konversaasje list, groep sleutels, en it berjocht arkyf. Dêrtroch drage dizze mear oer in brûker as de measte ienfâldige berichten doe, dus litte se klassike meitsje se it swakste stjoerde artefakt ûnôfhinklik fan hoe sûnens de berichten sels wurde stjoerd. nymchat-pq-root De kategory sels, dy't kin net ferdield wurde ûnder in sleutel dy't allinnich kin produsearjen.
In ynstellingsblob of in arkyfried sit yn ien plak foar jierren, dat is krekt de foarm fan it ding dat in oogst-nu-decrypt-later tsjinsten sammelje - heul mear as in ienige berjocht, dat is op syn minst efemeraal yn 'e brûker's eigen gedach.
Ien beperking rjochtet it format hjir ynstee as de sleutel. A self-addressed copy must be readable by elk It apparaat is op 'e akkount, dus elk apparaat reklamearret wat it kin iepenjen yn it plak dat syn oankondiging draait, en it akkount skriuwt allinnich wat se allegear kinne lêze.
Dat is in bewuste konsekwinsje, net in oersjoch, en dat is de reden dat Section 3.3 in sa'n apparaat prompt hat foar ferbining ynstee fan minting in ferske wortel: in twadde wortel sil de blob net lesber meitsje, it sil allinnich de identiteit syn sleutelmateriaal yn twa splitje.
In apparaat dy't in browserextensie of in remote signer (NIP-46) draait, hâldt gjin nsec om út te krijen, mar it hâldt de herstelcode, en ûnder de layered konstruksje fan Section 6.1 dat is alles wat de post-quantum helte nedich is: de signer produsearret de NIP-44-layer as it altyd hat, en de kliïnt keyst de eksterne layer sels.
9Rotaasje
De epoch Counter yn de derivation is wat makket rotatie mooglik sûnder nije sleutel materiaal. Incrementing it fertsjintwurdiget in ferske sleutelpaar út de selde wortel en in republisearre oankundiging; peers pick up de nije sleutel út de ferwiderbare rekord.
9.1 Oare epoches wurde bewarre, en niks wurdt re-encryptearre
In kliïnt bouwe decryption kandidaten fan 'e hjoeddeistige epoch nei 'e epoch − 3, dus in berjocht stjoerd net foardat in rotatie noch iepen foar it keywartpaar dat wie hjoeddeistige doe't it is ferstjoerd.
Dat venster is wat rotatie beskermje te meitsjen yn alle gefallen: sûnder it, elke rotatie soe strjitte wat wie yn flecht. Alles al ferdield bliuwt lesber foar it libben fan de identiteit, omdat in berjocht dy't de brûker net langer kin iepen is strikt slechter foar harren as ien dy't beskerming kin net ferbettere retroactive (Seksje 10.5).
10Wat it net beskermje
In papier dat allinich listet wat in ûntwerp berikt, beskriuwt in systeem net, en overstating in beveiligingseigens yn in ynterface is erger as om it út te nimmen.
10.1 De wortel is in twadde geheim, en it verliezen is unrecoverable.
Dit is de echte priis fan it ûntwerp. De beperking yn seksje 2 dat in brûker krekt ien ding te bewarjen kin hat, kin net foldwaan wurde: de nsec allinich rekonstrueart de post-quantum sleutel net, want it hiele punt is dat gjin iepenbiere wearde en gjin oare geheimen it eksposearje. As gjin apparaat de wortel hâldt en gjin fan de wraps fan seksje 3.2 kin opnommen wurde, is materiaal ferdield oan de wortel-derivate sleutel net herstelbere.
Mei manuele oerdracht de ienige pad, dit is skarpder as it earst kin lêzen. nympq1… Koade oeral hat krekt ien kopie fan it, op ien apparaat, en ferlies dat apparaat verliest elke post-quantum berjocht, ynstellings blob en arkyf rjochter ferdield oan it.
nsec Dat is no goed, dat is de eigendom op dy't it hele design berikt.
In oanfalder oanfallen de goedkoopste pad beskikber, dus in skema is waard wat syn swakste herstelroute is waard - in memorabele passphrase, bygelyks, sil set it hiele ding op wat de passphrase is waard, en de wrapped rige is krekt it artefakt in hark-nu-decrypt-later ynspiraasje sammelet en grinds offline yn freegje.
10.2 Authentication, as fergelykje fan konfidencialiteit
Elke handtekening yn Nostr is Schnorr oer secp256k1, en dat is net feroare hjoed. In teenstander mei in quantum kompjûter kin handtekeningen meitsje en in brûker yn real-time foarlêze. Wat de hybride sleutelburo ferlies is harken-now-decrypt-later: in oanfalder opnimming ferkeap hjoed kin net lêzen it later. It makket in berjocht unforgivable tsjin in teenstander dy't al de masine hat. Dit ferliking wurdt tafoege yn de applikaasjes doelbewust - de padlock-indicator rapportearret authentication, it skild rapportearret konfidensialiteit, en se binne separe glyphs omdat in berjocht kin hawwe ien sûnder de oare.
It begjint ek wat de oankundiging yn seksje 4 kin belooft. De binding tusken in npub en in ML-KEM-toets is in secp256k1 handtekening, dus in fergeliker dy't dy't kin falsearje, kin in eigen sleutel ferfetsje.
10.3 Metadaten
De titel betsjut: "Fjirtichtûzen yn Gehenna" (Gehenna is in oare namme foar de hel). p De tag, de soarte en de timestamp fan it ynterne berjocht. It skriuwt net dat in evenemint is, syn grutte, of doe't in relay it krige. Traffic analyze is net oanwêzich troch gjin part fan dit ûntwerp.
10.4 De offline mesh
Nymchat's Bluetooth mesh transport is in separe protokoll mei syn eigen handshake, en it is net dekt troch dit wurk.
10.5 Meldingen dy't al ferstjoerd binne
Ciphertext opnommen wylst beide kanten noch klassike klassike bleaft klassike permanent. It is al beskikber en kin net re-sealed wurde. Beskerming begjint by it berjocht dêr't beide kanten hielden post-quantum sleutels, net op it moment dat de funksje waard ynskreaun.
11Alternatyf besykje
| Approach | Wêrom no |
|---|---|
| Derivearje de post-quantum sleutel út de identiteit sleutel | De derivaasje is in iepenbiere algoritme oer de nsec, en in kwantum-ûndersiker ûntwerpt de nsec út de publisearre npub, dus brek de klassike helte hân oer de post-kwantum helte mei it. |
| Sende de wortel nei de oare apparaten fan de brûker via NIP-44 | In wortel ferstjoerd under classic-only encryption is recoverable troch elkenien dy't registrearre dat berjocht en brekt syn sleutel later, dat is de tsjinsten de wortel is om te stoppen. |
| In separatyf generearre ML-KEM-toetspaar op elk apparaat | Rejected. Devices moatte ferskate decapsulation keys hâlde, en ien ferfetsbere advertinsje per identiteit kin net alle keuzes drage. Peers soe encryptearje nei de sleutel dy't de lêste waard publisearre, en alle oare apparaten sil net kinne lêze it resultaat. Ien wortel per identiteit, befoarderd troch Section 3.2's pads, is wat dat foarkomt. |
| Wrap de wortel ûnder in pin | Rejected. A four-digit PIN is likernôch 13 bits tsjin in offline oanfalder hâldt de wrapped rige. Offerjen it by twa 256-bits pads soe misrepresintearje wat de swakste wrap waard. |
| Utjûn de npub om beide sleutels te dragen | 1,184 bytes is net in shareable identifier, en it soe brekje elke besteande Nostr-kliïnt fan parsearje fan in adres dat is definiearre as 32 bytes. |
| Key Directory tsjinst | Reintroducearret de autoriteit dat it netwurk is om te ferwiderjen. |
| Skriuw dy yn foar elke boodschap | It lûkt niks: de ferstjoerder hat de De ûntfanger De sleutel foar it earste berjocht, dat is krekt it gefal mei gjin eardere berjocht om it te dragen. |
| In-band kapasiteit ûnderwiis | Skriuwt foar in downgrade-oppervlak. In oanfalder dy't in kapasiteitflagge kin striuwe, dwaan it klassike pad. |
| Alleen post-quantum, gjin klassike leg | It giet om decennia fan analyse fan secp256k1 yn ruil foar in veel jongere primitive. beide De faak. |
12Pariteit ynfiering
Nymchat leveret twa ûnôfhinklike útfieringen fan dizze konstruksje - ien yn JavaScript foar de webapplikaasje, ien yn Dart foar de mobile applikaasjes, ynklusyf in fraach ML-KEM-768-poart.
De implementering fan de Dart ML-KEM wurdt validearre tsjin de offisjele
Yn de ACVP
Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(ML-KEM-*-FIPS203) — 25 sleutel-generaasje, 25 encapsulation en 10 decapsulation cases, rjochte as harren eigen suite. Dit binne de vectors NIST publisearret om te validatearjen in implementation, dus passing them is bewiis dat de poart is korrekte, net bloot bewiis dat de twa kliïnten oanhâlden mei elkoar. Boppedat, in mienskiplike fixture fan test vectors — seed derivation, encapsulation, beide payload formats, en komplete gift wraps — wurdt generearre út de JavaScript referinsje en kontrolearre troch beide test suites. De root secret útwreidet dat fixture ynstee as it ferfetsje: root to seed, root to keypair, de Public fingerprint fan de wortel, en de derived keyword, nonce en gearwurke gegevens fan de
nympq1… In divergence yn beide implementaties mislearre de build ynsteld as it produsearjen fan in berjocht dy't de oare kliïnt kin net iepen.
It is wat in apparaat “dit is de wortel ik hâld” fan “dit is in ferskillende one”, en in kliïnt dy't de fingerprint fan in oare kliïnt net kon reprodusearjen, soe in perfekt goede rekord lêze as gjin rekord yn alle gefallen - en dan, nei Section 3.3, mynten in twadde wortel en split de identiteit.
Yn Nymchat Yn Open Source Under de AGPL-3.0. De kriptografyske kern beskreaun hjir is
js/nym-crypto.js en js/modules/pq.js Yn de webside, en
lib/core/crypto/ Yn lib/features/identity/pq_registry.dart Yn de mobile klanten.
Foar de kortere, net-technyske ferklaring, sjoch de Skriuw dy yn foar quantum-resistant encryption.