Техническая белая книга Nymchat
Постквантовое ключевое соглашение в Nymchat
Распространение общественных ключей ML-KEM-768 через Nostr без каталога или реестра, и сеяние их из секрета, который никакая общественная ценность не раскрывает.
Добавление пост-квантового ключевого обмена в мессенджер в основном не является проблемой криптографии.Примитивы стандартизированы, а библиотеки существуют.Трудная часть заключается в том, что каждому участнику теперь нужен Второй Эта статья описывает, как Nymchat отвечает на это — откуда приходит второй ключ, как он достигает людей, которым он нужен, и что интерфейс может претендовать на результат — и, в последнем разделе, что этот результат не защищает.
Эта страница для удобства переведена автоматически. Применяется английский оригинал.
1Проблема
Наши частные сообщения шифруются с НИП-44, который имеет две отделяемые половины.Половина, которая скремляет простой текст — ChaCha20 с тегом HMAC-SHA256, HKDF (РФК 5869) — не подвергается существенной угрозе квантовым компьютером; алгоритм Гровера стоит ускорение квадратного корня против симметричного ключа, и 256 битов поглощает это. согласен на ключе находится эллиптическая кривая Diffie-Hellman over ПВХ256К1Восстановление одного частного ключа от его публичного коллеги ретроактивно раскрывает каждый общий секрет, который ключ когда-либо производил.
Угроза, которую это создает, не откладывается до тех пор, пока такая машина не существует. Противник с хранилищем может записывать шифровальный текст сегодня и расшифровать его всякий раз, когда появляется возможность. Все, что отправляется сейчас, что все еще имеет значение, уже компрометировано.
1.1 Ответы на вопросы в этой статье
Умеренное уменьшение давления хорошо понятно: запуск механизма инкапсулирования после квантового ключа наряду с классическим обменом, поэтому нападающему приходится разорвать оба, чтобы прочитать что-либо.ФИФА 203Это сразу же вызывает проблему распределения:
Добавьте пост-квантовый обмен, и вам нужен второй — ее общественный ключ ML-KEM.
Например, вы можете написать его на бумаге, прочесть его громко или сканировать с экрана, и это все, что вам нужно зашифровать. Публичный ключ ML-KEM-768 составляет 1,184 байта. Он не может быть прочитан громко, он не будет вписываться в имя пользователя, и он не принадлежит к QR-коду помимо идентичности, которая составляет только 32 байта.
Труднейшая часть заключается в том, что второй ключ приносит три разные проблемы, а остальная часть этой статьи в значительной степени является ответом на них:
- Его можно заменить. Ключ, который никто не может прочитать на первый взгляд, это именно то, что нападающий обменивает на свой собственный ключ.
- Он должен соглашаться на всех устройствах пользователя. Одна и та же учетная запись на телефоне и ноутбук должны представлять один и тот же ключ, или сообщения, запечатанные на одном, не могут быть открыты на другом.
- Оно может быть потеряно. Публичный ключ переиздается из тайны, так что то, что действительно должно выжить, это тайна — и строительством ничего другого не восстанавливает его.
2Дизайн ограничений
Четыре ограничения сформировали ответ, и они исключают большинство очевидных дизайнов до того, как будет написан какой-либо код.
- Как можно меньше секретов. Каждый дополнительный секрет является другим способом потерять вашу историю, и кто-то, кто знает, как резервировать nsec, не будет знать, как резервировать что-то еще. Раздел 3.1 показывает, что этот ключ не может быть выполнен прямо — пост-квантовый ключ, полученный из nsec, не обеспечивает никакой пост-квантовой защиты вообще — поэтому дизайн тратит точно один секрет и не более: один кусок ключевого материала, генерируемого один раз за личность, представленный в той же форме, что и nsec и в том же месте, так что тот, кто знает, как сохранить один, знает, как сохранить другой.
- Никакого авторитета Нет сервера, которому можно доверять, чтобы сказать, какой ключ принадлежит кому.
- Много устройств, одна личность Какой бы ключевой материал ни существовал, он должен оказаться идентичным для всех, и пути, которые несут его там, сами по себе не должны быть читаемы противником, против которого функция защищает.
- Без переговоров Любой обмен в диапазоне “какие шифры вы поддерживаете?” является поверхностью, которую нападающий может стереть, чтобы вынудить более слабый вариант.
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 уже является резервной копией; каждое устройство, соглашающееся по конструкции, без протокола синхронизации, чтобы пойти не так; одно заменяемое объявление на личность, будучи очевидно правильным, потому что устройства не могут не соглашаться с ключом; и ключ, существующий до того, как он когда-либо был опубликован, так что клиент может запечатать что-то для себя в первую очередь.
Все четыре преимущества бесполезны по одной причине. Алгоритм Шора, работающий против опубликованного npub, дает nsec. Производство семян является общественным алгоритмом над nsec. Так что противник, который нарушает классическую половину, восстанавливает пост-квантовую половину, выполняя ту же HKDF, что и все остальные.
Ключ расшифровки ML-KEM должен исходить от энтропии, которая не может быть ни выведена из nsec, ни передана при классическом только шифровании.
Независимо созданный секрет, который затем синхронизируется между устройствами пользователя в обычном сообщении NIP-44, является той же ошибкой с дополнительными шагами: противник записывает это сообщение сегодня и восстанавливает свой классический ключ позже, и корень выпадает.
3.2 Получение корня на другие устройства пользователя
Ограничение 3 раздела 2 — одна идентичность, несколько устройств — здесь не может быть удовлетворено арифметикой, потому что вся вещь в том, что ключ не является функцией чего-либо из уже общих устройств. nympq1… Коды сами по себе.
Корень отображается как nympq1… рядом с nsec, и второе устройство принимает его, вставленный в ту же панель. Это весь механизм. Устройство, которому не был дан код, не может участвовать, что описывается в разделе 4.2.
Правило в разделе 3.1 гласит, что корень никогда не может перемещаться под классическим только шифрованием, и любой механизм, который сделает это автоматическим — синхронизируя его через релей, обертывая его к идентификационному ключу — нарушает именно это.
Формат оставляет место для упакованного пути: запись может нести список упаковки, каждая AEAD blob под ключом, который пользователь может воспроизвести на другом устройстве — выходе PRF passkey, например. nympq1… Код является единственным способом пересечения. Раздел 10.1 указывает, сколько это стоит.
Сама запись живет в своей категории настроек, nymchat-pq-rootДаже не неся никаких оберток, он выполняет необходимую работу: его присутствие - это то, как второе устройство узнает, что эта идентичность уже имеет корень, что останавливает ее от навязывания сопернику (раздел 3.3).
ТЭ nymchat-pq-root Категория должна нет Этот ряд несет единственную копию корня, поэтому запечатывание его под ключом, полученным от корня, является замком, ключ которого находится внутри коробки: ни одно устройство никогда не могло его открыть, включая того, кто его написал.
Каждая другая категория настроек может и должна использовать исходный ключ. Это единственное исключение, и это исключение относительно круговоротности, а не о силе.
3.3 Поколение и усыновление
На загрузке, удерживая стойкую идентичность, клиент работает в следующем порядке:
- Поиск существующего
nymchat-pq-rootЭто рекорд. - Запись найдена, и это устройство может развернуть ее — принять его и объявить эту идентичность как постквантовую способность.
- Найдена запись, и это устройство не может ее развернуть — не генерируйте новый корень, и не публикуйте никаких объявлений вовсе.
nympq1…Код от устройства, которое уже имеет его. - Нет рекордов — генерировать корень, публиковать запись, объявлять и показывать
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” является точно таким же сильным, как и сам npub. Замена другого ключа инкапсуляции требует подчинения secp256k1. Атакующий, который может это сделать, не должен беспокоиться с KEM.
Объявления истекают Семь дней НИП-40 истечение срока действия, переиздаваемый каждые 24 часа, сохраняет в записи заявление о клиенте, который все еще работает, а не тот, который когда-то был.
Пропущенное объявление читается точно так же, как и то, которое никогда не не носило ключа: сверстники отправляют обычный NIP-44, который может читать каждый вход, и клиент возобновляет пост-квантовый обмен на своем следующем соединении, когда он переиздается.
Без него запись переживает ключ, который она называет: устройство, которое удаляется, перезагружается или имеет свой корень заменён, оставляет стоящую инструкцию, чтобы включить ключ, который никто больше не держит, и сообщения, отправленные под ним, теряются без ошибки с обеих сторон.
Ключевое поле называет его формат. Поле является pk2, и цифра является частью контракта, а не украшением: она называет формат полезной нагрузки, с которым может быть использован ключ. Читатель, который не распознает поле, заключает “клиент Nymchat, нет пост-квантового ключа” и отправляет обычный NIP-44, который каждый вход может прочитать. Это правильное направление неудачи, и стоит указать, как правило, нумерация формата существует, чтобы применить: непризнанное требование возможностей должно стоить защиты, никогда не доставки. Ключ, который не может быть использован сверстником, хуже, чем ни один ключ вообще, потому что сообщение, которое он производит, потеряно без ошибки с обеих сторон.
4.1 Отсутствие имеет смысл и оценивается в три раза
Тонкая, но важная деталь: объявление публикуется каждым клиентом Nymchat, а не только послеквантовыми, и ключевое поле является факультативным.
| наблюдается | Означает | Отправить поведение |
|---|---|---|
| Объявление с ключом | Nymchat, пост-квантовая способность | Гибридный |
| Объявление, без ключа | Nymchat, классический только — после квантового отключения, или устройство, еще не связанное с корнем идентичности | Классический NIP-17 |
| Нет объявления | Неизвестный клиент. Может быть любой пользователь Nostr или Bitchat | Классический, плюс укладка совместимости |
Объявление без ключа является подписанным заявлением о том, что отправитель управляет Nymchat, что позволяет пути отправки пропустить спекулятивную перекрестную упаковку протокола, которую он в противном случае должен был бы включить для всех, кого он не может идентифицировать.
4.2 Устройство, которое не может открыть корень, молчит
Объявление может быть заменено: одно событие на личность, последняя запись выигрывает.Это то, что делает дизайн единой записи работой, и это также делает не связанное устройство опасным, если оно публикует.Устройство, которое объявило ключ, который оно придумало для себя, сбивает реальный рекорд и отправляет каждого партнера для шифрования под ключом, который другие устройства не могут открыть.
Таким образом, устройство, которое знает корень, существует, но не может его открыть, не публикует никаких объявлений вовсе.Он не нарушен и не заблокирован из приложения: он по-прежнему читает каждое сообщение, для которого есть ключи, и по-прежнему отправляет классически, при этом побуждая пользователя связать его.
5Открытие и решение о отправлении
Клиенты изучают ключи сверстников двумя способами. Постоянная подписка охватывает людей, с которыми пользователь фактически соответствует — открытые разговоры и члены группы — так что их объявления поступают как обычные события. Для сверстников, впервые встретившихся, однократный запрос запускается во время отправки, ограниченный 2,5 секунды; если он не решается, сообщение становится классическим, что является поведением, которое существовало до того, как был добавлен пост-квантовый, а не новый режим неудачи.
Пользователь, который связывает новое устройство, или кто переходит от подключения к расширению браузера к локальному ключу, становится пост-квантовым способным в середине разговора, и постоянно кешированный “no” сохранит их на классическом шифровании на всю жизнь объявления.
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 стоящим.
kem_ssНичто в этом производстве не затрагивает сырой выход ECDH, что является тем, что происходит в разделе 6.1.kem_ct,recip_kem_pkИ оба идентификационных ключа связаны в качестве связанных данных, поэтому внешний слой связан с точным транскриптом, который его произвел.
Ключ ML-KEM получателя является долгоживущим, но каждое сообщение несет независимый шифровальный текст и, следовательно, независимый ключ.
kem_ssЭто то, что делает извлечение ненонса, а не рандомизация звучит:
ChaCha20-Poly1305 Смартфон
является нарушенным путем повторного использования пары (ключ, ненце), и здесь сам ключ является новым для каждого сообщения, поэтому ни одна пара не может повторяться.
6.1 Почему слои остаются отдельными
Альтернатива заключается в том, чтобы смешать оба секрета в один ключ для разговора и передать его NIP-44:
ck = HKDF-Extract(salt = "…",
IKM = ecdh_x || kem_ss || …) // do not do this
Эта конструкция звучит как криптография.У нее есть одна структурная проблема: она нуждается в
ecdh_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,820 до 5,238.
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).На входе, который держит идентификационный ключ напрямую, Nymchat гибридизирует оба слоя, каждый с собственной капсуляцией.
Вход подписчика получает только внешний слой. Уплотнение производится подписчиком как обычное 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 Старые эпохи сохраняются, и ничего не перешифровывается
Клиент создает кандидаты для расшифровки от текущей эпохи до эпохи − 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 клавиатура на каждом устройстве | Устройства будут держать разные ключи для расшифровки, и одно заменяемое объявление на личность не может нести их всех.Пейеры будут шифровать, на какой ключ был опубликован последний, и каждое другое устройство не сможет прочитать результат.Один корень на личность, перемещенный по путям раздела 3.2, является тем, что избегает этого. |
| Обувьте корень под PIN | Четырезначный PIN-код составляет около 13 бит против оффлайн-атакера, который держит упакованный ряд. Предлагая его рядом с двумя 256-битными путями, было бы неправильно представлено, что стоит самая слабая упаковка. |
| Расширение npub для переноса обоих ключей | 1,184 байта не является общим идентификатором, и это нарушило бы анализ каждого существующего клиента Nostr адреса, который определяется как 32 байта. |
| Ключевые сервисы директории | Возвращает авторитет, который существует сеть, чтобы избежать.Кто отвечает на поиск, решает, кто может прочитать сообщение. |
| Прикрепить ключ к каждому сообщению | Ничего не решает: отправителю нужен получателя ключ перед первым сообщением, что точно так же, как и без предварительного сообщения, чтобы нести его. |
| Способность к переговорам in-band | Создает пониженную поверхность. Нападающий, который может снять флаг способности, вынуждает классический путь. |
| Только пост-квантовая, без классической ноги | Отбрасывает десятилетия анализа secp256k1 в обмен на гораздо более молодого примитива. оба Фальшивая |
12Применение паритета
Nymchat поставляет две независимые реализации этой конструкции — одну в JavaScript для веб-приложения, одну в Dart для мобильных приложений, включая порт ML-KEM-768.
Реализация Dart ML-KEM подтверждена против официального
NIST ACVP
Полное наименование: МК-768 (ML-KEM-*-FIPS203) — 25 ключевых поколений, 25 инкапсуляций и 10 случаев декапсуляции, работающих как их собственный пакет. Это векторы, которые NIST публикует для подтверждения реализации, поэтому их передача является доказательством того, что порт является правильным, а не просто доказательством того, что два клиента согласны друг с другом. Кроме того, общая фиксация тестовых векторов — семенная деривация, инкапсуляция, как форматы полезной нагрузки, так и полные подарочные обертывания — генерируется из ссылки на JavaScript и проверяется обеими тестовыми комплексами. Корневой секрет расширяет эту фиксацию, а не заменяет ее: корень на семя, корень на ключевую пару, публичный отпечаток корня, а производный ключ, нен
nympq1… Дивергенция в обеих реализациях не удается создавать вместо того, чтобы производить сообщение, которое другой клиент не может открыть.
Это то, что говорит устройство “это корень я держу” от “это другой один”, и клиент, который не мог воспроизвести отпечаток пальца другого клиента, будет читать идеально хорошую запись, как никакой запись вовсе — и затем, следуя разделу 3.3, вытащить второй корень и разделить личность.
Nymchat есть Открытый источник в соответствии с AGPL-3.0. Криптографическое ядро, описанное здесь,
js/nym-crypto.js и js/modules/pq.js на веб-сайте клиента и
lib/core/crypto/ с lib/features/identity/pq_registry.dart в мобильных клиентах.
Для более короткого, нетехнического объяснения см. Страница базы знаний о квантово-устойчивом шифровании.