Шифрование ChaCha20
Современный потоковый шифр с опциональной аутентификацией
Безопасность на стороне клиента
ChaCha20-Poly1305 (RFC 8439) — рекомендуемый AEAD. Чистый ChaCha20 не обеспечивает целостность — всегда с Poly1305. 96-бит IETF-nonce: строгая уникальность обязательна. XChaCha20-Poly1305 (192 бит) для безопасной генерации случайных nonce.
Начальное значение счётчика (по умолчанию: 0)
О ChaCha20
ChaCha20 — ARX-потоковый шифр Бернштейна (2008), улучшенный Salsa20. Та же матрица 4×4, но новый четверть-раунд с вращениями 16-12-8-7: полная диффузия за 2 раунда (Salsa20: 4). IETF (RFC 8439): 96-бит nonce + 32-бит счётчик (макс. 256 ГБ/nonce).
ChaCha20-Poly1305 (RFC 7539→RFC 8439): IETF AEAD. Одноразовый ключ Poly1305 из первых 32 байт ChaCha20 (счётчик=0); шифрование со счётчика=1. Тег 128 бит. Google 2014 для Android TLS. TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 обязателен.
Сравнение алгоритмов
| Алгоритм | Аутентификация | Длина ключа | Размер nonce | Применение |
|---|---|---|---|---|
| ChaCha20 | Потоковый шифр | 256 bits | 96 bits (12 bytes) | Исследование протоколов; потоки с аутентификацией на высшем уровне; бенчмаркинг |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3, WireGuard, SSH, QUIC, Signal; устройства без AES-NI; AEAD с защитой от тайминга |
| XChaCha20 | Потоковый шифр | 256 bits | 192 bits (24 bytes) | Шифрование файлов/БД без гарантии уникальности nonce; libsodium secretstream; шифрование резервных копий с независимыми nonce |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | Хранимые данные с случайным nonce + 128-бит аутентификацией; хранилище libsodium; стандартный AEAD без централизованного управления nonce |
Как работает ChaCha20
Инициализация 4×4: строка 0=константы “expa nd 32-byte k”, строки 1-2=256-бит ключ (8×32), строка 3=[счётчик|nonce₀|nonce₁|nonce₂] (IETF). Четверть-раунд(a,b,c,d): a+=b; d^=a; d‹‹‹16; c+=d; b^=c; b‹‹‹12; a+=b; d^=a; d‹‹‹8; c+=d; b^=c; b‹‹‹7.
Двойной раунд = четверть-раунд по столбцам + по диагоналям. Вращения 16-12-8-7: полная диффузия за 2 раунда (Salsa20: 4). 10 двойных раундов; выход = XOR преобразованного состояния с исходным.
AEAD: Аутентифицированное шифрование
ChaCha20-Poly1305 (RFC 8439): одноразовый ключ Poly1305 из первых 32 байт ChaCha20 (счётчик=0); шифрование со счётчика=1; MAC над [дополненный AAD||шифртекст||len(AAD)||len(шифртекст)]; тег 16 байт.
XChaCha20-Poly1305: HChaCha20 выводит 256-бит подключ из первых 128 бит 192-бит nonce + исходный ключ. 2^32 сообщений → вероятность коллизии 2^(-128). libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt.
Основные особенности
- Лучшая диффузия, чем Salsa20: вращения 16-12-8-7 → полная диффузия за 2 раунда. ChaCha20/8 ≈ Salsa20/16 по безопасности.
- Стандартизация IETF (RFC 8439, 2018): TLS 1.3, WireGuard, SSH, QUIC, Signal, Noise Protocol, Android TLS.
- Производительность без AES-NI: на 25-40% быстрее AES-GCM на ARM, RISC-V, MIPS. Идеально для IoT/мобильных/встроенных систем.
- 96-бит IETF nonce: 32-бит счётчик (макс. 256 ГБ/nonce). XChaCha20: 192 бит для безопасной случайной генерации.
- Нет известных атак на ChaCha20/20 (2025). Лучший анализ с сокращёнными раундами: Ши и др. (2012) на ChaCha20/6.
Вопросы безопасности
- Повторное использование nonce уничтожает ChaCha20-Poly1305: XOR открытых текстов + ключ Poly1305 раскрыт. TLS 1.3: nonce = порядковый номер XOR.
- Граница 32-бит счётчика: макс. 256 ГБ на (ключ, nonce). TLS 1.3 повторный ввод ключа через key_update.
- Одноразовый ключ Poly1305: повторное использование nonce → повторное использование ключа → атака-подделка (Бернштейн 2005). RFC 8439 §2.8.
- Усечение тега запрещено: RFC 8439 требует 16 байт. Усечение до 64 бит → 2^(-64), несоответствие TLS 1.3.
Реальное применение
- TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 обязателен. OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLS.
- WireGuard VPN: единственный симметричный шифр (Доненфельд 2017, Linux 5.6). С Curve25519, Poly1305, BLAKE2, SipHash.
- Signal Protocol/Double Ratchet: ChaCha20-Poly1305 после X3DH. WhatsApp, тайные беседы Messenger, Matrix, Keybase.
- OpenSSH chacha20-poly1305@openssh.com (6.5, 2014): два экземпляра ChaCha20 для устранения утечек тайминга.
- Google Mobile TLS (2014): Лэнгли+Дыонг. В 3 раза быстрее AES-128-GCM на Nexus 5 Cortex-A15. Влияние на IETF.
Ссылки
Связанные инструменты
AES Шифрование/Дешифрование
Безопасное шифрование и дешифрование текста с использованием алгоритма AES
Семейство RC (RC4/RC5/RC6)
Потоковые и блочные шифры семейства RC, включая RC4, RC4-Drop, RC5 и RC6 (финалист AES)
Blowfish Шифрование/Дешифрование
Быстрый симметричный блочный шифр, разработанный Брюсом Шнайером, с переменной длиной ключа (32-448 бит)