Nymchat whitepaper tehnică
Acordul de cheie post-quantum în Nymchat
Distribuirea cheilor publice ML-KEM-768 pe Nostr fără un director sau un registru și însămânțarea lor dintr-un secret pe care nici o valoare publică nu îl dezvăluie.
Adăugarea unui schimb de chei post-quantum la un mesager nu este în mare parte o problemă de criptografie.Primitivele sunt standardizate și bibliotecile există.Partea dificilă este că fiecare participant are nevoie acum de un a doua Acest document descrie modul în care Nymchat răspunde la aceasta – de unde vine a doua cheie, cum ajunge la persoanele care au nevoie de ea, și ce interfață este permis să pretindă despre rezultat – și, în ultima secțiune, ce acest rezultat nu protejează.
Această pagină este tradusă automat pentru comoditate. Originalul în limba engleză este versiunea care se aplică.
1Problema
Mesajele noastre private sunt criptate cu NIP-44, care are două jumătăți separabile. jumătatea care scramblează textul simplu – ChaCha20 cu o etichetă HMAC-SHA256, HKDF (RFC 5869- nu este amenințat în mod semnificativ de un calculator cuantic; algoritmul lui Grover costă o accelerare cu rădăcină pătrată față de o cheie simetrică, iar 256 de biți absoarbe acest lucru. Sunt de acord Curba eliptică Diffie-Hellman Cuvânt cheie: 256k1Recuperarea unei chei private de la omologul său public expune retroactiv fiecare secret partajat pe care cheia l-a produs vreodată.
Amenințarea pe care aceasta o creează nu este amânată până când o astfel de mașină există. Un adversar cu stocare poate înregistra textul criptografic astăzi și îl poate decripta ori de câte ori capabilitatea ajunge. Orice lucru trimis acum care încă mai contează atunci este deja compromis. Acesta este atacul specific pe care un schimb de chei post-quantum îl înfrânge și acesta este motivul pentru care munca nu poate aștepta ca mașina să fie construită.
1.1 Răspunsurile la această întrebare
Este bine de înțeles atenuarea: rulați un mecanism de încapsulare a cheii post-quantum alături de schimbul clasic, astfel încât un atacator trebuie să rupă ambele pentru a citi orice.Păpușă 203Acest lucru ridică imediat o problemă de distribuție:
Adăugați un schimb post-quantum și aveți nevoie de un al doilea – cheia publică ML-KEM.
Un npub este auto-conținut. Puteți să-l scrieți pe hârtie, să-l citiți cu voce tare sau să-l scanați de pe un ecran și este tot ceea ce oricine are nevoie să vă cripteze. O cheie publică ML-KEM-768 este de 1,184 byte. Nu poate fi citit cu voce tare, nu se va potrivi într-un nume de utilizator și nu aparține unui cod QR în afară de o identitate care are doar 32 de byte.
Partea mai dificilă este că o a doua cheie aduce trei probleme distincte, iar restul acestei lucrări este în mare măsură un răspuns la ele:
- poate fi înlocuită. O cheie pe care nimeni nu o poate citi dintr-o privire este exact genul de lucru pe care un atacator îl schimbă pentru ei înșiși. Secțiunea 4 o leagă de identitate cu o semnătură, care o stabilește pe deplin.
- Trebuie să fie compatibil pe toate dispozitivele unui utilizator. Același cont pe un telefon și un laptop trebuie să prezinte aceeași cheie, sau mesajele sigilate la unul nu pot fi deschise pe celălalt.
- Poate fi pierdut. Cheia publică este republicată dintr-un secret, deci ceea ce trebuie să supraviețuiască este acel secret – și prin construcție nimic altceva nu îl reconstruiește.
2Constrângeri de design
Patru constrângeri au modelat răspunsul și exclud majoritatea design-urilor evidente înainte ca orice cod să fie scris.
- Cât mai puține secrete. Utilizatorii noștri poartă deja exact un secret, nsec. Fiecare secret suplimentar este un alt mod de a vă pierde istoria, iar cineva care știe să se backupeze un nsec nu va ști să se backupeze nimic altceva. Secțiunea 3.1 arată că acesta nu poate fi îndeplinit în mod direct - o cheie post-quantum derivată din nsec nu oferă protecție post-quantum deloc - astfel încât designul cheltuiește exact un secret și nu mai mult: o singură bucată de material cheie, generată o dată pe identitate, prezentată în aceeași formă ca și nsec și în același loc, astfel încât oricine știe cum să păstreze una știe cum să păstreze cealaltă.
- Nici o autoritate. Nu există nici un server care să poată fi de încredere pentru a spune care cheie îi aparține cui.
- Mai multe dispozitive, o singură identitate. O identitate Nostr este utilizată în mod obișnuit de mai mulți clienți simultan. Orice material cheie există trebuie să se încheie identic pe toți, iar căile care o poartă acolo nu trebuie să fie citibile de adversarul împotriva căruia se apără caracteristica.
- Nici o negociere. Orice schimb în bandă de “ce cifre susțineți?” este o suprafață pe care un atacator o poate rupe pentru a forța opțiunea mai slabă.
3Un secret rădăcină independentă
Decizia de încărcare este că cheia de decapsulare ML-KEM este semănată din material cheie pe care nici o valoare publică nu îl expune.
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)
Rădăcina este prezentată utilizatorului în modul în care este prezentat un nsec: Băsescu 32 Cu prefixul uman-citibil
nympqDe aceea, se citeşte ca nympq1…, afișat lângă nsec în ecranul de identitate din spatele aceleiași interacțiuni de dezvăluire, copiat cu același control, niciodată înregistrat și niciodată trimis oriunde în clar.
Sarea este separata de domeniu in mod intentionat, asa ca nici un alt secret nu poate obtine aceeasi pereche de chei. epoch Conductor de rotație (secțiunea 9).
3.1 De ce cheia nu poate fi derivată din cheia de identitate
Design-ul evident este de a semăna cheieparul din secretul pe care utilizatorul îl are deja:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Este atractiv din patru motive, toate reale: nimic nou de backup, pentru că nsec-ul este deja backup; fiecare dispozitiv care este de acord prin construcție, fără nici un protocol de sincronizare să meargă greșit; un anunț înlocuibil pe identitate fiind evident corect, deoarece dispozitivele nu pot fi de acord cu privire la cheie; și cheia existentă înainte de a fi vreodată publicată, astfel încât un client să poată sigila ceva pentru el însuși în primul rând.
Toate cele patru beneficii sunt inutile, dintr-un motiv. Algoritmul lui Shor care rulează împotriva unui npub publicat produce nsec. Derivarea semințelor este un algoritm public peste nsec. Deci adversarul care rupe jumătatea clasică reconstruiește jumătatea post-quantum rulând același HKDF pe care îl rulează toți ceilalți.
Cheia de decapsulare ML-KEM trebuie să provină de la entropie care nu este nici derivabilă din nsec, nici niciodată transmisă sub criptare clasică-numai.
O secretă generată independent, care este apoi sincronizată între dispozitivele unui utilizator în interiorul unui mesaj NIP-44 obișnuit, este aceeași eșec cu pași suplimentari: un adversar înregistrează acel mesaj astăzi și își recuperează cheia clasică mai târziu, iar rădăcina cade.
3.2 Obținerea rădăcinii către celelalte dispozitive ale utilizatorului
Constrângerea 3 din Secțiunea 2 – o identitate, mai multe dispozitive – nu poate fi satisfăcută aici prin aritmetică, pentru că întregul punct este că cheia nu este o funcție a ceva ce dispozitivele deja împărtășesc. nympq1… Codul în sine.
Rădăcina este prezentată ca nympq1… lângă nsec, iar un al doilea dispozitiv îl acceptă lipit în același panou. Aceasta este întregul mecanism. Un dispozitiv care nu a primit codul nu poate participa, ceea ce descrie Secțiunea 4.2.
Regula din Secțiunea 3.1 spune că rădăcina nu poate călători niciodată sub criptarea clasică numai, iar orice mecanism care ar face acest lucru automat – sincronizarea prin intermediul unui relay, înfășurarea acestuia cu cheia de identitate – încalcă exact acest lucru.
Formatul lasă loc pentru o cale înfășurată: o înregistrare poate purta o listă de înfășurări, fiecare un blob AEAD sub o cheie pe care utilizatorul o poate reproduce pe un alt dispozitiv - o ieșire PRF passkey, de exemplu. nympq1… Codul este singura cale de trecere. secțiunea 10.1 precizează cât costă.
Înregistrarea în sine trăiește în propria sa categorie de setări, nymchat-pq-rootChiar dacă nu poartă învelișuri, face lucrarea necesară: prezența sa este modul în care un al doilea dispozitiv învață că această identitate are deja o rădăcină, ceea ce îl împiedică să mintă pe unul rival (secțiunea 3.3).
pe nymchat-pq-root Categorie trebuie nu Această linie poartă singura copie a rădăcinii, astfel că sigilarea sub o cheie derivată de la rădăcină este o încuietoare a cărei cheie este în interiorul cutiei: niciun dispozitiv nu a putut să o deschidă vreodată, inclusiv cel care a scris-o. Este sigilată clasic - NIP-44 în sine - sau nu deloc.
Toate celelalte categorii de setări pot și ar trebui să utilizeze cheia rădăcină derivată. Aceasta este singura excepție și este o excepție cu privire la circularitate, mai degrabă decât cu privire la rezistență.
3.3 Generație și adopție
La pornire, având o identitate durabilă, un client funcționează în această ordine:
- În căutarea unui existent
nymchat-pq-rootÎnregistrări . - Înregistrarea a fost găsită, iar acest dispozitiv îl poate debloca – să o adopte şi să declare această identitate ca fiind post-quantum capabilă.
- Înregistrarea a fost găsită, iar acest dispozitiv nu o poate debloca — nu generați o nouă rădăcină și nu publicați deloc anunțuri.
nympq1…codul de pe un dispozitiv care îl are deja. - fără record — generați o rădăcină, publicați înregistrarea, anunțați și afișați
nympq1…codul utilizatorului o dată, astfel încât acesta să îl poată salva.
Pasul 3 este pasul care este ușor de greșit și este motivul pentru care ordinea este scrisă mai degrabă decât lăsată fiecărei implementări.Două dispozitive pe care fiecare decide să genereze o rădăcină produc două rădăcini independente sub o singură identitate, și asta este eșecul pe care acest ordonare există pentru a preveni.
4Anunțul capacității
Jumătatea publică a perechei de chei derivate este publicată ca adresabil
Năstase-01
eveniment — tip 30078, etichetat 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": [ ... ]
}
}
Adresabil înseamnă că relay-ul păstrează un eveniment pe (kind, pubkey, d-tag), astfel încât o republica înlocuiește anunțul anterior în locul său.
Semnătura este obligatorie. Evenimentul este semnat de cheia de identitate, astfel încât afirmația “această cheie ML-KEM aparține acestei npub” este exact la fel de puternică ca npub-ul în sine. Înlocuirea unei chei de încapsulare diferite necesită forjarea unei semnături secp256k1. Un atacator care poate face acest lucru nu trebuie să se deranjeze cu KEM-ul.
Anunțurile expiră. O zi de șapte NIP-40 expirarea, republicată la fiecare 24 de ore, păstrează în evidență o declarație despre un client care este încă în funcțiune, mai degrabă decât una care a fost.
Un anunț ratat este citit exact ca unul care nu a purtat niciodată o cheie: colegii trimit NIP-44 obișnuit, pe care fiecare conectare îl poate citi, iar clientul reia schimbul post-quantum la următoarea conexiune, când se publică din nou. Așadar, tăcerea timp de mai mult de o săptămână costă protecția mesajelor trimise în timpul decalajului - acestea sunt clasic criptate, mai degrabă decât rezistente la cuantice - și nu costă nimic altceva.
Fără una, o înregistrare depășește cheia pe care o numește: un dispozitiv care este șters, resetat sau are rădăcina înlocuită lasă o instrucțiune în picioare de a încapsula la o cheie pe care nimeni nu o mai deține, iar mesajele trimise sub ea sunt pierdute fără erori pe oricare dintre părți.
Câmpul cheie își numește formatul. Câmpul este pk2, și cifra este o parte a contractului mai degrabă decât decorarea: numește formatul de sarcină utilă cu care poate fi utilizată cheia. Un cititor care nu recunoaște câmpul încheie clientul “Nymchat, nici o cheie post-quantum” și trimite NIP-44 obișnuit, pe care fiecare conectare îl poate citi. Aceasta este direcția corectă a eșecului și merită menționată ca regulă numărarea formatului există pentru a impune: o revendicare a capacității nerecunoscută trebuie să coste protecție, niciodată livrare. O cheie pe care un coleg nu o poate folosi este mai rău decât nici o cheie deloc, deoarece mesajul pe care îl produce este pierdut fără eroare pe ambele părți.
4.1 Absența este semnificativă și triplă
Un detaliu subtil, dar important: anunțul este publicat de fiecare client Nymchat, nu numai de cei capabili de post-quantum, iar câmpul cheie este opțional.
| Observată | Mijloace | Trimiteți comportamentul |
|---|---|---|
| Anunț cu cheie | Nymchat, post-quantum capabil | hibridă |
| Anunț, fără cheie | Nymchat, clasic numai - post-quantum off, sau un dispozitiv care nu este încă legat de rădăcina identității | Articolul următorNIP-17 |
| Fără anunț | Client necunoscut. ar putea fi orice utilizator Nostr sau Bitchat | Clasic, plus un ambalaj de compatibilitate |
Un anunț fără cheie este o declarație semnată că expeditorul rulează Nymchat, care permite trimiterii să treacă o înveliș speculativă de protocol încrucișat pe care altfel ar trebui să o includă pentru oricine nu poate identifica.
4.2 Un dispozitiv care nu poate deschide rădăcina rămâne tăcut
Anunțul este înlocuibil: un eveniment pe identitate, ultima scriere câștigă.Acesta este ceea ce face ca designul de înregistrare unică să funcționeze, și este, de asemenea, ceea ce face ca un dispozitiv fără legătură să fie periculos dacă publică.Un dispozitiv care a anunțat o cheie pe care a inventat-o pentru el însuși ar bloca înregistrarea reală și ar trimite fiecare coleg la criptare sub o cheie pe care celelalte dispozitive nu o pot deschide.
Deci, un dispozitiv care cunoaște o rădăcină există, dar nu o poate deschide, nu publică anunțuri deloc. Nu este rupt și nu este blocat din aplicație: citește totuși fiecare mesaj pentru care are cheile și încă îl trimite în mod clasic, în timp ce îl îndeamnă pe utilizator să îl lege.
5Descoperirea și decizia de trimitere
Clienții învață cheile colegilor în două moduri. Un abonament permanent acoperă persoanele cu care un utilizator corespunde efectiv – conversații deschise și membri ai grupului – astfel încât anunțurile lor ajung ca evenimente obișnuite. Pentru un coleg întâlnit pentru prima dată, o interogare cu o singură lovitură rulează la timpul de trimitere, limitat la 2,5 secunde; dacă nu rezolvă, mesajul devine clasic, care este comportamentul care a existat înainte de post-quantum a fost adăugat mai degrabă decât un nou mod de eșec.
Un utilizator care leagă un nou dispozitiv, sau care se mută de la o extensie de browser la o cheie locală, devine post-quantum capabil mijloc de conversație, iar un permanent cache “nu” le-ar păstra pe criptare clasică pentru viața anunțului.
5.1 De ce nu există un atac de degradare
Decizia de rutare se reduce la o singură întrebare:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Nu există nicio negociere de capacitate, nicio listă de algoritmi susținuți și niciun câmp pe care un atacator să-l poată elibera pentru a forța o cale mai slabă. este Modul de eșec al unui anunț retras sau retras este că mesajul merge clasic - status quo-ul înainte de această caracteristică - mai degrabă decât că un mesaj hibrid este redus la ceva falsificabil.
Conversația ține și mai mult: un client trimite un hibrid numai atunci când deține o cheie, și deținerea cheii este dovada că destinatarul poate decapsula.Nu există o stare în care un mesaj este trimis post-quantum la cineva care nu o poate citi.
6Construcția hibridă
Un text de criptare NIP-44 nemodificat este stratul interior, iar ML-KEM cheiează un AEAD extern în jurul acestuia:
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)
Ambele secrete trebuie să fie încă recuperate pentru a citi mesajul: stratul exterior produce doar un text de criptare NIP-44, iar deschiderea care are nevoie de ECDH clasic. Un adversar cuantic care sparge secp256k1 primește cheia interioară și încă se confruntă cu ML-KEM; o ruptură a ML-KEM taie stratul exterior și lasă NIP-44 în picioare.
kem_ssNimic din această derivare nu atinge ieșirea brută ECDH, care este ceea ce se transformă în Secțiunea 6.1.kem_ct,recip_kem_pkȘi ambele chei de identitate sunt legate ca date asociate, astfel încât stratul extern este angajat la transcrierea exactă care a produs-o.
Cheia ML-KEM a destinatarului este de lungă durată, dar fiecare mesaj poartă un text de criptare independent și, prin urmare, un text independent.
kem_ssAceasta este ceea ce face ca derivarea nonce mai degrabă decât randomizarea să sune:
ChaCha20-Poly1305 înregistrări
este ruptă prin reutilizarea unei perechi (cheie, nonce), iar aici cheia în sine este nouă pentru fiecare mesaj, astfel încât nici o pereche nu se poate repeta.
6.1 De ce straturile rămân separate
Alternativa este să amestecați ambele secrete într-o singură cheie de conversație și să trimiteți-o la NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Această construcţie sună ca criptografia. are o problemă structurală: are nevoie de
ecdh_x, coordonatul brut x al ieșirii ECDH, ca material cheie - și o extensie a browserului (NIP-07) sau o semnătură la distanță (NIP-46Acesta execută NIP-44 în numele apelantului și returnează un text de criptare, care este întregul punct de a ține cheia undeva unde aplicația nu poate ajunge.
Prin urmare, amestecarea secretelor exclude fiecare conectare care păstrează cheia de identitate într-un semnatar, adică cei mai atenți utilizatori, și nici o cantitate de lucru pe derivarea cheii nu o poate schimba.Layering elimină dependența: NIP-44 rămâne întreg și este produs de ceea ce deține cheia de identitate, semnatar inclus, în timp ce jumătate KEM este calculat din codul de recuperare deținut direct de client.
Costul este lățimea de bandă și nu este mic. textul de cifrare ML-KEM este de 1,088 byte și se deplasează pe fiecare mesaj, base64url-codat la 1,451 caractere; AEAD extern adaugă o etichetă de 16 byte Poly1305 și extinde sarcina de utilizare NIP-44 pe care o înfășoară cu o treime. Un mesaj de 50 de caractere crește de la 176 de byte la 1,712, iar un mesaj de 2000 de caractere de la 2,820 la 5,238.
6.2 Caracteristici de auto-descriere
pe pq2. Prefixul face ca implementarea să fie incrementală: este auto-descriptivă, astfel încât un client alege calea de decriptare inspectând sarcina utilă în loc să aibă încredere într-o etichetă sau să-și amintească ce susține un coleg.Un cititor care nu recunoaște un prefix nu reușește să deschidă această sarcină utilă mai degrabă decât să o citească greșit, iar mesajele sigilate înainte de ambele părți ar putea face post-quantum să rămână lizibile ca NIP-44 obișnuit fără migrare.
Decapsularea ML-KEM este concepută pentru a nu eșua niciodată: datorită unui text de cifrare defectuos, transformarea Fujisaki-Okamoto returnează un secret pseudo-random determinist, mai degrabă decât o eroare. O cheie greșită, prin urmare, nu apare la nivelul stratului KEM deloc – apare ca o defecțiune HMAC în interiorul NIP-44, ceea ce este la fel ca o suprafață greșită clasică a cheii. Apelatorii tratează ambele în mod identic, astfel încât eșecul nu poartă niciun semnal distinctiv. Aceasta este și ceea ce face lista de candidați a Secțiunii 9.1 funcțională: un client încearcă fiecare cheie la rând și permite NIP-44 să spună care a fost cea corectă.
6.3 Ambele straturi ale învelișului cadou
A NIP-17 Mesajul personal este un NIP-59 Înveliș cadou: un zvon nesemnat, sigilat sub cheia de identitate a expeditorului (tip 13), apoi înfășurat sub o cheie aruncată generată pe mesaj (tip 1059). Pe un login care deține cheia de identitate direct, Nymchat hibridizează ambele straturi, fiecare cu propria sa encapsulare.
Înregistrarea semnatarului primește numai stratul exterior. Sigiliul este produs de semnatar ca NIP-44 obișnuit - aplicația nu vede niciodată cheia care o face - deci nu poate fi hibridizată în loc. Acest lucru nu costă nimic împotriva atacului în cauză: sigiliul este accesibil numai prin înveliș, iar învelișul este ceea ce depozitează un înregistrator. Un adversar care deține traficul înregistrat trebuie să rupă ML-KEM înainte ca un sigiliu să fie chiar vizibil pentru a ataca.
7Mesajele de grup și acoperirea parțială
Un mesaj de grup nu este un singur text cifrat. Este același text simplu trimis fiecărui membru, fiecare copie încapsulată la propria cheie ML-KEM a aceluiași membru. Un membru care a publicat o cheie primește un ambalaj hibrid; unul care nu are un ambalaj clasic.
Acest lucru creează o problemă de contabilitate pe care o implementare naivă o face greșit. Dacă opt din zece membri primesc o copie hibridă, mesajul este nu Un adversar are nevoie de o copie clasică a unui text simplu care este identic în toate zece, astfel încât mesajul este protejat numai dacă fiecare Copia este .
Nymchat urmărește, prin urmare, acoperirea per mesaj în timpul fan-out-ului - numărul este cunoscut numai în timp ce învelișurile sunt construite - și badge-ul raportează “cantum-rezistent la 8 din 10 membri” mai degrabă decât să pretindă că mesajul este protejat. primită mesajul de grup (numai expeditorul numără fan-out-ul), interfața raportează protecție parțială mai degrabă decât completă.
7.1 Ce raportează Scutul
Scutul spune adevărul despre Mesajul, nu despre software-ul care l-a trimis:
- Protecție completă: fiecare copie a acestui text simplu a ieșit hibrid.
- Parțial: unele copii ale unui mesaj de grup au ieșit clasic. Desenat degradat mai degrabă decât complet, deoarece o copie clasică a unui text simplu identic în toate acestea este o nevoie a adversarului.
- Clasic este declarat direct, mai degrabă decât afișat ca nici un badge, deoarece un indicator absent este ambiguu între “neprotected”, “broken”, și “această construcție lipsește caracteristica”.
Verdictul este înregistrat atunci când mesajul este sigilat mai degrabă decât recalculat din ceea ce anunță un coleg mai târziu. Ciphertext care există deja nu poate deveni mai bine protejat decât a fost, iar o interfață care a redresat mesajele vechi pe puterea unui nou anunț ar pretinde ceva fals despre byte pe un relay.
Regulile de grup de mai sus stack pe partea de sus a acestui lucru, mai degrabă decât să-l înlocuiască: un mesaj de grup este complet protejat numai atunci când fiecare copie a membrului a fost, și un mesaj de grup primit fără număr de acoperire afișează parțial.
8Copii adresate pentru tine
Mai multe lucruri pe care un client le stochează sunt criptate la identitatea propriu-zisă a utilizatorului: setările sincronizate, lista de conversații, cheile de grup și arhiva mesajelor. Acestea poartă mai mult despre un utilizator decât majoritatea mesajelor unice, deci lăsându-le clasice le-ar face cel mai slab artefact stocat, indiferent de cât de atent au fost sigilate mesajele în sine. nymchat-pq-root categoria însăşi, care nu poate fi sigilată sub o cheie pe care numai ea o poate produce.
Un blob de setări sau un rând de arhivă stă într-un singur loc de ani de zile, ceea ce este exact forma unui lucru pe care îl colectează un adversar – acum decriptat – mai târziu – mult mai mult decât orice mesaj unic, care este cel puțin efemer în mintea propriului utilizator.
O constrângere guvernează formatul aici, mai degrabă decât cheia. O copie auto-adresată trebuie să fie citibilă de către fiecare dispozitivul pe cont, astfel încât fiecare dispozitiv anunță ceea ce poate deschide în lista anunțului său poartă, iar contul scrie doar ceea ce toți pot citi.
Un dispozitiv care deține identitatea, dar nu rădăcina, nu poate deschide nimic sigilat la cheia derivată de rădăcină, inclusiv propriile sale setări. Aceasta este o consecință deliberată, nu o supraveghere, și de aceea Secțiunea 3.3 are un astfel de dispozitiv prompt pentru legare în loc să mintă o rădăcină proaspătă: o a doua rădăcină nu ar face blob-ul lizibil, ar împărți doar materialul cheie al identității în două.
Un dispozitiv care rulează o extensie a browser-ului sau un semnatar la distanță (NIP-46) nu deține niciun nsec de derivat, dar deține codul de recuperare și, sub construcția stratificată a Secțiunii 6.1, este tot ce are nevoie jumătatea post-quantum: semnatarul produce stratul NIP-44 așa cum are întotdeauna, iar clientul cheiează stratul exterior în sine.
9rotaţie
pe epoch Numărătorul în derivare este ceea ce face posibilă rotația fără material cheie nou. Creșterea acesteia generează o pereche de chei proaspete din aceeași rădăcină și un anunț republicat; colegii iau noua cheie din înregistrarea înlocuibilă.
9.1 Epocile vechi sunt păstrate și nimic nu este re-codificat
Un client construiește candidați de decriptare din epoca curentă până la epoca − 3, astfel încât un mesaj sigilat cu puțin timp înainte de o rotație se deschide încă împotriva perechei de chei care era actuală atunci când a fost trimisă.
Această fereastră este ceea ce face ca rotația să fie sigură: fără ea, fiecare rotație ar pierde tot ceea ce era în zbor. Tot ceea ce este deja sigilat rămâne lizibil pentru viața identității, deoarece un mesaj pe care utilizatorul nu îl mai poate deschide este strict mai rău pentru ei decât unul a cărui protecție nu poate fi îmbunătățită retroactiv (secțiunea 10.5).
10Ce nu protejează
O lucrare care enumeră doar ceea ce realizează un design nu descrie un sistem, iar supraestimarea unei proprietăți de securitate într-o interfață este mai rău decât omiterea acesteia.
Rădăcina este un al doilea secret, iar pierderea ei este de nerecuperat.
Aceasta este prețul real al proiectului. Constrângerea din Secțiunea 2 că un utilizator ar trebui să aibă exact un lucru de păstrat nu poate fi îndeplinită: numai nsec-ul nu reconstruiește cheia post-quantum, deoarece întregul punct este că nici o valoare publică și nici un alt secret nu o expune. Dacă niciun dispozitiv nu deține rădăcina și niciunul dintre învelișurile din Secțiunea 3.2 nu poate fi deschis, materialul sigilat la cheia derivată din rădăcină nu este recuperabil.
Cu transferul manual singurul drum, acesta este mai ascuțit decât poate fi citit mai întâi. nympq1… codul oriunde are exact o copie a acestuia, pe un dispozitiv, și pierderea acelui dispozitiv pierde fiecare mesaj post-quantum, setările blob și rândul de arhivă sigilat la acesta.
nsec nu ajută; aceasta este proprietatea pe care se bazează întregul design.
Un atacator atacă calea cea mai ieftină disponibilă, astfel încât o schemă merită ceea ce merită cea mai slabă cale de recuperare - o frază memorabilă, de exemplu, ar pune întregul lucru la ceea ce merită fraza, iar rândul învelit este exact artefactul pe care un adversar colectează-acum-decriptat-mai târziu îl colectează și îl măcină offline în timp liber.
10.2 Autentificarea, distinctă de confidențialitate
Fiecare semnătură din Nostr este Schnorr peste secp256k1, iar acest lucru este neschimbat aici. Un adversar cu un computer cuantic ar putea falsifica semnături și să se prefacă ca un utilizator în timp real. Ceea ce înfrânge schimbul de chei hibrid este recoltarea-acum-decriptarea-mai târziu: un atacator care înregistrează traficul astăzi nu îl poate citi mai târziu. Nu face un mesaj de neiertat împotriva unui adversar care are deja mașina. Această distincție este adusă în aplicații în mod deliberat - indicatorul padlock raportează autentificare, scutul raportează confidențialitate și acestea sunt glife separate pentru că un mesaj poate avea unul fără celălalt.
Legătura dintre un npub și o cheie ML-KEM este o semnătură secp256k1, astfel încât un adversar care le poate falsifica poate înlocui o cheie proprie.
10.3 Metadate
Învelișul cadou ascunde expeditorul, destinatarul dincolo de o singură p Etichetă, tipul și timestamp-ul mesajului interior. Nu ascunde faptul că un eveniment există, mărimea acestuia sau când un relay l-a primit.
10.4 Rețeaua offline
Transmisia prin plasă Bluetooth de la Nymchat este un protocol separat cu propriul său mâner și nu este acoperită de această lucrare.
10.5 Mesajele trimise deja
Ciphertext înregistrat în timp ce ambele părți erau încă clasice rămâne clasic permanent. Există deja și nu poate fi re-semnat. Protecția începe la mesajul în care ambele părți au ținut cheile post-quantum, nu în momentul în care caracteristica a fost pornită.
11Alternative considerate
| Abordarea | De ce nu |
|---|---|
| Derivează cheia post-quantum din cheia de identitate | Derivarea este un algoritm public peste nsec, iar un adversar cuantic recuperează nsec-ul din npub-ul publicat, rupând astfel jumătatea clasică peste jumătatea post-quantum cu ea. |
| Trimiterea rădăcinii către celelalte dispozitive ale utilizatorului prin NIP-44 | O rădăcină transmisă sub criptare clasică-numai este recuperabilă de oricine a înregistrat acel mesaj și își sparge cheia mai târziu, care este adversarul rădăcina există pentru a opri. |
| O pereche de tastatură ML-KEM generată separat pe fiecare dispozitiv | Dispozitivele ar deține chei de decapsulare diferite, iar un anunț înlocuibil pe identitate nu le poate purta pe toate. Peers ar cripta la care cheie a fost publicată ultima, iar fiecare alt dispozitiv ar fi incapabil să citească rezultatul. |
| Înfășurați rădăcina sub un PIN | Un PIN de patru cifre este de aproximativ 13 biți împotriva unui atacator offline care deține rândul înfășurat. Oferind-o lângă două căi de 256 biți ar reprezenta greșit valoarea celui mai slab înfășurat. |
| Extindeți npub pentru a transporta ambele chei | 1,184 byte nu este un identificator partajat, și ar rupe fiecare client Nostr existent de analiză a unei adrese care este definit ca 32 de byte. |
| Un serviciu de direcție cheie | Reintroduce autoritatea pe care rețeaua o are pentru a evita.Cine răspunde la căutare decide cine poate citi mesajul. |
| Adăugați cheia la fiecare mesaj | Nu rezolvă nimic: expeditorul are nevoie de receptorului cheie înainte de primul mesaj, care este exact cazul cu nici un mesaj anterior pentru a-l transporta. |
| Capacitatea de negociere în bandă | Creează o suprafață de degradare. Un atacator care poate elimina un steag de capacitate forțează calea clasică. |
| Numai post-quantum, fără picior clasic | Elimină decenii de analiză a secp256k1 în schimbul unui primitiv mult mai tânăr. ambele Failă |
12Paritatea punerii în aplicare
Nymchat livrează două implementări independente ale acestei construcții – una în JavaScript pentru aplicația web, una în Dart pentru aplicațiile mobile, inclusiv un port ML-KEM-768 de la zero.
Implementarea Dart ML-KEM este validată împotriva oficialului
NIST ACVP
Teste de răspuns cunoscut pentru ML-KEM-768 (ML-KEM-*-FIPS203) — 25 de cazuri de generare a cheilor, 25 de cazuri de încapsulare și 10 cazuri de decapsulare, care rulează ca o suită proprie. Acestea sunt vectorii pe care NIST le publică pentru a valida o implementare, așa că trecerea lor este dovada că portul este corect, nu doar dovada că cei doi clienți sunt de acord unul cu celălalt. În plus, o fixare comună a vectorilor de testare – derivarea semințelor, încapsulare, ambele formate de sarcină utilă și învelișuri de cadouri complete – este generată din referința JavaScript și verificată de ambele suite de testare. Secretul rădăcină extinde această fixare în loc să o înlocuiască: rădăcină la semințe, rădăcină la cheie
nympq1… Un divergent în ambele implementări eșuează construirea, mai degrabă decât producerea unui mesaj pe care celălalt client nu îl poate deschide.
Este ceea ce spune un dispozitiv “acesta este rădăcina pe care o dețin” de la “acesta este un altul”, iar un client care nu putea reproduce amprenta unui alt client ar citi o înregistrare perfect bună ca nici o înregistrare deloc - și apoi, după Secțiunea 3.3, mint o a doua rădăcină și împărți identitatea.
Nymchat este Sursă deschisă în conformitate cu AGPL-3.0. nucleul criptografic descris aici este
js/nym-crypto.js şi js/modules/pq.js pe site-ul clientului și
lib/core/crypto/ cu lib/features/identity/pq_registry.dart Pentru clienții mobili.
Pentru o explicaţie mai scurtă, non-tehnică, vezi Pagina de bază de cunoștințe despre criptarea cuantică rezistentă.