ChaCha20 использует только сложения, циклические сдвиги и XOR, поэтому выполняется за постоянное время на любом процессоре, а Poly1305 — одноразовый MAC, ключ которого для каждого сообщения выводится из первого блока шифра. RFC 8439 (заменивший RFC 7539) использует 32-битный счётчик блоков, что ограничивает одно сообщение объёмом 256 ГиБ. XChaCha20-Poly1305 расширяет nonce до 192 бит, поэтому случайные nonce в нём безопасны; этот вариант описан в Internet-Draft и реализован в libsodium и других библиотеках.
Повторное использование одной и той же пары ключа и nonce нарушает конфиденциальность и позволяет атакующему подделывать сообщения — точно так же, как в AES-GCM. На процессорах с инструкциями AES алгоритм AES-GCM обычно быстрее на больших объёмах данных (на одном ядре Apple M4 Max с OpenSSL 3.6.5 — около 2,1 ГБ/с у ChaCha20-Poly1305 против 8,8 ГБ/с у AES-256-GCM), но ChaCha20-Poly1305 выигрывает на коротких сообщениях и на устройствах без аппаратной поддержки AES.
Он используется в наборе TLS 1.3 TLS_CHACHA20_POLY1305_SHA256 (0x1303), в OpenSSH как chacha20-poly1305@openssh.com, как транспортный шифр WireGuard, для шифрования полезной нагрузки в age и в локальных токенах PASETO v2.