Nymchat whitepaper teknis
Perjanjian Kunci Post-Quantum di Nymchat
Distribusi kunci publik ML-KEM-768 di Nostr tanpa direktori atau registri, dan menaburnya dari rahasia yang tidak ada nilai publik yang mengungkapkan.
Menambahkan pertukaran kunci pasca-kuantum ke seorang utusan sebagian besar bukan masalah kriptografi. primitives distandardisasi dan perpustakaan ada. Kedua Dokumen ini menggambarkan bagaimana Nymchat menjawab itu – dari mana kunci kedua berasal, bagaimana ia menjangkau orang-orang yang membutuhkannya, dan apa yang diizinkan antarmuka untuk mengklaim tentang hasilnya – dan, di bagian terakhir, apa yang hasilnya tidak melindungi.
Halaman ini diterjemahkan dengan mesin untuk kenyamanan. Versi asli bahasa Inggris adalah versi yang berlaku.
1Masalahnya
Pesan pribadi kami dienkripsi dengan NIP-44, yang memiliki dua separuh yang dapat dipisahkan. setengah yang menggelengkan teks sederhana — ChaCha20 dengan tag HMAC-SHA256, kunci melalui HKDF (KPK 5869) — tidak terancam secara berarti oleh komputer kuantum; algoritma Grover menghabiskan kecepatan akar persegi melawan kunci simetris, dan 256 bit menyerap itu. Setuju pada kunci adalah kurva eliptik Diffie-Hellman di atas Spesifikasi K256K1, dan algoritma Shor memecahkan logaritma diskret sepenuhnya. mengembalikan satu kunci pribadi dari rekan publiknya secara retroaktif mengekspos setiap rahasia bersama yang kunci pernah diproduksi.
Ancaman ini tidak ditunda sampai mesin seperti itu ada. seorang lawan dengan penyimpanan dapat merekam teks enkripsi hari ini dan mendekripsi setiap kali kemampuan tiba. Apa pun yang dikirim sekarang yang masih penting kemudian sudah dikompromikan. Ini adalah serangan spesifik pertukaran kunci pasca-quantum yang kalah, dan itulah sebabnya pekerjaan tidak bisa menunggu mesin untuk dibangun.
1.1 Pertanyaan yang dibahas dalam artikel ini
Perbedaannya adalah dengan menggunakan alat-alat yang terbuat dari bahan-bahan kimia, yang dapat digunakan untuk memindahkan bahan-bahan kimia dari bahan-bahan kimia ke bahan-bahan kimia lainnya, sehingga dapat digunakan untuk memindahkan bahan-bahan kimia dari bahan-bahan kimia tersebut. (FIPS 203Ini langsung menimbulkan masalah distribusi:
Menambahkan pertukaran pasca-quantum dan Anda membutuhkan yang kedua - kunci publik ML-KEMnya. di mana kunci itu hidup, dan bagaimana Anda mendapatkannya sebelum Anda dapat mengirimkannya apa pun?
Anda dapat menulisnya di atas kertas, membacanya dengan keras, atau memindai dari layar, dan itu adalah semua yang perlu dienkripsi untuk Anda. kunci publik ML-KEM-768 adalah 1,184 byte. tidak dapat dibaca dengan keras, tidak akan cocok dalam nama pengguna, dan tidak termasuk dalam kode QR selain identitas yang hanya 32 byte.
Bagian yang lebih sulit adalah bahwa kunci kedua membawa tiga masalah yang berbeda, dan sisanya dari kertas ini sebagian besar adalah jawaban untuk mereka:
- dapat diganti. Kunci yang tidak dapat dibaca dalam sekejap mata adalah persis apa yang dilakukan oleh seorang penyerang untuk mereka sendiri.Bagian 4 mengikatnya dengan identitas dengan tanda tangan, yang mengatur satu ini sepenuhnya.
- Ini harus disetujui di seluruh perangkat pengguna. Akun yang sama di ponsel dan laptop harus menampilkan kunci yang sama, atau pesan yang disegel ke satu tidak dapat dibuka di yang lain.
- Itu bisa hilang. Kunci publik dipublikasikan kembali dari rahasia, jadi apa yang sebenarnya harus bertahan adalah rahasia itu – dan dengan konstruksi tidak ada yang mengembangkannya.
2Pembatasan desain
Empat pembatasan membentuk jawaban, dan mereka mengecualikan sebagian besar desain yang jelas sebelum kode apa pun ditulis.
- Sedikit rahasia yang mungkin. Setiap rahasia tambahan adalah cara lain untuk kehilangan riwayat Anda, dan seseorang yang tahu bagaimana menyimpan cadangan nsec tidak akan tahu cara menyimpan cadangan apa pun. Bagian 3.1 menunjukkan bahwa kunci ini tidak dapat dipenuhi secara langsung - kunci pasca-kuantum yang berasal dari nsec tidak memberikan perlindungan pasca-kuantum sama sekali - sehingga desain menghabiskan hanya satu rahasia dan tidak lebih: satu potongan bahan kunci, yang dihasilkan sekali per identitas, disajikan dalam bentuk yang sama dengan nsec dan di tempat yang sama, sehingga siapa pun yang tahu cara menyimpan satu tahu cara menyimpan yang lain. Bagian 10.1 jujur tentang biaya yang masih ada.
- Tidak ada otoritas. Tidak ada server yang dapat dipercaya untuk mengatakan kunci mana yang milik siapa.
- Berbagai alat, satu identitas Identitas Nostr biasanya digunakan dari beberapa klien sekaligus. apa pun materi kunci yang ada harus berakhir identik pada mereka semua, dan jalur yang membawa itu ke sana seharusnya tidak dapat dibaca oleh lawan yang ditentang.
- Tidak ada negosiasi. Setiap pertukaran dalam band dari “ciri mana yang Anda dukung?” adalah permukaan yang dapat dipotong oleh penyerang untuk memaksa opsi yang lebih lemah.
3rahasia yang independen
Keputusan yang membawa beban adalah bahwa kunci dekapsulasi ML-KEM ditaburkan dari bahan kunci yang tidak ada nilai publik yang mengekspos.
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)
Akar disajikan kepada pengguna dengan cara nsec adalah: Tembak32 dengan prefix yang dapat dibaca oleh manusia
nympqOleh karena itu, ia membaca sebagai nympq1…, yang ditampilkan di samping nsec di layar identitas di belakang interaksi mengungkapkan yang sama, disalin dengan kontrol yang sama, tidak pernah masuk dan tidak pernah dikirim ke mana pun dalam jelas.
Garam dipisahkan dengan tujuan, sehingga tidak ada rahasia lain yang bisa menghasilkan keypair yang sama. epoch Menggunakan alat penggerak rotasi (Bagian 9).
3.1 Mengapa kunci tidak dapat dihasilkan dari kunci identitas
Desain yang jelas adalah untuk menabur keypair dari rahasia yang sudah dimiliki pengguna:
seed = HKDF(salt = "…", IKM = nsec) // do not do this
Ini menarik karena empat alasan, semuanya nyata: tidak ada yang baru untuk cadangan, karena nsec sudah cadangan; setiap perangkat yang setuju oleh konstruksi, tanpa protokol sinkronisasi untuk salah; satu pengumuman yang dapat diganti per identitas yang jelas benar, karena perangkat tidak dapat tidak setuju tentang kunci; dan kunci yang ada sebelum pernah diterbitkan, sehingga klien dapat menutup sesuatu untuk dirinya sendiri pada awalnya.
Semua empat manfaat tidak berguna, untuk satu alasan. algoritma Shor berjalan melawan npub yang diterbitkan menghasilkan nsec. Derivasi benih adalah algoritma publik atas nsec. Jadi lawan yang memecahkan separuh klasik membangun kembali separuh pasca-quantum dengan menjalankan HKDF yang sama yang semua orang lain berjalan. Menentang panen sekarang-decrypt-later - satu ancaman fitur itu ada untuk berhenti - kunci yang dihasilkan dengan cara ini tidak menambahkan apa-apa.
Kunci decapsulation ML-KEM harus berasal dari entropy yang tidak dapat dihasilkan dari nsec dan tidak pernah ditransmisikan di bawah enkripsi klasik-hanya.
Sebuah rahasia yang dihasilkan secara independen yang kemudian disinkronkan antara perangkat pengguna di dalam pesan NIP-44 biasa adalah kegagalan yang sama dengan langkah-langkah tambahan: lawan merekam pesan itu hari ini dan mengembalikan kunci klasiknya nanti, dan akar jatuh.
3.2 Mendapatkan akar ke perangkat lain pengguna
Batas 3 dari Bagian 2 - satu identitas, beberapa perangkat - tidak dapat dipenuhi dengan aritmatika di sini, karena seluruh poin adalah bahwa kunci bukanlah fungsi dari apa pun yang sudah dibagikan perangkat. nympq1… kode itu sendiri.
Akar tersebut ditampilkan sebagai nympq1… di samping nsec, dan perangkat kedua menerima ditempelkan ke dalam panel yang sama.Ini adalah seluruh mekanisme.Perangkat yang belum diberikan kode tidak dapat berpartisipasi, yang dijelaskan dalam Bagian 4.2.
Aturan di Bagian 3.1 mengatakan akar mungkin tidak pernah bepergian di bawah enkripsi klasik-hanya, dan setiap mekanisme yang akan membuat ini otomatis - menyinkronkannya melalui relay, membungkusnya ke kunci identitas - melanggar persis itu.
Format ini meninggalkan ruang untuk jalur yang dibungkus: sebuah rekaman dapat membawa daftar pembungkus, masing-masing AEAD blob di bawah kunci yang dapat diputar pengguna pada perangkat lain - output PRF passkey, misalnya. nympq1… Kode adalah satu-satunya cara melalui.Bagian 10.1 menjelaskan berapa biaya yang dikenakan.
Rekaman itu sendiri hidup dalam kategori pengaturan sendiri, nymchat-pq-rootMeskipun tidak membawa kemasan, itu melakukan pekerjaan yang diperlukan: kehadirannya adalah bagaimana perangkat kedua belajar bahwa identitas ini sudah memiliki akar, yang merupakan apa yang menghentikan itu dari menggantikan satu pesaing (Bagian 3.3).
yang nymchat-pq-root Kategori harus bukan baris itu membawa satu-satunya salinan akar, sehingga menyegelnya di bawah kunci yang berasal dari akar adalah kunci yang kuncinya berada di dalam kotak: tidak ada perangkat yang pernah bisa membukanya, termasuk yang menulisnya. itu disegel secara klasik - NIP-44 untuk dirinya sendiri - atau tidak sama sekali. Ini adalah satu tempat yang desain menerima perlindungan klasik-hanya, dan itu mampu: baris ini tidak membawa akar hari ini, hanya fakta bahwa satu ada.
Setiap kategori pengaturan lainnya dapat dan harus menggunakan kunci yang berasal dari akar. Ini adalah pengecualian tunggal, dan itu adalah pengecualian tentang sirkularitas daripada tentang kekuatan.
3.3 Generasi dan adopsi
Pada boot, memegang identitas permanen, klien bekerja dalam urutan ini:
- Mencari yang sudah ada
nymchat-pq-rootRekor yang - Rekaman ditemukan, dan perangkat ini dapat membuka - mengadopsi dan mengumumkan identitas ini sebagai post-quantum mampu.
- Rekaman ditemukan, dan perangkat ini tidak dapat membuka — tidak menghasilkan akar baru, dan tidak mempublikasikan pengumuman sama sekali. mohon pengguna untuk menghubungkan perangkat ini dengan memasukkan
nympq1…dari perangkat yang sudah memilikinya. - Tidak Rekor menghasilkan akar, menerbitkan rekaman, mengumumkan, dan menampilkan
nympq1…kode untuk pengguna sekali sehingga mereka dapat menyimpannya.
Langkah 3 adalah langkah yang mudah salah, dan itulah sebabnya urutan dituliskan bukannya ditinggalkan untuk setiap implementasi. dua perangkat yang masing-masing memutuskan untuk menghasilkan akar menghasilkan dua akar independen di bawah satu identitas, dan itu adalah kegagalan urutan ini ada untuk mencegah.
4Pengumuman Kapasitas
Separuh publik dari keypair yang dihasilkan diterbitkan sebagai addressable.
Bupati-01
peristiwa — jenis 30078, ditandai 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 menyimpan satu peristiwa per (kind, pubkey, d-tag), sehingga republish menggantikan pengumuman sebelumnya di tempat.
Tanda tangan adalah yang mengikat. Peristiwa ini ditandatangani oleh kunci identitas, sehingga klaim “Key ML-KEM ini milik npub” ini persis sama kuatnya dengan npub itu sendiri. Menggantikan kunci encapsulation yang berbeda membutuhkan penambahan tanda tangan secp256k1. Seorang penyerang yang dapat melakukan itu tidak perlu mengganggu KEM.
Pengumuman akan berakhir. 7 hari NIP-40 expiration, dipublikasikan kembali setiap 24 jam, menyimpan catatan sebuah pernyataan tentang klien yang masih berjalan daripada yang dulu.
Sebuah pengumuman yang hilang dibaca persis seperti yang tidak pernah membawa kunci: rekan-rekan mengirim NIP-44 biasa, yang dapat dibaca setiap login, dan klien melanjutkan pertukaran pasca-quantum pada koneksi berikutnya, ketika itu diterbitkan kembali. Jadi diam selama lebih dari satu minggu biaya perlindungan untuk pesan yang dikirim selama kesenjangan - mereka secara klasik dienkripsi daripada tahan kuantum - dan tidak ada biaya lain. pengiriman tidak terpengaruh, tidak ada yang sudah diterima menjadi tidak dapat dibaca, dan tidak ada tindakan yang diperlukan saat dikembalikan.
Tanpa itu, sebuah rekaman melampaui kunci yang disebutnya: perangkat yang dihapus, reset, atau memiliki akarnya diganti meninggalkan instruksi berdiri untuk mengencapsulate ke kunci yang tidak ada yang memegang lagi, dan pesan yang dikirim di bawahnya hilang tanpa kesalahan di kedua sisi.
Bidang kunci menamai formatnya. Bidang ini adalah pk2, dan digit adalah bagian dari kontrak bukannya dekorasi: itu menamai format payload yang dapat digunakan dengan kunci. Pembaca yang tidak mengenali bidang menyimpulkan “Nymchat klien, tidak ada kunci post-quantum” dan mengirimkan NIP-44 biasa, yang setiap login dapat dibaca. Itu adalah arah kegagalan yang benar, dan itu layak untuk menyatakan sebagai aturan angka format ada untuk menegakkan: klaim kemampuan yang tidak diakui harus biaya perlindungan, tidak pernah pengiriman.
4.1 Ketidakhadiran adalah bermakna, dan tiga-nilai
Sebuah rincian halus tetapi penting: pengumuman ini diterbitkan oleh setiap klien Nymchat, tidak hanya mereka yang mampu pasca-quantum, dan bidang kunci adalah opsional.
| Pengamatan | Cara | Kirim perilaku |
|---|---|---|
| Pengumuman dengan Kunci | Nymchat, kapasitas post-quantum | Hibrida |
| Pengumuman, tidak ada kunci sama sekali | Nymchat, klasik hanya — post-quantum off, atau perangkat yang belum terhubung ke akar identitas | Spesifikasi NIP-17 |
| Tidak ada pengumuman | Klien yang tidak diketahui. dapat menjadi pengguna Nostr atau Bitchat | Klasik, ditambah kemasan kompatibilitas |
Sebuah pengumuman tanpa kunci adalah pernyataan yang ditandatangani bahwa pengirim menjalankan Nymchat, yang memungkinkan jalur mengirim melewatkan kemasan cross-protocol spekulatif yang harus dimasukkan untuk siapa pun yang tidak dapat diidentifikasi.
4.2 Perangkat yang tidak dapat membuka akar tetap diam
Pengumuman ini dapat diganti: satu peristiwa per identitas, penulisan terakhir menang. itulah yang membuat desain single-record bekerja, dan itu juga apa yang membuat perangkat yang tidak terhubung berbahaya jika ia menerbitkan. perangkat yang mengumumkan kunci yang telah dirancang untuk dirinya sendiri akan menghancurkan catatan nyata dan mengirim setiap rekan untuk enkripsi di bawah kunci yang tidak dapat dibuka oleh perangkat lain.
Jadi perangkat yang tahu akar ada tetapi tidak bisa membukanya tidak menerbitkan pengumuman sama sekali. tidak rusak dan tidak terkunci dari aplikasi: itu masih membaca setiap pesan yang memiliki kunci dan masih mengirim secara klasik, sambil mendorong pengguna untuk menghubungkannya.
5Penemuan dan Keputusan Kirim
Klien belajar kunci sesama dengan dua cara. langganan berdiri mencakup orang-orang yang pengguna benar-benar berkomunikasi dengan - percakapan terbuka dan anggota kelompok - sehingga pengumuman mereka tiba sebagai peristiwa biasa. Untuk sesama bertemu untuk pertama kalinya, kueri satu kali berjalan pada waktu mengirim, terbatas pada 2,5 detik; jika tidak memecahkan, pesan menjadi klasik, yang merupakan perilaku yang ada sebelum post-quantum ditambahkan bukan mode kegagalan baru.
Seorang pengguna yang menghubungkan perangkat baru, atau yang pindah dari login ekstensi browser ke kunci lokal, menjadi post-quantum mampu pertengahan percakapan, dan permanen cache “no” akan menjaga mereka pada enkripsi klasik untuk kehidupan pengumuman.
5.1 Mengapa tidak ada serangan degradasi
Keputusan routing dikurangi menjadi satu pertanyaan:
pq = (we hold a signed, unexpired ML-KEM key for this recipient)
Tidak ada negosiasi kemampuan, tidak ada daftar algoritma yang didukung, dan tidak ada bidang yang dapat diselesaikan oleh penyerang untuk memaksa jalur yang lebih lemah. adalah Mode kegagalan dari pengumuman yang dihapus atau ditahan adalah bahwa pesan itu menjadi klasik - status quo sebelum fitur ini - daripada bahwa pesan hibrida diturunkan menjadi sesuatu yang dapat ditipu.
Konversi juga memegang dan lebih penting: klien mengirimkan hibrida Hanya Ketika ia memegang kunci, dan memegang kunci adalah bukti penerima dapat mengecapsulate.Tidak ada keadaan di mana pesan dikirim post-quantum ke seseorang yang tidak dapat membacanya.
6Konstruksi Hybrid
Nymchat tidak menggantikan NIP-44. ia membungkusnya. teks enkripsi NIP-44 yang tidak dimodifikasi adalah lapisan dalam, dan ML-KEM mengunci AEAD eksternal di sekitarnya:
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)
Kedua rahasia masih harus dipulihkan untuk membaca pesan: lapisan luar hanya menghasilkan teks enkripsi NIP-44, dan pembukaan yang membutuhkan ECDH klasik. seorang lawan kuantum yang memecahkan secp256k1 mendapatkan kunci internal dan masih menghadapi ML-KEM; sebuah putus dari ML-KEM memotong lapisan luar dan meninggalkan NIP-44 berdiri.
kem_ssTidak ada yang dalam derivasi ini menyentuh output ECDH mentah, yang merupakan apa yang terjadi pada Bagian 6.1.kem_ct,recip_kem_pkdan kedua kunci identitas terikat sebagai data yang terkait, sehingga lapisan eksternal terikat pada transkrip yang tepat yang menghasilkannya.
Kunci ML-KEM penerima adalah panjang umur, tetapi setiap pesan membawa teks enkripsi independen dan karenanya independen
kem_ssItulah yang membuat derivasi nonce daripada randomisasi terdengar:
Keterangan ChaCha20-Poly1305
adalah dipecahkan dengan menggunakan kembali pasangan (keyword, nonce), dan di sini kunci itu sendiri adalah baru untuk setiap pesan, sehingga tidak ada pasangan yang dapat diulang.
6.1 Mengapa lapisan tetap terpisah
Alternatifnya adalah mencampur kedua rahasia menjadi satu kunci percakapan dan mengirimkannya ke NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Konstruksi itu terdengar seperti kriptografi. ia memiliki satu masalah struktural: ia membutuhkan
ecdh_x, koordinat x mentah dari output ECDH, sebagai bahan kunci - dan ekstensi browser (NIP-07) atau penandatanganan jarak jauh (NIP-46Ini melakukan NIP-44 atas nama panggilan dan mengembalikan teks enkripsi, yang merupakan seluruh titik memegang kunci di suatu tempat di mana aplikasi tidak dapat mencapai.
Menggabungkan rahasia oleh karena itu mengecualikan setiap login yang menyimpan kunci identitas dalam signer, yaitu pengguna yang paling berhati-hati, dan tidak ada jumlah pekerjaan pada derivasi kunci yang dapat mengubahnya. Layering menghilangkan ketergantungan: NIP-44 tetap utuh dan diproduksi oleh apa pun yang memegang kunci identitas, signer termasuk, sementara KEM setengah dihitung dari kode pemulihan yang dipegang klien secara langsung.
Biaya adalah lebar pita, dan itu tidak kecil. teks enkripsi ML-KEM adalah 1.088 byte dan naik pada setiap pesan, base64url-koded ke 1.451 karakter; AEAD eksternal menambahkan 16-byte Poly1305 tag dan memperluas NIP-44 payload itu membungkus dengan sepertiga. pesan 50-karakter tumbuh dari 176 byte menjadi 1.712, dan satu 2.000-karakter dari 2.820 hingga 5.238. lantai adalah sekitar 1,5 KB per pesan terlepas dari seberapa pendek pesan itu, yang merupakan harga mengencapsulasi segar setiap kali daripada menggunakan rahasia bersama.
6.2 Payloads yang mendefinisikan diri
yang pq2. Prefix membuat penyebaran incremental: itu auto-deskripsi, sehingga klien memilih jalur dekripsi dengan memeriksa beban berguna alih-alih dengan mempercayai tag atau mengingat apa yang didukung peer. pembaca yang tidak mengenali prefix gagal untuk membuka beban berguna itu alih-alih membacanya, dan pesan yang disegel sebelum kedua sisi dapat membuat post-quantum tetap dapat dibaca seperti NIP-44 biasa tanpa migrasi.
ML-KEM decapsulation dirancang untuk tidak pernah gagal: dengan teks enkripsi yang rusak, transformasi Fujisaki-Okamoto mengembalikan rahasia pseudo-random deterministis ketimbang kesalahan. Kunci yang salah karena itu tidak muncul di lapisan KEM sama sekali - itu muncul sebagai kegagalan HMAC di dalam NIP-44, yang sama dengan permukaan kunci klasik yang salah. Panggilan memperlakukan keduanya dengan cara yang sama, sehingga kegagalan tidak membawa sinyal yang membedakan. Ini juga yang membuat daftar kandidat Bagian 9.1 dapat bekerja: klien mencoba setiap kunci berturut-turut dan membiarkan NIP-44 mengatakan mana yang benar.
6.3 Kedua lapisan pembungkus hadiah
A NIP-17 Pesan pribadi adalah a NIP-59 Gift Wrap: sebuah rumor yang tidak ditandatangani, disegel di bawah kunci identitas pengirim (tipe 13), kemudian diselipkan di bawah kunci yang dihasilkan per pesan (tipe 1059).
Sebuah login penandatangan hanya mendapatkan lapisan eksternal. Sel diproduksi oleh penandatangan sebagai NIP-44 biasa — aplikasi tidak pernah melihat kunci yang membuatnya — sehingga tidak dapat dihibridisasi di tempat. Ini tidak biaya apa pun terhadap serangan yang dimaksud: sel hanya dapat dicapai melalui kemasan, dan kemasan adalah apa yang disimpan rekaman. Seorang lawan yang memegang lalu lintas tercatat harus memecahkan ML-KEM sebelum sel bahkan terlihat untuk menyerang.
7Pesan kelompok dan cakupan parsial
Sebuah pesan kelompok bukanlah satu teks enkripsi. Ini adalah teks sederhana yang sama yang ditampilkan ke setiap anggota, setiap salinan yang terkapsulasi ke kunci ML-KEM anggota itu sendiri. Seorang anggota yang telah menerbitkan kunci menerima kemasan hibrida; yang tidak mendapatkan kemasan klasik.
Jika delapan dari sepuluh anggota menerima salinan hibrida, pesan bukan Seorang lawan membutuhkan satu salinan klasik dari teks sederhana yang identik di semua sepuluh, sehingga pesan hanya dilindungi jika setiap Kopi adalah
Oleh karena itu, Nymchat melacak cakupan per pesan selama fan-out – jumlahnya hanya diketahui saat wraps sedang dibangun – dan badge melaporkan “quantum-resistant ke 8 dari 10 anggota” alih-alih mengklaim pesan dilindungi. menerima pesan kelompok (hanya pengirim yang menghitung penggemar-out), antarmuka melaporkan sebagian daripada perlindungan penuh. mengklaim perlindungan penuh pada kekuatan salinan sendiri saja akan menjadi overstatement tentang pesan secara keseluruhan.
7.1 Apa yang dilaporkan perisai
Perisai mengatakan kebenaran tentang Pesan, bukan tentang perangkat lunak yang mengirimkannya:
- Perlindungan penuh: setiap salinan teks sederhana ini keluar hibrida.
- Parsial: beberapa salinan pesan kelompok keluar secara klasik. ditarik degradasi bukannya lengkap, karena satu salinan klasik teks sederhana yang identik dalam semua dari mereka adalah kebutuhan lawan.
- Klasik dinyatakan secara langsung daripada ditunjukkan sebagai tidak ada badge, karena indikator yang tidak ada ambigu antara “ tidak dilindungi”, “ rusak”, dan “build ini kekurangan fitur”.
Keputusan dicatat ketika pesan ditutup bukan dikumpulkan kembali dari apa yang diiklankan sesudahnya. ciphertext yang sudah ada tidak bisa menjadi lebih dilindungi daripada sebelumnya, dan antarmuka yang mengembalikan pesan lama pada kekuatan pengumuman baru akan mengklaim sesuatu yang salah tentang byte pada relay.
Aturan kelompok di atas tumpukan di atas ini bukannya menggantikannya: pesan kelompok sepenuhnya dilindungi hanya ketika salinan setiap anggota, dan pesan kelompok yang diterima tanpa jumlah cakupan menampilkan parsial.
8Salinan yang ditujukan untuk diri sendiri
Beberapa hal yang disimpan klien dienkripsi untuk identitas pengguna sendiri: pengaturan sinkron, daftar percakapan, kunci grup, dan arsip pesan. Ini membawa lebih banyak tentang pengguna daripada sebagian besar pesan tunggal, sehingga meninggalkan mereka klasik akan membuat mereka artefak tersimpan terlemah terlepas dari seberapa hati-hati pesan itu sendiri disegel. nymchat-pq-root kategori itu sendiri, yang tidak dapat disegel di bawah kunci yang hanya dapat diproduksi.
Blob pengaturan atau baris arsip duduk di satu tempat selama bertahun-tahun, yang persis adalah bentuk sesuatu yang dikumpulkan oleh lawan yang kemudian dicuri - jauh lebih dari pesan tunggal, yang setidaknya efemeral dalam pikiran pengguna sendiri.
Satu pembatasan mengatur format di sini dan bukan kunci. salinan yang dirujuk sendiri harus dapat dibaca oleh setiap perangkat pada akun, sehingga setiap perangkat mengiklankan apa yang dapat dibuka di papan iklan, dan akun hanya menulis apa yang dapat dibaca oleh mereka semua. menulis apa pun yang lain akan mengunci perangkat dari pengaturan sendiri - kegagalan diam yang sama yang dihindari dengan cara lain, datang dari arah yang berbeda.
Perangkat yang memegang identitas tetapi bukan akar tidak dapat membuka apa pun yang disegel ke kunci yang berasal dari akar, termasuk pengaturan sendiri.Ini adalah konsekuensi yang disengaja, bukan pengawasan, dan itulah mengapa Bagian 3.3 memiliki petunjuk perangkat seperti itu untuk menghubungkan alih-alih mengencangkan akar segar: akar kedua tidak akan membuat blob dapat dibaca, itu hanya akan memecah materi kunci identitas menjadi dua.
Sebuah perangkat yang menjalankan ekstensi browser atau tanda tangan jarak jauh (NIP-46) tidak memegang nsec untuk berasal dari, tetapi itu memegang kode pemulihan, dan di bawah konstruksi berlapis dari Bagian 6.1 yang adalah semua yang dibutuhkan oleh separuh pasca-kuantum: tanda tangan menghasilkan lapisan NIP-44 seperti yang selalu ada, dan klien kunci lapisan eksternal itu sendiri.
9Rotasi
yang epoch Counter dalam derivasi adalah apa yang membuat rotasi dimungkinkan tanpa materi kunci baru. Meningkatkannya menghasilkan sepasang kunci baru dari akar yang sama dan pengumuman yang dipublikasikan kembali; peer mengambil kunci baru dari catatan yang dapat diganti. rotasi oleh karena itu tidak meminta pengguna untuk menulis sesuatu untuk kedua kalinya: akar dihasilkan sekali per identitas dan epoch melakukan putaran.
9.1 Epoch lama disimpan, dan tidak ada yang dienkripsi ulang
Tidak ada yang ditulis ulang ketika kunci berputar. klien membangun kandidat dekripsi dari era saat ini ke era − 3, sehingga pesan yang disegel tidak lama sebelum rotasi masih terbuka terhadap pasangan kunci yang saat ini saat dikirim.
Jendela itu adalah apa yang membuat rotasi aman untuk dilakukan sama sekali: tanpa itu, setiap rotasi akan menghancurkan apa pun yang sedang dalam penerbangan. apa pun yang sudah tertutup tetap dapat dibaca untuk kehidupan identitas, karena pesan yang pengguna tidak dapat lagi membuka lebih buruk bagi mereka daripada yang perlindungan tidak dapat ditingkatkan secara retroaktif (Bagian 10.5).
10Apa yang tidak melindungi
Sebuah kertas yang hanya mencantumkan apa yang dicapai oleh desain tidak menggambarkan sistem, dan melebih-lebihkan properti keamanan dalam antarmuka adalah lebih buruk daripada melewatkannya.
10.1 Akar adalah rahasia kedua, dan kehilangan itu tidak dapat dipulihkan
Ini adalah harga nyata dari desain. pembatasan di Bagian 2 bahwa pengguna harus memiliki persis satu hal untuk disimpan tidak dapat dipenuhi: nsec saja tidak membangun kembali kunci pasca-quantum, karena seluruh poin adalah bahwa tidak ada nilai publik dan tidak ada rahasia lain yang mengeksposnya. Jika tidak ada perangkat yang memegang akar dan tidak ada bungkus dari Bagian 3.2 yang dapat dibuka, material yang disegel ke kunci yang berasal dari akar tidak dapat dipulihkan.
Dengan transfer manual satu-satunya jalur, ini lebih tajam daripada yang dapat dibaca pertama kali. nympq1… kode di mana-mana memiliki persis satu salinan dari itu, pada satu perangkat, dan kehilangan perangkat itu kehilangan setiap pesan pasca-quantum, pengaturan blob dan baris arsip yang disegel ke dalamnya.
nsec tidak membantu; itu adalah properti yang didasarkan pada seluruh desain.
Seorang penyerang menyerang jalur termurah yang tersedia, sehingga skema bernilai apa jalur pemulihan terlemah itu bernilai - kata sandi yang mengesankan, misalnya, akan menempatkan seluruh hal pada apa pun kata sandi itu bernilai, dan baris yang dikemas adalah persis artefak yang dikumpulkan dan digoreng oleh lawan yang kemudian dipulihkan saat bersantai.
10.2 Autentikasi, berbeda dari kerahasiaan
Setiap tanda tangan di Nostr adalah Schnorr atas secp256k1, dan itu tidak berubah di sini. Seorang lawan dengan komputer kuantum dapat memalsukan tanda tangan dan berpura-pura pengguna dalam waktu nyata. Apa yang mengalahkan pertukaran kunci hibrida adalah panen-sekarang-decrypt-later: seorang penyerang yang merekam lalu lintas hari ini tidak dapat membacanya nanti. Ini tidak membuat pesan tidak dapat diampuni melawan lawan yang sudah memiliki mesin. Perbedaan ini dibawa ke dalam aplikasi dengan sengaja - indikator padlock melaporkan otentikasi, perisai melaporkan kerahasiaan, dan mereka adalah glif terpisah karena pesan dapat memiliki satu tanpa yang lain.
Ini juga membatasi apa yang dapat dijanjikan oleh pengumuman di Bagian 4. ikatan antara npub dan kunci ML-KEM adalah tanda tangan secp256k1, sehingga lawan yang dapat memalsukan mereka dapat menggantikan kunci mereka sendiri.
3.3 Metadata
Pembungkusan hadiah menyembunyikan pengirim, penerima melampaui satu p tag, jenis, dan timestamp pesan internal. Ini tidak menyembunyikan bahwa suatu peristiwa ada, ukurannya, atau ketika sebuah relay menerima itu.
4.3 Jaringan Offline
Transportasi mesh Bluetooth Nymchat adalah protokol terpisah dengan peregangan tangannya sendiri, dan tidak tercakup oleh pekerjaan ini.
10.5 Pesan yang sudah dikirim
Ciphertext yang tercatat sementara kedua sisi masih klasik tetap klasik secara permanen. sudah ada dan tidak dapat ditutup kembali. perlindungan dimulai pada pesan di mana kedua sisi memegang kunci post-quantum, tidak pada saat fitur itu diaktifkan.
11Alternatif yang dipertimbangkan
| Pendekatan | Mengapa tidak |
|---|---|
| Menghasilkan kunci post-quantum dari kunci identitas | Derivasi adalah algoritma publik atas nsec, dan lawan kuantum memulihkan nsec dari npub yang diterbitkan, sehingga memecahkan setengah tangan klasik atas setengah pasca-kuantum dengan itu. |
| Kirim root ke perangkat lain pengguna melalui NIP-44 | Sebuah akar yang ditransmisikan di bawah enkripsi klasik-hanya dapat dipulihkan oleh siapa pun yang merekam pesan itu dan memecahkan kuncinya kemudian, yang adalah musuh akar yang ada untuk menghentikan. |
| Tombol ML-KEM yang dihasilkan secara terpisah pada setiap perangkat | Perangkat akan memegang kunci decapsulation yang berbeda, dan satu pengumuman yang dapat diganti per identitas tidak dapat memuat mereka semua. Peers akan mengenkripsi ke mana pun kunci yang diterbitkan terakhir, dan setiap perangkat lain tidak akan dapat membaca hasilnya. |
| Membungkus akar di bawah PIN | Penolakan. PIN empat digit adalah sekitar 13 bit melawan penyerang offline yang memegang baris yang dibungkus. menawarkan di samping dua jalur 256-bit akan menyesatkan apa yang paling lemah dibungkus bernilai. |
| Memperluas npub untuk membawa kedua kunci | 1,184 byte bukanlah pengidentifikasi yang dapat dibagikan, dan itu akan memecahkan setiap pemindaian klien Nostr yang ada dari alamat yang didefinisikan sebagai 32 byte. |
| Layanan Key Directory | Mengembalikan otoritas jaringan yang ada untuk menghindari.Siapa pun yang menjawab pencarian memutuskan siapa yang dapat membaca pesan. |
| Menghubungkan kunci ke setiap pesan | Tidak menyelesaikan apa-apa: pengirim membutuhkan penerima kunci sebelum pesan pertama, yang tepatnya dengan tidak ada pesan sebelumnya untuk membawanya. |
| In-band kemampuan negosiasi | Menciptakan permukaan degradasi. penyerang yang dapat melepaskan bendera kemampuan memaksa jalur klasik. |
| Post-quantum saja, tidak ada kaki klasik | Membuang dekade analisis secp256k1 sebagai imbalan untuk primitif yang jauh lebih muda. keduanya yang gagal. |
12implementasi paritas
Nymchat menyajikan dua implementasi independen dari konstruksi ini – satu dalam JavaScript untuk aplikasi web, satu dalam Dart untuk aplikasi mobile, termasuk port ML-KEM-768 dari awal.
Implementasi Dart ML-KEM validasi terhadap resmi
Untuk ACVP
Penelitian ini dilakukan dengan menggunakan metode pengujian BMD (ML-KEM-*-FIPS20325 key-generation, 25 encapsulation dan 10 decapsulation cases, running as their own suite.These are the vectors NIST publishes to validate a implementation, so passing them is proof the port is correct, not mere evidence that the two clients agree with each other.Over that, a shared fixture of test vectors — seed derivation, encapsulation, both payload formats, and complete gift wraps — is generated from the JavaScript reference and checked by both test suites.The root secret extends that fixture rather than replacing it: root to seed, root to keypair, the root's public fingerprint, and the derived key, nonce and associated data of the outer layer are vectors of their own, so the two clients cannot disagree about what a
nympq1… Sebuah divergensi dalam salah satu implementasi gagal membangun bukannya menghasilkan pesan yang klien lain tidak dapat membuka.
Ini adalah apa yang memberitahu perangkat “ini adalah akar yang saya pegang” dari “ini adalah yang berbeda, dan klien yang tidak dapat mereproduksi sidik jari klien lain akan membaca catatan yang sangat baik sebagai tidak ada catatan sama sekali - dan kemudian, mengikuti Bagian 3.3, mint akar kedua dan membagi identitas.
Nymchat adalah Sumber terbuka di bawah AGPL-3.0. inti kriptografi yang dijelaskan di sini adalah
js/nym-crypto.js Dan js/modules/pq.js pada situs web klien, dan
lib/core/crypto/ dengan lib/features/identity/pq_registry.dart Untuk klien mobile.
Untuk penjelasan yang lebih singkat dan tidak teknis, lihat Situs basis pengetahuan tentang enkripsi kuantum-resistant.