База знань: квантово-резистентне шифрування

Технічна біла книга Nymchat

Пост-квантовий ключовий договір в Nymchat

Розповсюдження ML-KEM-768 публічних ключів через Nostr без каталогу або реєстру, і посіяння їх з таємниці, яку жодна публічна цінність не викриває.

Версія 1.0 Листопад 2026 Стосується Nymchat 3.74+

Додавання пост-квантового обміну ключами до месенджера, як правило, не є проблемою криптографії.Примітиви стандартизовані, а бібліотеки існують. Другий Цей документ описує, як Nymchat відповідає на це - звідки походить другий ключ, як він досягає людей, які його потребують, і що інтерфейс може претендувати на результат - і, в останньому розділі, що цей результат не захищає.

1Проблема

Наші приватні повідомлення зашифровуються НІП-44, яка має дві роздільні половинки. половина, яка перекручує простий текст — ChaCha20 з тегом HMAC-SHA256, ключовим через HKDF (РФК 5869) — не значно загрожує квантовому комп'ютеру; алгоритм Гровера коштує прискорення квадратного кореня проти симетричного ключа, і 256 біт поглинає це. погоджуються на ключі є еліптична крива Діффі-Хеллман над ПВХ256К1Відновлення одного приватного ключа від його публічного колеги ретроактивно розкриває кожну загальну таємницю, яку ключ коли-небудь виробляв.

Загроза, яку це створює, не відкладається до тих пір, поки не існує така машина. Противник з сховищем може записувати шифровий текст сьогодні і розшифрувати його, коли приходить здатність. Все, що надсилається тепер, що все ще має значення, вже піддається компромісу.

1.1 Питання, на які відповідає ця стаття

Зміцнення добре зрозуміло: запустити механізм пост-квантового ключового інкапсуляції поряд з класичним обміном, тому нападник повинен розірвати обидва, щоб прочитати що-небудь.ФІФА 203Це негайно викликає проблему розподілу:

Питання

Додайте пост-квантовий обмін, і вам потрібен другий — її ML-KEM публічний ключ. Де живе цей ключ, і як ви отримуєте його, перш ніж ви можете відправити їй що-небудь?

Ви можете написати його на папері, прочитати його гучно, або сканувати його з екрану, і це все, що потрібно шифрувати для вас. ML-KEM-768 публічний ключ становить 1,184 байти. Він не може бути прочитаний гучно, він не буде вписаний в ім'я користувача, і він не належить до QR-коду, крім ідентичності, яка становить лише 32 байти.

Найскладніша частина полягає в тому, що другий ключ приносить три різні проблеми, а решта цієї статті в значній мірі є відповіддю на них:

2Дизайн обмежень

Чотири обмеження сформували відповідь, і вони виключають більшість очевидних дизайнів, перш ніж написати будь-який код.

  1. Таємниць якомога менше. Кожна додаткова таємниця є іншим способом втратити вашу історію, і хтось, хто знає, як резервувати nsec, не знатиме, як резервувати що-небудь інше. Розділ 3.1 показує, що цей ключ не може бути виконаний прямо - пост-квантовий ключ, отриманий з nsec, не забезпечує пост-квантового захисту взагалі - так що дизайн витрачає саме одну таємницю і не більше: єдиний шматок ключового матеріалу, що генерується один раз за ідентичність, представлений в тій же формі, що і nsec і в тому ж місці, так що кожен, хто знає, як зберігати один, знає, як зберігати інший. Розділ 10.1 чесний щодо того, що це все ще коштує.
  2. Без авторитету Немає сервера, якому можна довіряти, щоб сказати, який ключ належить кому.
  3. Кількість пристроїв, одна ідентичність Будь-який ключовий матеріал, який існує, повинен закінчитися однаковим на всіх з них, і шляхи, які несуть його там, не повинні самі бути читаними противником, проти якого функція захищається.
  4. Ніяких переговорів Будь-який обмін в діапазоні “які шифри ви підтримуєте?” є поверхнею, яку нападник може зняти, щоб змусити більш слабкий варіант.

3Незалежний кореневий секрет

Важливе рішення полягає в тому, що ключ декапсуляції ML-KEM посіяний з ключового матеріалу, який не відображає жодної публічної цінності.

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)

Корень представлений користувачеві таким чином, як nsec: Беч32 з людським читальним префіксом nympqТаким чином, вона читається як nympq1…, відображається поруч з nsec на екрані ідентифікації за тією ж взаємодією, копіюється з тим же контролем, ніколи не реєструється і ніколи не надсилається в будь-якому місці в чіткому.

Соль розділена доменами навмисно, тому жодна інша таємниця ніколи не може отримати одну і ту ж ключову пару. epoch Використання двигунів обертання (розділ 9).

3.1 Чому ключ не може бути виведений з ключа ідентичності

Очевидна конструкція полягає в тому, щоб розсіяти ключовий пара з таємниці, яка вже є у користувача:

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

Це привабливо з чотирьох причин, всі вони реальні: нічого нового для резервного копіювання, тому що nsec вже є резервним копією; кожен пристрій, який погоджується за будівництвом, без жодного протоколу синхронізації, щоб піти не так; одне заміненене оголошення за ідентичністю, будучи очевидно правильним, тому що пристрої не можуть не погоджуватися з ключем; і ключ, існуючий до того, як він коли-небудь був опублікований, так що клієнт може запечатати щось для себе в першу чергу.

Всі чотири переваги безцінні, з однієї причини. Алгоритм Shor працює проти опублікованого npub дає nsec. Похід насіння є публічним алгоритмом над nsec. Так що противник, який розбиває класичну половину, реконструює пост-квантову половину, працюючи тим же HKDF, що і всі інші. Проти урожаю-тепер-дешифрувати-пізніше - одна загроза функція існує, щоб зупинити - ключ, отриманий таким чином, не додає нічого.

Правило все випливає з

Ключ декапсуляції ML-KEM повинен походити від ентропії, яка не може бути виведена з nsec і ніколи не передається під класичним тільки шифруванням.

Незалежно створений секрет, який потім синхронізується між пристроями користувача всередині звичайного повідомлення NIP-44, є тією ж помилкою з додатковими кроками: противник записує це повідомлення сьогодні і відновлює його класичний ключ пізніше, а корінь випадає.

3.2 Повернення до інших пристроїв користувача

Обмеження 3 розділу 2 - одна ідентичність, кілька пристроїв - не може бути задоволено арифметикою тут, тому що вся річ полягає в тому, що ключ не є функцією чогось, що вже поділяють пристрої. nympq1… Код для себе.

Корень відображається як nympq1… Пристрій, який не отримав код, не може брати участі, що описується в розділі 4.2.

Правило в розділі 3.1 говорить, що корінь ніколи не може подорожувати під класичним тільки шифруванням, і будь-який механізм, який зробить це автоматичним - синхронізуючи його через релей, обертаючи його до ідентифікаційного ключа - порушує саме це.

Формат залишає простір для обкладеного шляху: запис може нести список обкладок, кожен з яких - AEAD blob під ключем, який користувач може відтворити на іншому пристрої - наприклад, вихід PRF passkey. nympq1… У розділі 10.1 зазначено, скільки це коштує.

Сам запис живе у своїй категорії налаштувань, nymchat-pq-rootНавіть не несучи обкладинки, вона робить необхідну роботу: її присутність полягає в тому, як другий пристрій дізнається, що ця ідентичність вже має корінь, що зупиняє її від придушення конкурента (розділ 3.3).

Примітка дизайну: одна категорія, яка не може використовувати новий ключ

ТІ nymchat-pq-root Категорія MUST ні Цей ряд несе єдину копію кореня, тому запечатання його під ключем, що походить від кореня, є замком, ключ якого знаходиться всередині коробки: жоден пристрій ніколи не міг його відкрити, включаючи того, хто його написав.

Будь-яка інша категорія налаштувань може і повинна використовувати кореневий ключ. Це єдиний виняток, і це виняток щодо циркулярності, а не щодо міцності.

3.3 Покоління і усиновлення

На завантаженні, тримаючи стійку ідентичність, клієнт працює в такому порядку:

  1. Пошук існуючого nymchat-pq-root І рекорд.
  2. Запис знайдений, і цей пристрій може розгорнути його - прийняти його і оголосити цю ідентичність як пост-квантову здатність.
  3. Запис знайдений, і цей пристрій не може розгорнути його — не генеруйте новий корінь, і не публікуйте жодного оголошення взагалі. nympq1… Код від пристрою, що вже має його.
  4. Без рекордів — генерувати корінь, публікувати запис, оголошувати і показувати nympq1… Код передається користувачеві один раз, щоб він міг його зберегти.

Крок 3 - це крок, який легко помилитися, і це є причиною того, що порядок записується, а не залишається на кожну реалізацію.Два пристрої, які кожен вирішує генерувати корінь, виробляють два незалежних коріння під однією ідентичністю, і це провал цього порядку існує, щоб запобігти.

4Оголошення про можливості

Публічна половина похідної ключової пари публікується як адресна НІП-01 подія — тип 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 означає, що релей зберігає одну подію на (kind, pubkey, d-tag), так що республіка замінює попереднє оголошення на місці.

Підпис є обов'язковим Подія підписується ідентифікаційним ключем, тому твердження, що цей ключ ML-KEM належить до цього npub&rdquo; є точно таким же сильним, як і сам npub. Замінити інший ключ encapsulation вимагає сформування підпису secp256k1. Нападник, який може зробити це, не повинен турбуватися з KEM.

Оголошення закінчуються Семиденний НІП-40 закінчення терміну дії, що повторюється кожні 24 години, зберігає в записі заяву про клієнта, який все ще працює, а не той, який колись був.

Пропущене оголошення читається точно так само, як те, яке ніколи не не носило ключа: однолітки надсилають звичайний NIP-44, який може прочитати кожен вхід, і клієнт продовжує пост-квантовий обмін на своєму наступному підключенні, коли він повторно публікується.Так, мовчання протягом більше тижня коштує захисту повідомлень, відправлених під час проміжку - вони класично шифруються, а не квантово-резистентні - і коштують нічого іншого.

Без одного запис переживає ключ, який він називає: пристрій, який стирається, ресетується або має свій корінь замінений, залишає стоячу інструкцію, щоб вкапсулювати до ключа, якого ніхто більше не тримає, і повідомлення, відправлені під ним, втрачаються без помилки з будь-якої сторони.

Ключове поле називає свій формат. Поле є pk2, і цифра є частиною контракту, а не прикрасою: вона називає формат корисного навантаження, з яким може бути використаний ключ. Читач, який не визнає поле, закінчує &ldquo;Nymchat-клієнт, немає пост-квантового ключа&rdquo; і надсилає звичайний NIP-44, який кожен вхід може прочитати. Це правильний напрямок невдачі, і варто зазначити, як правило, що існує нумерування формату: невизнана претензія на здатність повинна коштувати захист, ніколи не доставляти. Ключ, який ровесник не може використовувати, гірше, ніж жоден ключ взагалі, тому що повідомлення, яке він виробляє, втрачається без помилки з будь-якого боку.

4.1 Відсутність є значущою і трьохзначною

Тонка, але важлива деталь: оголошення публікується кожним клієнтом Nymchat, не тільки тим, хто здатний до пост-квантового, а ключове поле є факультативним.

СпостереженнязасобиНадіслати поведінку
Оголошення з ключем Nymchat, пост-квантова здатність Гібридний
Оголошення, жодного ключа Nymchat, класичний тільки — після квантового вимкнення, або пристрій, ще не пов'язаний з коренем ідентичності Класичний NIP-17
Без оголошення Невідомим клієнтом може бути будь-який користувач Nostr або Bitchat Класичний, плюс упаковка для сумісності

Оголошення без ключа - це підписана заява про те, що відправник працює Nymchat, що дозволяє шляху відправлення пропустити спекулятивну крос-протокол упаковку, яку вона б інакше мала включити для тих, кого вона не може ідентифікувати.

4.2 Пристрій, який не може відкрити корінь, мовчить

Оголошення є замінним: одна подія за ідентичністю, останнє написання виграє.Це те, що робить дизайн одного запису робочим, і це також те, що робить непідключений пристрій небезпечним, якщо він публікує.Пристрій, який оголосив ключ, який він придумав для себе, би забивав реальний запис і відправив кожного колегу до шифрування під ключем, який інші пристрої не можуть відкрити.

Таким чином, пристрій, який знає корінь існує, але не може його відкрити, не публікує жодного оголошення взагалі. він не зламаний і не заблокований з програми: він все ще читає кожне повідомлення, для якого він має ключі, і все ще відправляє класично, при цьому спонукаючи користувача зв'язати його.

5Відкриття і рішення про відправлення

Клієнти дізнаються ключі однолітків двома способами. Постійний підпис охоплює людей, з якими користувач насправді відповідає - відкриті розмови та члени групи - так що їх оголошення надходять як звичайні події. Для однолітків, які вперше зустрічаються, одноразовий запит працює в час відправлення, обмежений 2,5 секунди; якщо він не вирішує, повідомлення переходить до класичного, що є поведінкою, яка існувала до того, як був доданий пост-квантовий, а не новий режим невдачі.

Користувач, який з'єднує новий пристрій, або хто переходить від входу в розширення браузера до локального ключа, стає пост-квантовим, здатним на середину розмови, і постійно кешується &ldquo;не&rdquo; тримає їх на класичному шифруванні протягом усього життя оголошення.

5.1 Чому немає атаки зниження рівня

Рішення про маршрутизацію скорочується до одного питання:

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

Немає переговори з можливостями, немає списку підтримуваних алгоритмів, і немає поля, яке нападник може очистити, щоб змусити слабший шлях. є Режим невдачі позбавленого або утриманого оголошення полягає в тому, що повідомлення виходить класичним - статус-кво перед цією функцією - а не в тому, що гібридне повідомлення знижується до чогось помилкового.

Конверт також тримає і має більше значення: клієнт відправляє гібрид Тільки коли він тримає ключ, і тримання ключа є доказом того, що одержувач може розкапсулювати.

6Гібридна конструкція

Немодифікований текст шифрування NIP-44 є внутрішнім шаром, а ML-KEM обертає навколо нього зовнішній AEAD:

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)

Обидві таємниці все ще повинні бути відновлені, щоб прочитати повідомлення: зовнішній шар дає тільки текст шифрування NIP-44, і відкриття, яке потребує класичного ECDH. Квантовий противник, який розбиває secp256k1, отримує внутрішній ключ і все ще стикається з ML-KEM; розрив ML-KEM розрізає зовнішній шар і залишає NIP-44 на місці.

Ключ ML-KEM одержувача довговічний, але кожне повідомлення несе незалежний текст шифрування і, отже, незалежний текст шифрування. kem_ssЦе те, що робить походження ненонс, а не випадково звучить: ChaCha20-Полі1305 переривається шляхом повторного використання пари (ключ, ненце), і тут сам ключ є новим для кожного повідомлення, тому жодна пара не може повторюватися.

6.1 Чому шари залишаються окремими

Альтернатива полягає в тому, щоб змішати обидві таємниці в один ключ для розмови і передати його NIP-44:

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

Ця конструкція звучить як криптографія. У неї є одна структурна проблема: вона потребує ecdh_xЗазначимо, що в якості основного матеріалу, а також розширення браузера, використовується сировинний координат x-координату виходу ECDH (НІП-07) або віддалений підпис (НІП-46Вона виконує NIP-44 від імені виклику і повертає текст шифрування, який є цілою точкою утримання ключа десь, де додаток не може досягти.

Змішування секретів, отже, виключає кожен логін, який зберігає ключ ідентичності в підписувачі, тобто найбільш обережні користувачі, і ніяка кількість роботи над похідним ключем не може його змінити. Layering видаляє залежність: NIP-44 залишається цілим і виробляється тим, що тримає ключ ідентичності, включаючи підписувача, тоді як половина KEM обчислюється з коду відновлення, який зберігає клієнт безпосередньо.

Шрифт ML-KEM становить 1088 байтів і проходить на кожному повідомленні, base64url-кодированому до 1 451 символів; зовнішній AEAD додає 16-байтовий тег Poly1305 і розширює навантаження NIP-44 на третину. Повідомлення з 50 символів зростає з 176 байтів до 1 712, а повідомлення з 2 000 символів з 2 820 до 5 238; підлога становить приблизно 1,5 Кб на повідомлення, незалежно від того, наскільки коротке повідомлення, що є ціною інкапсуляції щоразу, а не повторного використання спільного секрету.

6.2 Самоописуючі платіжні навантаження

ТІ pq2. Префікс робить розгортання інгредієнтним: він є самоописуючим, тому клієнт вибирає шлях розшифровки, перевіряючи корисне навантаження, а не довіряючи тегу або запам'ятовуючи те, що підтримує співвітчизник.Читач, який не визнає префікс, не відкриває цей корисний навантаження, а не неправильно читає його, і повідомлення, запечатані перед будь-якою стороною, можуть зробити пост-квантовий залишатися читами як звичайний NIP-44 без міграції.

Помилкове відхилення

Декапсуляція ML-KEM розроблена для того, щоб ніколи не провалитися: зважаючи на неправильний текст шифрування, трансформація Fujisaki-Okamoto повертає детерміністичну псевдо-навмисну таємницю, а не помилку. Тому неправильний ключ взагалі не виникає на шарі KEM — він виникає як помилка HMAC всередині NIP-44, що так само, як і неправильні класичні поверхні ключів. Виклики обробляють обидва однаково, тому помилка не несе ніякого відмінного сигналу. Це також робить список кандидатів розділу 9.1 працездатним: клієнт спробує кожен ключ у свою чергу і дозволяє NIP-44 сказати, який був правильний.

6.3 Обидва шари подарункової упаковки

A НІП-17 Особисте повідомлення A НІП-59 Подарункова упаковка: непідписані чутки, запечатані під ідентифікаційним ключем відправника (рід 13), а потім упаковані під викидним ключем, що генерується за повідомленням (рід 1059).

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
Обидва шари шифрування є гібридними, кожна з незалежною ML-KEM енкапсуляцією. Зовнішній шар прив'язаний до секрету, так що упаковка не розкриває відправника.

Підписницький логін отримує тільки зовнішній шар. Печать виробляється підписником як звичайний NIP-44 - додаток ніколи не бачить ключ, який робить його - тому його не можна гібридизувати на місці. Це не коштує нічого проти атаки в даному випадку: печатку можна досягти тільки через обгортку, а обгортку - це те, що зберігає рекордер.

7Групові повідомлення та часткове охоплення

Групове повідомлення не є одним шифрованим текстом. Це той самий простий текст, виданий кожному учаснику, кожна копія вбудована до власного ключа ML-KEM цього учасника.

Це створює облікову проблему, яку помиляється наївна реалізація. Якщо вісім з десяти членів отримують гібридну копію, повідомлення ні Противник потребує однієї класичної копії простого тексту, яка ідентична у всіх десяти, тому повідомлення захищено тільки в тому випадку, якщо кожен Копія є

Nymchat, отже, відслідковує охоплення за повідомленнями під час фан-аут - кількість відома тільки в той час, коли обкладинки будуються - і відбиток повідомляє "квантовий стійкий до 8 з 10 членів", а не стверджує, що повідомлення захищено. отриманих Групове повідомлення (тільки відправник рахує шанувальника), інтерфейс повідомляє про частковий, а не повний захист.

7.1 Про що повідомляє щит

Щит свідчить правду про Повідомлення, а не про програмне забезпечення, яке його відправило:

Цифровий текст, який вже існує, не може стати краще захищеним, ніж це було, і інтерфейс, який переробив старі повідомлення на силу нового оголошення, стверджував би щось неправдиве про байти на релейлі.

Правило групи, наведене вище, належить до цього, а не замінює його: повідомлення групи повністю захищено тільки тоді, коли копія кожного члена була, а отримане повідомлення групи без обліку покриття відображається частково.

8Копії адресовані самому собі

Кілька речей, які клієнт зберігає, зашифровуються до власної ідентичності користувача: синхронізовані налаштування, список розмов, групові ключі та архів повідомлень. Вони несуть більше інформації про користувача, ніж більшість одиночних повідомлень, тому залишення їх класичними робить їх найслабшим артефактом, незалежно від того, наскільки ретельно самі повідомлення були запечатані. nymchat-pq-root сама категорія, яка не може бути запечатана під ключем, який тільки вона може виробляти.

Блоб налаштувань або рядок архіву сидить в одному місці протягом багатьох років, що є точно такою формою речі, яку збирає опонент, який збирає - тепер розшифровує - пізніше - набагато більше, ніж будь-яке окреме повідомлення, яке, принаймні, є ефемальним у власному розумінні користувача.

Одне обмеження регулює формат тут, а не ключ. кожен Пристрій на обліковому записі, так що кожен пристрій рекламує те, що він може відкрити в списку його оголошення несе, і рахунок пише тільки те, що всі вони можуть прочитати.

Обмеження, які варто відзначити

Пристрій, який зберігає ідентичність, але не корінь, не може відкрити що-небудь запечатане до ключа, що походить від корінця, включаючи його власні налаштування. Це є навмисним наслідком, а не наглядом, і саме тому в розділі 3.3 є такий пристрій, який пропонує зв'язування замість того, щоб міняти новий корінь: другий корінь не зробить блоб читамим, він тільки розділить ключовий матеріал ідентичності на дві частини.

Пристрій, що керує розширенням браузера або віддаленим підписувачем (NIP-46), не зберігає nsec для отримання, але він зберігає код відновлення, і під шарованою конструкцією Розділу 6.1 це все, що потрібно після квантової половини: підписувач виробляє шар NIP-44, як він завжди має, а клієнт підключає сам зовнішній шар.

9Ротація

ТІ epoch Розрахунок у похідному - це те, що робить обертання можливим без нового ключового матеріалу. Підвищення його дає свіжу пару ключів з того ж коріння і повторно опублікованого оголошення; однолітки підбирають новий ключ з замінюваного запису.

9.1 Старі епохи зберігаються, і нічого не перешифровується

Клієнт створює кандидати дешифрування з поточної епохи вниз до епохи &minus; 3, тому повідомлення, запечатане незадовго до обертання, все ще відкривається проти пари клавіш, яка була поточною, коли вона була відправлена.

Це вікно є тим, що робить обертання безпечним у всьому: без нього будь-яке обертання зламало б все, що було в польоті. Все, що вже запечатано, залишається читаним на все життя ідентичності, тому що повідомлення, яке користувач більше не може відкрити, є суворо гіршим для них, ніж те, чий захист не може бути поліпшений ретроактивно (розділ 10.5).

10Що це не захищає

Папір, який тільки перераховує те, чого досягає дизайн, не описує систему, і переоцінка властивості безпеки в інтерфейсі гірше, ніж його пропущення.

Корень – це друга таємниця, і втратити її неможливо.

Це реальна ціна дизайну. Обмеження в Розділі 2, що користувач повинен мати точно одну річ, щоб зберегти, не може бути виконано: nsec сам по собі не реконструює пост-квантовий ключ, тому що вся річ полягає в тому, що жодна публічна цінність і жодна інша таємниця не виявляє його. Якщо жоден пристрій не тримає коріння і жодна з обкладинки Розділу 3.2 не може бути відкрита, матеріал, запечатаний до ключа, що походить від коріння, не може бути відновлений.

При ручному переведенні єдиний шлях, це більш різкий, ніж він може спочатку прочитати. nympq1… Код у будь-якому місці має точно одну копію, на одному пристрої, і втрачаючи цей пристрій, втрачається кожне пост-квантове повідомлення, налаштування blob і рядок архіву, запечатаний на ньому. nsec Це не допоможе; це властивість, на якій спирається весь дизайн.

Нападник атакує найдешевший доступний шлях, тому схема варта того, що її найслабший шлях відновлення вартий - пам'ятна пароля, наприклад, поставила б всю річ на те, що варті паролі, а обкладений ряд - це саме артефакт, який згодом збирає і руйнує противник у вільний час.

10.2 Автентифікація, як відмінність від конфіденційності

Кожен підпис в Nostr є Schnorr над secp256k1, і це незмінно тут. Противник з квантовим комп'ютером міг підробляти підписи і прикидатися користувачем в реальному часі. Що гібридний ключовий обмін поразки є урожай-тепер-дешифрувати-пізніше: нападник, який записує трафік сьогодні, не може прочитати його пізніше. Це не робить повідомлення неминучим проти противника, який вже має машину. Це розрізнення вноситься в програми навмисно - індикатор padlock повідомляє про автентифікацію, щит повідомляє про конфіденційність, і вони є окремими гліфами, тому що повідомлення може мати один без іншого.

Він також обмежує те, що може обіцяти оголошення в розділі 4.В'язування між npub і ключем ML-KEM є підписом secp256k1, тому противник, який може підробляти ці ключі, може замінити свій власний ключ.

10.3 Метадані

Подарункова обробка приховує відправника, одержувача за межами одного p тег, тип і часовий штамп внутрішнього повідомлення. Він не приховує, що подія існує, її розмір, або коли релей отримав його.

10.4 Офлайн мережа

Транспорт мережі Bluetooth Nymchat є окремим протоколом з власним рукостисканням, і він не охоплюється цією роботою.

10.5 Повідомлення вже надіслані

Цифровий текст, записаний в той час як обидві сторони були ще класичними, залишається класичним назавжди. Він вже існує і не може бути перезапечатаний. Захист починається з повідомлення, де обидві сторони тримали пост-квантові ключі, а не в момент, коли функція була включена.

11Розглянуті альтернативи

підхідЧому не
Виведення квантового ключа з ідентифікаційного ключа Виведення є публічним алгоритмом над nsec, і квантовий противник відновлює nsec з опублікованого npub, тому розбиваючи класичну половину рук над пост-квантовою половиною з нею.
Надіслати корінь на інші пристрої користувача через NIP-44 Корень, що передається під класичним тільки шифруванням, може бути відновлений будь-ким, хто записав це повідомлення і розбиває його ключ пізніше, що є противником, корінь існує, щоб зупинити.
На кожному пристрої створена окрема пара клавіш ML-KEM Пристрої тримали б різні ключі декапсуляції, і одне замінене оголошення за ідентичністю не може нести їх усіх.Періоди шифрували б на будь-який ключ, який був опублікований останнім, і кожен інший пристрій не міг би прочитати результат.
Загорнути корінь під PIN Чотиризначний PIN-код становить близько 13 біт проти офлайнового атакуючого, який тримає обкладений ряд.
Розширення npub для перенесення обох ключів 1,184 байта не є спільним ідентифікатором, і це розірвало б кожен існуючий клієнт Nostr для аналізу адреси, яка визначається як 32 байти.
Ключовий сервіс директорії Повторно вводить авторитет, який мережа існує, щоб уникнути.Хто відповість на пошук, вирішує, хто може прочитати повідомлення.
Додайте ключ до кожного повідомлення Нічого не вирішує: відправник потребує Реципієнти ключ перед першим повідомленням, що саме відбувається без попереднього повідомлення, щоб нести його.
Внутрішня здатність переговорів Нападник, який може зняти прапор здатності, змушує класичний шлях.
Тільки пост-квантовий, без класичної ноги Відкидає десятиліття аналізу secp256k1 в обмін на набагато молодшого примітивного. обидва Фальсифікація

12ПАРІТЕТ РЕАЛИЗАЦІЇ

Nymchat поставляє дві незалежні реалізації цієї конструкції — одну в JavaScript для веб-додатків, одну в Dart для мобільних додатків, включаючи порт ML-KEM-768.

Реалізація Dart ML-KEM підтверджена проти офіційного НІСТ ACVP Використання методів аналізу та аналізу МЗС України (ML-KEM-*-FIPS203) — 25 ключових поколінь, 25 випадків енкапсуляції та 10 випадків декапсуляції, що працюють як їх власний пакет. Це вектори, які NIST публікує для перевірки реалізації, тому їх передача є доказом того, що порт є правильним, а не просто доказом того, що два клієнти погоджуються один з одним. Крім того, спільна фіктура тестових векторів — похід насіння, енкапсуляція, обидва формати корисного навантаження і повні подарункові обкладинки — генерується з посилання JavaScript і перевіряється обома тестовими комплектами. Кореневий секрет розширює цю фіктуру, а не замінює її: корінь на насіння, корінь на ключову пару, публічний відбиток nympq1… Розбіжність в обох реалізаціях не спрацьовує будівлю, а не виробляє повідомлення, яке інший клієнт не може відкрити.

Це те, що говорить пристрій &ldquo;це корінь, який я тримаю&rdquo; від &ldquo;це інший один&rdquo;, і клієнт, який не міг відтворити відбиток пальця іншого клієнта, прочитав би ідеально хороший запис, як жодного запису взагалі - і потім, після Розділу 3.3, винайшов другий корінь і розділив ідентичність.

Nymchat є Відкриті джерела під AGPL-3.0. Криптографічне ядро, описане тут, є js/nym-crypto.js і js/modules/pq.js на веб-сайті клієнта та lib/core/crypto/ з lib/features/identity/pq_registry.dart на мобільних клієнтах.

Для більш короткого, нетехнічного пояснення див. База знань про квантово-резистентне шифрування.