Nymchat whitepaper teknis
Post-Quantum Key Agreement ing Nymchat
Distribusikan kunci publik ML-KEM-768 liwat Nostr tanpa direktori utawa registri, lan nyebatake saka rahasia sing ora nilai publik nyebatake.
Ngandhingake pertukaran kunci post-quantum kanggo utusan iku paling ora masalah kriptografi. primitives distandarisasi lan perpustakaan ana. Bagian sulit iku yen saben peserta saiki kudu Ing iki Paparan iki ngleksanakake cara Nymchat ngleksanakake iku - ngendi kunci kedhaftar datang saka, cara njaluk orang-orang sing kudu, lan apa antarmuka bisa njaluk babagan hasil - lan, ing bab pungkasan, apa hasil iki ora nglindhungi.
Kaca iki diterjemahake mesin kanggo penak. Asli Inggris minangka versi sing ditrapake.
1Masalahipun
Mesej-mesej pribadi kita dienkripsi karo NIP-44Ing ngisor iki, ing ngisor iki, ana sisih-sisih sing bisa dipisahake, sisih-sisih sing nglumpukake teks sederhana — ChaCha20 karo tag HMAC-SHA256, sing ditutupi Ngudhunaké (Ing taun 5869) - ora ana ancaman signifikan dening komputer kuantum; algoritma Grover biaya accelerup-root-square vs key symmetric, lan 256 bit njupuk iku. Tiyang ing kunci iku elliptic-kurva Diffie-Hellman liwat Kira-kira 256 k1Rangking salah siji kunci swasta saka rekan-rekannya publik retroaktif nyedhiyakake saben rahasia umum sing kunci pernah diprodhuksi.
Ancaman iki nggawe ora ditangguh nganti mesin kaya ana. A lawan karo storage bisa ngrekam teks enkripsi saiki lan ngrekripsi nalika kapasitas ndadekake. Apa-apa sing dikirim sadurunge ana wis dikompromikan. Iki minangka serangan spesifik saka pertukaran kunci post-quantum, lan iku alasan kerja ora bisa ngarep kanggo mesin bakal dibangun.
1.1 Pertanyaan sing kertas iki ngandika
Ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing sisih, ing sisih, ing sisih, ing sisih, ing sisih, ing sisih (Tiyang 203). iki langsung nyebabake masalah distribusi:
Kanggo ngirim pesan Alice saiki, sampeyan kudu siji: npub-nya. Tambihake pertukaran pasca-quantum lan sampeyan duwe kunci publik ML-KEM.
A npub iku mbantu dhewe. Sampeyan bisa nyimpen ing kertas, njaluk ndhuwur, utawa ngetikake saka layar, lan iku kabeh wong kudu enkripsi kanggo sampeyan. A ML-KEM-768 kunci publik iku 1,184 byte. Ngandhut ora bisa dibaca ndhuwur, iku ora bakal cocok ing nama pangguna, lan iku ora ana ing kode QR kalebu identitas sing mung 32 byte.
Ukuran iku bagian gampang. Bagian sing luwih rumit iku yen kunci kedhaftar nyedhiyakake tiga masalah sing beda, lan sisih kertas iki ing sawetara bab iku jawaban kanggo loro:
- Dheweke bisa diganti. A kunci sing ora bisa njaluk ing pandangane iku apa-apa sing wong penyerang ngganti kanggo dhewe. Bagian 4 nyambungake menyang identitas karo tanda tangan, sing ngatur iku langsung.
- Dheweke kudu konsisten ing kabeh piranti pengguna. Akun sing padha ing telpon lan laptop kudu nuduhake kunci sing padha, utawa pesan sing ditutup kanggo siji ora bisa dibuka ing liyane.
- Dheweke bisa hilang. Kunci publik diterbitake saka rahasia, supaya apa sing sebenarnya kudu tetep iku rahasia iki - lan kanthi konstruksi ora apa-apa liyane ngembangake. Bagian 10.1 jelas ngandika apa biaya, amarga iki ora diselesaikan kaya dibayar.
2Design lan kabutuhan
Empat kabutuhan ngatur jawaban, lan padha njaluk paling desain jelas sadurunge kode apa-apa ditulis.
- Sawetara rahasia sing bisa. Pengguna Nostr wis nyimpen persis siji rahasia, nsec. Tiap rahasia tambahan iku cara liyane kanggo njaluk riwayat, lan wong sing ngerti kanggo nyimpen nsec ora bakal ngerti kanggo nyimpen apa-apa liyane. Bagian 3.1 ndadekake siji iki ora bisa ditemokake langsung - kunci post-quantum sing diwenehi saka nsec ora nyedhiyakake perlindungan post-quantum - supaya desain nyimpen persis siji rahasia lan ora luwih: pirang-pirang bahan kunci sing diprodhuksi saben kali per identitas, diwenehi ing bentuk padha karo nsec lan ing panggonan sing padha, supaya apa-apa sing ngerti cara nyimpen siji ngerti cara nyimpen liyane. Bagian 10.1 iku jujur babagan apa sing tetep biaya.
- Lan ora otoritas. Iki ora ana server sing bisa dipercaya kanggo ngomong ngendi kunci ngendi. apa-apa server kaya dadi titik ing ngendi pesan bisa diarahkan.
- Tembung-tembung ing sawetara alat, siji identitas. A Nostr identitas digunakake kanthi umum saka sawetara klien ing wektu. apa-apa bahan kunci sing ana kudu dadi identik ing kabeh, lan jalur sing mbantu iku ana kudu ora bisa dibaca dening lawan sing fitur nglawan.
- Nanging ora negosiasi. Apa-apa pertukaran ing band saka “ti manawa ciphers ndhukung?” iku permukaan sawijining penyerang bisa nglebu kanggo nggunakake pilihan sing luwih lemah.
3Roti rahasia sing independen
Keputusan bebarengan iku yen kunci decapsulation ML-KEM diwenehi saka bahan utama sing ora ana nilai publik. saben identitas njupuk siji rahasia akar, diprodhuksi siji:
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)
Root iki diwenehi kanggo pengguna minangka nsec iku: Tiyang32 Ing ngisor iki ana ing prefix sing bisa dibaca.
nympqIng ngisor iki dibaca minangka nympq1…, ditampilake ing ndhuwur nsec ing layar identitas ing ndhuwur interaksi reveal padha, copied karo kontrol padha, ora logged lan ora ngirim ing manawa ing jelas.
Garut iki dipisahake ing domain kanthi tujuan, supaya rahasia liyane ora bisa njupuk keypair sing padha. epoch Nglumpukake ing rotasi (Bagian 9).
3.1 Mengapa kunci ora bisa diwenehi saka kunci identitas
Desain jelas iku kanggo nyimpen keypair saka rahasia sing user wis wis:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Iki atraktif kanggo empat alasan, kabeh nyata: ora apa-apa anyar kanggo backup, amarga nsec wis backup; saben piranti sing setuju dening konstruksi, tanpa protokol sinkronisasi kanggo salah; siji pengumuman sing bisa diganti saben identitas wis jelas akurat, amarga piranti ora bisa nggawasan babagan kunci; lan kunci sing ana sadurunge sadurunge ora diterbitake, supaya klien bisa ngetepake apa-apa kanggo dhewe ing pisanan.
Ing kabeh empat manfaat ora ana nilai, kanggo salah siji alasan. Algoritma Shor mbukak ing nglawan npub diterbitake nyedhiyakake nsec. Derivasi benih iku algoritma publik ing nglawan nsec. Jadi lawan sing nglawan setengah klasik mbukak setengah post-quantum kanthi mbukak HKDF padha sing kabeh liyane mbukak. Ing nglawan panen-sampun-decrypt-later - siji ancaman fitur iki ana kanggo nghenti - kunci sing diwenehi kanthi cara iki nyedhiyakake apa-apa.
Key decapsulation ML-KEM kudu teka saka entropy sing ora bisa diwenehi saka nsec lan ora pernah ditransmisir kanthi enkripsi klasik-only.
A rahasia sing diprodhuksi kanthi independen sing banjur sinkronisasi antarane piranti pengguna ing ing pesan NIP-44 biasa iku kegagalan sing padha karo langkah tambahan: lawan ngrekam piranti sing saiki lan njaluk kunci klasik ing pungkasan, lan akar njaluk.
3.2 Nampa root kanggo piranti user liyane
Kekuatan 3 saka Bagian 2 - siji identitas, sawetara piranti - ora bisa dipenuhi dening aritmetik ing iki, amarga kabeh titik iku yen kunci ora fungsi saka apa-apa piranti padha. nympq1… Kode iku dhewe.
Roti iki diwenehi minangka nympq1… ing ndhuwur nsec, lan piranti kedhaftar njaluk iku ditampung ing panel sing padha. Ya iku kabeh mekanisme. Piranti sing ora diwenehi kode ora bisa partisipasi, kang bab 4.2 dijelaskan.
Rule ing Bagian 3.1 ngandika wuta bisa ora ngliwati di bawah enkripsi klasik-only, lan saben mekanisme sing bakal nindakake iki otomatis - sinkronisasi liwat relay, nglumpukake menyang kunci identitas - nglumpukake sak iku.
Format ndadekake ruang kanggo jalur wrapped: rekaman bisa nyimpen daftar wraps, saben blob AEAD ing ngisor tombol sing pengguna bisa ngulang ing piranti liyane - output PRF passkey, misal. nympq1… Kode iku satu-satunya cara liwat. Bagian 10.1 ngandika apa biaya.
Rekaman dhewe urip ing kategori setelan dhewe, nymchat-pq-rootSampeyan nglakokake ora wraps iku nglakokake kerja sing dibutuhake: kehadiran iku cara piranti kedhaftar njaluk yen identitas iki wis akar, kang iku apa sing nghenti nglakokake rival siji (Seksi 3.3).
lan nymchat-pq-root Kategori iku ora ing kunci ML-KEM-root-derived. baris iki nyimpen satu-satunya salinan saka akar, supaya ngetepake ing ngisor kunci sing diwenehi saka akar iku kunci kang kunci ana ing kotak: ora ana piranti bisa nyebatake, kalebu siji sing ngandika. iki ditutup klasik - NIP-44 kanggo dhewe - utawa ora ana. Iki iku salah siji tempat desain njaluk perlindungan klasik-only, lan bisa ngidini: baris nyimpen ora ana akar saiki, mung fakta sing ana.
Kabeh kategori setelan liyane bisa lan kudu nggunakake kunci root-derived. iki iku pengecualian siji, lan iku pengecualian babagan sirkularitas lan ora babagan kekuatan.
3.3 Generasi lan adopsi
Ing boot, nglakoni identitas langgeng, klien kerja ing urutan iki:
- Panggonan kanggo existing
nymchat-pq-rootIng rek. - Rekaman ditemokake, lan piranti iki bisa unwrap iku - njupuk lan nyatakake identitas iki minangka kapasitas post-quantum.
- Rekaman ditemokake, lan piranti iki ora bisa unwrap - ora ngasilake root anyar, lan ora ngirim iklan apa-apa. Nglumpukake pengguna kanggo nghubungake piranti iki kanthi ngetik
nympq1…kode saka piranti sing wis wis. - Ing rekaman — ngasilake akar, ngirim rekaman, nyatakake, lan nampilake
nympq1…kode kanggo pengguna siji kanggo bisa nyimpen.
Langkah 3 iku langkah sing gampang kanggo njaluk, lan iku alasan ordering ditulis ndhuwur lan ora ditinggalake kanggo saben implementasi. Dua piranti sing masing-masing milih kanggo ngasilake root ngasilake dua akar independen ing salah siji identitas, lan iku kegagalan ordering iki ana kanggo nghindari.
4Pameran kapasitas
Setengah publik saka keypair derivative diterbitake minangka addressable.
Tiyang-01
event — jinis 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 berarti relay nyimpen siji acara per (kind, pubkey, d-tag), supaya republish mbukak pengumuman sadurunge. saben identitas ngendi wis akurat siji cathetan saiki, kang iku apa “ngandhutake kunci Alice ” a single unambiguous fetch ora sawijining daftar kanggo mbukak.
Tandatangani iku wajib. Ing acara iki ditandatangani dening kunci identitas, supaya klaim “ke ML-KEM kunci iku milik npub” iku dhuwur banget kaya npub dhewe. Nggantike kunci encapsulation beda kudu nggoleki tanda secp256k1. A penyerang kang bisa nggawe iku ora kudu nggoleki KEM.
Pemberitahuan iku kadharan. Ing taun 7 NIP-40 The expiration, diterbitake saben 24 jam, nyimpen pernyataan babagan klien sing masih berjalan lan ora siji sing sadurunge.
Pemberitahuan sing ditransmisikake minangka sing ora ngandhut kunci: peers ngirim NIP-44 biasa, sing saben login bisa njaluk, lan klien ngulangake pertukaran post-quantum ing sambungan sing sésane, nalika iki diterbitake. Jadi ngandhut kanggo luwih saka seminggu biaya perlindungan kanggo pesan sing dikirim ing gendhut - padha klasik enkripsi lan ora kuantum-resistant - lan biaya apa-apa liyane. pengiriman ora terpengaruh, ora apa-apa sing wis diwenehi dadi unreadable, lan ora tindakan dibutuhake ing balik.
Iki asimetri minangka alasan kanggo kadhaptarake lan ora kecelakaan saka iku. Tanpa siji, rekaman ngluwihi kunci sing jenengake: piranti sing dihapus, ngreset, utawa duwe akar dipindahake ndadekake instruksi standing kanggo encapsulate menyang kunci sing ora ana liyane, lan pesan sing dikirim ing ngisor iki diwenehi tanpa kesalahan ing saben sisi. Tujuh dinten ngluwihi jendela kasebut, lan ngidini relay kanggo ngundhuh rekaman dhewe lan ora nggunakake klien kanggo ngetokake.
Papan kunci ngandika format. Field iku pk2, lan digit iku bagian saka kontrak lan ora dekorasi: iku jeneng format payload sing kunci bisa digunakake karo. Pembaca sing ora ngetokake lapangan ngetokake “Nymchat klien, ora kunci post-quantum” lan ngirim NIP-44 biasa, sing saben login bisa ngetokake. Ya iku arah kegagalan sing akurat, lan iku layak ngetokake minangka aturan nomerasi format ana kanggo ngetokake: klaim kapasitas unrecognized kudu biaya perlindungan, ora ngirim.
4.1 Absensi minangka makna, lan tiga-valueed
Rincian sing halus nanging penting: pengumuman iki diterbitake dening kabeh klien Nymchat, ora mung klien sing bisa post-quantum, lan bidang kunci iku opsional.
| Piyambakipun | Tegese | Tindak lan perilaku |
|---|---|---|
| Panggonan karo kunci | Nymchat, post-quantum bisa | Hybrid lan |
| Panggonan, ora kunci | Nymchat, klasik mung — post-quantum off, utawa piranti sing ora dihubungkan karo akar identitas | Ing taun 1700-an |
| Ngandhingake | Klien Unknown. Bisa dadi pengguna Nostr utawa Bitchat | Klasik, plus wrap kompatibilitas |
Panggonan tanpa kunci yaiku pernyataan sing ditandatangani sing pengirim ngoperasikan Nymchat, sing ngidini jalur ngirim ngundhuh wrap cross-protocol spekulatif sing ora kudu kalebu kanggo siapapun sing ora bisa diidentifikasi.
4.2 Perangkat sing ora bisa ngluwihi akar iku silent.
Pengumuman kasebut bisa diganti: siji acara saben identitas, pisanan pungkasan menang. iku apa sing nggunakake desain single-record, lan iku uga apa sing nggunakake piranti unlinked bahaya yen dheweke ngirim. A piranti sing ngumumake kunci sing wis minted kanggo dhewe bakal nglumpukake record nyata lan ngirim saben peer kanggo enkripsi kanthi kunci sing piranti liyane ora bisa ngluwihi.
Sampeyan ora rusak lan ora diblokir saka aplikasi: iku isih njaluk saben pesan sing duwe kunci kanggo lan isih ngirim klasik, nalika njaluk pengguna kanggo nghubungake. Silence iku perilaku sah kanggo piranti sing ora bisa ngandika identitas.
5Discovery lan keputusan ngirim
Klien njaluk kunci peer-to-peer ing dua cara. langganan standing mbutuhake wong sing ngandhutake – ngobrol-ngandhut lan anggota grup – supaya pengumuman sing diwenehi minangka acara biasa. Kanggo peer-to-meet kanggo pisanan, pitakonan one-shot mbukak ing wektu ngirim, dibatas ing 2.5 detik; yen ora mbukak, pesan dadi klasik, kang iku perilaku sing ana sadurunge post-quantum ditambahake ora mode kegagalan anyar.
A hasil negatif iki cache kanggo sepuluh menit lan ora iku. Pengguna sing nghubungake piranti anyar, utawa sing ngalihake saka login browser-ekstensi menyang kunci lokal, dadi post-quantum bisa mid-conversation, lan permanen cache “no” bakal tetep ing enkripsi klasik kanggo urip saka iklan.
5.1 Mengapa ora ana serangan downgrade
Keputusan routing ngurangi kanggo satu pertanyaan:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Iki ora ana negosiasi kapasitas, ora daftar algorithm-supported, lan ora lapangan sawijining penyerang bisa jelas kanggo nggunakake jalur sing luwih lemah. punika Mode kegagalan saka pengumuman sing dihapus utawa ditahan iku yen pesan iku klasik - status quo sadurunge fitur iki - nanging yen pesan hibrida diturunake dadi apa-apa sing bisa diwenehi.
Ing konversi uga mbukak lan penting luwih: klien ngirim hybrid Tiyang Nalika iku nyimpen kunci, lan nyimpen kunci iku bukti sing penerima bisa decapsulate.
6Konstruksi hybrid
Nymchat ora mbukak NIP-44. Dheweke wrap. Teks enkripsi NIP-44 sing ora diubahake minangka lapisan internal, lan ML-KEM nyambung AEAD eksternal ing ndhuwur:
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)
Iki rahasia uga kudu diwenehi kanggo njaluk pesan: lapisan eksternal nyedhiyakake mung teks enkripsi NIP-44, lan bukaan sing kudu kanggo ECDH klasik. A musuh kuantum sing nglumpukake secp256k1 njaluk kunci internal lan isih nglawan ML-KEM; ing nglumpukake ML-KEM nglumpukake lapisan eksternal lan njaluk NIP-44 berdiri.
kem_ssTiyang ing derivasi iki nyentuh output ECDH raw, kang iku apa Section 6.1 mbukak ing.kem_ct,recip_kem_pklan kedhaftar kunci identitas diikat ing minangka data asosiasi, supaya lapisan eksternal diikat kanggo transkrip akurat sing diprodhuksi.
Key ML-KEM penerima iku langgeng, nanging saben pesan nglakoni teks enkripsi sing independen lan amarga iku independen
kem_ssItulah apa sing ngasilake nonce lan ora ngandhutake ngandhutake:
ChaCha20-Poly1305 ing
iki dibutuhake kanthi nggunakake (keyword, nonce) pasangan, lan ing iki kunci dhewe anyar kanggo saben pesan, supaya ora pasangan bisa ngulang.
6.1 Mengapa lapisan tetep terpisah
Alternatif iku kanggo nggabungake kedhaftar rahasia ing siji kunci percakapan lan ngirim kanggo NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Konstruksi iki nyaring minangka kriptografi. Dheweke duwe salah siji masalah struktural: iku kudu
ecdh_xIng ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki (NIP-07Ing ngisor iki ana ing ngisor iki (NIP-46Dheweke nglakoni NIP-44 ing jeneng panggilan lan mbukak teks enkripsi, kang iku kabeh titik nglakoni kunci ing ngendi aplikasi ora bisa nggunakake.
Layering nyingkirake saben login sing nyimpen kunci identitas ing signer, yaiku pengguna paling hati-hati, lan ora jumlah kerja ing derivasi kunci bisa nggantiake. Layering nyingkirake ketergantungan: NIP-44 nyimpen lan diprodhuksi dening apa sing nyimpen kunci identitas, signer kalebu, nalika setengah KEM dihitung saka kode pemulihan sing klien nyimpen langsung.
The biaya iku bandwidth, lan iku ora cilik. The ML-KEM ciphertext iku 1.088 bytes lan nyetir ing saben pesan, base64url-coded kanggo 1,451 karakter; AEAD eksternal nyedhiyakake tag 16-byte Poly1305 lan nyebatake payload NIP-44 iku wraps dening siji-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti-ti.
6.2 Payloads sing disimpen
lan pq2. Prefix nggawe deploying incremental: iku self-describing, supaya klien milih jalur decryption kanthi inspecting payload ora kanthi trusting tag utawa ngingat apa peer ndhukung. A pembaca sing ora njaluk prefix gagal kanggo mbukak payload sing ora misleading iku, lan pesan sing ditutup sadurunge saben sisi bisa nggawe post-quantum tetep bisa dibaca minangka NIP-44 biasa tanpa migrasi.
ML-KEM decapsulation wis dirancang kanggo ora gagal: nyedhiyakake teks encryption malformed, transformasi Fujisaki-Okamoto mbukak rahasia pseudo-random deterministis lan ora salah. Key salah amarga ora mbukak ing lapisan KEM - iku mbukak minangka kegagalan HMAC ing NIP-44, sing minangka cara sing salah saka permukaan kunci klasik. Callers nglakokake kedhaftar kanthi identik, supaya kegagalan ora nglakokake sinyal diferensiasi.
6.3 Dua lapisan wrap hadiah
A NIP-17 Panggonan pribadi iku a NIP-59 gift wrap: rumor sing ora ditandatangani, ditandatangani ing kunci identitas pengirim (gen 13), banjur ditandatangani ing kunci kasebat sing diprodhuksi saben pesan (gen 1059). Ing login sing ndeleng kunci identitas langsung, Nymchat hybridize kedhaftar lapisan, saben karo encapsulation dhewe.
A signer login njaluk lapisan eksternal mung. The seal diprodhuksi dening signer minangka NIP-44 biasa - aplikasi ora ndeleng kunci sing nggawe iku - supaya ora bisa hybridized ing panggonan. Ini ora biaya apa-apa kanggo serangan ing ngendi: seal bisa diakses mung liwat wrap, lan wrap iku apa rekorder nyimpen.
7Panggonan grup lan cakupan parsial
Panggonan grup iku ora satu teks enkripsi. Itulah teks sing padha sing diwenehi kanggo saben anggota, saben salinan dikapsulake menyang kunci ML-KEM ngendi anggota. A anggota sing ngirim kunci njaluk bungkusan hybrid; siji sing ora njaluk bungkusan klasik.
Iki nggawe masalah akuntansi sing implementasi naïf njaluk. yen delapan saka sepuluh anggota njaluk salinan hybrid, pesan iku ora Delapan-sepuluh dilindungi. Sang lawan kudu siji salinan klasik saka teks sederhana sing identik ing kabeh sepuluh, supaya pesan iki dilindungi mung yen saben Copy iku.
Nymchat banjur nyimpen cakupan per pesan nalika fan-out - hitungan iku mung bisa ngerti nalika wraps wis dibangun - lan badge melaporkan “quantum-resistant kanggo 8 saka 10 anggota” ora ngandika pesan dilindungi. Panggonan Mesej grup (hanya pengirim nghitung fan-out), antarmuka melaporkan parsial lan ora perlindungan lengkap. Nglakoni perlindungan lengkap ing kekuatan salinan dhewe mung bakal dadi overstatement babagan mesej ing keseluruhan.
7.1 Apa sing dilaporkan saka perisai
Panjenenganipun ngandika kebenaran babagan Panggonan, ora babagan software sing ngirim iku:
- Perlindungan lengkap: saben salinan saka teks sederhana iki dadi hybrid.
- Parsial: sawetara salinan saka pesan grup teka klasik. Digambarake degraded nanging ora lengkap, amarga siji salinan klasik saka teks pisanan identik ing kabeh iku kabeh kebutuhan lawan.
- Klasik dituduhake kanthi jelas lan ora ditampilake minangka ora badge, amarga indikator sing mungke ambigu antara “unprotected”, “broken”, lan “build iki kurang fitur”.
Keputusan iki dicatake nalika pesan ditutup lan ora dikaluarake saka apa sing peer iklan ing ngisor iki. Ciphertext sing ana ora bisa dadi luwih dilindungi saka ana, lan antarmuka sing ngrewake pesan tua ing kekuatan saka iklan anyar bakal ngaku apa-apa palsu babagan bytes ing relay.
Aturan grup ing ndhuwur stack ing ndhuwur iki ora mbukaké: pesan grup wis sepenuhnya dilindungi mung nalika salinan saben anggota ana, lan salinan grup sing diwenehi tanpa hitungan cakupan ditampilake parsial.
8Kopi sing ditujukan kanggo dhewe
Sawetara barang-barang klien disimpen kanggo identitas user dhewe: pengaturan sinkronisasi, daftar percakapan, kunci grup, lan arsitek pesan. Iku ngirim luwih babagan user saka paling pesan sing ana, supaya ngandhutake klasik bakal dadi artifak paling lemah sing disimpen tanpa ngandhutake ngandhutaké pesan dhewe. nymchat-pq-root kategori dhewe, sing ora bisa ditutup ing kunci sing mung bisa diprodhuksi.
Artifak-artifak iki ana ing ngendi desain paling penting. Blob pengaturan utawa baris arsip ngendi ing satu tempat kanggo taun-tahun, kang iku persis bentuk saka bagay sing ngumpulake saka lawan-sampun-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut-ngandhut.
Salah penghalang ngatur format ing iki lan ora kunci. salinan sing ana alamat dhewe kudu bisa dibaca dening saben ing akun, supaya saben piranti nyebat apa sing bisa buka ing papan iklan sing nglakoni, lan akun nyebaté mung apa sing kabeh bisa baca. Tulis apa-apa liyane bakal nyekat piranti saka setelan dhewe - sing padha silent kegagalan Section 3.2 nglindhungi kanthi cara liyane, mbukak saka arah beda.
Perangkat sing nduweni identitas nanging ora root ora bisa ngluwihi apa-apa sing ditutup kanggo kunci root-derivated, kalebu pengaturan dhewe. Iki iku konsekuensi sengaja, ora pengawasan, lan iku alasan Section 3.3 duwe alat sing disaranake kanggo linking alatan minting root anyar: root kedhaftar ora bakal nggawe blob bisa dibaca, iku mung bakal nyebar materi kunci identitas ing loro.
Perangkat sing ngoperasikake ekstensi browser utawa signer remote (NIP-46) ora nglakoni nsec kanggo diwenehi, nanging iku nglakoni kode pemulihan, lan ing konstruksi layered saka Bagian 6.1 sing kabeh dibutuhake saka separuh post-quantum: signer ngproduksi lapisan NIP-44 kaya iku selalu, lan klien nglakoni lapisan eksternal dhewe.
9Rotasi
lan epoch Counter ing derivasi iku apa sing nggunakake rotasi tanpa bahan kunci anyar. Incrementing iki ngasilake pasangan kunci anyar saka akar sing padha lan pengumuman diterbitake; peers njupuk kunci anyar saka rekaman sing bisa diganti. Rotasi amarga ora ngarepake pengguna kanggo ngetik apa-apa ing pisanan: akar diprodhuksi siji kali per identitas lan epoch ngganti.
9.1 Epoch-Epoch kuno disimpen, lan ora ana re-encrypted
A klien ngasilake kandidat decryption saka era saiki nganti epoch − 3, supaya pesan sing disegel sesawuh sadurunge rotasi uga mbukak kanggo pasangan kunci sing saiki nalika iku dikirim.
Apa-apa sing wis ditutup tetep bisa dibaca kanggo urip saka identitas, amarga pesan sing nggunakake ora bisa lagi buka iku ketimbang siji kang perlindungan ora bisa ditingkatake retroactively (Seksi 10.5).
10Apa sing ora melindungi
Paparan sing mung nulisake apa sing dicapai ing desain ora ngleksanakake sistem, lan mbutuhake properti keamanan ing antarmuka luwih parah saka mbutuhake.
10.1 A akar iku rahasia kedua, lan njaluk iku ora bisa diwenehi.
Iki minangka harga nyata saka desain. Kekuatan ing Bagian 2 sing user kudu duwe apa-apa kanggo nyimpen ora bisa ditemokake: nsec mung ora ngrekonstruksi kunci post-quantum, amarga kabeh titik iku yen ora nilai publik lan ora rahasia liyane nyedhiyakake. Yen ora salah siji piranti nyimpen akar lan ora salah siji wraps saka Bagian 3.2 bisa dibukak, bahan sing ditutup kanggo kunci-derivate akar ora bisa diwenehake.
Kanthi transmisi manual satu-satunya jalur, iki luwih tajam saka sing bisa dibaca pisanan. nympq1… code ing ngendi wis akurat siji salinan saka iku, ing siji piranti, lan njaluk piranti iki njaluk kabeh pesan post-quantum, setelan blob lan baris arsip sing ditutup kanggo iku.
nsec Dheweke ora nggunakake; iku properti sing kabeh desain dumunung ing.
Apa-apa jalur bungkusan sing ditambahake sawise kudu nghapus bar sing padha karo manual. A penyerang nyerang jalur paling murah sing kasedhiya, supaya skema wis nilai apa-apa jalur pemulihan paling lemah-kalebu passphrase sing bisa diingat, uga bakal nempatake kabeh apa-apa kalebu passphrase, lan baris bungkusan iku persis artefakt sing sawetara-sampun-deskript-sampun ngumpulake lan ngurangi offline ing free-time.
10.2 Autentikasi, minangka beda saka kerahasiaan
Tiap tanda tangan ing Nostr iku Schnorr liwat secp256k1, lan sing ora diubah ing iki. A musuh karo komputer kuantum bisa nguripake tanda tangan lan nguripake pengguna ing wektu nyata. Apa nguripake pertukaran kunci hibrida iku nguripake-ke-decrypt-later: sawijining penyerang ngrekam lalu lintas saiki ora bisa njaluk ndhuwur. Dheweke ora nggawe pesan sing ora bisa diampuni kanggo musuh sing wis mesin. Perbedaan iki digunakake ing aplikasi kanthi sengaja - indikator padlock nguripake autentikasi, perisai nguripake kerahasiaan, lan padha glyphs terpisah amarga pesan bisa duwe siji tanpa liyane.
Panggonan antarane npub lan kunci ML-KEM iku tanda secp256k1, supaya lawan sing bisa nggoleki sing bisa mbukak kunci dhewe.
3.3 Metadata
Tiyang-tiyangipun ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi ngluwihi. p tag, jinis, lan timestamp saka pesan internal. Dheweke ora mbutuhake yen acara ana, ukuran, utawa nalika relay nampa. Analisis lalu lintas ora ditindakake dening apa-apa bagian saka desain iki.
10.4 Jaringan offline
Nymchat's Bluetooth mesh transportasi minangka protokol terpisah karo tangan dhewe, lan iku ora ditutupi dening karya iki.
10.5 Panggonan sing wis dikirim
Ciphertext disimpen nalika saben sisi iku masih klasik tetep klasik permanen. iku wis ana lan ora bisa ditutup ulang. Perlindungan wiwit ing pesan ing ngendi kedhaftar ngendi nyimpen post-quantum, ora ing wektu fitur iki di-switch.
11Alternatif sing dianggep
| Pendekatan | Kenapa ora |
|---|---|
| Ngasilake kunci post-quantum saka kunci identitas | Ing derivasi iku algoritma umum liwat nsec, lan lawan kuantum njaluk nsec saka npub diterbitake, supaya ngluwihi setengah klasik liwat setengah post-quantum karo iku. |
| Ngirim root menyang perangkat liyane pangguna liwat NIP-44 | Roti sing ditransmisir ing kode-kripsi klasik-only bisa diwenehi dening siapa-siapa sing ngrekam pesan lan nglumpukake kunci ing ngisor iki, kang yaiku musuh saka akar sing ana kanggo nghenti. |
| A keypair ML-KEM sing diprodhuksi separat ing saben piranti | Tiyang ditolak. Perangkat bakal nyimpen kunci decapsulation sing beda, lan siji pengumuman sing bisa diganti saben identitas ora bisa nyimpen kabeh. Peers bakal enkripsi kanggo ngendi kunci wis diterbitake sadurunge, lan kabeh peralatan liyane bakal ora bisa njaluk hasil. Satu akar saben identitas, dipindhah dening jalur Section 3.2, iku apa sing nghindari iku. |
| Nglumpukake akar ing PIN | A PIN empat-digit kira-kira 13 bit kontra penyerang offline nglakoni baris bungkusan. nyedhiyakake ing sisih saka dua jalur 256-bit bakal misrepresentasi apa sing bungkusan paling lemah ana nilai. |
| Ngluwihi npub kanggo ngangkut kedhaftar kunci | 1,184 bytes ora minangka pengidentifikasi sing bisa dibagikan, lan iki bakal nglumpukake saben klien Nostr sing ana parsing alamat sing didefinisikan minangka 32 bytes. |
| Layanan Key Directory | Renewasi otoritas jaringan sing ana kanggo nghindari. Siap-siap sing nyangguhake searchup nglakoni siapa bisa njaluk pesan. |
| Ngandhingake kunci kanggo saben pesan | Nguripake apa-apa: pengirim kudu Receiver iku kunci sadurunge pesan pisanan, kang iku tepat ing kasus karo ora pesan pisanan kanggo ngangkutake. |
| Kapasitas negosiasi ing band | Ngasilake permukaan downgrade. Seorang penyerang kang bisa njaluk bendera kapasitas nggunakake jalur klasik. |
| Sadaya post-quantum, ora kaki klasik | Ngluwihi dekade analisis secp256k1 ing ngganti kanggo primitif sing luwih muda. loro-lorone Iki iku. |
12Paritas implementasi
Nymchat nyedhiyakake dua implementasi independen saka konstruksi iki - siji ing JavaScript kanggo aplikasi web, siji ing Dart kanggo aplikasi seluler, kalebu port ML-KEM-768.
Implementasi Dart ML-KEM validasi menyang resmi
Ngudhunaké ACVP
Ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki, ing ngisor iki (ML-KEM-*-FIPS203) — 25 kunci-generasi, 25 encapsulation lan 10 kasus decapsulation, mbukak minangka suite dhewe. Iku vektor NIST diterbitake kanggo ngvalidasi implementasi, supaya ngliwati iku bukti port iku akurat, ora mung bukti sing kedhaftar klien setuju karo loro. Ngaba iki, fixture umum vektor test - derivation benih, encapsulation, kedhaftar payload, lan lengkap gift wraps - diprodhuksi saka referensi JavaScript lan diprodhuksi dening kedhaftar test suites. Root secret nyebarake fixture sing ora mbukak: root kanggo benih, root kanggo keypair, sidik jari publik saka wétan, lan kunci derivatif, nonce lan data terkait saka lapisan luar iku vektor dhewe, supaya kedhaftar ora bisa nganggur babagan apa
nympq1… Divergence ing salah siji implementasi gagal build lan ora ngasilake pesan sing klien liyane ora bisa buka.
Iki iku apa sing ngandika piranti “it iku akar sing aku duwe” saka “it punika piranti liyane ”, lan klien sing ora bisa ngulang piranti piranti klien liyane bakal ngandika cathetan apik minangka ora cathetan - lan banjur, sawise Bagian 3.3, mint piranti kedua lan nyebarake identitas.
Nymchat iku Open sumber ing AGPL-3.0. inti kriptografi sing digambarake ing iki iku
js/nym-crypto.js lan js/modules/pq.js ing web klien, lan
lib/core/crypto/ Dheweke lib/features/identity/pq_registry.dart Ing klien mobile.
Kanggo penjelasan sing luwih sing sing sing kurang teknis, ndeleng kaca basis pengetahuan ing enkripsi quantum-resistant.