Nymchat teknika blankpapero
Post-kvanta ŝlosla interkonsento en Nymchat
Distribuado de publikaj ML-KEM-768-ŝlosiloj tra Nostr sen direktaro aŭ registaro, kaj semado de ili el sekreto, kiun neniu publika valoro malkaŝas.
Aldoni post-kvantan ŝlosilan interŝanĝon al mesaĝilo estas plejparte ne kriptografia problemo. La primitivoj estas normigitaj kaj la bibliotekoj ekzistas. La malfacila parto estas, ke ĉiu partoprenanto nun bezonas... sekundo publika ŝlosilo, kaj discentralizita reto havas neniun evidentan lokon por meti ĝin. Ĉi tiu artikolo priskribas kiel Nymchat respondas tion — de kie la dua ŝlosilo venas, kiel ĝi atingas la homojn, kiuj bezonas ĝin, kaj kion la interfaco estas permesita aserti pri la rezulto — kaj, en la lasta sekcio, kion tiu rezulto ne protektas.
Ĉi tiu paĝo estas maŝintradukita por komforto. La angla originalo estas la versio kiu validas.
1La problemo
Nostr-privataj mesaĝoj estas ŝifritaj per NIP-44, kiu havas du apartigeblajn duonojn. La duono, kiu malklarigas la malklaran tekston — ChaCha20 kun HMAC-SHA256-etiketo, klavita tra HKDF (RFC 5869) — ne estas signife ameaĉata de kvantkomputilo; Grover-algoritmo rezultigas kvadrata radikan rapidigon kontraŭ simetria ŝlosilo, kaj 256 bitoj absorbas tion. La duono, kiu konsentas sur la ŝlosilo estas eliptika-kurva Diffie-Hellman super secp256k1, kaj la algoritmo de Shor solvas la diskretan logaritmon rekte. Recuperi unu privatan ŝlosilon el ĝia publika kontraŭparto retroaktive eksponas ĉiun komunan sekreton, kiun tiu ŝlosilo iam produktis.
La ameaĝo, kiun ĉi tio kreas, ne estas postponata ĝis kiam tia maŝino ekzistos. Adversario kun stokaĵo povas registri ĉifritan tekston hodiaŭ kaj deĉifri ĝin kiam ajn la kapablo alvenos. Ĉio sendita nun, kiu ankoraŭ gravas tiam, estas jam kompromitita. Tio estas la specifa atako, kiun post-kvanta ŝlos-interŝanĝo venkas, kaj tio estas la kialo, kial la laboro ne povas atendi ĝis la maŝino estos konstruita.
1.1 La demando, kiun ĉi tiu artikolo respondas
La mitigado estas bone komprenata: uzu post-kvantan ŝlos-enkapsuligan mekanismon kune kun la klasika interŝanĝo, tiel ke atakianto devas rompi ambaŭ por legi ion ajn. Nymchat uzas ML-KEM-768 (FIPS 203). Tio tuj levas distribuan problemon:
Por mesaĝi Alicion hodiaŭ, vi bezonas unu aferon: ŝian npub. Aldonu post-kvantan interŝanĝon kaj vi bezonas duan — ŝian ML-KEM publikan ŝlosilon. Kie tiu ŝlosilo loĝas, kaj kiel vi ricevas ĝin antaŭ ol vi povas sendi al ŝi ion ajn?
Npub estas memkontenanta. Vi povas skribi ĝin sur papero, legi ĝin voĉe, aŭ skani ĝin de ekrano, kaj ĝi estas ĉio, kion iu ajn bezonas por ĉifri al vi. Publika ŝlosilo ML-KEM-768 estas 1 184 bajtoj. Ĝi ne povas esti legita voĉe, ĝi ne povos enesti en uzantnomon, kaj ĝi ne apartenas en QR-kodo apud identeco, kiu estas nur 32 bajtoj.
Grandeco estas la facila parto. La pli malfacila parto estas, ke dua ŝlosilo alportas tri apartajn problemojn, kaj la resto de ĉi tiu artikolo estas plejparte respondo al ili:
- Ĝi povas esti substituita. Ŝlosilo, kiun neniu povas
- Ĝi devas kongrui tra la aparatoj de uzanto. La sama konto sur telefono kaj laptopo devas prezenti la saman ŝlosilon, aŭ mesaĝoj sigelitaj al unu ne povas esti malfermitaj en la alia. Sekcio 3.2 kondukas al tio.
- Ĝi povas perdiĝi. La publika ŝlosilo estas re-publikigita el sekreto, do tio, kio efektive devas postvivi, estas tiu sekreto — kaj laŭ la konstruo nenio alia rekonstruas ĝin. Sekcio 10.1 klare deklaras kion tio kostas, ĉar ĉi tiu ne estas solvita, sed eher pagita.
2Dizajnaj limigoj
Kvar limigoj formis la respondon, kaj ili ekskludas la plej multajn el la evidentaj dezajnoj antaŭ ol iu ajn kodo estas skribita.
- Tiel malmultajn sekretojn kiel ebleblas. Nostr-uzantoj jam portas precize unu sekreton, la nsec-on. Ĉiu aldona sekreto estas alia maniero perdi vian historion, kaj iu, kiu scias fari sekurkopion de nsec, ne scios fari sekurkopion de io alia. Sekcio 3.1 montras, ke ĉi tiu ne povas esti tute plenumita — post-kvanta ŝlosilo derivita el la nsec ne provizas ajnan post-kvantan protekton — do la dezajno eluzas precize unu sekreton kaj ne pli: unu solan pecon de ŝlosilmaterialo, generita unufoje por ĉiu identeco, prezentita en la sama formo kiel la nsec kaj en la sama loko, tiel ke kiu ajn scias kiel konservi unu, scias kiel konservi la alian. Sekcio 10.1 estas honesta pri tio, kion tio ankoraŭ kostas.
- Neniu aŭtoritato. Ne ekzistas servilo, kiun oni povas fidi por diri, kiu ŝlosilo apartenas al kiu. Tia servilo ajn fariĝas la punkto, ĉe kiu mesaĝoj povas esti redirektitaj.
- Multaj aparatoj, unu identeco. Nostr-identeco estas kutime uzata de pluraj klientoj samtempe. Ĉiu ajn ekzistanta ŝlos-materialo devas finiĝi identa ĉe ĉiuj ili, kaj la vojoj kiuj transportas ĝin tien mem ne devas esti legeblaj de la malamiko kontraŭ kiu la funkcio defendas.
- Neniu intertraktado. Ĉiu
3Sendependa radika sekreto
La fundamenta decido estas, ke la ML-KEM-dekapsuliga ŝlosilo estas semita el ŝlosilmaterialo, kiun neniu publika valoro malkaŝas. Ĉiu identeco ricevas unu
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)
La radiko estas prezentata al la uzanto tiel kiel nsec estas: bech32 kun la hom-legebla prefikso
nympq, do ĝi legiĝas kiel nympq1…, montrita apud la nsec en la identeco-ekrano malantaŭ la sama malkaŝa interago, kopita per la sama kontrolo, neniam registrita kaj neniam sendita ien ajn en klara teksto. Ĝi ne estas pasvorto kaj ĝi ne estas ensaluto. Ĝi estas ŝlos-materialo, kiun la uzanto povas konservi, tute same kiel la nsec.
La salto estas intence domaine-apartigita, tiel ke neniu alia sekreto iam povas derivi la saman ŝlosparon.
La epoch kalkulilo movigas rotacion (Sekcio 9).
3.1 Kial la ŝlosilo ne povas esti derivita el la identiga ŝlosilo
La evidenta dezajno estas semi la ŝlosoparono el la sekreto, kiun la uzanto jam havas:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Ĝi estas alloga pro kvar kialoj, ĉiuj realaj: nenio nova por rezervi, ĉar la nsec jam estas la rezervo; ĉiu aparato konsentas per la konstruado, sen iu sinkroniga protokolo por erari; unu anstataŭebla anonco por identeco esti evidente ĝusta, ĉar aparatoj ne povas malkonsenti pri la ŝlosilo; kaj la ŝlosilo ekzistas antaŭ ol ĝi iam estas publikigita, tiel ke kliento povas sigeli ion al si mem dum la unua funkciigo.
Ĉiuj la kvar avantaĝoj estas senvaloraj pro unu kialo. Shor-algoritmo aplikata al publikigita npub eldonas la nsec. La semaĵo-derivado estas publika algoritmo super la nsec. Tial la adversario, kiu rompas la klasikan duonon, rekonstruas la post-kvantan duonon per la sama HKDF, kiun ĉiu alia uzas. Kontraŭ "kollekti-nun-dekripti-poste" — la ununura ameaĝo, kiun la funkcio ekzistas por malhelpi — ŝlosilo derivita tiel ne aldonas ion ajn.
La ML-KEM decapsuliga ŝlosilo devas veni el entropio, kiu estas nek derivata el la nsec, nek iam transdonita sub klasika-sola ĉifrado.
La dua klausulo de tiu regulo faras tiel da laboro kiel la unua. Sendepende generita sekreto, kiu poste estas sinkronigita inter la aparatoj de uzanto ene de ordinara NIP-44-mesaĝo, estas la sama malsukceso kun pliaj paŝoj: adversario registras tiun mesaĝon hodiaŭ kaj poste recuperas ĝian klasikan ŝlosilon, kaj la radiko malkovriĝas. Tial la vojoj en la sekva sekcio estas tiaj kiel ili estas, kaj kial neniu el ili estas "sendu ĝin al via alia aparato".
3.2 Aldoni la radikon al la aliaj aparatoj de la uzanto
Limigo 3 de Sekcio 2 — unu identeco, pluraj aparatoj — ne povas esti plenumi per aritmetiko ĉi tie, ĉar la esenco estas, ke la ŝlosilo ne estas funkcio de io ajn, kion la aparatoj jam havas komune. Ĝi devas esti plenumi per transporto anstataŭe, kaj ekzistas precize unu vojo: la uzanto movas la nympq1… kodigi sin.
La radiko estas montrita kiel nympq1… krom la nsec, kaj dua aparato akceptas ĝin gluitite en la saman panelon. Tio estas la tuta mekanismo. Aparato, kiu ne ricevis la kodon, ne povas partopreni, kion Sekcio 4.2 priskribas.
Mana translokigo estas intenca fundamento anstataŭ unua paŝo. La regulo en Sekcio 3.1 diras, ke la radiko neniam rajtas vojaĝi sub nur klasika ĉifrado, kaj ĉiu mekanismo, kiu igus tion aŭtomata — sinkronigante ĝin per relé, ĉirkaŭvolumante ĝin al la identiga ŝlosilo — tute malobservas ĝin. La paŝo, kiun la uzanto faras, estas la kialo, kial la protekto estas reala.
La formato lasas spacen por envelopita vojo: rekordo povas enhavi liston de envelopoj, ĉiu el kiuj estas AEAD-blobo sub ŝlosilo, kiun la uzanto povas reprodukti en alia aparato — ekzemple, eldato de passkey-PRF. Nenio liveras tian hodiaŭ, kaj ĝis io faras tion, la nympq1… kodo estas
la sola vojo trans.
Sekcio 10.1 deklaras kion tio kostas.
La rekordo mem loĝas en sia propra agorda kategorio, nymchat-pq-root, kaj sinkronigas kiel la aliaj kategorioj faras. Eĉ sen enhavi envolvaĵojn, ĝi plenumas necesan laboron: ĝia ĉeesto estas kiel la dua aparato lernas, ke ĉi tiu identeco jam havas radikon, kio malhelpas ĝin krei rivalan (Sekcio 3.3).
La nymchat-pq-root kategorio devas ne estu ĉifritita per la radiko-derivita ML-KEM-ŝlosilo. Tiu linio enhavas la solan kopion de la radiko, tial sigeli ĝin sub ŝlosilo derivita el la radiko estas ŝlosilo, kies ŝlosilo troviĝas ene de la skatolo: neniu aparato iam povus malfermi ĝin, inkluzive de la unu, kiu skribis ĝin. Ĝi estas sigelita klasike — NIP-44 al si mem — aŭ tute ne. Tio estas la unu loko, kie la dezajno akceptas nur klasikan protekton, kaj ĝi povas ŝarti tion: la linio ne enhavas radikon hodiaŭ, nur la fakton, ke tia ekzistas.
Ĉiu alia agordkategorio povus kaj devus uzi la radik-derivitan ŝlosilon. Tio estas la ununura escepto, kaj ĝi estas escepto pri cirkulariteco prefere ol pri forto.
3.3 Generado kaj adopto
Dum ŝaltado, tenante daŭripovan identecon, kliento laboras en ĉi tiu ordo:
- Serĉu ekzistantan
nymchat-pq-rootrekordo. - Rekordo trovita, kaj ĉi tiu aparato povas malpakigi ĝin — adopto ĝin kaj anoncu ĉi tiun identecon kiel post-kvante kapablan.
- Rekordo trovita, kaj ĉi tiu aparato ne povas malpakigi ĝin — ne generu novan radikon, kaj ne publikigu ajnan anoncon tute. Instigu la uzanton konekti ĉi tiun aparaton per enigi la
nympq1…kodo de aparato, kiu jam havas ĝin. - Neniu rekordo — generu radikon, publikigu la rekordon, anoncu, kaj montru la
nympq1…kodo al la uzanto unufoje, por ke ili povu konservi ĝin.
Paŝo 3 estas la paŝo, kiun estas facile erari, kaj ĝi estas la kialo, kial la ordo estas skribita anstataŭ esti lasita al ĉiu implementado. Du aparatoj, kiuj ĉiu decidas generi radikon, produktas du sendependajn radikojn sub unu identeco, kaj tio estas la malsukceso, kiun ĉi tiu ordo ekzistas por malhelpi.
4La anonco pri la kapablo
La publika duonparto de la derivita ŝlosilparo estas publikigita kiel adreseblaĵo.
NIP-01
evento — speco 30078, etiketita 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": [ ... ]
}
}
Adresebleco signifas, ke la relé konservas unu eventon por ĉiu (speco, publika ŝlosilo, d-tag), do ulangpublikigo anstataŭigas la antaŭan anoncon ĉe la sama loko. Tial ĉiu identeco havas precize unu aktualan rekordon, kio igas "serĉi la ŝlosilon de Altiĉo" unuan neambiguajn eltiron anstataŭ liston por rekonsilii.
La subskribo estas la ligiĝo. La evento estas subskribita per la identiga ŝlosilo, do la aserto «ĉi tiu ML-KEM-ŝlosilo apartenas al ĉi tiu npub» estas tute same forta kiel la npub mem. Substitui per alia enkapsuliga ŝlosilo postulas falsi secp256k1-subskribon. Atakanto, kiu povas fari tion, ne bezonas okupiĝi pri la KEM.
Anoncoj kadukiĝas. Septunmana NIP-40 kaduko, re-publikita ĉiuj 24 horoj, tenas la rekordon kiel deklaron pri kliento, kiu ankoraŭ funkcias, anstataŭ pri unu, kiu iam funkcis. La radiko mem neniam kadukas; nur la aserto pri ĝi kadukas.
Eksvalidigita anonco estas legata precize kiel unu, kiu neniam portis ŝlosilon: nodoj sendas ordinaran NIP-44, kiun ĉiu eniro povas legi, kaj la kliento rekomencas la post-kvantan interŝanĝon en sia venonta konekto, kiam ĝi denove publikigas. Tial silentiĝi pli longe ol semajno kostas protekton por la mesaĝoj senditaj dum la intervalo — ili estas klasike ĉifritaj anstataŭ kvant-rezistaj — kaj ne kostas ion alian. Liverado ne estas influata, nenio jam ricevita fariĝas neleginda, kaj neniu ago estas bezonata kiam oni revenas.
Tiu asimetrio estas la kialo de la kaduko, ne hazardo de ĝi. Sen ĝi, rekordo vivas pli longe ol la ŝlosilo, kiun ĝi nomas: aparato, kiu estas forviŝita, reinizita, aŭ kies radiko estas anstataŭigita, lasas stantan instruon enkapsuli al ŝlosilo, kiun neniu plu posedas, kaj mesaĝoj senditaj sub ĝi estas perditaj sen eraro ĉe neniu flanko. Septem tagoj limigas tiun fenestron, kaj permesas al relajloj mem forĵeti la rekordon anstataŭ fidi je klientoj rimarki ĝin.
La ŝlosila kampo nomas ĝian formaton. La kampo estas pk2, kaj la cifero estas parto de la kontrakto anstataŭ dekoracio: ĝi nomas la ŝarĝformaton, kun kiu la ŝlosilo povas esti uzata. Leganto, kiu ne agnoskas la kampon, konkludas «Nymchat kliento, neniu post-kvantuma ŝlosilo» kaj sendas ordinaran NIP-44, kiun ĉiu ensalutigo povas legi. Tio estas la ĝusta direkto de malsukceso, kaj estas valorinde deklari kiel regulo la celon, kiun la formatnumaraĵo celas devigi: neagnotata kapabileca pretendo devas kosti protekton, neniam liveron. Ŝlosilo, kiun kolego ne povas uzi, estas pli malbona ol neniu ŝlosilo tute, ĉar la mesaĝo, kiun ĝi produktas, estas perdita sen eraro ĉe neniu flanko.
4.1 Absenco estas signifa kaj trivalenta
Subtila sed grava detalo: la anonco estas publikigita de ĉiu Nymchat-kliento, ne nur post-kvantume kapablaj, kaj la ŝlosilkampo estas opcia. Tio rezultigas tri distingeblajn statojn anstataŭ du:
| Observita | Rimedoj | Sendu konduton |
|---|---|---|
| Anonco kun ŝlosilo | Nymchat, postkvantume kapabla | Hibrido |
| Anonco, neniu ŝlosilo tute | Nymchat, nur klasika — post-kvanta malŝaltita, aŭ aparato ankoraŭ ne ligita al la radiko de la identeco | Klasika NIP-17 |
| Neniu anonco | Neskia kliento. Povus esti iu ajn Nostr- aŭ Bitchat-uzanto. | Klasika, plus kompatibileca envolvaĵo |
Kolapsigi la trian radon en la kvaran estus vera perdo. Senŝlosila anonco estas subskribita deklaro, ke la sendanto operacias Nymchat, kio permesas al la senda vojo preterpasi spekulan inter-protokolan ĉembaligon, kiun ĝi aliflanke devus inkluzivi por iu ajn, kiun ĝi ne povas identigi.
4.2 Aparato kiu ne povas malfermi la radikon restas silenta
La anonco estas anstataŭebla: unu evento por ĉiu identeco, la lasta skribo venkas. Tio estas kio faras la ununura-registran dezajnon funkcii, kaj ĝi ankaŭ estas kio faras ne-ligitan aparaton danĝera se ĝi publikigas. Aparato, kiu anoncis ŝlosilon, kiun ĝi mem kreis por si mem, superŝanĝus la veran registron kaj sendus ĉiun nodon al ĉifrado per ŝlosilo, kiun la aliaj aparatoj ne povas malfermi.
Do, aparato kiu scias, ke radiko ekzistas sed ne povas malfermi ĝin, tute ne publikigas ajnan anoncon. Ĝi ne estas difektita kaj ĝi ne estas blokita el la aplikaĵo: ĝi ankoraŭ legas ĉiun mesaĝon, por kiu ĝi havas la ŝlosilojn, kaj ankoraŭ sendas klasike, dum ĝi instigas la uzanton ligi ĝin. Silento estas la ĝusta konduto por aparato, kiu ne povas paroli por la identeco.
5Malkovro kaj la decido pri sendado
Klientoj lernas la ŝlosilojn de kunuloj per du manieroj. Daŭra abono kovras la homojn, kun kiuj uzanto efektive korespondas — malfermajn konversaciojn kaj grupanojn — tiel ke iliaj anoncoj alvenas kiel ordinaraj eventoj. Por kunulo renkontita unuanfoje, unufoja demando estas plenumata ĉe la sendtempo, kun limigo de 2,5 sekundoj; se ĝi ne sukcesas, la mesaĝo fariĝas klasika, kio estas la konduto, kiu ekzistis antaŭ ol post-kvanta estis aldonita, anstataŭ nova maniero de malsukceso.
Negativa rezulto estas keŝita dum dek minutoj anstataŭ por ĉiam. Uzanto, kiu ligas novan aparaton, aŭ kiu transiras de eniro per retumila aldono al loka ŝlosilo, fariĝas post-kvante kapabla meze de konversacio, kaj permanente keŝita "ne" tenus ilin ĉe klasika ĉifrado dum la vivo de la anonco.
5.1 Kial ne ekzistas reduktiga atako
La decido pri rutigo reduktiĝas al ununura demando:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Ne ekzistas negocado de kapabloj estas la intertraktado, kaj ĝi estas subskribita. La erarmodo de striita aŭ retenita anonco estas, ke la mesaĝo ias klasika — la status quo antaŭ ĉi tiu funkcio — anstataŭ ke hibrida mesaĝo estas malaltigita al io falsebla.
La inversaĵo ankaŭ validas kaj pli gravas: kliento sendas hibridon nur kiam ĝi tenas ŝlosilon, kaj teni la ŝlosilon estas pruvo, ke la ricevanto povas dekapsuli. Ne ekzistas stato, en kiu mesaĝo estas sendata post-kvante al iu, kiu ne povas legi ĝin.
6La hibrida konstruo
Nymchat ne anstataŭas NIP-44-on. Ĝi ĉirkaŭvolvas ĝin. Neŝanĝita NIP-44-ĉifritulo estas la interna tavolo, kaj ML-KEM ŝlosas eksteran AEAD ĉirkaŭ ĝi:
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)
Ambaŭ sekretoj ankoraŭ devas esti recuperitaj por legi la mesaĝon: la ekstera tavolo liveras nur NIP-44 ĉifritan tekston, kaj malfermi tion postulas la klasikan ECDH. Kvanta adversario, kiu rompas secp256k1, ricevas la internan ŝlosilon kaj ankoraŭ alfrontas ML-KEM; rompo de ML-KEM forigas la eksteran tavolon kaj lasas NIP-44 staranta. Ĉiu enigo meritas sian lokon:
kem_ssŝlosilas la eksteran tavolon sola. Neniuĵo en ĉi tiu derivado tuŝas la puran ECDH-eltron, kio estas tio, kion Sekcio 6.1 ŝaltas.kem_ct,recip_kem_pkkaj ambaŭ identigaj ŝlosiloj estas ligitaj kiel kunligita datumo, do la ekstera tavolo estas firme ligita al la preciza transskripto, kiu produktis ĝin. Aldonado de cifertteksto al la identeco de alia sendinto malsukcesas pri aŭtentikigo anstataŭ pri dekriptado.
Enkapsuligo estas farata freŝe por ĉiu mesaĝo. La ML-KEM-ŝlosilo de la ricevanto estas longdaŭra, sed
ĉiu mesaĝo portas sendependan ĉifrotekstton kaj tial sendependan
kem_ss. Tio estas kio igas derivi la nonon anstataŭ randomigi ĝin saĝa:
ChaCha20-Poly1305
estas rompita per reuzado de (ŝlosilo, nonce) paro, kaj ĉi tie la ŝlosilo mem estas nova por
ĉiu mesaĝo, do neniu paro povas ripetiĝi.
6.1 Kial la tavolojoj restas apartaj
La alternativo estas kombini ambaŭ sekretojn en unuagan konversacian ŝlosilon kaj transdoni tion al NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Tiu konstruo estas solida kiel kriptografio. Ĝi havas unu strukturan problemon: ĝi bezonas
ecdh_x, la bruta x-koordinato de la ECDH-elĵo, kiel ŝlosstero-materialo — kaj retumila
aldonaĵo (NIP-07) aŭ remota subskribanto (NIP-46) neniam redonas tiun valoron. Ĝi efektivigas NIP-44 nomde la vokanto kaj redonas ĉifrotekston, kio estas la tuta celo de teni la ŝlosilon en loko, kiun la aplikaĵo ne povas atingi.
Miksiĝo de la sekretoj tial ekskludas ĉiun ensaluton, kiu konservas la identigan ŝlosilon en subskribanto, kio signifas la plej zorganajn uzantojn, kaj neniu kvanto de laboro pri la ŝlosilderviĝo povas ŝanĝi tion. Stratigado forigas la dependon: NIP-44 restas tuta kaj estas produktata de ĉio ajn, kiu tenas la identigan ŝlosilon, inkluzive de subskribanto, dum la KEM-duono estas kalkulata el la recupera kodo, kiun la kliento tenas rekte. Subskribantaj ensalutoj estas ordinaj post-kvantaj partoprenantoj en ambaŭ direktoj.
La kosto estas ancho de banda, kaj ĝi ne estas malgranda. La ML-KEM ĉifroteksto estas 1 088 bajtoj kaj akompanas ĉiun mesaĝon, base64url-kodita al 1 451 karakteroj; la ekstera AEAD aldonas 16-bajtan Poly1305-tagon kaj pligrandigas per trepiono la NIP-44-ŝarĝon, kiun ĝi ĉirkaŭas. Mesaĝo de 50 karakteroj kreskas de 176 bajtoj al 1 712, kaj tiu de 2 000 karakteroj de 2 820 al 5 238. La minimumo estas proksimume 1,5 KB po mesaĝo, sendepende de kiel mallonga la mesaĝo estas, kio estas la prezo de nova enkapsuligo ĉiufoje anstataŭ la reuzo de komuna sekreto.
6.2 Mempriskribemaj ŝarĝoj
La pq2. Prefikso igas la implementadon inkrementan: ĝi estas mempriskriba, tial kliento elektas la deĉifradan vojon per inspektado de la enhavo anstataŭ per fido al etikedo aŭ memoro pri tio, kion kunulo subtenas. Leganto, kiu ne rekonas prefikson, ne sukcesas malfermi tiun enhavon anstataŭ mislegi ĝin, kaj mesaĝoj sigelitaj antaŭ ol iu ajn flanko povis fari post-kvantan protekton restas legeblaj kiel ordinara NIP-44 sen migrado.
ML-KEM dekapsuligo estas desegnita neniam malsukcesi: donante malformitan ĉifrittekston, la Fujisaki-Okamoto transformo redonas deterministan pseudonrandan sekreton anstataŭ eraron. Tial malĝusta ŝlosilo tute ne aperas ĉe la KEM-nivelo — ĝi aperas kiel HMAC-eraro interne de NIP-44, kio estas la sama maniero kiel malĝusta klasika ŝlosilo aperas. Vokantoj traktas ambaŭ identike, do la malsukceso ne portas distingeblan signalon. Ĝi ankaŭ estas tio, kio igas la kandidatliston de Sekcio 9.1 praktikabelebla: kliento provas ĉiun ŝlosilon unu post la alia kaj lasas NIP-44 diri, kiu estis ĝusta.
6.3 La ambaŭ tavoloj de la donacpapero
A NIP-17 privata mesaĝo estas NIP-59 donpakado: senonirma rumeo, sigelita sub la identiga ŝlosilo de la sendinto (speco 13), poste ĉekaŭpakita sub efemera ŝlosilo generita por ĉiu mesaĝo (speco 1059). En ensalutigo, kiu regas la identigan ŝlosilon rekte, Nymchat hibridigas ambaŭ tavolojn, ĉiu kun sia propra enkapsuligo.
Eniro de signanto ricevas nur la eksteran tavolon. La sigelo estas produktita de la signanto kiel ordinara NIP-44 — la aplikaĵo neniam vidas la ŝlosilon, kiu faras ĝin — tial ĝi ne povas esti hibridigita ĉe la loko. Tio ne kostas ion kontraŭ la temata atako: la sigelo estas atingebla nur per la envolvaĵo, kaj la envolvaĵo estas tio, kion registrilo stokas. Malsamideculo posedanta registritan trafikon devas rompi ML-KEM antaŭ ol eĉ sigelo estas videbla por ataki.
7Grupaj mesaĝoj kaj partia kovrado
Grupmesaĝo ne estas unu ĉifrotatuko. Ĝi estas la sama klarteksto distribuitita al ĉiu membro, ĉiu kopio enkapsuligita al la propra ML-KEM-ŝlosilo de tiu membro. Membro, kiu publikigis ŝlosilon, ricevas hibridan ĉembalpakon; tiu, kiu ne faris tion, ricevas klasikan ĉembalpakon.
Tio kreas kontistan problemon, kiun naiva implemento malĝuste traktas. Se ok el dek membroj ricevas hibridan kopion, la mesaĝo estas ne ok dekono protektita. Adversario bezonas unu klasikan kopion de klarteksto, kiu estas identa en ĉiuj dek, do la mesaĝo estas protektita nur se ĉiu kopio estas.
Nymchat tial spuras po-mesaĝan kovron dum la disvastiĝo — la nombro estas nur sciativa dum la envolvoj estas konstruataj — kaj la emblemo raportas "kvant-rezista al 8 el 10 membroj" anstataŭ aserti, ke la mesaĝo estas protektita. Kie neniu nombro estas disponebla, kio estas la norma kazo por ricevite grupo-mesaĝo (nur la sendinto kalkulas la disvastiĝon), la interfaco raportas partian anstataŭ plenan protekton. Aserti plenan protekton per la forto de nur la propra kopio estus troa deklaro pri la mesaĝo kiel tuta.
7.1 Kion la ŝildo raportas
La ŝildo asertas la veron pri la mesaĝo, ne pri la programaro, kiu sendis ĝin:
- Plena protekto: ĉiu kopio de ĉi tiu plainteksto eliris hibride.
- Partia: kelkaj kopioj de grupo-mesaĝo estis dissenditaj klasike. Tirita degradita anstataŭ plena, ĉar unu klasika kopio de plenteksto identa en ĉiuj de ili estas ĉio, kion adversario bezonas.
- Klasikaĵo estas eksplicite deklarita anstataŭ montrita per la manko de emblemo, ĉar manko de indikilo estas ambigua inter «neprotektita», «difektita» kaj «ĉi tiu versio ne havas la funkcion».
La verdikto estas registrita kiam la mesaĝo estas sigelita, anstataŭ esti denove kalklitata el tio, kion samnivelulo anoncas poste. Ĉifritita teksto, kiu jam ekzistas, ne povas fariĝi pli bone protektita ol ĝi estis, kaj interfaco, kiu redibujus malnovajn mesaĝojn bazante sin sur nova anonco, estus asertanta ion falsan pri bajtoj sur relajlo.
La grupaj reguloj supre estas supermetitaj sur ĉi tiun anstataŭ anstataŭigi ĝin: grupmesaĝo estas tute protektita nur kiam ĉiu membras kopio estis, kaj ricevita grupmesaĝo sen kovrado-kvanto montras "partian".
8Kopioj adresitaj al vi mem
Kelkaj aferoj, kiujn kliento stokas, estas ĉifritaj al la propra identeco de la uzanto: sinkronigitaj agordoj, la konversacia listo, grupŝlosiloj kaj la mesaĝarkivo. Tiuj portas pli da informo pri uzanto ol la plej multaj unuopaj mesaĝoj, do lasi ilin klasike farus ilin la plej malfortan stoken artefakton, sendepende de kiel zorge la mesaĝoj mem estis sigelitaj. Ili uzas la saman hibridon, enkapsuligitan en la uzanto-propra radiko-derivita ŝlosilo — kun la unu sola escepto priskribita en Sekcio 3.2, la nymchat-pq-root kategorio mem, kiu ne povas esti sigelita sub
ŝlosilo, kiun nur ĝi povas produkti.
Tiuj artefaktoj estas kie la dezajno plej gravas. Agord-amaso aŭ arkiva linio sidas en unu loko dum jaroj, kio estas ĝuste la speco de afero, kiun adversario de "kolekti-taniere-dekripti-poste" kolektas — multe pli ol ajn unuagan mesaĝon, kiu estas almenaŭ efemera en la propra menso de la uzanto.
Unu limigo regas la formaton ĉi tie pli ol la ŝlosilon. Memadresita kopio devas esti legebla de ĉiu aparato sur la konto, do ĉiu aparato deklaras kion ĝi povas malfermi en la listo, kiun ĝia anonco portas, kaj la konto skribas nur tion, kion ĉiuj ili povas legi. Skribi ion ajn alian ŝlosus aparaton el siaj propraj agordoj — la saman silentan malsukceson, kiun Sekcio 3.2 evitas per aliaj rimedoj, alvenante el malsama direkto.
Aparato, kiu tenas la identecon sed ne la radikon, ne povas malfermi ion ajn sigelitan per la radiko-derivita ŝlosilo, inkluzive de siaj propraj agordoj. Tio estas intenca sekvo, ne forgeso, kaj estas la kialo, kial Sekcio 3.3 havas tian aparatan prompton por ligado anstataŭ krei novan radikon: dua radiko ne farus la blobon legebla, ĝi nur splitus la ŝlos-materialon de la identeco en du. Ĝis la uzanto ligas ĝin, la aparato daŭre funkcias — ĝi legas tion, por kio ĝi havas la ŝlosilojn, kaj sendas klasike.
Aparato reganta retumilan aldonon aŭ malproksiman subskribilon (NIP-46) ne tenas nsec por derivi de, sed ĝi ja tenas la reskupan kodon, kaj sub la stratuma konstruado de Sekcio 6.1 tio estas ĉio, kion la post-kvanta duonparto bezonas: la subskribilo produktas la NIP-44 straton kiel ĝi ĉiam faris, kaj la kliento mem ŝlosas la eksteran straton. Tia ensalutigo estas ordinara partoprenanto en ambaŭ direktoj.
9Rotacio
La epoch Kontruo en la derivado estas tio, kio ebligas rotacion sen nova ŝlosmaterialo. Incrementigo de ĝi donas novan ŝlosparon el la sama radiko kaj re-publikigitan anoncon; la kunuloj prenas la novan ŝloson el la substituinda rekordo. Tial rotacio ne petas la uzanton skribi ion ajn duanfoje: la radiko estas generita unufoje por ĉiu identeco kaj la epoko faras la turnadon.
9.1 Malnovaj epokoj estas konservataj, kaj nenio estas reŝifrita
Nenio estas reeskribata kiam ŝlosilo rotacias. Kliento konstruas deĉifraj kandidatojn de la nuna epoko ĝis epoko −3, do mesaĝo sigelita iom antaŭ rotacio ankoraŭ malfermiĝas kontraŭ la ŝlosilparo, kiu estis aktuala kiam ĝi estis sendita.
Tiu fenestro estas tio, kio faras rotacion tute sekura: sen ĝi, ĉiu rotacio strandigus ĉion, kio estis en flugo. Ĉio jam sigelita restas legebla dum la vivo de la identeco, ĉar mesaĝo, kiun la uzanto ne plu povas malfermi, estas pli malbona por ili ol tiu, kies protekto ne povas esti plibonigita retroaktive (Sekcio 10.5).
10Kion ĉi tio ne protektas
Artikolo, kiu nur listigas kion dezajno atingas, ne priskribas sistemon, kaj troigi sekurecan propron en interfaco estas pli malbona ol omisi ĝin. La sekvaj estas ekster kion ĉi tiu konstruo defendas.
10.1 La radiko estas dua sekreto, kaj perdi ĝin estas ne-recuperebla.
Tio estas la reala prezo de la dezajno. La limigo en Sekcio 2, ke uzanto devus havi precize unu aferon por konservi, ne povas esti plenumita: la nsec mem ne rekonstruas la post-kvantan ŝlosilon, ĉar la ĉefa esenco estas, ke neniu publika valoro kaj neniu alia sekreto malkaŝas ĝin. Se neniu aparato tenas la radikon kaj neniu el la ĉembaloj de Sekcio 3.2 povas esti malfermataj, materialo sigelita al la radiko-derivita ŝlosilo ne estas recuperigebla. Ne ekzistas eskrovado kaj intencite ne ekzistas aŭtoritataro, kiu povus teni eskvron.
Per manŭla transiro kiel la sola vojo, tio estas pli akra ol ĝi povus ŝajni unue legi. Uzanto, kiu neniam kopias la nympq1… kodo ĉien havas precize unu kopion de ĝi, sur unu aparato, kaj perdi tiun aparaton perdas ĉiun post-kvantan mesaĝon, agord-blobon kaj arkiv-linion sigelitan al ĝi. La
nsec ne helpas; tio estas la propraĵo, sur kiu la tuta dezajno ripozas.
Ĉiu poste aldonita envolvita vojo devas plenumi la saman normon kiel la mana. Atakanto atakas la plej malmultekostan disponeblan vojon, do skemo havas la valoron de sia plej malforta rekuper-vojo — ekzemple, memorebla frazŝlosilo metus la tutan aferon laŭ la valoro de la frazŝlosilo, kaj la envolvita linio estas ĝuste la artefakto, kiun adversario de la tipo "kollektu nun, dekriptu poste" kolektas kaj molaŝas senrete dum sia libera tempo.
10.2 Aŭtentikigo, distingata de konfidencialeco
Ĉiu subskribo en Nostr estas Schnorr super secp256k1, kaj tio restas senŝanĝita ĉi tie. Adversario kun kvantkomputilo povus falsi subskribojn kaj impersoni uzanton en realtempo. Kion la hibrida ŝlosilekŝanĝo venkas kontraŭ estas "rikollekti-taniere-dekripti-poste": atakanto registrante trafikon hodiaŭ ne povas legi ĝin poste. Ĝi ne igas mesaĝon nefalsigebla kontraŭ adversario, kiu jam havas la maŝinon. Tiu distingo estas intence portita en la aplikaĵojn — la ĉelnokla indikilo raportas aŭtentigon, la ŝildo raportas konfidenciecon, kaj ili estas apartaj glifoj ĉar mesaĝo povas havi unu sen la alia.
Ĝi ankaŭ limigas tion, kion la anonco en Sekcio 4 povas promesi. La ligiĝo inter npub kaj ML-KEM-ŝlosilo estas secp256k1-subskribo, do malamiko, kiu povas falsi ilin, povas anstataŭigi per sia propra ŝlosilo. Konfidencialeco kontraŭ estonta malamiko ne estas la sama kiel aŭtentikeco kontraŭ tia.
10.3 Metadatoj
Donac-velopado kaŝas la sendanton, la riceanton preter unu sola p etiketo, la speco kaj la tempsignaturo de la interna mesaĝo. Ĝi ne kaŝas, ke evento ekzistas, ĝian grandecon, aŭ kiam relé ricevis ĝin. Trafika analizo ne estas traktata de iu ajn parto de ĉi tiu dezajno.
10.4 La malonline meso
La Bluetooth-mesh-transporto de Nymchat estas aparta protokolo kun sia propra handshake, kaj ĝi ne estas kovrita de ĉi tiu laboro. Mesagloj tra la mesh estas klasika.
10.5 Mesaĝoj jam senditaj
Ĉifroteksto registrita dum unu el la flankoj ankoraŭ estis klasika, restas klasika permanente. Ĝi jam ekzistas kaj ne povas esti re-sigelita. Protektado komenciĝas ĉe la mesaĝo, kie ambaŭ flankoj havis post-kvantajn ŝlosilojn, ne ĉe la momento, kiam la funkcio estis aktivigita.
11Konsideritaj alternativoj
| Alproksimiĝo | Kial ne? |
|---|---|
| Derivu la post-kvantuman ŝlosilon el la identiga ŝlosilo | Reĵita. La derivado estas publika algoritmo super la nsec, kaj kvanta adversario recuperas la nsec el la publikigita npub, do la rompado de la klasika duonparto liveras la post-kvantan duonparton kune kun ĝi. Ĝi solvis ĉiun distribu-problemon en ĉi tiu artikolo kaj defendis kontraŭ neniu. Sekcio 3.1. |
| Sendu la radikon al la aliaj aparatoj de la uzanto per NIP-44 | Reĵetita pro la sama kialo en malsamaj vestoj. Radiko transmit |
| Aparte generita ML-KEM-paro de ŝlosiloj en ĉiu aparato | Malakceptite. Aparatoj teretus malsamajn dekapsuligŝlosilojn, kaj unu anstataŭebla anonco por identeco ne povas porti ilin ĉiujn. Peer-oj enkriptus al kiu ajn ŝlosilo estis lasta publikigita, kaj ĉiu alia aparato ne povus legi la rezulton. Unu radiko por ĉiu identeco, movata per la vojoj de Sekcio 3.2, estas tio, kio evitas tion. |
| Envelopu la radikon sub PIN-kodo. | Malakceptita. Tetracifra PIN estas ĉirkaŭ 13-bita kontraŭ senreteca atakanto posedanta la envolviton linion. Oferti ĝin apud du 256-bitaj vojoj misreprezentus la valoron de la plej malforta envolviĝo. |
| Etendu la npub por porti ambaŭ ŝlosilojn. | 1 184 bajtoj ne estas partigebla identigilo, kaj ĝi rompes la parson de ĉiu ekzistanta Nostr-kliento de adreso, kiu estas difinita kiel 32 bajtoj. |
| Ĉefa repertuara servo | Reintroduktas la aŭtoritaton, kiun la reto celas eviti. Kiu ajn respondas al la serĉo, decidas kiu povas legi la mesaĝon. |
| Aldonu la ŝlosilon al ĉiu mesaĝo | Nenion solvas: la sendanto bezonas la de la ricevanto ŝlosilo antaŭ la unua mesaĝo, kio estas precize la kazo sen antaŭa mesaĝo por porti ĝin. |
| En-banda intertraktado de kapabloj | Kreas superfacon de malpliigo. Atakanto, kiu povas forigi kapablan flagon, devigas la klasikan vojon. |
| Nur postkvanta, sen klasika parto | Forlasas jardekojn da analizo de secp256k1 interŝanĝe por multe pli juna primitivo. Hibrido malsukcesas nur se ambaŭ misfari. |
12Implementa pariteco
Nymchat distribuas du sendependajn implementojn de ĉi tiu konstruaĵo — unu en JavaScript por la retaplikaĵo, unu en Dart por la poŝtelefonaj aplikaĵoj, inkluzive de ML-KEM-768-portado kreita de la komenco. Du implementoj de la sama primitivo estas kutime riskaĵo, tial ili estas komparataj unu kontraŭ la alia anstataŭ esti fidataj por konsenti.
La Dart ML-KEM-impligo estas validigita kontraŭ la oficiala
NIST ACVP
testoj kun konataj respondoj por ML-KEM-768 (ML-KEM-*-FIPS203) — 25 kazoj de ŝlos-generado, 25 de enkapsuligo kaj 10 de dekapsuligo, ruliĝantaj kiel sia propra kompleto. Tiuj estas la vektors, kiujn NIST publikigas por validigi implementon, do sukcesi tra ili estas pruvo, ke la portado estas ĝusta, ne nur pruvo, ke la du klientoj interkonsentis unu kun la alia. Super tio, komuna fiksuilo de testaj vektors — semo-derivado, enkapsuligo, ambaŭ ŝarĝformatoj, kaj plenaj envelopoj — estas generita el la JavaScript-referenco kaj kontrolata de ambaŭ testaj kompletoj. La radika sekreto pligrandigas tiun fiksuilon anstataŭ anstataŭigi ĝin: radiko al semo, radiko al ŝlosparo, la publika fingroprinto de la radiko, kaj la derivita ŝlosilo, nonce kaj rilataj datumoj de la ekstera tavolo estas propraj vektors, do la du klientoj ne povas malkonsenti pri tio, kio...
nympq1… kodo signifas aŭ temas pri la bajtoj, per kiuj mesaĝo estas sigelita. A
diverĝo en iu ajn implementado haltigas la konstruadon anstataŭ produkti mesaĝon, kiun la alia
kliento ne povas malfermi.
La fingrospuro estas nominda inter ĉi tiuj. Ĝi estas tio, per kiu aparato distingas "ĉi tiu estas la radiko, kiun mi tenas" de "ĉi tiu estas alia", kaj kliento, kiu ne povus reprodukti la fingrospuron de alia kliento, legus tute bonan rekordon kiel tute neniun rekordon — kaj tiam, sekvante Sekcion 3.3, krei duan radikon kaj dividi la identecon. Ĝi estas vektoro ĝuste pro tiu kialo.
Nymchat estas malfermita
fonto sub la AGPL-3.0. La kriptografia koro priskribita ĉi tie estas
js/nym-crypto.js kaj js/modules/pq.js en la retkliento, kaj
lib/core/crypto/ kun lib/features/identity/pq_registry.dart en
la mobilaj klientoj.
Por la pli mallonga, ne-teknika klarigo, vidu la sciobaza paĝo pri kvantuma rezista ĉifrado.