Nymchat teknikal whitepaper
Post-Quantum Key Agreement sa Nymchat
Pag-distribusyon ng ML-KEM-768 public keys sa pamamagitan ng Nostr nang walang isang directory o isang registry, at pag-save ang mga ito mula sa isang sekreto na walang public value expose.
Ang pagdaragdag ng isang post-quantum key exchange sa isang messenger ay karaniwang hindi isang problema ng cryptography. Ang mga primitives ay standardized at ang mga library ay magagamit. ang second Ang dokumento na ito ay naglalarawan kung paano ang Nymchat ay sumusuporta sa ito - kung saan ang ikalawang key ay dumating, kung paano ito ay dumating sa mga tao na kailangan nito, at kung ano ang interface ay magbigay sa pag-aari tungkol sa resulta - at, sa huling seksyon, kung ano ang resulta na ito ay hindi protektahan.
Ang pahinang ito ay isinalin sa makina para sa kaginhawahan. Ang orihinal na Ingles ay ang bersyon na naaangkop.
1ang problema
Ang aming mga private messages ay encrypted sa NIP-44, na may dalawang separable halimbawa. Ang halimbawa na scrambles ang plaintext — ChaCha20 na may isang HMAC-SHA256 tag, keyed sa pamamagitan ng ang hdd (Mga pahinang tumuturo sa RFC 5869) — ay hindi nangangahulugan na pinatay sa pamamagitan ng isang quantum computer; ang algorithm ng Grover ay nagkakahalaga ng isang square-root acceleration laban sa isang symmetric key, at 256 bits ay sumasama na. ang agreement sa key ay ang elliptic-curve Diffie-Hellman over ang napili ng mga taga-hanga: 256k1Ang pagkuha ng isang private key mula sa kanyang public counterpart retroactively exposes every shared secret that key ever produced.
Ang isang opponent na may storage ay maaaring i-record ang encryption text ngayon at i-decrypt ito kapag ang kapangyarihan ay dumating. Ang anumang bagay na ibinigay ngayon na kahit na mahalaga pagkatapos ay na-compromise. Ito ay ang espesyal na pag-atake ng isang post-quantum key exchange, at ito ay ang dahilan kung bakit ang trabaho ay hindi maaaring maghintay para sa machine upang bumuo.
1.1 Ang mga tanong na ito ay sumusunod
Ang mitigasyon ay malalaman: i-run ang isang post-quantum key encapsulation mekanismo kasama ang classical exchange, kaya ang isang attacker ay dapat mamatay ang parehong upang basahin ang anumang bagay.Pagkakaiba 203Ito ay nangangahulugan ng isang distribution problem:
Upang mensahe sa Alice ngayon, kailangan mo ng isang bagay: ang kanyang npub. Ipasok ang isang post-quantum exchange at kailangan mo ng isang ikalawang — ang kanyang ML-KEM public key. Nasaan ang key na ito live, at kung paano mo makakuha ng ito bago mo maaaring magpadala sa kanya ng anumang bagay?
Ang isang npub ay self-contained. You can write it on paper, read it out loud, or scan it from a screen, at ito ay ang lahat ng kailangan upang i-encrypt sa iyo. Ang isang ML-KEM-768 public key ay 1,184 bytes. Ito ay hindi maaaring read out loud, ito ay hindi matatagpuan sa isang username, at ito ay hindi nasa isang QR code sa pamamagitan ng isang identity na ay lamang 32 bytes.
Ang mas mahusay na bahagi ay na ang isang ikalawang key ay nagdadala ng tatlong mga problema, at ang iba pang bahagi ng papel na ito ay karaniwang isang solusyon sa mga ito:
- Ito ay maaaring i-substitute. Ang isang key na hindi maaaring makikita sa isang mata ay katulad na uri ng bagay na isang attacker swaps para sa kanilang sarili. Section 4 binds ito sa identity na may isang signature, na kung saan matatagpuan ang isang ito outright.
- Kailangan ito upang makipag-ugnay sa lahat ng mga device ng isang user. Ang parehong account sa isang telepono at isang laptop ay dapat magkaroon ng parehong key, o mensahe sealed sa isa ay hindi maaaring i-open sa ibang.
- Ito ay maaaring maging lost. Ang public key ay re-published mula sa isang sekreto, kaya kung ano ang tunay na kailangan upang i-survive ay ang sekreto - at sa pamamagitan ng konstruksiyon walang iba pang reconstruct ito.
2Design ng mga limitasyon
Dalawang mga limitasyon na binubuo ang solusyon, at ang mga ito ay binubuo ng karamihan ng mga palabas na disenyo bago ang anumang code ay inilathala.
- Mayroong mga sekreto na posible. Ang mga gumagamit ng Nostr ay may eksaktong isang sekreto, ang nsec. Ang bawat pangunahing sekreto ay isang iba pang paraan upang mamatay ang iyong kasaysayan, at ang isang tao na malaman upang i-backup ang isang nsec ay hindi maaaring malaman upang i-backup ang anumang iba pang bagay. Ang Seksyon 3.1 ay nagpapakita na ang isa na ito ay hindi maaaring matatagpuan outright - isang post-quantum key derived mula sa nsec ay hindi nagbibigay ng pag-post-quantum proteksiyon sa lahat - kaya ang disenyo ay gumagamit ng eksaktong isang sekreto at hindi higit pa: isang single piece ng key material, na nilikha ng isang beses sa bawat identity, na itinatag sa parehong form na ang nsec at sa parehong lugar, kaya ang isa sa mga taong malaman kung paano upang i-
- Walang autoridad Walang server na maaaring maging trusted upang sabihin na kung ano ang key ay kumpanya. Any such server becomes the point at kung saan mga mensahe ay maaaring redirect.
- Maraming mga device, isang identity. Ang isang Nostr identity ay karaniwang ginagamit mula sa ilang mga kliyente sa parehong oras. Ang anumang key material ay magagamit ay dapat magsagawa na identical sa lahat ng mga ito, at ang mga path na nagpapadala ito dito ay hindi kailangang maging readable sa pamamagitan ng opponent na ang feature ay defending laban sa.
- Walang negosyo Any in-band exchange of “which ciphers do you support?” is a surface a attacker can strip to force the weaker option.
3Isang Independent Root Secret
Ang decision-bearing ay na ang ML-KEM decapsulation key ay nabuo mula sa key material na walang public value exposes. Each identity gets one root secret, generated once:
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)
Ang root ay inilathala sa user na tulad ng isang nsec ay: sa pamamagitan ng bech32 sa pamamagitan ng human-readable prefix
nympqDahil dito ay tinatawag na nympq1…, na ipakita sa paligid ng nsec sa screen ng identity sa likod ng parehong pag-reveal interaction, na-copy sa parehong control, hindi na logged at hindi na ibinigay sa anumang lugar sa clear. Ito ay hindi isang password at ito ay hindi isang login. Ito ay isang key material na ang user ay maaaring i-save, katulad ng nsec.
Ang salt ay domain-separated sa propesyonal, kaya walang iba pang sekreto ay maaaring maiwasan ang parehong keypair. epoch Ipinanganak ang mga rotary (Section 9).
3.1 Bakit ang key ay hindi maaaring i-derived mula sa identity key
Ang malinaw na disenyo ay upang i-save ang keypair mula sa sekreto na ang user na ngayon ay may:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Ito ay napaka-attractive para sa tatlong mga dahilan, lahat ng mga ito ay real: walang bagong upang backup, dahil ang nsec ay na-backup; ang bawat aparato na nakatuon sa pamamagitan ng konstruksiyon, na walang pag-synchronization protocol upang pumunta sa mabuti; ang isang repatriable announcement sa bawat identity ay malinaw na totoo, dahil ang aparato ay hindi maaaring mag-disagree tungkol sa key; at ang key na karaniwang bago ito ay inilathala, kaya ang isang client ay maaaring i-seal ang isang bagay sa kanyang sarili sa unang pagkakataon.
Ang lahat ng katapusan ay walang katangian, para sa isang dahilan. Ang algorithm ng Shor ay gumagana laban sa isang na-publish na npub ay nagbibigay ng nsec. Ang derivation ng mga seed ay isang public na algorithm sa pagitan ng nsec. Kaya ang opponent na bumalik ang klasikong halimbawa ay i-reconstruct ang post-quantum halimbawa sa pamamagitan ng pag-execute ang parehong HKDF na lahat ng iba ay gumagana. laban sa harvest-now-decrypt-later - ang isa na kinakailangan ang feature ay magkaroon upang mag-stop - isang key na inilathala sa paraan na ito ay hindi gumagamit ng anumang bagay.
Ang ML-KEM decapsulation key ay dapat na dumating mula sa entropy na hindi na derivable mula sa nsec at hindi kailanman inilathala sa ilalim ng classical-only encryption.
Ang isang independiyenteng generated secret na pagkatapos ay sinynchronized sa pagitan ng mga device ng isang user sa loob ng isang normal na NIP-44 mensahe ay ang parehong aksyon na may mga karagdagang mga hakbang: ang isang opponent ay nag-record na mensahe ngayon at i-recover ang kanyang classic key pagkatapos, at ang root ay umalis.
3.2 Pagkuha ng root sa iba pang mga device ng user
Ang limitasyon 3 ng Seksyon 2 - isang identity, ilang mga device - ay hindi maaaring na-satisfied sa arithmetic dito, dahil ang buong punto ay na ang key ay hindi isang function ng anumang bagay na ang mga device na nag-share. nympq1… Code ang iyong sarili.
Ang root ay ipinapakita bilang nympq1… sa loob ng nsec, at ang isang ikalawang aparato ay sumali ito sa parehong panel. Ito ay ang buong mekanismo. Ang isang aparato na hindi ibinigay ng code ay hindi maaaring mag-participate, na kung saan ay inilarawan sa Section 4.2.
Ang kurso sa Seksyon 3.1 ay sabi na ang root ay hindi maaaring mag-move sa ilalim ng classical-only encryption, at ang anumang mekanismo na maaaring gawin ito automatic - syncing ito sa pamamagitan ng isang relay, pag-imbak ito sa identity key - naglalaman ng katotohanan na ito.
Ang format ay nagbibigay ng lugar para sa isang wrapped path: isang record ay maaaring magkaroon ng isang listahan ng wraps, bawat isa ay isang AEAD blob sa ilalim ng isang key na ang user ay maaaring i-replicate sa iba pang device - isang passkey PRF output, halimbawa. nympq1… Ang code ay ang isa sa paraan sa paglipas. Ang seksyon 10.1 ay nagpapakita kung ano ang gastos.
Ang record na ito ay matatagpuan sa kanyang kategorya ng mga setting, nymchat-pq-rootKung hindi ito naglalaman ng mga wraps, ito ay gumagawa ng kailangan na trabaho: ang kanyang karanasan ay kung paano ang isang ikalawang aparato ay malaman na ang identity na ito ay may isang root, na kung saan ay kung ano ang nag-iisip ng isang rival na ito (Section 3.3).
ang nymchat-pq-root Kategorya ang must hindi Ang bar ay naglalaman ng isang kopya ng root, kaya umabot ito sa ilalim ng isang key derived mula sa root ay isang bar na ang key ay sa loob ng box: walang aparato ay maaaring i-open ito, kabilang ang isa na nag-script ito. Ito ay itinatampok classically - NIP-44 sa sarili - o hindi lahat. Ito ay ang isa na lugar na ang disenyo ay nakikipagtulungan ng classical-only protection, at ito ay maaaring makakakuha ng: ang bar ay walang root ngayon, lamang ang katotohanan na ang isa ay may.
Ang lahat ng iba pang mga kategorya ng setting ay maaaring at dapat gamitin ang root-derived key. Ito ay ang single exception, at ito ay isang exception tungkol sa circularity hindi tungkol sa strength.
3.3 Generasyon at adoption
Sa boot, may isang durable identity, ang isang client ay gumagana sa itaas na order:
- Maghanap ng isang existing
nymchat-pq-rootang record. - Ang record na natagpuan, at ang aparato ay maaaring i-unwrap ito - I-adopt ito at i-anunsyo ang identity na ito bilang post-quantum-capable.
- Ang record na natagpuan, at ang device na ito ay hindi maaaring i-unwrap ito Huwag gamitin ang isang bagong root, at huwag i-publish ang anumang ad sa lahat. Pumunta ang user upang i-link ang device na ito sa pamamagitan ng pag-introduce ang
nympq1…ang code mula sa isang device na mayroon siyang ito. - Walang record — lumikha ng isang root, i-publish ang record, i-announce, at ipakita ang
nympq1…ang code para sa user isang beses upang sila ay maaaring i-save ito.
Step 3 ay ang step na madaling makakuha ng error, at ito ay ang dahilan kung bakit ang ordering ay ibinigay sa ibaba kaysa sa ibinigay sa bawat implementation. Dalawang mga aparato na ang bawat nagsisimula upang lumikha ng isang root ay lumikha ng dalawang independiyenteng mga root sa ilalim ng isang identity, at ito ay ang pag-usapan na ito ordering ay mayroon na upang maiwasan.
4Ang Kapasidad ng Anunsiyal
Ang public half ng derived keypair ay inilathala bilang isang addressable
sa pamamagitan ng NIP-01
ang napili ng mga taga-hanga: kind 30078, tagged nym-pq:
{
"kind": 30078,
"tags": [
["d", "nym-pq"],
["t", "nym-pq"],
["expiration", "<unix seconds>"]
],
"content": {
"v": 2,
"alg": "mlkem768",
"nym": 1,
"epoch": 0,
"pk2": "<base64url ML-KEM-768 encapsulation key>",
"exp": <unix seconds>,
"devices": [ ... ]
}
}
Addressable means the relay keeps one event per (kind, pubkey, d-tag), kaya ang isang republish ay bumubuo ng previous announcement sa lugar.
Ang signature ay obligatory. Ang kaganapan ay sinignado sa pamamagitan ng identity key, kaya ang claim “sa ML-KEM key ay kabilang sa npub” na ito ay katumbas na tulad ng npub mismo. Substitute ng isang iba't-ibang encapsulation key ay nangangailangan ng pagdiriwang ng isang secp256k1 signature. Ang isang attacker na maaaring gawin na ito ay hindi kailangang mag-alala sa KEM.
Ang mga anotasyon ay umalis. 7 ang araw NIP-40 Ang extinction, na re-publish sa bawat 24 oras, ay naglalaman ng isang statement tungkol sa isang client na ngayon ay gumagana kaysa sa isa na ginagamit. Ang root mismo ay hindi gumagana; lamang ang claim tungkol sa ito ay gawin.
A missed announcement is read exactly like one that never carried a key: peers send ordinary NIP-44, na kung saan ang bawat login ay maaaring mag-read, at ang client ay nagpatuloy ng post-quantum exchange sa kanyang susunod na koneksyon, kapag ito re-publishes.So mag-silent para sa higit sa isang linggo ay mahalaga ng proteksyon para sa mga mensahe na ibinigay sa panahon ng gap - sila ay classicly encrypted hindi quantum-resistant - at walang gastos sa iba.
Ang asymmetry na ito ay ang dahilan para sa pagkuha at hindi isang aksidente ng ito. walang isa, ang isang record ay lumapit sa itaas ng mga key na ito tinatawag: isang device na ay umuwi, reset, o may kanyang root na itinakda ay nagbibigay ng isang standing instruction upang i-encapsulate sa isang key na walang nakuha na higit pa, at mga mensahe na ibinigay sa ilalim ng ito ay nawala nang walang error sa parehong pahina. Seven days limitasyon na window, at nagbibigay ng relay upang i-drop ang record sa sarili na hindi nangangailangan sa mga client upang makikita.
Ang key field ay tinatawag na format. Ang field ay pk2, at ang digit ay bahagi ng kontrata kaysa sa dekorasyon: ito ay tinatawag ang format ng payload na ang key ay maaaring gamitin na may. Ang isang reader na hindi nakikilala ang field ay nagsisimula sa “Nymchat client, walang post-quantum key” at nagpadala ng ordinaryong NIP-44, na kung saan ang bawat login ay maaaring basahin. Ito ay ang katotohanan ng error direction, at ito ay mahalaga na itinatag bilang isang pananampalataya ang format na numero ay magagamit upang ipatupad: ang isang unrecognized kapangyarihan claim ay dapat magkakahalaga ng proteksiyon, hindi paghahatid. Ang isang key na hindi maaaring gamitin ng isang peer ay mas mababa kaysa sa walang key sa lahat, dahil ang mensahe na itinatag ay nawala nang walang error sa
4.1 Absence ay meaningful, at tri-valued
Isang subtle ngunit mahalaga na detalye: ang announcement ay inilathala sa pamamagitan ng lahat ng Nymchat client, hindi lamang ang mga post-quantum-capable, at ang key field ay optional.
| ang observation | ibig sabihin | Gawin ang behavior |
|---|---|---|
| Pahayagan sa isang key | Nymchat, post-quantum na may kapasidad | ang hybrid |
| Pag-iisip, walang key sa lahat | Nymchat, classical lamang — post-quantum off, o isang device na hindi pa rin nakikipag-ugnay sa root ng identity | ang napili ng mga taga-hanga: NIP-17 |
| Walang announcement | Unknown client. Maaari itong maging anumang user ng Nostr o Bitchat | Classic, plus isang compatibility wrap |
Ang isang keyless announcement ay isang signed statement na ang mga tagapagsalita ay gumagana ng Nymchat, na nagbibigay-daan ng mga send path upang i-ship ang isang speculative cross-protocol wrap na ito ay dapat magagamit para sa anumang ito ay hindi ma-identify.
4.2 Ang isang aparato na hindi maaaring i-open ang root ay silent
Ang pag-uugali ay maaaring i-substitute: isang event per identity, last write wins. That's what makes the single-record design work, at it's also what makes a unlinked device dangerous if it publishes. A device that announced a key it had minted for itself would clobber the real record and send every peer to encryption under a key that other devices can't open.
Kaya ang isang aparato na alam ng isang root ay mayroon ngunit hindi maaaring i-open ito ay inilathala ng walang ad sa lahat. Ito ay hindi na-broken at ito ay hindi locked out ng application: ito ay patuloy na nabasa ang bawat mensahe na ito ay may mga keys para sa at patuloy na inilathala, habang nag-iisip ang user upang i-link ito. Silence ay ang katotohanan para sa isang aparato na hindi maaaring nagsasalita para sa identity.
5Discovery at ang pag-send decision
Ang mga kliyente ay malaman ang mga key ng peer sa dalawang paraan. Ang isang standing subscription ay naglalaman ng mga tao na ang isang gumagamit ay nagtatrabaho sa - open conversations at mga miyembro ng grupo - kaya ang kanilang mga anunsyo ay dumating bilang normal na mga kaganapan. Para sa isang peer meeting para sa unang pagkakataon, isang one-shot query ay gumagana sa send time, na limitado sa 2.5 segundo; kung ito ay hindi nagtatrabaho, ang mensahe ay magiging klasikong, na kung saan ay ang behavior na ginagamit bago ang post-quantum ay idinagdag kaysa sa isang bagong mode ng error.
Ang isang gumagamit na nag-link ng isang bagong device, o na nag-move mula sa isang browser-extension login sa isang local key, ay naging post-quantum-capable mid-conversation, at isang permanently cached “no” ay patuloy sa mga ito sa classical encryption para sa buhay ng ad.
5.1 Bakit walang downgrade attack
Ang decision sa routing ay humahantong sa isang single question:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Walang negosyo ng kapangyarihan, walang listahan ng mga algorithm na sumusuporta, at walang field ang isang attacker ay maaaring malusog upang i-force ang isang mas mababang path. ay Ang panukala mode ng isang stripped o withholded announcement ay na ang mensahe ay dumating classic - ang status quo bago ang feature na ito - hindi na ang isang hybrid na mensahe ay na-downgraded sa isang bagay na dapat mag-false.
Ang reverse ay din nagtatampok at mahalaga ng higit pa: isang customer ay nagpadala ng hybrid lamang ang Kapag ang isang taong nakakaalam ng higit pa tungkol sa ito ay maaaring i-verify ito, babaguhin ko ang input domain sa ASCII.
6ang hybrid construction
Ang isang unmodified NIP-44 encryption text ay ang interior layer, at ang ML-KEM keyes ang isang external AEAD sa paligid nito:
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)
Lahat ng mga sekreto ay dapat natagpuan upang basahin ang mensahe: ang outer layer ay gumagawa lamang ng isang NIP-44 encryption text, at ang pag-uugali na kailangan ng klasikong ECDH. Ang isang quantum opponent na lumikha ng secp256k1 ay makakuha ng ang internal key at nagtatagumpay sa ML-KEM; ang isang break ng ML-KEM ay lumikha ng outer layer at humihingi ng NIP-44 standing.
kem_ssWalang bagay sa derivation na ito ay tumutulong sa raw ECDH output, na kung saan ay kung ano ang Section 6.1 tumutulong.kem_ct,recip_kem_pkAt ang parehong identity keys ay binubuo bilang mga kasangkapan ng data, kaya ang outer layer ay naka-commit sa eksaktong transcript na nilikha ito.
Ang ML-KEM key ng recipient ay long-lived, ngunit ang bawat mensahe ay naglalaman ng isang independiyenteng encryption na teksto at, kaya, isang independiyenteng
kem_ssIto ay kung ano ang gumagawa ng deriving ang nonce sa halip ng randomize ito:
Mga pahinang tumuturo sa ChaCha20-Poly1305
Ang mga ito ay nagtatagumpay sa pamamagitan ng reuse ng isang (key, nonce) parehong, at dito ang key mismo ay bagong para sa bawat mensahe, kaya walang parehong maaaring i-repeat.
6.1 Bakit ang mga layers ay matatagpuan
Ang alternatibo ay i-mix ang dalawang sekreto sa isang single conversation key at i-hand that sa NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Ang konstruksyon na ito ay mataas na tulad ng cryptography. Ito ay may isang struktural na problema: ito ay kailangan
ecdh_x, ang raw x-koordinate ng output ng ECDH, bilang mga pangunahing materyal - at isang extension ng browser (NIP-07(Ang mga sumusunod na mga sumusunod na mga sumusunod (NIP-46Nagtatakda ito ng NIP-44 sa ngalan ng nag-caller at bumalik ang isang encryption text, na kung saan ay ang buong punto ng pag-iisip ng key sa isang lugar kung saan ang application ay hindi makukuha.
Ang paghahambing ng mga sekreto ay sinusubukan ng lahat ng login na nagbibigay ng identity key sa isang signer, na kung saan ay sasabihin ang mga pinaka-mahalagang gumagamit, at walang karamihan ng trabaho sa key derivation ay maaaring i-changed ito. Layering i-remove ang dependency: NIP-44 ay matatagpuan na buong at na-produce sa pamamagitan ng kung ano ang nagtatag ng identity key, signer kabilang, habang ang KEM halaga ay inilathala mula sa recovery code na ang client ay nagtatag ng direkta.
Ang gastos ay bandwidth, at ito ay hindi maliit. Ang ML-KEM cifertext ay 1,088 bytes at rides sa bawat mensahe, base64url-coded sa 1,451 characters; ang external AEAD adiy a 16-byte Poly1305 tag at expands ang NIP-44 payload na ito wraps sa isang third. Ang isang 50-karakter na mensahe ay lumaki mula 176 bytes sa 1,712, at isang 2,000-karakter na isa mula sa 2,820 sa 5,238. Ang floor ay halos 1.5 KB bawat mensahe kahit anong short ang mensahe ay, na kung saan ay ang presyo ng encapsulating fresher sa lahat ng pagkakataon at hindi reusing isang shared secret.
6.2 Mag-describe ng mga payloads
ang pq2. Ang prefix ay gumagawa ng pag-implementasyon ng incremental: ito ay self-describing, kaya ang isang client ay piliin ang path ng decryption sa pamamagitan ng pag-inspect ng payload hindi sa pamamagitan ng pag-iisip ng isang tag o pag-iisip ng kung ano ang isang peer suportahan. Ang isang reader na hindi kilala ng isang prefix ay hindi mag-open na payload na hindi malinaw sa kanya, at mga mensahe na sinimulan bago ang parehong pahina ay maaaring gawin post-quantum makikita tulad ng normal na NIP-44 nang walang pag-migrasyon.
Ang ML-KEM decapsulation ay dinisenyo na hindi mai-fail: dahil sa isang malformed cifertext, ang Fujisaki-Okamoto transform ay bumabalik ng isang deterministic pseudo-random secret sa halip ng isang error. Ang isang maliliit na key ay kaya hindi lumipas sa layer ng KEM sa lahat — ito ay lumipas bilang isang HMAC error sa loob ng NIP-44, na tulad ng isang maliliit na classical key surfaces. Ang mga callers ay nagtatrabaho sa parehong parehong, kaya ang pag-fail ay walang distinctive signal. Ito ay din ang ginawa ng listahan ng mga kandidato ng Section 9.1 na gumagana: ang isang client ay nagtatrabaho sa bawat key sa turo at nagbibigay ng NIP-44 upang sabihin kung ano ang parehong.
6.3 Ang dalawang layers ng gift wrap
A NIP-17 Ang mensahe ay a NIP-59 gift wrap: isang unsigned rumor, sealed sa ilalim ng sender's identity key (type 13), pagkatapos wrapped sa ilalim ng isang throwaway key generated sa bawat mensahe (type 1059). Sa isang login na nagtatag ng identity key direkta, Nymchat hybridizes ang parehong layer, bawat isa sa kanyang sarili na encapsulation.
Ang signer login ay makakakuha lamang ng iba't ibang layer. Ang seal ay ginawa ng signer bilang ordinaryong NIP-44 — ang application ay hindi makikita ang key na gumagawa ito — kaya hindi ito maaaring hybridized sa lugar. Ito ay walang gastos laban sa pag-atake na ito: ang seal ay makakakuha lamang sa pamamagitan ng wrap, at ang wrap ay kung ano ang isang recorder store. Ang isang opponent na nagtatagumpay na naka-recorded traffic ay dapat i-break ML-KEM bago ang isang seal ay kahit na nakikita sa pag-atake.
7Mga mensahe ng grupo at partikular na coverage
Ang isang mensahe ng grupo ay hindi lamang isang cifertext. Ito ay ang parehong plaintext na inihayag sa bawat miyembro, ang bawat kopya ay inkapsulado sa kanyang sarili ML-KEM key. Ang isang miyembro na nag-publish ng isang key ay makakuha ng isang hybrid wrap; ang isa na hindi makakuha ng isang classical wrap.
Ito ay lumikha ng isang problema sa accounting na ang isang naive na implementasyon ay mabigat. Kung 8 sa 10 mga miyembro ay makakuha ng isang hybrid na kopya, ang mensahe ay hindi Ang isang opponent ay kailangan ng isang classical copy ng isang plaintext na identical sa lahat ng ten, kaya ang mensahe ay protektado lamang kung bawat ang kopya.
Nymchat kaya nag-track per-message coverage sa panahon ng fan-out - ang bilang ay alam lamang habang ang mga wraps ay binuo - at ang badge reports “quantum-resistant sa 8 ng 10 mga miyembro” sa halip na claiming ang mensahe ay protektado. kung saan walang count ay magagamit, na kung saan ay normal na kaso para sa isang Nakakuha ng group message (only the sender counts the fan-out), ang interface reports partial rather than full protection. claiming full protection on the strength of one's own copy alone would be a overstatement about the message as a whole.
7.1 Ano ang mga report ng Shield
Ang shield ay nagpapakita ng katotohanan tungkol sa mensahe, hindi tungkol sa software na nagpadala ito:
- Kompletong proteksiyon: Ang bawat kopya ng plaintext na ito ay lumabas hybrid.
- Partikular: ang ilang mga kopya ng isang grupo na mensahe ay naging classically.Drawed degraded rather than full, dahil ang isang classical kopya ng isang plaintext na identical sa lahat ng mga ito ay lahat ng isang opponent na kailangan.
- Ang classical ay inihayag nang malinis at hindi ipinakita bilang walang badge, dahil ang isang absent indicator ay ambiguous sa pagitan ng “unprotected”, “broken”, at “sa build na ito ay walang ang feature”.
Ang verdict ay na-record kapag ang mensahe ay sealed at hindi re-calculated mula sa kung ano ang isang peer advertises pagkatapos. Ciphertext na ngayon ay hindi maaaring maging mas mahusay na protektado kaysa sa ito ay, at isang interface na re-review old messages sa kapangyarihan ng isang bagong pag-anunsyo ay nagpapakita ng isang bagay na katotohanan tungkol sa bytes sa isang relay.
Ang mga panukala ng grupo sa itaas na bundok ay tumutulong sa itaas ng ito sa halip na i-substitute ito: ang isang grupong mensahe ay ganap na protektado lamang kapag ang kopya ng bawat miyembro ay, at ang isang nabanggit na grupong mensahe na walang coverage count ay nagpapakita ng partial.
8Mga kopya na ibinigay sa iyo
Ang ilang mga bagay ng isang client ay naka-encrypted sa user's own identity: ang mga setting na sinynchronized, ang listahan ng konversasyon, ang group keys, at ang archive ng mensahe. Ang mga ito ay naglalaman ng higit pa tungkol sa isang user kaysa sa karamihan ng mga single mensahe ay gawin, kaya ang pag-iisip ng mga ito classic ay maaaring gumawa ng mga ito ang pinakamababa sa mga artifact na naka-sacred kung paano malaman na ang mga mensahe mismo ay na-sacred. Ang mga ito ay gumagamit ng parehong hybrid, inkapsulado sa user's own root-derived key - na may isang exception na itinuturing sa Section 3.2, ang nymchat-pq-root ang kategorya na ito, na hindi maaaring i-sealed sa ilalim ng isang key na lamang ito ay maaaring lumikha.
Ang isang setting blob o isang archive row ay matatagpuan sa isang lugar para sa mga taon, na kung saan ay katumbas na ang form ng bagay na isang mga opponent ay nakolekta - higit pa sa anumang single mensahe, na kung saan ay halos ephemeral sa user's own mind.
Ang isang limitasyon ay naglalarawan sa format dito at hindi ang key. A self-addressed copy must be readable by bawat Ang aparato sa account, kaya ang bawat aparato advertises kung ano ang maaaring i-open sa listahan ang kanyang ad carries, at ang account ay mag-script lamang kung ano ang lahat ng mga ito ay maaaring mag-read.
Ang isang device na may identity ngunit hindi ang root ay hindi maaaring i-open ang anumang bagay na sealed sa root-derived key, kabilang ang kanyang sarili na mga setting. Ito ay isang deliberate consequence, hindi isang oversight, at ito ang dahilan kung bakit Section 3.3 ay may tulad ng isang device prompt para sa linking sa halip ng minting isang bagong root: isang ikalawang root ay hindi makuha ang blob, ito ay lamang mag-divide ang identity's key material sa dalawang.
Ang isang aparato na gumagana ng isang extension ng browser o isang remote signer (NIP-46) ay walang nsec upang i-derive mula sa, ngunit ito ay naglalaman ng code recovery, at sa ilalim ng layered konstruksiyon ng Seksyon 6.1 na ang lahat ng post-quantum halimbawa ay kinakailangan: ang signer ay lumikha ng layer ng NIP-44 tulad ng nangangailangan nito, at ang client ay i-key ang outer layer mismo.
9Rotasyon
ang epoch Ang mga counter sa derivation ay kung ano ang gumagawa ng rotation ay posible nang walang bagong key material. Incrementing ito ay nagbibigay ng isang bagong keypair mula sa parehong root at isang re-published announcement; peers pumili ng bagong key mula sa re-replaceable record. Rotation kaya hindi nangangailangan ng user na mag-save ng anumang bagay sa isang ikalawang beses: ang root ay generated isang beses sa bawat identity at ang epoch ay gumagawa ng turn.
9.1 Ang mga lumang epoke ay inihayag, at walang bagay ay re-encrypted
Ang isang client ay lumikha ng mga kandidato sa decryption mula sa kasalukuyang epoke hanggang sa epoke − 3, kaya ang mensahe na sealed malapit bago ang isang rotation ay patuloy na buksan laban sa keypair na kasalukuyang kapag itinatag nito.
Ang window na ito ay kung ano ang gumagawa ng rotation safe upang gawin sa lahat: walang ito, ang bawat rotation ay magpapatakbo kung ano ang ay sa paglipat. Ang anumang bagay na nangangahulugang ay mag-readable para sa buhay ng identity, dahil ang mensahe na ang user ay hindi maaaring mag-open ay malaki para sa kanila kaysa sa isa na ang proteksiyon ay hindi maaaring i-improve retroactively (Section 10.5).
10Ano ang hindi protektahan
Ang isang papel na naglalarawan lamang ng kung ano ang makukuha ng isang disenyo ay hindi naglalarawan ng isang sistema, at ang pag-exaggerate ng isang security property sa isang interface ay mas mababang kaysa sa pag-usapan ito.
10.1 Ang root ay isang ikalawang sekreto, at ang pagkuha ng ito ay hindi mai-recoverable
Ito ay ang tunay na presyo ng disenyo. Ang limitasyon sa Seksyon 2 na ang isang gumagamit ay dapat magkaroon ng eksaktong isang bagay upang i-make: ang nsec lamang ay hindi i-reconstruct ang post-quantum key, dahil ang buong punto ay na walang public na halaga at walang iba pang mga sekreto ay i-expose ito. Kung walang aparato ay nagtatag ng root at walang mga wraps ng Seksyon 3.2 ay maaaring i-open, materyal na itinatag sa root-derived key ay hindi maaaring i-recover.
Kapag ang isang maliit na notebook ay isang maliit na notebook, ngunit ang isang maliit na notebook ay isang maliit na notebook. nympq1… Ang code sa anumang lugar ay may eksaktong isang kopya ng ito, sa isang device, at ang pagbawi ng device na ito ay humihingi ng lahat ng post-quantum message, mga setting blob at archive row sealed sa kanya.
nsec Walang problema; ito ang lahat ng pag-iisip sa kanya.
Ang isang pag-atake ang pinakamababang path na magagamit, kaya ang isang scheme ay mahahalaga kung ano ang kanyang pinakamababang ruta ng pag-recovery ay mahahalaga - isang memorable passphrase, halimbawa, ay mag-set ang buong bagay sa kung ano ang passphrase ay mahahalaga, at ang na-wrapped row ay katumbas na ang artefact na isang mga opponent na nakuha at muli offline sa libreng oras.
10.2 Authentication, bilang iba't ibang sa confidentiality
Every signature in Nostr is Schnorr over secp256k1, at ito ay walang pagbabago dito. Ang isang opponent na may isang quantum computer ay maaaring lumikha ng mga signature at mag-imaginate ng isang user sa real-time. Ano ang hybrid key exchange hits ay harvest-now-decrypt-later: ang isang attacker na nag-record ng traffic ngayon ay hindi makikita ito pagkatapos. Ito ay hindi gumawa ng isang mensahe ay hindi mapagsalita laban sa isang opponent na nasa makina. Ang paghahatid na ito ay inilapat sa mga application na deliberately - ang padlock indicator reports authentication, ang shield reports confidentiality, at ang mga ito ay separate glyphs dahil ang isang mensahe ay maaaring magkaroon ng isa nang walang isa.
Ang pagitan sa pagitan ng isang npub at isang ML-KEM key ay isang signature ng secp256k1, kaya ang isang opponent na maaaring lumikha ng mga ito ay maaaring i-substitute ng isang key ng kanilang sarili. Confidentiality laban sa isang future opponent ay hindi ang parehong authenticity laban sa isa.
10.3 Ang mga metadata
Ang pag-aari ng regalo ay binubuo ang sender, ang recipient ay higit sa isang single p Ang tag, uri, at timestamp ng internal na mensahe. Ito ay hindi ipinakita na ang isang event ay may-isa, ang kanyang size, o kapag ang isang relay ay nakuha ito. Traffic analysis ay hindi tinutukoy sa anumang bahagi ng design na ito.
10.4 Ang Offline mesh
Ang Nymchat's Bluetooth mesh transport ay isang separateng protocol na may kanyang sarili na handshake, at ito ay hindi naka-cover ng trabaho na ito.
10.5 Mga mensahe na nagpadala
Ang ciphertext na itinuturing habang ang parehong pahina ay pa rin ang classical classical permanently. It’s already existing and can’t be re-sealed. Protection ay nagsisimula sa mensahe kung saan ang parehong pahina ay nagtatag ng post-quantum keys, hindi sa oras na ang feature ay pinagsimula.
11Alternatibo sa paghahanap
| ang approach | Bakit hindi |
|---|---|
| I-derive ang post-quantum key mula sa identity key | Rejected. Ang derivation ay isang public algorithm sa pamamagitan ng nsec, at isang quantum opponent i-recover ang nsec mula sa inilathala ng npub, kaya binuksan ang classic half hands sa pamamagitan ng post-quantum half sa kanya. It solved every distribution problem in this paper and defended against nobody. |
| Ipadala ang root sa iba pang mga device ng user sa pamamagitan ng NIP-44 | Ang isang root na inilathala sa ilalim ng classical-only encryption ay i-recoverable sa pamamagitan ng lahat na nag-record na mensahe at i-break ang kanyang key pagkatapos, na kung saan ang opponent ang root ay magagamit upang i-stop. |
| Ang isang separately generated ML-KEM keypair sa bawat aparato | Rejected. Devices would hold different decapsulation keys, at isang substitutable announcement per identity cannot carry them all. Peers would encrypt to which key was published last, at ang lahat ng iba pang device ay hindi maaaring makikita ang resulta. One root per identity, na-move sa pamamagitan ng mga path ng Section 3.2, ay kung ano ang tinutukoy na ito. |
| I-wrap ang root sa ilalim ng isang PIN | Rejected. Ang isang four-digit PIN ay tungkol sa 13 bit laban sa isang offline attacker na nagtatag ng ang wrapped row. Ang ibinibigay nito kasama ang dalawang 256-bit paths ay ibinigay kung ano ang mas mabuti na wrap ay katumbas. |
| I-extend ang npub upang mangyaring ang dalawang keys | 1,184 bytes ay hindi isang ibinigay na identifier, at ito ay tumutulong sa lahat ng mga kasalukuyang Nostr client ng pag-parsing ng isang address na defined bilang 32 bytes. |
| Ang isang key directory service | I-reintroduce ang authority na ang network ay magagamit upang i-evite. Ang taong sumusuporta sa searchup ay nagsisimula kung sino ang maaaring mag-read ang mensahe. |
| Ipasok ang key sa bawat mensahe | Walang solusyon: ang sender ay kailangan ng ang recipient Ito ay dahil ang mga termino at kontekstong ginagagamit ay mas malinaw at madali maintindihan. |
| In-Band Kapasidad ng Negosyo | I-create a downgrade surface. Ang isang attacker na maaaring i-take ng isang kapasidad na flag ay gumagawa ng classical path. |
| Post-quantum lamang, walang classical leg | Buksan ang mga dekada ng pag-analysis ng secp256k1 sa pagbabago para sa isang mas madalas na primitive. pareho ang fail. |
12Parity ng Implementasyon
Nymchat nagbibigay ng dalawang independiyenteng mga implementasyon ng konstruksiyon na ito - isa sa JavaScript para sa web application, isa sa Dart para sa mga mobile application, kabilang ang isang mula sa-scratch ML-KEM-768 port.
Ang implementation ng Dart ML-KEM ay validated laban sa official
Mga pahinang tumuturo
Mga pahinang tumuturo sa pag-aaral (ML-KEM-*-FIPS203) — 25 key-generation, 25 encapsulation at 10 decapsulation cases, run as their own suite. Ito ay ang vectors NIST publishes to validate a implementation, kaya passing ang mga ito ay proof the port is correct, hindi lamang proof that the two clients agree with each other. Sa itaas na, isang shared fixture ng test vectors — seed derivation, encapsulation, both payload formats, and complete gift wraps — is generated from the JavaScript reference and checked by both test suites. Ang root secret extends that fixture rather than replacing it: root to seed, root to keypair, ang public fingerprint ng root, at ang derived key, nonce at associated data ng outer layer ay mga vectors ng kanilang sarili, kaya ang dalawang kliyente ay hindi maaaring mag-agpatuloy tungkol sa kung ano ang isang
nympq1… Ang isang divergence sa parehong implementation ay hindi gumagawa ng build kaysa sa paggawa ng isang mensahe na ang iba pang client ay hindi maaaring buksan.
Ito ay kung ano ang sinasabi ng isang device “it's the root I hold” mula sa “it's a different one”, at isang client na hindi maaaring mag-replicate ang fingerprint ng isang iba pang client ay makikita ng isang ganap na magandang record bilang walang record sa lahat - at pagkatapos, sumunod sa Section 3.3, minta ang isang ikalawang root at ibahagi ang identity.
Ang mga ito ay Open source ang sa ilalim ng AGPL-3.0. Ang cryptographic core na ibinigay dito ay
js/nym-crypto.js at js/modules/pq.js sa web client, at
lib/core/crypto/ sa lib/features/identity/pq_registry.dart sa mga mobile client.
Para sa karagdagang, non-technical explanation, tingnan ang Tungkol sa Quantum-Resistant Encryption.