# Постквантовые замены Monero-примитивов **Версия:** 1.0 draft **Цель:** для каждого ключевого Monero-примитива — конкретная PQ-замена с обоснованием выбора и known-tradeoffs. ## Сводная таблица | Monero (классический) | PQ-замена в Монеро-Монтане | Источник | Готовность | |------------------------|----------------------------|----------|------------| | CLSAG ring signature (Ed25519) | Lattice ring signature (MatRiCT+ или новейшая) | Esgin-Steinfeld-Sun 2019, MatRiCT+ 2022 | Research, не production | | Stealth addresses (curve25519 DH) | PQ stealth via ML-KEM-768 KEM | NIST FIPS 203 | Готов, нужна формализация derivation | | Pedersen commitment + Bulletproofs (SECP) | Lattice commitment + Lattice range proof | Esgin-Nguyen-Seiler 2020, Lyubashevsky-Nguyen-Plançon 2022 | Research, тяжёлая | | Triptych anonymity (next-gen) | Lattice-based аналог | Не существует production-ready | TBD | | EdDSA (transaction signatures) | ML-DSA-65 (FIPS 204) | NIST 2024 | Production-ready | | SHA-3 (some hashes) | SHA-256 (consistent с TimeChain) | NIST FIPS 180-4 | Production-ready | ## 1. Ring Signature: CLSAG → Lattice Ring Signature ### Что делает CLSAG в Monero Подписант доказывает что он один из K=11 потенциальных подписантов из anonymity set без раскрытия конкретного. Использует Ed25519 + Schnorr-подобную конструкцию + linkability tag для предотвращения двойного подписания. ### Почему нужна замена Ed25519 базируется на эллиптической кривой (curve25519). Алгоритм Шора ломает дискретный логарифм за полиномиальное время → ring signature становится тривиально проследимой при появлении достаточно мощного квантового компьютера. ### MatRiCT+ как кандидат Esgin et al. (2022) предложили improved version их 2019-й работы. Параметры: - Категория безопасности: NIST L3 (≥192 бит классических, ≥128 квантовых). - Размер подписи: ~5–20 КБ (в зависимости от K). Bigger чем Monero CLSAG ~0.5 КБ, но в пределах разумного. - Время подписания: ~100–500 мс на современном CPU. - Время верификации: ~50–200 мс. ### Альтернативы - **Mubarak-Shen 2024** и другие более поздние lattice ring signatures — могут быть лучше по размеру, но менее проверены. - **One-out-of-many SNARK** — теоретически возможно, но требует trusted setup или post-quantum SNARK с большим overhead. ### Решение Использовать MatRiCT+ как baseline, мониторить новые публикации каждые 6 месяцев. Если появится production-grade implementation с лучшими параметрами — мигрировать через MIP в [12 Управление](../12%20Управление%20и%20Обновления/). ### Открытые вопросы - Готовая audited implementation на Rust? Нет. Нужен либо port from C++ research code, либо самостоятельная реализация. Это значимый риск (см. F-01 в [Internal Audit](../09%20Внешний%20Аудит/Internal-Audit-2026-05-04.md)). - Совместимость с lightweight clients (мобильные кошельки)? Требует оптимизации. ## 2. Stealth Addresses: curve25519 DH → ML-KEM-768 ### Что делают stealth addresses в Monero Получатель публикует одну пару ключей (view, spend). Отправитель генерирует one-time public key для конкретной транзакции через DH-протокол: ``` r = random scalar R = r·G (опубликовано в transaction) P = Hash(r·V)·G + S (target one-time address) ``` Получатель сканирует транзакции, проверяет принадлежность через свой view-secret-key. ### PQ адаптация через ML-KEM-768 Заменяем DH на key encapsulation: ``` (view_pk, view_sk) ← ML-KEM-768 keygen() (spend_pk, spend_sk) ← ML-DSA-65 keygen() Sender: (ct, K) ← ML-KEM-768 encapsulate(view_pk) one_time_addr = spend_pk + Hash(K)·G_PQ # G_PQ — generator в lattice space Publish (one_time_addr, ct) on chain. Recipient (scan): K' ← ML-KEM-768 decapsulate(view_sk, ct) expected = spend_pk + Hash(K')·G_PQ if expected == one_time_addr: this transaction is mine. ``` ### Параметры - ML-KEM-768 ciphertext: 1088 байт. - ML-KEM-768 public key: 1184 байт. - Размер one-time-address packet: ~1.5 КБ vs ~64 байт классический Monero. ### Открытые вопросы - Корректность derivation `spend_pk + Hash(K)·G_PQ` в lattice space — нужна формальная проверка что this preserves ML-DSA-65 EUF-CMA. - Sub-address scheme (Monero supports multiple stealth addresses from one base) — нужна PQ-адаптация. ## 3. Range Proofs: Bulletproofs → Lattice Range Proofs ### Что делают Bulletproofs в Monero Доказательство `0 ≤ amount < 2^64` без раскрытия amount. Использует Pedersen commitments + inner-product argument на эллиптической кривой. Параметры Monero (post-2018): - Размер: ~675 байт для одного output. - Время верификации: ~5 мс. ### PQ замены #### 3.1 Esgin-Nguyen-Seiler 2020 Lattice-based exact proofs через amortized SIS protocol. - Размер: ~5–15 КБ за range proof. - Время верификации: ~50–100 мс. #### 3.2 Lyubashevsky-Nguyen-Plançon 2022 Improvement предыдущих lattice proofs. - Размер: ~3–10 КБ. - Время верификации: ~30–80 мс. #### 3.3 SNARK-based PQ (e.g. STARK) STARKs пост-квантовы по построению (hash-based). - Размер: ~50–200 КБ (большой!). - Время верификации: ~5–20 мс (очень быстро благодаря logarithmic). - Trusted setup: НЕ нужен (это плюс). ### Решение Lyubashevsky-Nguyen-Plançon как baseline. STARKs как fallback если lattice не reach acceptable size. ### Trade-off PQ range proofs **значительно тяжелее** Bulletproofs: - Размер: 3–10× больше. - Verifier time: 6–20× больше. Это означает что throughput приватного слоя меньше public Montana. Это **сознательное** решение — приватность стоит производительности. ## 4. Подписи: Ed25519 → ML-DSA-65 Уже решено в основной спецификации Монтаны. ML-DSA-65 (FIPS 204) — production-ready. | Параметр | Ed25519 | ML-DSA-65 | |----------|---------|-----------| | Public key | 32 байт | 1952 байт | | Подпись | 64 байт | 3309 байт | | Уровень безопасности | 128 бит классических, **0 квантовых** | 192 классических, 128 квантовых | ## 5. Хеш-функции Унификация: SHA-256 везде где это разумно. Monero использует Keccak; Montana использует SHA-256 (соответствует FIPS 180-4 и используется в VDF). При интеграции на boundary — convertor. ## 6. Сводный анализ trade-off ``` Размер транзакции: Public Monero: ~2–3 КБ Public Montana: ~5 КБ Монеро-Монтана: ~50–100 КБ (10–20× public Montana) Время верификации одной транзакции: Public Monero: ~10 мс Public Montana: ~5 мс Монеро-Монтана: ~100–500 мс (20–100× public Montana) Throughput транзакций в окне τ₁=60с: Public Monero: ~10⁴+ tx/блок Public Montana: ~10⁴+ tx/окно Монеро-Монтана: ~100 tx/окно (consensus bottleneck — verification time) ``` **Это значит:** приватный слой имеет существенно меньшую пропускную способность чем публичный. Это **honest trade-off** — приватность дорогая. ## 7. Открытые направления исследований - [ ] Bench MatRiCT+ vs newer schemes — какая лучше для Монтаны. - [ ] Реальная implementation хотя бы reference в Rust (нет готовых сейчас). - [ ] Audited cryptographic library с PQ ring sigs (нет в open-source проектах). - [ ] Optimization range proofs: targeting <5 КБ. - [ ] Compatibility с mobile/lightweight clients. ## 8. Связанные документы - [Архитектура](Архитектура.md) — где эти примитивы используются. - [02 Криптография](../02%20Криптография/) — базовые PQ-примитивы Монтаны. - [09 Внешний аудит](../09%20Внешний%20Аудит/) — F-01 single-implementation risk применим к этим примитивам тоже. - [Вызов Монеро-сообществу](Вызов-Монеро-сообществу.md) — приглашение к рецензии этих choices. ## 9. Источники 1. Esgin, M. F., Steinfeld, R., Sun, S.-F., et al. (2019). *MatRiCT*. CCS. 2. Esgin, M. F., et al. (2022). *MatRiCT+*. (newer revision). 3. Esgin, M. F., Nguyen, N. K., Seiler, G. (2020). *Practical Exact Proofs from Lattices*. ASIACRYPT. 4. Lyubashevsky, V., Nguyen, N. K., Plançon, M. (2022). *Lattice-Based Zero-Knowledge Proofs and Applications*. EUROCRYPT. 5. Bünz, B., et al. (2018). *Bulletproofs*. IEEE S&P. (для контекста сравнения) 6. Goodell, B., Noether, S., Blue, A. (2020). *CLSAG*. (для контекста сравнения) 7. Ben-Sasson, E., et al. (2018). *Scalable, transparent, and post-quantum secure computational integrity* (STARK).