Перейти к содержанию

Постквантовый Xray: 14 вопросов о VLESS Encryption и ML-DSA-65 в REALITY

Опубликовано
  • Админы
Постквантовый Xray: ML-KEM-768 в конфиге
Постквантовый Xray: ML-KEM-768 в конфиге

В чужих конфигах Xray всё чаще попадаются две новые сущности: строка "decryption": "mlkem768x25519plus.native.600s..." вместо привычного "none" и пара полей mldsa65Seed / mldsa65Verify внутри realitySettings. Обе появились недавно, обе про постквантовую криптографию, и обе решают разные задачи — из-за чего в чатах регулярно советуют «включи, там квантовое шифрование», не объясняя, от чего именно оно спасает.

Собрал ответы на вопросы, которые задают чаще всего. Фактура — из документации Project X и описания PR, который эту механику принёс.

ℹ️ Справка

Кому пригодится: тем, кто держит свой сервер на Xray-core (в том числе под панелями вроде Remnawave, Marzban, 3x-ui) и раздаёт конфиги дальше. Если вы только клиент и ключи вам выдали — вам полезны вопросы 4, 7 и 13.


1. Что именно добавили и когда

Механика приехала в Xray-core пулл-реквестом #5067 — «VLESS protocol: Add lightweight, Post-Quantum ML-KEM-768-based PFS 1-RTT / anti-replay 0-RTT AEAD Encryption» за авторством RPRX. В списке изменений релиза v26.6.1 (1 июня 2026) «VLESS Post-Quantum Encryption» вынесено отдельным пунктом со ссылкой на этот PR.

Параллельно в REALITY появились поля mldsa65Seed (сервер) и mldsa65Verify (клиент) — это уже про подпись, а не про шифрование. Разница между ними — половина всей путаницы вокруг темы, и к ней мы вернёмся в вопросе 10.

2. Разве REALITY и так не шифрует трафик?

Шифрует, но отвечает не за то, о чём обычно думают.

REALITY — это в первую очередь маскировка и аутентификация сервера. Клиент отправляет настоящий TLS ClientHello с SNI постороннего сайта, сервер подсовывает сертификат этого сайта, а для DPI картина выглядит как обычный визит на example.com. Внутри — X25519, короткий идентификатор shortId и проверка того, что сервер действительно ваш, а не подставленный по дороге.

Чего REALITY делать не обязан — защищать вас от последствий утечки клиентского конфига. Именно эту дыру закрывает VLESS Encryption.

Три слоя одного VLESS-соединения
Три слоя одного VLESS-соединения

Схема на основе документации xtls.github.io и описания PR XTLS/Xray-core#5067

3. От чего страхует VLESS Encryption, чего не делает REALITY

Сценарий, который прямо разбирают в описании PR: конфиг клиента куда-то утёк. Вы отправили ссылку vless:// в мессенджер, скопировали её через буфер обмена на телефоне с «умной» клавиатурой, положили в облачную заметку, отдали знакомому — вариантов масса.

Со старой схемой ("decryption": "none") владелец такого конфига получает всё: он может подключаться, он может — если параллельно писал ваш трафик — расшифровать записанное, он может встать посередине. С VLESS Encryption ключ каждого соединения выводится из эфемерной пары ML-KEM-768 + X25519, сгенерированной на месте, и из содержимого конфига не восстанавливается.

❗ Главное

Главная мысль в одну строку: REALITY отвечает на вопрос «как это выглядит снаружи и тот ли это сервер», VLESS Encryption — на вопрос «что будет, если строка подключения окажется в чужих руках».

В описании PR это разложено на два уровня. NFS-слой (non-forward-secret) построен на заранее известных публичных ключах и нужен, чтобы промежуточные узлы в цепочке не могли выдать себя за сервер. PFS-слой договаривается о временных ключах на каждое соединение — и даже утечка приватного ключа сервера не даёт задним числом расшифровать записанный трафик. Для сравнения там же прямо названы Shadowsocks 2022 / AEAD и VMess: они держатся на фиксированном PSK и forward secrecy в этом смысле не дают вовсе.

4. Что значит «постквантовый», если квантового компьютера всё равно нет

Угроза здесь не «завтра сломают», а harvest now, decrypt later: трафик пишут сегодня, расшифровывают через N лет, когда появится подходящая машина. Для мессенджера это неактуально, для человека, чей трафик кто-то методично складывает в архив, — вопрос открытый.

ML-KEM-768 — это стандартизованный NIST механизм инкапсуляции ключа (FIPS 203, в девичестве CRYSTALS-Kyber). В mlkem768x25519plus он используется вместе с классическим X25519, а не вместо: гибрид ломается только если сломать обе половины. Это та же логика, по которой браузеры уже несколько лет гоняют X25519MLKEM768 в обычном TLS.

⚠️ Осторожно

Трезво: постквантовая часть не делает вас невидимым для DPI, не ускоряет соединение и не решает ни одной сегодняшней проблемы с блокировками. Она стоит дёшево и страхует от гипотетического сценария. Если вам продают «квантовый VPN» как средство обхода — вам продают маркетинг.

5. Как читается эта длинная строка

Формат — блоки, разделённые точкой, в фиксированном порядке. Одна и та же грамматика для серверного decryption и клиентского encryption, отличаются третий блок и содержимое ключевого хвоста.

Анатомия строки encryption/decryption
Анатомия строки encryption/decryption

Схема на основе xtls.github.io/config/inbounds/vless.html и PR XTLS/Xray-core#5067

Блок Сервер (decryption) Клиент (encryption)
1. Рукопожатие mlkem768x25519plus то же самое, обязано совпадать
2. Внешний вид native / xorpub / random то же самое, обязано совпадать
3. Сессия срок жизни тикета: 600s или диапазон 100-500s 0rtt или 1rtt
4. Паддинг 100-111-1111 — вероятность-мин-макс то же
5. Задержка 75-0-111 — «75 % подождать 0…111 мс» то же
6. Паддинг 50-0-3333 то же
7. X25519 приватный ключ пароль (публичный ключ сервера)
8. ML-KEM-768 Seed клиентская часть

Если блоки 4–6 опустить, применяются значения по умолчанию: 100-111-1111.75-0-111.50-0-3333.

6. native, xorpub или random — что выбрать

Режим Что делает Когда брать
native Ничего не прячет: заголовки выглядят как TLSv1.3 AEAD, публичные ключи узнаваемы Внутри REALITY/TLS, где внешний вид уже обеспечен верхним слоем
xorpub XOR-ом гасит характерные признаки публичных ключей ML-KEM-768 и X25519 Когда VLESS Encryption работает без TLS сверху
random Полная рандомизация через XOR (AES-256-CTR). По описанию PR затрагивает ~0,006 % объёма трафика Максимальная невыразительность, когда обвязки нет вовсе

В описании PR отдельно отмечено, что связка native/xorpub + XTLS ReadV/Splice даёт лучшую производительность, потому что не приходится шифровать поверх уже зашифрованного. То есть если у вас REALITY + Vision — native тут не «слабый вариант», а осознанно правильный.

7. 0-RTT — экономия или дыра

0rtt разрешает клиенту переиспользовать выданный ранее тикет и пропустить полное рукопожатие: первое сообщение с данными уходит сразу. 1rtt всегда делает полный обмен.

Защита от реплея здесь сделана через срок жизни тикета на стороне сервера (по умолчанию около 10 минут), а не через сверку времени между клиентом и сервером. Практическая разница: вам не нужно ловить рассинхрон часов на роутере или телефоне — типовую боль Shadowsocks-AEAD и старых схем с maxTimeDiff.

📌 Заметка

Паддинг и задержки (блоки 4–6) применяются только к 1-RTT рукопожатию. Если у вас 0rtt и тикеты живут, вы эти блоки на большинстве соединений просто не увидите.

8. Как сгенерировать ключи

Самый короткий путь — одна команда, которая выдаёт сразу согласованную пару строк для сервера и клиента:

./xray vlessenc

Ручной путь, если нужно контролировать каждый блок:

./xray x25519      # пара X25519: PrivateKey для сервера, Password для клиента
./xray mlkem768    # Seed для сервера и клиентская часть
./xray uuid        # UUID пользователя, если создаёте нового

shortIds для REALITY — это hex чётной длины, до 8 байт (16 hex-символов) включительно.

9. Как выглядит рабочий конфиг

Серверный inbound — VLESS с Vision поверх XHTTP и REALITY:

{
  "listen": "0.0.0.0",
  "port": 443,
  "protocol": "vless",
  "settings": {
    "clients": [
      { "id": "<UUID>", "flow": "xtls-rprx-vision" }
    ],
    "decryption": "mlkem768x25519plus.native.600s.<X25519 PrivateKey>.<ML-KEM-768 Seed>"
  },
  "streamSettings": {
    "network": "xhttp",
    "security": "reality",
    "realitySettings": {
      "target": "example.com:443",
      "serverNames": ["example.com"],
      "privateKey": "<REALITY PrivateKey>",
      "shortIds": ["0123456789abcdef"]
    },
    "xhttpSettings": { "path": "/<случайный путь>" }
  }
}

Клиентская сторона — зеркально:

{
  "protocol": "vless",
  "settings": {
    "vnext": [{
      "address": "<ваш IP или домен>",
      "port": 443,
      "users": [{
        "id": "<UUID>",
        "flow": "xtls-rprx-vision",
        "encryption": "mlkem768x25519plus.native.0rtt.<X25519 Password>.<ML-KEM-768 Client>"
      }]
    }]
  }
}

⛔ Так делать нельзя

Поле decryption нельзя оставлять пустым. Если шифрование не нужно, туда явно пишется "none". Пустая строка — не «выключено», а невалидный конфиг, и Xray на старте это уронит.

10. Тогда что такое mldsa65Seed и mldsa65Verify

Это уже не про шифрование канала, а про подпись сертификата, которым REALITY представляется клиенту.

  • mldsa65Seed на сервере — приватный ключ, которым к сертификату добавляется вторая, постквантовая подпись по ML-DSA-65 (FIPS 204).
  • mldsa65Verify на клиенте — публичная часть, которой эта подпись проверяется.

Смысл: аутентификация сервера в REALITY исторически держится на X25519, и её ломает тот же гипотетический квантовый противник. ML-DSA-65 добавляет параллельный механизм, который таким противником не ломается. Если поле не заполнено — работает старая схема, всё как раньше.

⚠️ Осторожно

Подводный камень из документации: когда в обвязке включается гибридный обмен X25519MLKEM768, сертификат вашего target должен быть больше 3500 байт. Постквантовые ключи и подписи объёмные, и слишком «худой» сертификат чужого сайта ломает картину. Если после включения соединение начало разваливаться — начните проверку именно отсюда, а не с ключей.

11. Справочник полей REALITY — что там вообще есть

Поле Сторона Назначение
target сервер Куда уходит трафик, не прошедший проверку, например example.com:443
serverNames сервер Допустимые значения SNI; пустая строка разрешает подключения без SNI
privateKey сервер Приватный ключ X25519 (./xray x25519)
shortIds сервер Список коротких идентификаторов, hex чётной длины до 16 символов
minClientVer сервер Минимальная версия клиента, по умолчанию 26.3.27; занижать не стоит — старые клиенты заметнее для DPI
maxClientVer сервер Максимальная версия клиента
maxTimeDiff сервер Допустимый разбег часов в миллисекундах
mldsa65Seed сервер Постквантовая подпись сертификата (ML-DSA-65)
limitFallbackUpload / limitFallbackDownload сервер Ограничение скорости для трафика, ушедшего в фолбэк
serverName клиент Одно из значений серверного serverNames
fingerprint клиент Обязательно. Профиль uTLS, например chrome
shortId клиент Один из серверных shortIds, может быть пустым
password клиент Публичный ключ X25519 сервера
mldsa65Verify клиент Проверка постквантовой подписи
spiderX клиент Стартовый путь «краулера»; лучше делать разным для разных клиентов

Разбор самого механизма REALITY — в отдельной теме: Гайд: как работает Reality (XTLS) и почему он обходит DPI.

12. Насколько это дорого по скорости

В описании PR приводятся два аргумента. Первый: у VLESS Encryption нет отдельного поля длины AEAD, за счёт чего заявлен выигрыш около 10 % относительно Shadowsocks 2022. Второй: при включённом XTLS повторной расшифровки проксируемого TLSv1.3 не происходит вовсе — на Linux работает splice на уровне ядра, и трафик идёт почти на нативной скорости.

Отдельно упомянуто ограничение размера пакета — 8K, позже 16K, — введённое ради того, чтобы не копировать буферы лишний раз.

📌 Заметка

Это цифры автора реализации из описания PR, а не результаты независимого замера. Проверяйте на своём железе: на слабом ARM-роутере постквантовое рукопожатие заметно тяжелее классического X25519, и на большом количестве коротких соединений разница видна.

13. Что сломается у клиентов

Главный риск — не криптография, а совместимость. Строка encryption — поле уровня ядра Xray, и клиент, который её не понимает, просто не подключится. В обсуждениях сообщества прямым текстом рекомендуют держать для таких пользователей отдельный inbound с классической схемой vless + vision + reality.

Практический порядок действий:

✅ Как правильно

  1. Поднимите второй inbound с VLESS Encryption на отдельном порту, не трогая рабочий.
  2. Проверьте на нём свои клиенты по одному, отмечая версию ядра Xray, а не версию GUI-обёртки — они расходятся.
  3. Убедитесь, что сертификат target больше 3500 байт, если включаете mldsa65.
  4. Только после этого переносите пользователей и гасите старый inbound.

Отдельно: mlkem768x25519plus — это конструкция Xray-core. Не переносите строку в конфиг другого ядра «по аналогии»; если у вас клиенты на sing-box или mihomo, сверяйтесь с их собственной документацией и не считайте поддержку данностью. Про маршрутизацию в sing-box у нас есть разбор по слоям.

14. Так включать сейчас или подождать

Взвешенно: включать имеет смысл, если вы раздаёте конфиги людям, которые точно перешлют их в мессенджере. Именно этот сценарий даёт реальный выигрыш уже сегодня — вне зависимости от того, когда и появится ли вообще квантовый компьютер.

Не имеет смысла торопиться, если у вас разношёрстный зоопарк клиентов, которые вы не контролируете, а поддержку обновлений некому оказывать. Ломать работающее ради страховки от гипотетической угрозы — плохой размен.

И общая оговорка, которая касается любого туннеля: всё описанное защищает канал до вашего сервера. Что происходит после сервера, и что вы сами отправили в чужой сервис поверх этого канала, ни ML-KEM, ни ML-DSA не лечат.

Если что-то в цепочке всё-таки не работает — есть отдельный справочник «симптом → причина → что делать».


Источники

💬 Вопрос к сообществу

А вы уже перевели своих пользователей на mlkem768x25519plus — или держите классику ради совместимости? Интересны цифры: сколько клиентов отвалилось при переключении и на каком железе постквантовое рукопожатие заметно по CPU.

Featured Replies

No posts to show

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу
Яндекс.Метрика

Account

Navigation

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.