Народный

Безопасность

Poly1305

Криптографический MAC (message authentication code), спроектированный Дэниелом Бернштейном. В паре с ChaCha20 образует AEAD-шифр ChaCha20-Poly1305 — стандарт TLS 1.3, WireGuard, Signal.

Что это

Poly1305 — это однопроходный MAC (Message Authentication Code), вычисляющий 16-байтный тег аутентичности по сообщению произвольной длины и 32-байтному one-time-ключу. Опубликован Дэниелом Бернштейном в 2005 году. Сам по себе не шифрует — только аутентифицирует. Практически всегда используется в связке с потоковым шифром ChaCha20, образуя AEAD-конструкцию ChaCha20-Poly1305 (RFC 8439).

К 2026 году ChaCha20-Poly1305 — основной AEAD в WireGuard, обязательный cipher suite в TLS 1.3 (наряду с AES-GCM), стандарт в Signal Protocol, QUIC, SSH.

Как это работает

Poly1305 строится на полиномиальном MAC поверх простого поля 2¹³⁰ − 5. Сообщение разбивается на блоки по 16 байт, каждый интерпретируется как число, и оценивается полином (c₁·rⁿ + c₂·rⁿ⁻¹ + ... + cₙ·r) mod (2¹³⁰−5) где r — половина one-time key. Затем добавляется вторая половина ключа s модуло 2¹²⁸, результат — 16-байтный tag.

Критическое требование: один и тот же 32-байтный ключ нельзя использовать для двух разных сообщений — иначе атакующий восстановит r через GCD двух полиномов. Поэтому Poly1305 всегда работает в паре с потоковым шифром, который генерирует свежий ключ для каждого сообщения из nonce.

ChaCha20-Poly1305 AEAD (RFC 8439):

1. one_time_key = ChaCha20(key, nonce, counter=0)[:32]
2. ciphertext   = sequence ^ ChaCha20(key, nonce, counter=1..)
3. tag          = Poly1305(one_time_key, AAD || ciphertext || lengths)
4. output       = ciphertext || tag

При декодировании первым проверяется tag (constant-time compare), и только если он валиден — данные расшифровываются. Это защищает от padding-oracle атак.

Применение в WireGuard:

WireGuard data packet:
[ type=4 | receiver_index | counter | encrypted_payload | 16-byte tag ]

Каждый пакет шифруется ChaCha20-Poly1305 с nonce = 0¹²·counter (64-битный монотонный счётчик).

Почему это важно для пользователя VPN

На мобильных устройствах ChaCha20-Poly1305 быстрее AES-GCM в 2-3 раза, потому что не требует аппаратного AES-NI ускорения, а CPU x86/ARM умеют выполнять ChaCha20 как обычный битшифт. На сервере с AES-NI ситуация обратная — AES-GCM быстрее. Поэтому TLS 1.3 разрешает обе cipher suite, и клиент выбирает по своему железу.

Что юзеру стоит знать:

  • WireGuard использует только ChaCha20-Poly1305 — без переговоров cipher suite. Это упрощает протокол, но привязывает к одному примитиву (см. WireGuard — критика отсутствия cipher agility).
  • На Android/iOS ChaCha20-Poly1305 экономит батарею — на 20-30% меньше CPU, чем AES-256-GCM, при том же throughput.
  • При активном DPI операторы режут трафик, не разбираясь в crypto, поэтому выбор Poly1305 vs AES-GCM не влияет на обход блокировок — но влияет на скорость через VPN на смартфоне.

Если VPN-клиент предлагает выбор cipher (например, OpenVPN), на мобильных платформах однозначно ChaCha20-Poly1305. На десктопах с современным CPU — практически любой будет работать на скорости канала.

Связанные термины

ChaCha20 — потоковый шифр, всегда в паре с Poly1305. AEAD — общая категория шифров с аутентификацией. AES-256-GCM — альтернатива на основе AES. WireGuard и TLS 1.3 используют ChaCha20-Poly1305 как один из стандартных AEAD.

Источники