Whitepaper tecnicu di Nymchat
Accordu di chjave post-quantica in Nymchat
Distribuisce le chiavi pubbliche ML-KEM-768 supra Nostr senza un annu o un registru, è seminanduli da un segretu ca nisun valore publicu espone.
Aggiende un scambiu di chiavi post-quanticu à un messager ùn hè micca per u più un prubblema di crittografia. I prìmitivi sò standardizati è e librerie esistenu. A parte difficili hè chì ogni participante hà avè̀ bisognu di un secondu chiave pubblica, è una rete decentrata ùn hà micca un postu ovviu induve metteghjàla. Stu rappurtu descrive cumu Nymchat risponde à quessa questione — duv'è chì vene a seconda chiave, cumu hàghjà a ghjungere à e persone chì ne anu bisognu, è ch'essa interfaccia hè permessa di dichjerà nantu à u risultatu — è, in l'ultima sezione, chè u risultatu ùn pruteghja micca.
Questa pagina hè tradutta in macchina per comodità. L'uriginale in inglese hè a versione chì si applica.
1U problema
I messaggi privati di Nostr sò criptati cù NIP-44, chi hà dui mità separabili. A mità chì sbroglia u testu in chiaro — ChaCha20 cù un tag HMAC-SHA256, chjaveatu trà HKDF (RFC 5869) — ùn hè micca minacciatu significativamente da un computer quantic; l'algoritmu di Grover costa un'accelerazione di radice quadra contru una chiave simmetrica, è 256 biti assorbe questu. A mità chì accetta sulla chìavigna hè u Diffie-Hellman à curva ellittica sopra secp256k1, è l'algoritmu di Shor risolve u logaritmu discretu direttamente. U ricuperu di una chiave privata da u so contrapartitu públicu espone retroattivamente ogni secretu condivisu chì quella chiave hà mai produttu.
A minaccia chì questu crea ùn hè micca rimandata finchì tale maschina ùn esiste. Un avversariu chì hà un magazinu pò registrà u cifratu oghje è decifràlu quandu chì a capacità arriva. Tutte e cose mandate oghje chì avranu ancora importanza dopu hè già compromessu. Questa hè l'attacu specificu chì un scambiu di chiavi post-quanticu sconfigge, è hè a racuna per chì u travagliu ùn possa micca aspettà chì a maschina sia custruita.
1.1 A quistione chì questu articulu risponde
A mitigazione hè ben capita: esse un meccanismu di incapsulazione di chjave post-quantica accantu à l'scambiu classicu, accussì un attaccante deve rompe tutt'e dui per legge qualsiasi cosa. Nymchat usa ML-KEM-768 (FIPS 203). Quellu pone subitu un prublema di distribuzione:
Per mandà un messaghju à Alice oghje, avete bisognu di una cosa: u so npub. Aghjunte un scambiu post-quanticu è avete bisognu di una seconda — a so chìave pubblica ML-KEM. Dove si trova quella chìave, è cumu a pigliate prima di pudè mandalle quarchìosa?
Un npub hè autocuntenutu. Pudete scrive itu nantu à una carta, legge itu à alta voce, o scannà itu da un scrinu, è hè tuttu ciò di chì quaciunque hà bisognu per criptà versu vostru. Una chìave pubblica ML-KEM-768 hè di 1.184 byte. Essa ùn pò micca esse letta à alta voce, ùn si cuntene micca in un nome d'utilizatore, è ùn hè micca in u postu in un codice QR accantu à un identità chì hè solu di 32 byte.
A dimensione hè a parte più facile. A parte più difficile hè chì una seconda chjave porta trè prubblemi distinti, è u restu di questu articulu hè in gran parte una risposta à elli:
- Si pò sustituì. Una chiave chì nisciuna pò legge d'un colpu d'occhju hè esattamente u tipu di cosa chì un attaccante scambia cù a so. A Sezzione 4 a lega à l'identità cù una firma, chì risolve sta questione subitu.
- Deve esse in accordu trà i dispunitive di l'utilizatore. U stessu accuntu nantu à un telefonu è un laptop deve presentà a stessa chjave, o i messaggi sigillati per unu ùn ponu micca esse apre nantu à l'altru. A sezione 3.2 u spiega.
- Pò esse perdutu. A chiave publica hè ripubblicata da un segretu, dunque ciò chì deve veramente sopravviver hè quellu segretu — è per cunstruzzione nenti altru ùn u ricostruisce. A sezione 10.1 dichjara chiaramente ciò chì chistu costa, perchè questu ùn hè micca risoltu quantu pagatu.
2Vincoli di designu
Quattru cunstrainti anu modellatu a risposta, è e eliminanu a maiur parte di i disegni ovvi prima chì quissatu codice sia scrittu.
- U più pocu segreti possibile. I utilizatori di Nostr portanu digià esattamente un segretu, l'nsec. Ogni segretu addiziunale hè un altru modu per perde a vostra storia, è una persona chì hè capace di salvà un nsec ùn saprà micca salvà nantu à nenti altru. A sezione 3.1 mostra chì questu ùn pò micca esse cumpratu subitu — una chìave post-quantica derivata da l'nsec ùn furnisce micca alcuna protizzione post-quantica — dunque u design spende esattamente un segretu è micca di più: un solu pezzu di materiale di chìave, generatu una volta per identità, presentatu in a stessa forma chì l'nsec è in u stessu locu, in modu chì chiunque sapia cumu mantene unu sapia cumu mantene l'altru. A sezione 10.1 hè onesta nantu à ciò chì questu costa ancora.
- Nessuna autorità. Ùn ci hè nisun servitore à chì si pò fidà per dì quale chìave appartene à chì. Un servitore di quellu genere diventa u puntu induve i missaghji ponu esse ridiretti.
- Apparati mutili, una sola identità. Una identità Nostr hè usata cumunamente da diversi client in u stessu tempu. Tutte e materie di a chiave chì esistenu devono esse identiche nantu à tutti elli, è i percorsi chì u portanu arrò ùn devono micca esse leggibili da l'adversariu contru u quale a funzione si difende.
- Pas di negoziazione. Qualsiasi scambiu in-band di «quali cifrati sustenete?» hè una superfice chì un attaccante pò scartà per forzà l'opzione più debole. U design deve micca avè nenti da disgradà.
3Un segretu di radice indipendente
A decisa fondamentale hè chì a chìave di decapsulazione ML-KEM hè derivata da un materiale di chìave chì nisuna valura publica ùn espone. Ogni identità riceve un secretu radice, gieneratu una volta:
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)
A radice hè presentata à l'utilizatore cum'è un nsec: bech32 cum u prefissu legibile da l'omu
nympq, dunque si legge cum'è nympq1…, mostratu accantu à u nsec in u screnu di l'identità sottu à a stissa interazzione di rivelazione, copiatu cù u stessu cuntrollu, mai registratu è mai mandatu in qüalschì parte in chiaro. ùn hè micca una parolla d'ordine è ùn hè micca un login. Hè materiale di chiave chì l'utilizatore pò salvà, esattamente cum'è u nsec.
U sali hè separatu per dominu apposta, accussì nisun altru secretu pò mai derivà a stissa coppia di chjavi. U epoch contatore guida a rotazione (Sezione 9).
3.1 Perchè a chìave ùn pò micca esse derivata da a chìave d'identità
U disegnu ovviu hè di semà a coppia di chjavi da u secretu chì l'utilizatore hà digià:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Hè attraente per quattru ragioni, tutt'ellu vere: nenti di novu da salvà, perchè u nsec hè già u backup; ogni dispositivu hè d'accordu per costrizzione, senza nessun protocollu di sincronizazione chì pò fallisce; un annunci rimpiazzabile per identità chì hè ovviuamente correctu, perchè i dispositivi ùn ponu micca esse in disaccordu nantu à a chìave; è a chìave esiste prima chì sia pubblicata, accussì un client pò sigillà qualcosa à si stessu durante u primu funzionamentu.
I dört benefici sò senza valore, per una sola ragione. L'algoritmu di Shor executatu contru un npub publicatu dà u nsec. A derivazione di a simina hè un algoritmu publicu supra u nsec. Quindi l'adversariu chì rompe a mità classica ricostruisce a mità post-quantica executendu u stessu HKDF chì tutti l'altri executendu. Contru u "harvest-now-decrypt-later" — a sola minaccia chì a funzione esiste per fermà — una chìave derivata in stu modu ùn aggiunge micca nenti.
A chìave di decapsulazione ML-KEM deve venì da un'entropia chì ùn hè nè derivabile da u nsec nè mai trasmessa sottu à una cifratura soluamente classica.
A seconda clausa di quella rula fa u stessu travagliu chì a prima. Un segretu generatu indipendentemente chì hè dopu sincronizatu trà i dispruzi di un utente in un missaghju NIP-44 ordinariu hè u stessu fallimentu cù passi in più: un avversariu registra quellu missaghju oghje è ritrova a so chìave classica dopu, è a radice casca. Hè per quellu chì i camini in a prossima sezione sò i camini chì sò, è perchè nisun di elli ùn hè «mandalu à u vostru altru dispruziu».
3.2 Portà u root à l'altri apparati di l'utilizatore
U Constraintu 3 di a Sezione 2 — una identità, diversi dispositivi — ùn pò micca esse soddisfattu da l'aritmetica quì, perchè u puntu principale hè chì a chiave ùn hè micca una funzione di ciò chì i dispositivi condividenu già. Deve esse soddisfattu da u trasportu invece, è c'è esattamente un solu caminu: l'utilizatore move u nympq1… si codificanu.
A radice hè mostrata cum'è nympq1… accantu à u nsec, è un seconde dispozitivu
accetta chì sia incollatu in u stessu pannellu. Hè tuttu u meccanismu. Un dispozitivu chì ùn hà micca
ricevutu u codice ùn pò micca participà, chì a Sezione 4.2 descrive.
U trasferimentu manuale hè un basu deliberatu invece d'è un primu passu. A regla in a Sezione 3.1 dice chì a radice ùn pò mai viaggià sottu à una cifratura solu classica, è ogni meccanismu chì renderebbe questu automaticu — sincrizenduellu trà un rilè, incapsulenduellu in a chìave d'identità — viola esattamente questu. U passi chì l'utilizatore fà hè a ragione per chì a protezzione hè reale.
U formatu lascia spòciu per un percorsu avvoltu: un registru pò purta una lista di avvolgimenti, ciascununu hè un blob AEAD sottu à una chìave chì l'utilizatore pò riproduzè nantu à un altru dispozitivu — un output di PRF di passkey, per esempiu. Niente ùn ne include unu ghjornu odi, è finché qualcosa ùn u fà, u nympq1… u codice hè
l'unica via per attravesà.
A sezione 10.1 dice ch'è u prezzu.
U registru stessu vive in a so categuria di impostazioni, nymchat-pq-root, è si sincronizza cum'e e altre categurie. Puru senza portà nisun wrap, ellu svolge u travagliu necessariu: a so presenza hè u modu per chì un seconda apparecchiu aprenda chì questa identità hà digià una radice, chì hè ciò chì impedisce à u sicondu di cunfegná una rivale (Sezione 3.3).
U nymchat-pq-root categoria deve micca esse criptatu cù a chiave ML-KEM derivata da a radice. Quella riga porta l'unica copia di a radice, dunque sigillà ella sottu à una chiave derivata da a radice hè una serratura chì a so chiave hè in a scatula: nisun dispusitivu ùn puderia mai apertela, inclusu quellu chì l'ha scritta. Essa hè sigillata in modu classicu — NIP-44 à sè — o micca affattu. Stu hè l'unicu postu induve u design accetta una protizzione solu classica, è pò permetteselu: a riga ùn porta micca radice oghje, solu u fattu chì una esiste.
Ogni altra categuria di impostazioni pò è deve usà a chìave derivata da a radice. Questa hè l'unica eccezione, è hè un'eccezione di circolarità invece chì di forza.
3.3 Generazione è adottazione
À l'avviamentu, portendu un'identità durabile, un cliènte travaglia in questu ordine:
- Cherca un esistente
nymchat-pq-rootregistra - Registru truvatu, è stu dispositivu pò sbucciàlu — adottatella è annunciate sta identità cum'è capace post-quantica.
- Registru truvatu, è questu apparatu ù pò micca scartàlu. — ù ùn criate micca una nova radice, è ù ùn pubblicate micca ningun avvisu. Chiedite à l'utilizatore di ligà stu dispositivu entrendu u
nympq1…codice da un apparatu chì l'havi digià - Nessun registru — genera una radice, pubblica u record, annuncia, è mostra u
nympq1…u codice à l'utilizatore una volta perchè pudessenu salvàlu.
U passu 3 hè u passu chì hè facilità di sbaglià, è hè a ragiuna per chì l'ordine hè scrittu invece di esse lasciatu à ogni implementazione. Dui apparati chì ciasununu decide di generà una radice produzi dui radici indipendenti sottu à un'unica identità, è quella hè a falla chì stu ordine esiste per evità.
4L'annunciu di a capacità
A mità publica di a coppia di chiavi derivata hè pubblicata cum'è un indirizzabile
NIP-01
eventu — tipu 30078, tagghiatu 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 vult dì chì u relay tene un solu eventu per (kind, pubkey, d-tag), dunque una repubblicazione sostituisce l'annunciu precedente in u postu. Ogni identità hà dunque esattamente un record attuale, chì hè ciò chì fà "cherche a chiave di Alice" una ricerca unica è senza ambiguità invece di una lista da riconcilià.
A firma hè u vinculu. L'eventu hè sigatu da a chìave di l'identità, dunque a dichiarazione "questa chìave ML-KEM appartene à stu npub" hè esattamente accussà forte com'u npub stessu. Sostituì una chìave di incapsulazione diversa richiede a falsificazione di una firma secp256k1. Un attaccante chì pò fà questu ùn hà micca bisognu di preoccupà di u KEM.
L'annunci scadenu. Sette ghjorni NIP-40 a scadenza, ripùblicata ogni 24 ore, mantene u registru cum'è una dichiarazione nantu à un cliente chì hè ancu in funzione invece di unu chì era. A radice stissa ùn scade mai; solu a dichiarazione nantu à essa scade.
Un avisu scadutu si legge esattamente cum'è unu chì ùn hà mai purtatu una chjave: i paritari mandanu un NIP-44 ordinariu, chì ogni login pò legge, è u client resuma u scambiu post-quanticu in a so prossima cunnessione, quandu repubblicheca. Quindi, rimani in silenziu per più di una simana costa a protezzione per i missaghji mandati durante u bucu — essi sò criptati classicamente invece chì resistenza à u quanticu — è ùn costa nenti altru. A consegna ùn hè influenzata, nenti di ciò chì hè già statu ricevutu diventa illegibile, è ùn hè necessaria alcuna azione à u ritornu.
Quell'asymmetria hè a ragione di a scadenza invece di esse un accidentu di essa. Senza quella, un registru campa più longu di a chiave chì ellu identifica: un apparatu chì hè cancellatu, resettatu, o chì hà a so radice rimplassata lascia un'istruzzione permanente per incapsulà versu una chiave chì nimanghè ùn a tene più, è i missaghji mandati sottu à essa sò persi senza alcun erroru da parte di nisun. Sette ghjorni limita quella finestra, è permette à i rilayi di scartà u registru da elli stessu invece di conta nantu à i clienti per accorgesi.
U campu chjave nomma u so formatu. U campu hè pk2, è u cifru hè parte di u contractu invece chì una decorazione: ellu nomine u formatu di u payload cù u quale a chjave pò esse usata. Un lettore chì ùn riconosce micca u campu conclude «client Nymchat, micca una chjave post-quantica» è manda un NIP-44 ordinariu, chì ogni login pò legge. Hè quella a direzzione di fallimentu corretta, è vale a pena di dichjara cum'è una regla chì u numeru di u formatu esiste per impone: una rivendicazione di capacità micca cunoscuta deve custà protezzione, micca a consegna. Una chjave chì un parè ùn pò micca usà hè peggiu di micca avè una chjave affattu, perchè u messaggiu chì ella produce hè persu senza alcun errore da una parte o dall'altra.
4.1 L'assenza hè significativa, è à trè valori
Un detagliu subtile ma impurtante: l'annunciu hè pubblicatu da ogni client Nymchat, micca solu quelli capaci di post-quantica, è u campu di a chìave hè opzionale. Quessu dà trè stati distinguibili inzice di dui:
| osservatu | I mezi | Manda u comportamentu |
|---|---|---|
| Annunciu cù una chiave | Nymchat, capace di post-quantica | Ibridu |
| Annunciu, senza alcuna chiave | Nymchat, solu classico — post-quanticu disattivatu, o un dispozitivu micca ancu ligatu à a radice di l'identità. | Classicu NIP-17 |
| Nessun annunciu | Cliente sconosciutu. Puderia esse qualsesi utilizatore di Nostr o di Bitchat. | Classicu, più un involucru di compatibilità |
Unificà a terza righe cù a quarta seria una vera perdita. Un annunziu senza chiave hè una dichiarazione firmata chì u mandante utilizza Nymchat, chì permette à u caminu di mandamentu di saltà un involucru speculativu cross-protocollu chì ellu avrilia d'include sinon per quiconque ellu ùn pò micca identificà.
4.2 Un dispositivu chì ù pò apre a radice resta silenziu
L'annunziu hè rimpiazzabile: un evetu per identità, l'ultimu scrittu vince. Hè questu chì fà funzionà u design à record unicu, è hè ancu ciò chì fà un dispositivu micca ligatu periculosu s'ellu pubblica. Un dispositivu chì avia annunziatu una chjave chì avia cuniatu per sè sovrascriveria u record reale è manderebbe ogni peer à criptà sottu à una chjave chì l'altri dispisivu ùn ponu micca apre.
Dunque, un dispositivu chì sape chì una radice esiste ma ùn pò micca apre ella ùn fà micca alcun annunziu. Ellu ùn hè micca rottu è ùn hè micca bloccatu fora di l'applicazione: ellu legge ancu tutti i missaghji per i quali hà e chjavi è manda ancu in modu classicu, mentre invita l'utilizatore à ligàlu. U silenziu hè u cumportamentu correttu per un dispositivu chì ùn pò micca parlà per l'identità.
5Scoperta è a decisione d'invio
I clienti scopranu e chjavi di i pariggi in dui modi. Un'aspisizione permanente cuncoveria e persone cù e quali un utente si corrisponde di vera — cunversazioni aperte è i membri di u gruppu — accussì i so annunci arrivanu cum'è eventi ordinari. Per un pariggi incontratu per a prima volta, una dumanda unica si eseguia à u tempu di l'invio, limitata à 2,5 sicondi; s'ellu ùn si risolve micca, u messaghju hè mandatu in modu classicu, chì hè u cumportamentu chì esistia prima chì u post-quanticu fosse aghjuntu invece di un novu modu di fallimentu.
Un risultatu negativu hè misu in cache per deci minuti invece chì per sempre. Un utente chì cunnetta un novu dispositivu, o chì passa da un login cù un'estensione di u browser à una chiave locale, divente capace di post-quantica trà a cunversazione, è un "no" misu in cache permanentemente u manteneria nantu à l'incrittazione classica per tutta a durata di l'annunciu.
5.1 Perchè ùn ci hè micca un attaccu di downgrade
A decisione di rutamentu si riduce à una sola dumanda:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Ùn ci hè micca negoziazione di capacità, nisuna lista di algoritmi supportati, è nisun campu chì un attaccante pò eliminà per forzà un percorsu più debole. Tenendu l'annunciu hè a negoziazione, è firmata. U modu di fallimentu di un annunziu privatu o ritenutu hè chì u messaggiu divente classicu — u statu quu prima di sta funzione — invece chì un messaggiu ibridu sia degradatu à quarchì cosa falsificabile.
U cunversu hè ancu validu è più impurtante: un cliante manda ibridu solamente quandu tene una chìave, è tene a chìave hè a prova chì u ricevente pò decapsulà. Ùn ci hè nessun statu in u quale un messaghju hè mandatu post-quantum à una persona chì ùn pò micca lighelu.
6A costruzzione ibrida
Nymchat ùn sostituisce micca u NIP-44. Ellu u riveste. Un cifratu NIP-44 ùn modificatu hè u stratu internu, è ML-KEM chjaveghja un AEAD esternu intorno à ellu:
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)
I dui segreti devono ancuò esse ritrovati per legge u messaghju: lu stratu externu dà solu un cifratu NIP-44, è per apre quellu serve l'ECDH classicu. Un avversariu quanticu chì rompe secp256k1 ottiene a chjave interna è deve ancuò fà fronte à ML-KEM; una rottura di ML-KEM scuperta u stratu externu è lascia u NIP-44 intactu. Ogni input guadagna u so postu:
kem_sschìe solu u stratu externu. Niente in sta derivazione toca u output ECDH raw, chì hè ciò chì a Sezione 6.1 attiva.kem_ct,recip_kem_pkè e dui chjave d'identità sò ligati cum'è dati assonciati, cusì u stratu externu hè ligatu à u trascripte esattu chì l'ha produttu. L'unione di un cifratu cù l'identità di un altru emettitore fallisce l'autenticazione invece di a decifratura.
L'incapsulazione hè eseguita novamente per ogni missaghju. A chìave ML-KEM di u ricevente hè di lunga durata, ma
ogni missaghju porta un cifratu indipendente è per u dunque un indipendente
kem_ss. Hè chistu chì rende sanu u fà derivà u nonce invece di rannumicà it:
ChaCha20-Poly1305
si rompe si riutilizata una coppia (chiave, nonce), è quì a chiave stissa hè nova per ogni messaghju, dunque nisuna coppia pò ripete.
6.1 Perchè i strati restanu separati
L'alternativa hè di mischjà i dui segreti in una sola chìave di cunversazione è di dà quella à NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Quella costruzione hè solida cum'è crittografia. Hà un prubblema strutturale: hà bisognu di
ecdh_x, a coordinata x bruta di l'output di l'ECDH, cum'è materiale di chiave — è un'estensione di u navigatore (NIP-07) o un firmatore remotu (NIP-46) ùn ritorna mai quella valore. Elu eseghice u NIP-44 per conto di u chiamante è rimanda una cifratura, chì hè u scopu tuttu natu di tene a chìave in un postu induve l'applicazione ùn pò micca arrivà.
Mischyà i segreti dunque escluderà ogni accessu chì mantene a chiave d'identità in un firmatore, ciò chì vole dì i utilizatori più prudenti, è nisuna quantità di travagliu supra a derivazione di a chiave pò cambià questu. A stratificazione rimuove a dipendenza: u NIP-44 resta integra è hè produttu da ciò chì detiene a chiave d'identità, firmatore inclusu, mentra a mità di u KEM hè cumputata da u codice di ricuperu chì u clientu detiene direttamente. L'accessi di u firmatore sò participanti post-quantichi ordinari in duje direzzioni.
U coste hè a larghezza di banda, è ùn hè micca piccula. U cifratu ML-KEM hè di 1.088 byte è hè presente in ogni missaghju, codificatu in base64url à 1.451 caratteri; l'AEAD esternu aghjunghje un tag Poly1305 di 16 byte è espande di un terzu u payload NIP-44 chì incapsula. Un missaghju di 50 caratteri passa da 176 byte à 1.712, è unu di 2.000 caratteri da 2.820 à 5.238. U minimu hè approssimativamente 1,5 KB per missaghju, indipendentemente da quantu u missaghju hè breve, chì hè u prezzu di l'incapsulazione di novu ogni volta invece di riutilizà un secret cumunitariu.
6.2 Carichi autodescrittivi
U pq2. U prefixe rende l'implementazione incrementale: hè autoscrittivu, cusì un client sceglie a via di decriptazione inspezzendu u payload invece di fidà di un tag o di ricordà ciò chì un parè supporta. Un lettore chì ùn riconosce micca un prefixe fallisce à apre quellu payload invece di legge male u cuntenutu, è i messaggi sigillati prima chì una parte pudessia fà u post-quantum rimanghenu leggibili cum'è un NIP-44 ordinariu senza migrazione.
A decapsulazione di ML-KEM hè diseñata per ùn fallì mai: dà una cifratura malformata, a trasfurmazione di Fujisaki-Okamoto restituisce un secret pseudo-casuale determinista invece di un errore. Una chiave sbagliata, per u dunque, ùn si manifesta micca à u livellu KEM — si manifesta cum'è un fallimentu HMAC in NIP-44, chì hè u stessu modu cum'è si manifesta una chiave classica sbagliata. I chiamanti trattanu dui identicu, dunque u fallimentu ùn porta alcun segnale di distinzione. Hè ancu ciò chì rende a lista di candidati di a Sezione 9.1 funzionale: un client prova ogni chiave in tornu è lascia chì NIP-44 dica quale era a giusta.
6.3 I dui strati di l'imballaghju di u regalu
A NIP-17 u messaghju privatu hè un NIP-59 impacchettamentu di regalu: una rume senza firma, sigillata sottu a chìave d'identità di u mandante (tipu 13), dopu impacchettata sottu una chìave di scartu generata per ogni messaghju (tipu 1059). In un login chì detiene a chìave d'identità direttamente, Nymchat ibridize i dui strati, ognunu cù a so incapsulazione.
Un login di firmatore riceve solu u stratu esternu. U sigillu hè produttu da u firmatore cum'è un NIP-44 ordinariu — l'applicazione ùn vede mai a chìa chì u fà — cusì ùn pò micca esse ibridatu in situ. Questu ùn costa nenti contru l'attacu in questione: u sigillu hè raggiungibile solu trà l'invulucru, è l'invulucru hè ciò chì un registratore stocca. Un avversariu chì detiene u trafficu registratu deve rompe ML-KEM prima chì un sigillu sia ancasu visibile per esse attaccatu.
7Messaggi in gruppu è copertura parziale
Un messaghju di gruppu ùn hè micca un solu cifratu. Hè u stessu testu in chiaro distribuitu à ogni membro, ogni copia incapsulata cù a propria chìave ML-KEM di quellu membro. Un membro chì hà publicatu una chìave riceve un wrap ibridu; unu chì ùn l'ha micca riceve un wrap classica.
Ciù crea un prubblema di contabilità chì un'implementazione ingenua sbaglia. S'ottu di deci membri ricevinu una copia ibrida, u messaghju hè micca ottu deci protetti. Un avversariu hà bisognu di una copia classica di un testu in chiaro chì hè identica in tutti deci, dunque u messaghju hè protettu solu s'è ogni a copia hè.
Nymchat dunque traccia a cunvèrsione per messaghju durante u fan-out — u conte hè solu sapibile mentre i wraps sò in cunstruzzione — è u badge raporta «resistente à u quantu per 8 di i 10 membri» invece di dichjará chì u messaghju hè prutettu. Ove ùn ci hè micca un conte dispunibule, chì hè u casu normale per un ricevutu messaghju di gruppu (solo u mandante conta a diffusione), l'interfaccia riferisce una prutezzione parziale invece di una piena. Rivendicà una prutezzione piena basata solu nantu à a propria copia seria un eccessu in quantu à u messaghju in tuttu u so integru.
7.1 Cosa u scudu raporta
U scudu dice a verità nantu à u messaghju, micca nantu à u software chì l'ha mandatu:
- Protezione totale: ogni copia di stu testu in chiaro hè uscita ibrida.
- Parziale: alcune copie di un messaghju di gruppu sò andate fora classicamente. Rappresentate degradate invece di complete, perchè una copia classica di un testu in chiaro identicu in tutti elli hè tuttu ciò di chì un avversariu hà bisognu.
- U classicu hè dichjaratu apertamente invece di esse mostratu cum'è un emblema assente, perchè un indicatore assente hè ambiguu trà "ùn prutettu", "rottu" è "questu versu manca di a funzione".
U verdetu hè registratu quandu u messaghju hè sigillatu invece di esse ricunputatu da ciò chì un pari dichjara più tardi. U testu cifratu chì esiste digià ùn pò micca diventà megliu protettu di comu era prima, è un'interfaccia chì ridisegnava i vecchi messaggi in forza di un novu annunciu susteneria qualcosa di falsu nantu à i byte nantu à un relay.
I righule di u gruppu sopra si sovrapponenu à questu invece di sostituillu: un messaghju di gruppu hè pienamente prutettu solu quandu a copia di ogni membre l'era, è un messaghju di gruppu ricevutu senza conteggiu di copertura mostra "parziale".
8Copie indirizzate à voi stessu
Alcune cose chì un clientu u storu sò criptate cù l'identità stessa di l'utilizatore: i paràmetri sincronizati, a lista di e cunversazioni, e chjavi di u gruppu, è l'archiviu di i messaggi. Quelli portanu più infurmazioni nantu à un utilizatore chì a maiur parte di i messaggi singoli, aldìchì lascià elli in modu classicu renderebbe elli l'artifattu storitu più debole, indipendentemente da quanta cura hè stata messa per sigillà i messaggi stessi. Essi usanu u stessu ibridu, incapsulatu cù a chjave radicata di l'utilizatore — cum'è l'unica eccezione descritta in a Sezione 3.2, u nymchat-pq-root a categuria stessa, chì ùn pò micca esse sigillata sottu
à una chìave chì solu essa pò pruduce.
Questi artifatti sò induve u design hè più impurtante. Un bloccu di settings o una riga d'archiviu resta in un postu per anni, chì hè esattamente u tipu di cosa chì un avversariu chì raccoglie avà per decifrà più tardi raccoglie — assai più di quattantu un missaghju singularly, chì hè almeno efimeru in a mente di l'utilizatore stessu.
Una limitazione governa u formatu quì invece di a chìave. Una copia cù l'indirizzu propiu deve esse leggibile da ogni dispositivu in u contu, accussì ogni dispositivu dichjara ciò chì pò apre in l'elencu chì u so annunciu porta, è u contu scrive solu ciò chì tutti elli pon legge. Scrive qualtesi altra cosa impedisce à un dispositivu di accede à e so configurazioni — u stessu fallimentu silenziu chì a Sezione 3.2 evita per altri mezzi, venendu da una direzzione diversa.
Un dispositivu chì detiene l'identità ma micca a radice ùn pò apertà nenti sigillatu cù a chiave derivata da a radice, incluse e so propi impostazioni. Hè una cunseguenza deliberata, micca una svista, è hè per u quale a Sezione 3.3 hà un avvisu di stu tipu per u ligamentu invece di mintà una nova radice: una seconda radice ùn renderebbe micca u blob leggibile, ella solu divideria u materiale di a chiave di l'identità in dui. Finchì l'utilizatore ùn u liga micca, u dispositivu continua à funzionà — ellu legge ciò per ch'ellu hà e chiavi è manda in modu classicu.
Un dispisitivu chì guida un'estensione di u browser o un firmatore remotu (NIP-46) ùn detiene nisun nsec da u quale derivà, ma ellu detiene u codice di ricuperu, è sottu à a cunstruzzione per strati di a Sezione 6.1, questu hè tuttu ciò di chì a mità post-quantica hà bisognu: u firmatore pruduce u stratu NIP-44 cum'è hà sempre fattu, è u client chjaveà u stratu esternu ellu stessu. Un tale login hè un participante ordinariu in dui direzzioni.
9Rotazione
U epoch U contadore in a derivazione hè ciò chì rende a rotazione possibile senza novu materiale di chjave. Aumentà u praduci una nova coppia di chjave da a stissa radice è un annunziu ripubblicatu; i pari pigghianu a nova chjave da u recordu rimpiazzabile. A rotazione dunque ùn pede à l'utilizatore di scrive nente una seconda volta: a radice hè ghjenerata una volta per identità è l'epoca fà u giru.
9.1 E vecchie epoche sò mantenute, è nenti ù hè ri-criptatu.
Niente ùn hè riscrittu quandu una chìave rotate. Un cliante costruisce candidati di decriptazione da l'epoca attuale finu à l'epoca − 3, per u quale un missaghju sigillatu pocu prima di una rotazione si apre ancu tiênu à a coppia di chìavi chì era attuale quandu hè statu mandatu.
Quellu intervallu hè ciò chì rende a rotazione sicura da fà: senza ellu, ogni rotazione lassaria in sospensione tuttu ciò chì era in corso. Tutte e cose digià sigillate restanu leggibili per tutta a vita di l'identità, perchè un messaghju chì l'utilizatore ùn pò più apre hè assai peggiu per ellu chì unu chì a so protezzione ùn pò micca esse migliorata retroattivamente (Sezzione 10.5).
10Chì questu ù prutege micca
Un articulu chì si limita à lista ciò chì un designu realizaghje ùn descrive micca un sistema, è sovrastimate una proprietà di sicurezza in un'interfaccia hè peggiu di l'omette. I seguenti sò fora di ciò chì sta cunstruzzione difende.
10.1 A radice hè un segretu secondu, è perdeghjàla hè irreversibile.
Stu hè u veru prezzu di a progettazione. A cunstraintsina in a Sezione 2 chì un utente deve avè esattamente una cosa da mantene ùn pò micca esse rispetata: l'nsec da sola ùn ricostruisce micca a chiave post-quantica, perchè u puntu chjave hè chì nisun valore publicu è nisun altru secretu ùn a espone. S'un dispositivu ùn detiene a radice è s'alcun di i wrap di a Sezione 3.2 ùn pò esse apertu, u materiale sigillatu cù a chiave derivata da a radice ùn hè micca ricuperabile. Ùn ci hè micca escrow è micca ci hè deliberatamente nisuna autorità chì puderia detene una.
Cum u trasferimentu manual hè l'unica via, questu hè più acutu di ciò chì pò parè prima di legge. Un utilizatore chì ùn copia mai u nympq1… u codice in quìsiunque hà esattamente una copia di ellu, supra un solu apparatu, è perde quellu apparatu perde ogni missaghju post-quanticu, blob di configurazione è fila d'archiviu sigillatu à ellu. U
nsec ùn serve à nenti; quella hè a proprietà nantu à quale si basa tuttu u disegnu.
Ogni caminu incapsulatu aghjuntu dopu deve supera a stissa barriera chì u manuale supera. Un attaccante attacca u caminu più chieru dispunibule, dunque un schemiu vale quantu a so ruta di ricuperu più debole — una parola d'ordine memorabile, per esempiu, metterebbe tuttu u sistema à u valore di quella parola d'ordine, è a riga incapsulata hè esattamente l'artifattu chì un avversariu chì raccoglie avà è decripta più tardi raccoglie è processa offline à u so piacè.
10.2 Autenticazione, distinta da a cunfidenzialità
Ogni firma in Nostr hè Schnorr supra secp256k1, è chistu ùn hè micca cambiatu quì. Un avversariu cù un computer quanticu puderia falsificà e firme è impersonà un utilizatore in tempu reale. Ciò chì l'échange di chiavi ibridu vince hè u "raccoglie avèra-decripta dopu": un attaccante chì registra u trafficu oghje ùn pò micca lighelu dopu. Hè ùn rende micca un missaghju infalsificabile contru un avversariu chì hà digià a machina. Sta distinzione hè portata deliberatamente in e applicazioni — l'indicatore di u lucchetto riferisce l'autenticazione, u scudu riferisce a cunfidenzialità, è sò glifi separati perchè un missaghju pò avè una senza l'altre.
Limita ancu ciò chì l'annunziu in a Sezione 4 pò prumette. U ligamentu trà un npub è una chjave ML-KEM hè una firma secp256k1, dunque un avversariu chì pò falsificà quelle pò substituì una chjave propria. A cunfidenzialità contru un avversariu futuru ùn hè micca a stissa cosa chì l'autenticità contru unu.
10.3 Metadati
L'imballaghju di regalù nasconde u mandatore, lu ricevente oltre un solu p tag, u tipu, è
a marca di tempu di u messaggiu internu. Ùn cuncela micca chì un eventu esiste, a so dimensione, o quandu
un relay l'ha ricevutu. L'analisi di u trafficu ùn hè micca affrontata da parte alcuna di stu design.
10.4 U mesh offline
U trasportu mesh Bluetooth di Nymchat hè un protocollu separatu cù u so propi handshake, è ùn hè micca copertu da questu travagliu. I messaggi sopra a mesh sò classichi.
10.5 Messaggi già mandati
U testu cifratu registratu mentra una di e duie parti era ancuprisamente classica resta classica per sempre. È già esistitu è ùn pò micca esse ri-sigillatu. A protezzione cumencia da u missaghju indove e duie parti avevanu chianve post-quantum, micca in u momentu in chì a funzione hè stata attivata.
11Alternative considerate
| Avvicinamentu | Perchè micca |
|---|---|
| Derivate a chìave post-quantica da a chìave d'identità | Rifiutatu. A derivazione hè un algoritmu públicu supra u nsec, è un avversariu quanticu ritrova u nsec da u npub pulbricatu, dunque a rottura di la mità classica consegna a mità post-quantica cù ela. Elu hà risoltu ogni prublema di distribuzione in stu articulu è ùn hà difendu contru nisunnu. Sezione 3.1. |
| Mandate u radicu à l'altri dispositivi di l'utilizatore via NIP-44 | Rifiutatu per a stessa ragione in vestiti diversi. Una radice trasmessa sott'à un ciframento solu classica hè recuperabile da qualsessiunque chì hà registratu quellu messaggiu è rompe a so chiave più tardi, chì hè l'adversariu chì a radice esiste per fermà. |
| Una coppia di chiavi ML-KEM ghenerata separatamente nantu à ogni dispositivu | Rifiutatu. L'apparati avrebbero chjavesse di decapsulazione diverse, è un annunchiu scambiabile per ogni identità ùn pò micca portà tutti quanti. I pari s'incriptàghjenu cù a chjave chì hè stata pubbicata ultimamente, è ogni altru apparatu ùn puderia micca legge u risultatu. Una radice per identità, mossa da i percorsi di a Sezione 3.2, hè ciò chì evita questu. |
| Incapsulà a radice sottu à un PIN | Rifiutatu. Un PIN à quattru cifre hè circa 13 biti contru un attaccante offline chì detiene a riga incapsulata. Offri lu accantu à dui cammini di 256 biti falsificherebbe u valore di l'incapsulatura più debole. |
| Espandi l'npub per portà e dui chìavi | 1.184 byte ù micca un identificatore chì si pò spartì, è ch'ellu romperia l'interpretazione di ogni client Nostr esistente di un indirizzu chì hè definitu cum'è 32 byte. |
| Un serviziu di direzzione chjave | Riintroduce l'autorità chì a rete esiste per evita. Chìunque risponde à a ricerca decide chì pò legge u messaghju. |
| Attacca a chìave à ogni messaghju | Risolve micca nente: u mandante hà bisognu di u di u destinatariu chiave prima di u primu messaghju, chì hè esattamente u casu senza un messaghju precedente per portallu. |
| Negoziatione di capacità in banda | Creia una superfice di degradazione. Un attaccante chì pò eliminà un flag di capacità forza u caminu classicu. |
| Solamente post-quantica, senza a parte classica | Scarta decadi di analisi di secp256k1 in scambiu di una primitiva assai più giuvana. Un ibridu fallisce solu s'è tramindui fallimentu. |
12Parità di implementazione
Nymchat furnisce dui implementazioni indipendenti di questa cunstruzzione — una in JavaScript per l'applicazione web, una in Dart per l'applicazioni mobili, includendu una portatura ML-KEM-768 fatta da zero. Dui implementazioni di a stessa primitiva hè di ordinariu un risargu, cusì sò messi in cunfrontu invece di esse fidati chì si mettinu d'accordu.
L'implementazione ML-KEM di Dart hè validata rispettu à l'uffiziale
NIST ACVP
testi di risposte cunosciuti per ML-KEM-768 (ML-KEM-*-FIPS20325 casi di generazione di chjavi, 25 di incapsulazione è 10 di decapsulazione, executati cum'è una propria suite. Quelli sò i vettori chì u NIST publica per validà un'implementazione, dunque u fà passà hè una prova chì u portu hè correctu, è micca solu una prova chì i dui clienti sò d'accordu trà di ESSI. Di sopra à quellu, un set cumunitariu di vettori di prova — derivazione di u seme, incapsulazione, tutti i formatu di u payload, è l'impacchettamenti cumpleti — hè ghjeneratu da u referenzu JavaScript è verificatu da e dui suite di prova. U segretu radice estende quellu set invece di sostituirlo: da a radice à u seme, da a radice à a coppia di chjavi, l'impronta publica di a radice, è a chjave derivata, u nonce è i dati associati di u stratu esternu sò vettori di u so propiu, dunque i dui clienti ùn ponu micca esse in disaccordu nantu à ciò chì un...
nympq1… lu codice si riferisce o riguarda i byte cù i quali un messaghju hè sigillatu. Una divergenza in una di e implementazioni fallisce a cunpilazione invece di produce un messaghju chì l'altru client ùn pò micca apre.
L'imprunta digitale meritsia d'esse citata trà queste. Hè ciò chì distingue trà un dispositivu «questu hè a radice chì aghju » è «questu hè una diversa», è un client chì ùn puderia micca ripruducì l'imprunta digitale di un altru client lisegheria un record perfettamente bonu cum'è un record assolutamenti micca esistente — è dopu đó, seguendu a Sezione 3.3, crea una seconda radice è divide l'identità. Hè un vektore per esattamente quella rappuna.
Nymchat è sorgente aperta sottu à l'AGPL-3.0. U core criptugraficu descrittu quì hè
js/nym-crypto.js è js/modules/pq.js in u client web, è
lib/core/crypto/ cu lib/features/identity/pq_registry.dart in
i clienti mobili.
Per a spiegazione più curta è non tecnicu, vede a Pagina di a base di conoscenza nantu à a criptografia resistente à u quantum.