Basi pengetahuan: enkripsi kuantum-resistant

Nymchat whitepaper téhnis

Ngeunaan alat-alat utama di Nymchat

Distribusi kunci publik ML-KEM-768 ngaliwatan Nostr tanpa direktori atawa registry, sarta nyimpen aranjeunna ti rahasia nu teu nilai publik ngalaporkeun.

Ngeunaan versi 1.0 Dina 2026 Gampangna pikeun Nymchat 3.74+

Ngaronjatkeun pertukaran kunci pasca-quantum ka messenger nu utamana teu masalah cryptography. primitives anu standardized jeung perpustakaan aya. bagian kakuatan nyaéta yén unggal pamilon ayeuna kudu hiji Dina kertas ieu ngécéskeun kumaha Nymchat ngalawan eta - ti mana kunci kedua datang ti, kumaha eta ngahontal jalma anu peryogi eta, jeung naon antarmuka diperbolehkeun klaim ngeunaan hasilna - jeung, di bagian terakhir, naon hasilna teu ngajaga.

1Masalah téh

Panggilan pribadi kami anu disadiakeun ku NIP-44, nu mibanda dua belahan anu bisa dipisahkeun. belahan nu scrambles teks simple — ChaCha20 kalawan tag HMAC-SHA256, keyed ngaliwatan Ngeunaan (Ngeunaan: RFC 5869) — teu diancam signifikan ku komputer kuantum; algoritma Grover ngabalukarkeun hiji acceleration square-root ngalawan key symmetric, sarta 256 bit absorbs eta. Ngeunaan di kunci nyaéta elliptic-kurva Diffie-Hellman leuwih Ngeunaan 256K1, sarta algoritma Shor ngecas logaritma discreet lengkep. Recovering hiji kunci swasta ti homolog publikna retrospectively exposes unggal rahasia dibagikeun nu kunci pernah dihasilkeun.

The ancaman ieu nyiptakeun teu ditangguh nepi ka mesin ieu aya. A musuh kalawan storage bisa nyokot teks encryption kiwari jeung decrypt eta lamun kapasitas datang. Sakabéh nu dikirim ayeuna nu masih penting ayeuna geus kompromi. Ieu téh serangan spesifik hiji pertukaran kunci post-quantum ngalahir, sarta éta alasna karya teu bisa ngantosan pikeun mesin anu dibangun.

1.1 Soalan ieu kertas jawab

Ngeunaan author nu: Lamun anjeun resep artikel ieu ngeunaan (Ngeunaan 203Ieu langsung ngabalukarkeun masalah distribusi:

Pertanyaan téh

Pikeun ngirim pesan Alice kiwari, anjeun kudu hiji hal: npub nya. Tambihkeun hiji pamasaran post-quantum jeung anjeun kudu sejen - ML-KEM public key nya. Dupi nu kunci anu hirup, jeung kumaha anjeun meunangkeun eta saméméh anjeun bisa ngirimkeun anjeunna naon?

A npub mangrupakeun indit. Anjeun tiasa nyokot eta dina kertas, dibaca deui, atawa scan eta ti layar, sarta éta téh sakabéh anu kudu encrypt ka anjeun. A ML-KEM-768 kunci publik nyaéta 1,184 bytes. Ieu teu bisa dibaca deui, éta moal cocog dina ngaran pamaké, sarta éta teu aya dina kode QR di samping hiji identitas nu ngan 32 bytes.

Ukuran mangrupakeun bagian gampang. bagian leuwih kakuatan nyaéta yén kunci kedua ngabalukarkeun tilu masalah anu beda, jeung sisih kertas ieu utamana mangrupikeun jawaban pikeun aranjeunna:

2Désémbongkeun limitasi

Katuhu kabutuhan ngatur jawabna, sarta aranjeunna ngabalukarkeun loba desain jelas saméméh mana wae kode ditulis.

  1. Sakabéh rahasia anu mungkin. Users urang geus nyadiakeun sakumaha anu sarua, nsec. unggal rahasia tambahan mangrupakeun cara séjén pikeun meunangkeun sajarah anjeun, sarta batur anu nyaho pikeun nyadiakeun nsec teu nyaho pikeun nyadiakeun kitu séjén. Bagian 3.1 ngécéskeun ieu teu bisa diwanohkeun langsung - hiji kunci post-quantum diwanohkeun ti nsec teu nyadiakeun perlindungan post-quantum di sakuliahna - jadi desain nyadiakeun sakuliah hiji rahasia jeung teu leuwih: hiji potongan bahan kunci tunggal, diproyékkeun hiji kali per identitas, disadiakeun dina bentuk anu sarua jeung nsec jeung di tempat anu sarua, jadi anu hayang nyadiakeun kumaha pikeun nyadiakeun anu séjén. Bagian 10.1 téh jujur ngeunaan naon anu masih biaya.
  2. Teu aya otoritas. Aya hiji server nu bisa dipercaya pikeun nyebutkeun nu kunci milik ka anu. Mana wae server ieu jadi titik di mana pesan bisa dipindahkeun.
  3. Rupa alat, hiji identitas. A Nostr identitas anu biasa dipaké ti sababaraha klien dina hiji waktu. naon bahan utama aya kudu jadi identik dina sakabéh maranéhanana, jeung jalur nu ngabalukarkeun eta di sana-sini kudu teu bisa dibaca ku lawan nu fitur ngajaga ngalawan.
  4. Teu negosiasi. Any in-band exchange of “which ciphers do you support?” nyaéta hiji permukaan hiji penyerang bisa strip pikeun nyandak hiji pilihan lemah.

3A rahasia anu independen

Keputusan ngarugikeun téh yén kunci decapsulation ML-KEM ieu disimpen tina bahan utama nu teu nilai publik ngalaporkeun.

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)

The root anu disadiakeun ka pamaké kana cara nsec nyaéta: Ngeunaan 32 Demi sasatoan anu dimaksud nyaéta vertebrata. nympqIeu téh dibaca salaku nympq1…, ditémbongkeun di sabudeureun nsec dina layar identitas di balik interaksi ngalaporkeun anu sarua, disalin ku kontrol anu sarua, teu pernah logged jeung teu pernah dikirim ka mana wae dina jelas. Ieu teu password na éta teu login. Ieu bahan utama nu pamaké bisa nyimpen, sakumaha nsec.

Garam ieu dipisahkeun ku domain-dipisah ku tujuan, jadi teu rahasia séjén bisa pernah ngahasilkeun keypair anu sarua. epoch Ngeunaan alat router (bagian 9).

3.1 Alasan nu kunci teu bisa dihasilkeun ti kunci identitas

Desain jelas nyaéta nyimpen keypair ti rahasia nu pamaké geus boga:

seed = HKDF(salt = "…", IKM = nsec)          // do not do this

Ieu tarik pikeun empat alesan, sakabehna nyata: teu kitu anyar pikeun backup, sabab nsec geus backup; unggal alat anu disetujui ku konstruksi, tanpa protokol sinkronisasi pikeun ngalawan salah; hiji pamaréntah anu bisa diganti per identitas anu jelas sah, sabab alat teu bisa disatujuan ngeunaan kunci; jeung kunci anu aya saméméh eta pernah diterbitkeun, jadi klien bisa janten kitu pikeun sorangan di mimiti.

Sakabéh empat kaunggulan teu berharga, pikeun salah sahiji alesan. algoritma Shor ngajalankeun ngalawan npub diterbitkeun ngahasilkeun nsec. Derivasi benih nyaéta algorithm publik dina ngalawan nsec. Ku kituna lawan anu ngalawan setengah klasik reconstructna setengah post-quantum ku ngajalankeun sama HKDF nu sakabeh séjén ngajalankeun. Ngalawan panon-nu-decipt-later - hiji ancaman nu fitur aya pikeun hésé - hiji kunci dihasilkeun ku cara ieu ngaronjatkeun naon.

Hiji aturan sakabéh datang ti

The ML-KEM decapsulation key kudu datang ti entropy nu teu bisa dihasilkeun ti nsec na pernah dikirimkeun dina encryption-only klasik.

A rahasia anu dihasilkeun independen nu lajeng sinkronisasi antara alat pamaké dina hiji pesan NIP-44 biasa mangrupakeun gagal anu sarua jeung langkah tambahan: hiji musuh nyatakeun pesen anu ayeuna sarta ngaronjatkeun kunci klasik na sanggeus, sarta akar ieu ngaluarkeun.

3.2 Nyandak root ka alat séjén pamaké

Batas 3 tina Bagian 2 - hiji identitas, sababaraha alat - teu bisa disadiakeun ku aritmatika di dieu, sabab sakabéh titik nyaéta yén kunci teu fungsi sagala hal anu alat geus dibagi. nympq1… Kode pikeun diri.

Kakuatan ieu diwanohkeun salaku nympq1… Di sisi nsec, jeung alat kedua nampi eta dipake dina panel anu sarua. Ieu téh sakabéh mékanisme. A alat nu teu disadiakeun kode nu teu bisa partisipasi, nu Bagian 4.2 dijelaskeun.

Aturan dina Bagian 3.1 nyebutkeun nu akar teu bisa pernah travel di bawah encryption-only klasik, jeung unggal mékanisme nu bakal nyieun ieu otomatis - sinkronisasi eta ngaliwatan relay, bungkusan eta ka kunci identitas - ngabalukarkeun katuhu éta.

Format nawarkeun tempat pikeun jalur bungkusan: hiji rekaman bisa ngabalukarkeun hiji daftar bungkusan, unggal hiji AEAD blob di handap hiji kunci anu pamaké bisa ngaronjatkeun dina alat sejen - output PRF passkey, misalna. nympq1… Ngeunaan kode ieu téh satu-satunya jalan ngaliwatan. Bagian 10.1 ngajelaskeun naon biaya ieu.

The record sorangan hirup dina kategori setelan sorangan, nymchat-pq-rootKu kituna ngabalukarkeun no wraps eta ngalakukeun kerja anu dibutuhkeun: kagiatan nya nyaéta kumaha hiji alat kedua ngajarkeun yén identitas ieu geus boga akar, nu éta nu ngabalukarkeun eta minting rival hiji (Bagian 3.3).

Catetan desain: kategori anu teu bisa ngagunakeun kunci anyar

Anjeunna nymchat-pq-root Kategori anu wajib henteu Ieu baris ngabalukarkeun satu-satunya salinan tina akar, jadi ditutupkeun eta di handap hiji kunci dihasilkeun ti akar mangrupakeun lock nu kunci anu aya dina kotak: teu aya alat bisa ninggalkeun eta, kaasup anu nyusun eta. Ieu ditutupkeun klasik - NIP-44 sorangan - atawa teu sakabehna. Ieu téh hiji tempat nu desain nampi perlindungan klasik-only, jeung éta bisa nyayogikeun: baris nu ngabalukarkeun no root kiwari, ngan fakta yén hiji aya.

Kabéh kategori setelan lianna bisa jeung kudu ngagunakeun kunci derived root. Ieu téh hiji pengecualian, sarta éta hiji pengecualian ngeunaan circularity leuwih ti ngeunaan kakuatan.

3.3 Generasi jeung adopsi

Dina boot, ngabogaan identitas durable, klien ngoperasikeun dina urutan ieu:

  1. Meunangkeun hiji existing nymchat-pq-root Ngeunaan record.
  2. Record kapanggih, jeung alat ieu bisa unwrap eta - nyokot eta jeung ngumumkeun identitas ieu salaku post-quantum bisa.
  3. Record kapanggih, jeung alat ieu teu bisa unwrapping eta — teu ngahasilkeun root anyar, jeung teu ngirimkeun hiji panganyaran di sakuliahna. Ngarankeun pamaké pikeun ngagabungkeun alat ieu ku nyandak nympq1… kode ti alat nu geus boga eta.
  4. Ngeunaan record - generate a root, publish the record, ngumumkeun, jeung nembongkeun nympq1… kode pikeun pamaké hiji kali supaya aranjeunna bisa nyimpen.

Langkah 3 mangrupakeun langkah anu gampang ka salah, sarta éta alasna urutan dituliskeun nepi ka unggal implementasi. Dua alat nu unggal milih pikeun ngahasilkeun akar ngahasilkeun dua akar independen di handap hiji identitas, sarta éta gagal urutan ieu aya pikeun nyegah.

4Nurutkeun kapasitas

The public half of the derived keypair ieu diterbitkeun salaku addressable. Daptarkeun-01 Daptarkeun dina 30078. 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 hiji acara per (kind, pubkey, d-tag), jadi republish ngabalukarkeun pamaréntah saméméh di tempat. unggal identitas ku kituna boga akurat hiji catetan ayeuna, nu nu ngajadikeun &ldquo;look up Alice's key&rdquo; a hiji catetan unambiguous leuwih ti hiji daftar pikeun ngabandingkeun.

Tandatanganan téh wajib. Événsi ieu ditandatanganan ku kunci identitas, jadi klaim &ldquo;nu ML-KEM kunci nepi ka ieu npub&rdquo; téh sakumaha kuat salaku npub sorangan. Nggantikeun hiji kunci encapsulation béda kudu ngéléhkeun parentah secp256k1. A penyerang nu bisa ngalakukeun eta teu kudu ngabalukarkeun KEM.

Pemberitahuan anu tumuwuh. 7 poé NIP-40 The expiration, dipublikasikeun unggal 24 jam, nyimpen hiji pernyataan ngeunaan klien anu masih dioperasikeun jeung teu hiji anu dulur.

Pemberitahuan langganan dibaca sakumaha anu teu pernah ngabalukarkeun kunci: peers ngirim NIP-44 biasa, nu unggal login bisa dibaca, sarta klien ngulangkeun pertukaran post-quantum dina sambungan saterusna, nalika eta diterbitkeun deui. Ku kituna nyimpen silent pikeun leuwih ti minggu biaya perlindungan pikeun pesen anu dikirim dina interval - aranjeunna classicly encrypted teu kuantum-resistant - jeung biaya kitu. pangiriman teu dipikaresepkeun, kitu nu geus nampa jadi unreadable, jeung teu tindakan diperlukeun dina balik.

Ieu asymmetry mangrupakeun alesan pikeun kadaluwarsa nu leuwih ti aksésan tina eta. tanpa hiji, hiji catetan survives nu kunci nu ngaranna: hiji alat nu dihapus, reset, atawa geus akar nya diganti ninggalkeun hiji instruksi standing pikeun encapsulate ka hiji catetan nu teu aya anu aya deui, jeung pesan dikirimkeun di handap eta dipeunteun tanpa kesalahan di mana-mana sisi. Tujuh poé dibates jendela ieu, sarta ngidinan relay ngundeur catetan sorangan badag bergantung kana klien pikeun nempokeun.

The key field ngaranna format nya. Teras téh pk2, jeung digit mangrupakeun bagian tina kontrak leuwih ti dekorasi: eta ngaran format payload nu kunci bisa dipaké jeung. A pembaca nu teu nyaho lapangan ngadeukeutan &ldquo;Nymchat klien, teu post-quantum key&rdquo; jeung ngirim biasa NIP-44, nu unggal login bisa dibaca. Ieu arah gagal anu sahenteuna, sarta éta wartos nyatakeun salaku aturan nu format numbering aya pikeun ngalaksanakeun: hiji klaim kapasitas unrecognised kudu biaya perlindungan, teu nganteurkeun. A kunci anu peer teu bisa ngagunakeun nyaéta badag ti teu kunci di sakuliahna, sabab pesan nu dihasilkeun disimpen tanpa kesalahan di sakuliah.

4.1 Absence nyaéta signifikan, jeung tilu-rated

A detail subtil tapi penting: pamaréntah ieu diterbitkeun ku unggal klien Nymchat, teu ngan anu post-quantum-kapasitas, jeung medan kunci nyaéta opsional.

NurutkeunMaksadnaNgirimkeun perilaku
Pemberitahuan jeung kunci Nymchat, post-quantum bisa Hybrid téh
Nurutkeun, teu nyadiakeun kunci Nymchat, klasik ngan — post-quantum off, atawa hiji alat nu belum dikaitkeun ka akar identitas Ngeunaan NIP-17
Ngeunaan iklan Klién unknown. bisa jadi unggal pamaké Nostr atawa Bitchat Klassik, ditambahkeun kompatibilitas wrap

Ngaronjatkeun baris ketiga kana baris keempat bakal jadi kerugian nyata. pengumuman tanpa kunci mangrupakeun pernyataan signated yén pangirim ngajalankeun Nymchat, nu ngidinan jalur nganteurkeun wrap cross-protocol spekulatif éta bakal kudu kaasup pikeun jalma nu teu bisa identify.

4.2 A alat nu teu bisa buka akar tetep silent

Pemberitahuan anu bisa diganti: hiji acara per identitas, tulisan terakhir meunang. Ieu nu ngajadikeun desain single-record kerja, sarta éta ogé nu ngajadikeun hiji alat unlinked berbahaya lamun eta diterbitkeun. A alat nu ngumumkeun hiji kunci éta geus minted pikeun sorangan bakal clobber catetan nyata jeung ngirim unggal peer ka enkripsi di handap hiji kunci nu alat séjén teu bisa buka.

Jadi hiji alat nu nyaho akar aya tapi teu bisa buka eta ngirimkeun teu hiji pamaréntah di sakuliahna. Ieu teu rusak jeung éta teu diblokir ti aplikasi: éta masih ngécéskeun unggal pesan nu mibanda kunci pikeun jeung masih ngirimkeun klasik, bari ngéléhkeun pamaké pikeun nyambungkeun eta. Silence mangrupakeun perilaku sahenteuna pikeun hiji alat nu teu bisa ngobrol pikeun identitas.

5Deskripsi jeung keputusan ngirimkeun

Klien ngajarkeun kunci peer dua cara. langganan standing nyertakeun jalma anu pamaké anu bener nyertakeun — ngobrol buka jeung anggota grup — jadi pamaréntah maranéhanana datang salaku acara biasa. Pikeun peer kapanggih pikeun kahiji kali, hiji pertanyaan one-shot ngajalankeun dina waktos ngirim, dibateskeun ka 2,5 detik; lamun teu ngalereskeun, pesan jadi klasik, nu mangrupakeun perilaku anu aya saméméh post-quantum ieu ditambahkeun alatan mode gagal anyar.

A hasil négatip dipigawé pikeun sapuluh menit badag ka permanén. pamaké anu nyambungkeun alat anyar, atawa nu pindah ti login extension browser ka kunci lokal, jadi post-quantum bisa mid-conversation, jeung permanén dipigawé &ldquo;no&rdquo; bakal mantuan aranjeunna dina enkripsi klasik pikeun kahirupan pamaréntah.

5.1 Kumaha teu aya serangan degradasi

Keputusan routing ngurangan ka hiji soalan tunggal:

pq = (we hold a signed, unexpired ML-KEM key for this recipient)

Aya henteu negosiasi kapasitas, teu hiji senarai algorithms anu didukung, jeung teu aya lapangan hiji penyerang bisa sél pikeun nyandak hiji lalampahan leuwih lemah. nyaeta Mode kegagalan tina pamaréntah disingkirkeun atawa ditangtayungan nyaéta yén pesan jadi klasik - status quo sateuacan fitur ieu - badag yén pesan hibrida disingkirkeun kana hal anu bisa disingkirkeun.

Ngalawan kitu ogé ngabogaan jeung penting leuwih: hiji klien ngirim hibrida Sadaya Ku kituna, anjeun tiasa nyadiakeun ka anjeun, anjeun bisa nyadiakeun ka anjeun, anjeun bisa nyadiakeun ka anjeun.

6Konstruksi Hybrid

Nymchat teu ngarobah NIP-44. Ieu ngalengkepan eta. teks cipher NIP-44 unmodified nyaéta lapisan internal, jeung ML-KEM nyandak AEAD luar di sakuliah eta:

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)

Dua rahasia masih kudu diusahakeun pikeun maca pesan: lapisan luar ngahasilkeun ngan hiji NIP-44 ciphertext, jeung bukaan nu kudu ECDH klasik. A lawan kuantum anu breaks secp256k1 meunang kunci jero tur masih ngalawan ML-KEM; hiji breaking tina ML-KEM nyingkahan lapisan luar jeung tetep NIP-44 standing.

The ML-KEM key of the receiver is long-lived, tapi unggal pesan ngabalukarkeun teks encapsulation independen jeung ku kituna independen kem_ssIeu téh naon nu make deriving nonce badag randomizing eta tingal: Ngeunaan author nu: ieu dipigawé ku reusing hiji (keyword, nonce) pasangan, jeung di dieu kunci sorangan mangrupakeun anyar pikeun unggal pesan, jadi teu sababaraha bisa ulangi.

6.1 Alasan nu lapisan tetep terpisah

Alternatifna nyaéta pikeun ngagabungkeun duanana rahasia dina hiji kunci percakapan tunggal jeung ngirimkeun eta ka NIP-44:

ck = HKDF-Extract(salt = "…",
                  IKM  = ecdh_x || kem_ss || …)          // do not do this

Konstruksi ieu ngabalukarkeun cryptography. Ieu ngabogaan salah sahiji masalah struktural: eta kudu ecdh_xNgeunaan author nu: Lamun anjeun resep artikel ieu ngeunaan (NIP-07Ngeunaan author nu: Lamun anjeun resep artikel ieu ngeunaan (NIP-46Ieu ngalaksanakeun NIP-44 dina pihak panggero jeung ngalawan balik teks encryption, nu téh sakabéh titik nyimpen kunci di mana aplikasi teu bisa ngahontal.

Campuran rahasia, ku kituna, nyingkahi unggal login anu nyimpen kunci identitas dina signer, nyaéta nyebutkeun pamaké anu paling hati-hati, jeung teu jumlah karya dina derivasi kunci bisa ngarobah eta. Layering ngaluarkeun dependency: NIP-44 tetep sakabeh jeung dihasilkeun ku naon anu nyimpen kunci identitas, signer kaasup, nalika KEM setengah dihitung ti kode pemulihan nu klien nyimpen langsung. signer logins nyaéta partisipan post-quantum biasa di dua arah.

The biaya téh bandwidth, sarta éta teu leutik. The ML-KEM ciphertext nyaéta 1,088 bytes jeung rides on unggal pesan, base64url-koded ka 1,451 karakter; AEAD luar nambahkeun tag 16-byte Poly1305 sarta ngaronjatkeun payload NIP-44 nu ngumpulkeun ku tilu. A pesan 50-karakter tumbuh ti 176 bytes ka 1,712, jeung hiji 2000-karakter hiji ti 2,820 ka 5,238. The lantai nyaéta kira-kira 1,5 KB per pesan tanpa kira saeutik pesan anu pendek, nu mangrupakeun harga encapsulating fresher unggal waktos ti reusing a rahasia dibagikeun.

6.2 Daptarkeun payloads

Anjeunna pq2. prefix make deployment incremental: éta self-describing, jadi hiji klien milih lalampahan decryption ku inspecting payload badag ku percaya hiji tag atawa ngingat naon peer ngarojong. A pembaca nu teu nyaho prefix gagal pikeun buka payload nu badag leungitkeun eta, jeung pesan ditutup saméméh sisi bisa ngalakukeun post-quantum tetep bisa dibaca salaku biasa NIP-44 tanpa migrasi.

Demi sasatoan anu dimaksud nyaéta vertebrata.

ML-KEM decapsulation dirancang pikeun teu pernah gagal: ku text cipher malformed, transformasi Fujisaki-Okamoto ngabalukarkeun hiji determinist pseudo-random rahasia leuwih ti salah. A kunci salah jadi teu ngalawan dina lapisan KEM sakali - éta ngalawan salaku cacat HMAC di jero NIP-44, nu mangrupakeun cara anu salah dina permukaan kunci klasik. panggero ngabalukarkeun duanana sarua, jadi cacat teu ngabalukarkeun sinyal nu ngabalukarkeun. Éta ogé anu ngajadikeun daftar kandidat Section 9.1 bisa dioperasikeun: hiji klien nyoba unggal kunci tur ngabalukarkeun NIP-44 ngabalukarkeun nu anu salah.

6.3 Dua lapisan of hadiah wrap

A NIP-17 Panggilan pribadi nyaéta a NIP-59 hadiah wrap: rumor unsigned, ditutup di handap kunci identitas pengirim (tipe 13), lajeng ditutup di handap kunci throwaway dihasilkeun per pesan (tipe 1059). Dina login nu ngabogaan kunci identitas langsung, Nymchat hybridizes dua lapisan, unggal kalawan encapsulation sorangan.

A hybrid NIP-59 gift wrap: the rumor sealed under the sender's key, that seal wrapped under a per-message ephemeral key, both layers carrying a NIP-44 ciphertext inside a post-quantum AEAD. kind 1059 — wrap  ·  signed by a per-message ephemeral key content = pq2.<kem_ct>.<aead>   inner = NIP-44(eph, recip)   outer key = ML-KEM(recip) kind 13 — seal  ·  signed by the sender's identity key content = pq2.<kem_ct>.<aead>   inner = NIP-44(sender, recip)   outer key = ML-KEM(recip) rumor — unsigned the message: kind, content, tags, author pubkey unsigned on purpose — a signature would be portable proof
Kabéh lapisan enkripsi nyaéta hibrida, unggal kalawan encapsulation ML-KEM independen. lapisan luar ieu ditangtukeun ka rahasia ditangtukeun, jadi bungkusan teu ngalaporkeun pengirim.

A signer login nampa layer luar ngan. The seal anu dihasilkeun ku signer salaku NIP-44 biasa - aplikasi teu pernah ningali kunci anu nyieun eta - jadi eta teu bisa hybridized di tempat. Ieu teu biaya naon ti serangan dina hal ieu: seal anu bisa diakses ngan ngaliwatan wrap, jeung wrap nyaéta naon hiji recorder nyimpen. A opponent nyimpen lalu lintas dicatkeun kudu nyingkahan ML-KEM saméméh hiji seal bisa nembongkeun.

7Panggilan kelompok jeung cakupan parsial

Panggilan grup teu hiji teks encryption. Éta téh sama simplex disadiakeun ka unggal anggota, unggal salinan encapsulated ka anggota ML-KEM sorangan. A anggota nu geus diterbitkeun hiji kunci nampa hybrid wrap; anu nu teu nampa klasik wrap.

Ieu nyiptakeun masalah akuntansi nu implementasi naïf jadi salah. Lamun 8 ti 10 anggota nampa hiji salinan hybrid, pesan ieu henteu Eight-tenths dilindungkeun. hiji lawan kudu hiji salinan klasik tina teks biasa anu identik di sakabéh sepuluh, jadi pesan ieu dilindungkeun ngan lamun unggal Kopi téh.

Nymchat, ku kituna, nyurungkeun cakupan per pesan salila fan-out - jumlahna ngan bisa dipikawanoh nalika wraps anu diwangun - jeung badge laporan &ldquo;quantum-resistant ka 8 ti 10 anggota&rdquo; badag ngaku pesan anu dilindungi. Ngeunaan Panggilan grup (hanya pengirim ngandung fan-out), interfaces ngabarkeun parsial leuwih ti perlindungan lengkep. klaim perlindungan lengkep dina kakuatan salinan sorangan ngan bakal hiji overstatement ngeunaan pesan sakuliahna.

7.1 Naon anu dilaporkeun Shield

The Shield nyebutkeun kebenaran ngeunaan Ngeunaan, teu ngeunaan software nu ngirimkeun eta:

Judgment ieu dicatkeun nalika pesen anu ditutup, badag dikaluarkeun ti naon peer advertises saterusna. ciphertext nu geus aya teu bisa jadi leuwih dilindungi ti éta, jeung hiji antarmuka nu rewrug pesen tua dina kakuatan hiji pamaréntah anyar bakal ngaku hal palsu ngeunaan bytes dina relay.

Aturan grup di luhur stack di luhur ieu badag ngarobahkeun eta: hiji pesan grup diprotected lengkep ngan lamun salinan unggal anggota aya, jeung hiji pesan grup nu nampa tanpa count coverage ditémbongkeun parsial.

8Kopi dirékam ka diri anjeun

Sababaraha hal anu klien nyimpen disadiakeun ka identitas pamaké sorangan: setelan sinkronisasi, daftar percakapan, kunci kelompok, jeung arsiték pesen. Ieu nyimpen leuwih ngeunaan pamaké ti loba pesen tunggal ngalakukeun, jadi ninggalkeun aranjeunna klasik bakal nyieun aranjeunna artifak paling lemah disimpen tanpa kira kumaha hati-hati pesen sorangan anu disegel. Aranjeunna ngagunakeun hybrid anu sarua, encapsulated ka kunci root-derived pamaké sorangan - kalayan hiji pengecualian dijelaskeun di Bagian 3.2, nymchat-pq-root kategori sorangan, nu teu bisa ditutup di handap kunci anu ngan bisa ngahasilkeun.

A settings blob atawa baris arsiték aya di hiji tempat pikeun taun, nu téh tepat bentuk hal hiji rébu-nu-dekripsi-lanyar lawan ngumpulkeun - jauh leuwih ti sagala pesan tunggal, nu sahenteuna ephemeral dina pikiran pamaké sorangan.

Salah sahiji kabutuhan ngatur format di dieu jeung teu kunci. salinan diri-addressed kudu bisa dibaca ku unggal alat dina akun, jadi unggal alat nyebarkeun naon anu bisa dibuka dina ramatloka anu panganyaran na ngabalukarkeun, sarta akun nyokot ngan naon anu sadaya bisa dibaca. Tuliskeun sagala hal lianna bakal lock hiji alat ti setelan sorangan - hal anu sarua silent gagal Bagian 3.2 nyegah ku cara lianna, datang ti arah béda.

Hiji kasempetan anu patut dilakukeun

A alat nu ngabogaan identitas tapi teu root teu bisa buka naon anu ditutup ka root-derived key, kaasup setelan sorangan. Ieu mangrupakeun konsekuensi deliberate, teu hiji pangawasan, sarta éta alasana Section 3.3 boga alat ieu prompt pikeun linking badag minting a root anyar: a root kedua moal nyieun blob bisa dibaca, éta ngan ngabalukarkeun bahan kunci identitas dina dua. Hingga pamaké ngabalukarkeun eta, alat ieu terus ngoperasikeun - eta ngécéskeun naon aya kunci pikeun sarta ngirimkeun klasik.

A alat ngajalankeun ekstensi browser atawa signer remote (NIP-46) teu ngabogaan nsec pikeun dihasilkeun ti, tapi éta ngabogaan kode pemulihan, jeung dina konstruksi layered tina Bagian 6.1 nu téh sakabeh post-kuantum separuh dibutuhkeun: signer ngahasilkeun lapisan NIP-44 kawas ayeuna, sarta klien nyaluyukeun lapisan luar sorangan. login ieu hiji pamilon biasa di dua arah.

9Rotasi

Anjeunna epoch Counter dina derivation mangrupakeun hal anu nyieun rotasi dimungkinkeun tanpa bahan kunci anyar. Incrementing eta ngahasilkeun seueur keypair anyar ti basa anu sarua jeung hiji pamaréntah dipublikasikeun; peers nyokot kunci anyar ti catetan anu bisa diganti. Rotation ku kituna teu nangtukeun pamaké pikeun ngadaptarkeun naon deui: root anu dihasilkeun hiji kali per identitas jeung epoch ngalakukeun pindah.

9.1 Épok-épok tua disimpen, jeung teu aya anu re-encrypted

A klien ngembangkeun kandidat decryption ti era ayeuna nepi ka epoch &minus; 3, jadi pesan ditutup saterusna saméméh rotasi masih ngajalankeun kana pasangan keypair nu ayeuna nalika eta dikirim.

Ieu jandéla anu ngajadikeun rotasi aman pikeun ngalakukeun di sakuliahna: tanpa éta, unggal rotasi bakal ngabalukarkeun naon anu aya dina penerbangan. Sakabéh anu geus ditutup tetep bisa dibaca pikeun kahirupan identitas, sabab pesan nu pamaké teu bisa lengkep nu pisan badag pikeun aranjeunna ti hiji nu perlindungan nu teu bisa ditingkatkeun retrospectively (Bagian 10.5).

10Naon anu teu dilindungi

A kertas nu ngan nyaritakeun naon desain ngahasilkeun teu ngajelaskeun sistem, jeung overestimating hiji properti kaamanan dina antarmuka téh badag ti ngalawan eta.

10.1 A wortel mangrupakeun rahasia kedua, sarta ngurangan eta teu bisa diundeur

Ieu mangrupakeun harga nyata tina desain. Kakuatan dina Bagian 2 nu pamaké kudu boga hiji hal pikeun nyimpen teu bisa dilakukeun: nsec sorangan teu reconstruct nu post-quantum key, sabab sakabéh titik nyaéta yén teu aya nilai publik jeung teu rahasia lianna ngalaporkeun eta. Upami teu aya alat nyimpen root na teu aya salah sahiji wraps tina Bagian 3.2 bisa dibuka, bahan ditutup ka root-derived key teu bisa dipake. Aya teu escrow jeung aya tanpa otoritas anu bisa nyimpen hiji.

Ku manual ngalihkeun hiji jalan, ieu leuwih tajam ti éta bisa dibaca di awal. nympq1… kode di mana-mana boga tepat hiji salinan tina eta, dina hiji alat, jeung ngora nu alat ngora unggal pos-quantum pesan, setelan blob jeung baris archive ditutup ka eta. nsec Aya nu ngabalukarkeun, aya nu ngabalukarkeun.

Any wrapped path added later must clear the same bar as the manual one does. A attacker attacks the cheapest path available, jadi hiji skema téh worth what its weakest recovery route is worth — a memorable passphrase, for example, would put the whole thing at whatever the passphrase is worth, jeung baris wrapped mangrupakeun tepat artefakt a harvest-now-decrypt-later opponent ngumpulkeun jeung grind offline dina hésé.

10.2 Autentikasi, salaku beda ti konfidensialitas

Sakabéh tanda di Nostr nyaéta Schnorr leuwih secp256k1, sarta nu teu diubah di dieu. A lawan kalawan komputer kuantum bisa ngéléhkeun tanda-tanda jeung ngabalukarkeun hiji pamaké dina waktos nyata. Apa nu hibrid key exchange ngéléhkeun téh harvest-now-decrypt-later: hiji penyerang nyokot lalu lintas kiwari teu bisa maca eta sakali. Ieu teu nyieun hiji pesen unforgivable ngalawan hiji lawan anu geus boga mesin. Perbedaan ieu diwanohkeun kana aplikasi sengit - indikator padlock ngabarkeun otentikasi, shield ngabarkeun konfidensialitas, sarta aranjeunna glyphs separated sabab hiji pesen bisa boga hiji tanpa anu lain.

Ieu ogé ngaronjatkeun naon pamaréntah dina Bagian 4 bisa nawarkeun. sambungan antara npub jeung ML-KEM key mangrupakeun signature secp256k1, jadi hiji lawan anu bisa ngabalukarkeun aranjeunna bisa ngaropéa hiji kunci sorangan. kerahasiaan ngalawan lawan bakal teu sarua jeung authenticity ngalawan hiji.

10.3 Metatrader ieu

Ngeunaan author nu: Lamun anjeun resep artikel ieu ngeunaan: p tag, jenis, jeung timestamp tina pesan internal. Ieu teu disimpen yén hiji acara aya, ukuran na, atawa lamun relay nampa eta. analisis lalu lintas teu ditangtukeun ku mana wae bagian tina desain ieu.

10.4 The mesh offline

Nymchat's Bluetooth mesh transportasi mangrupakeun protokol terpisah kalawan handshake sorangan, sarta éta teu ditutupi ku karya ieu.

10.5 Panggilan geus dikirim

Ciphertext disimpen nalika duanana sisi masih klasik tetep klasik permanén. Ieu geus aya jeung teu bisa ditutup ulang. Perlindungan dimimitian dina pesan dimana duanana sisi nyimpen post-quantum key, teu dina momen nu fitur ieu dimekarkeun.

11Alternatif anu dipertimbangkeun

NgeunaanNaha nu nu
Nurutkeun kunci post-quantum ti kunci identitas The derivation nyaéta algorithm publik ngeunaan nsec, sarta lawan kuantum nyokot nsec ti npub diterbitkeun, jadi nyatakeun setengah klasik ngalawan setengah post-quantum jeung eta.
Ngirimkeun root ka alat séjén pamaké ngaliwatan NIP-44 A wartos nu dikirim dina kode-only-klasik anu bisa diundeur ku jalma anu dicatupkeun pesen ieu sarta nyingkahan kuncina sakali, nu mangrupakeun musuh nu wartos aya pikeun nganteurkeun.
A keypair ML-KEM anu dihasilkeun separat dina unggal alat Disadiakeun. peranti bakal nyimpen kunci decapsulation béda, sarta hiji pamaréntah anu bisa diganti per identitas teu bisa nyimpen sadaya. peers bakal encrypt ka mana kunci ieu diterbitkeun sadayana, jeung unggal peranti séjén bakal teu bisa maca hasilna. Salah runtuyan per identitas, dipindahkeun ku lalampahan Section 3.2, nyaéta anu nyingkahi eta.
Ngaronjatkeun akar di handap PIN A empat digit PIN nyaéta kira-kira 13 bit ngalawan hiji penyerang offline nyimpen baris bungkusan. nawarkeun eta di samping dua jalur 256-bit bakal disimpen naon bungkusan paling lemah téh berharga.
Ngaronjatkeun npub pikeun ngabalukarkeun dua kunci 1,184 bytes teu hiji identifier dibagikeun, sarta eta bakal ngabalukarkeun unggal klien Nostr aya parsing hiji alamat anu didefiniskeun salaku 32 bytes.
Layanan Key Directory Ieu ngabalukarkeun otoritas nu jaringan aya pikeun nyingkahi.Siapa anu nyanggakeun searchup ngatur nu bisa nelepon pesan.
Nyambungkeun kunci ka unggal pesan Ngaronjatkeun kitu: si penerjemah kudu Receiver nu nyalira saméméh pesan kahiji, nu téh tepatna kasus tanpa pesan saméméh pikeun ngabalukarkeun eta.
Kapasitas negosiasi in-band Ngadegkeun hiji permukaan degradasi. A penyerang anu bisa ngabalukarkeun hiji bendera kapasitas ngabalukarkeun jalur klasik.
Sadaya post-quantum, teu kaulinan klasik Ngabalukarkeun sababaraha dekade analisis secp256k1 pikeun ngabalukarkeun primitif jauh leuwih muda. duanana Ieu téh.

12Paritaskeun

Nymchat nawiskeun dua implementasi independen tina konstruksi ieu - hiji di JavaScript pikeun aplikasi web, hiji di Dart pikeun aplikasi mobile, kaasup port ML-KEM-768.

Implementasi Dart ML-KEM ieu validated ku resmi Ngeunaan ACVP Ngeunaan author nu: Lamun anjeun resep artikel ieu ngeunaan (ML-KEM-*-FIPS203) — 25 key-generation, 25 encapsulation jeung 10 kasus decapsulation, dioperasikeun salaku suite sorangan. Ieu téh vektor NIST diterbitkeun pikeun validate hiji implementasi, jadi ngalawan aranjeunna mangrupakeun bukti nu port nyaeta sah, teu ngan bukti yén dua klien anu cocog jeung anu séjénna. Di luhur ieu, hiji fixture dibagikeun vektor uji - derivation benih, encapsulation, duanana payload format, jeung gancang gift wraps - anu dihasilkeun ti JavaScript reference jeung dipeunteun ku duanana test suites. The root secret nyebarkeun fixture nu teu ngarobah eta: root ka benih, root ka keypair, sidik jari publik tina wortel, jeung nu derived key, nonce jeung data asosiasi tina lapisan luar mangrupakeun vektor sorangan, jadi nu dua klien teu bisa nganteurkeun ngeunaan naon nympq1… Divergence dina salah sahiji impleménsi ngabalukarkeun build alatan ngahasilkeun pesan nu klien séjén teu bisa buka.

Éta téh naon anu nyebutkeun hiji alat &ldquo;Ieu mangrupakeun akar I hold&rdquo; ti &ldquo;Ieu mangrupakeun sejen &rdquo;, jeung klien nu teu bisa ngagambarkeun sidik jari klien séjén bakal maca catetan perfectly alus salaku teu catetan di sakuliahna - sarta lajeng, sanggeus Bagian 3.3, mint hiji akar kedua jeung dibagi identitas.

Anjeunna téh sumber terbuka Ngeunaan AGPL-3.0. inti cryptographic dijelaskeun di dieu nyaéta: js/nym-crypto.js jeung js/modules/pq.js di web klien, jeung lib/core/crypto/ jeung lib/features/identity/pq_registry.dart Pikeun klien mobile.

Pikeun panganyarna singkat, non-teknis, tingali kaca basis pengetahuan dina enkripsi kuantum-resistant.