Skip to content
uencoder
TUTORIAL

How to Use ChaCha20 Encryption

Encrypt data with the ChaCha20 stream cipher, preferably with Poly1305 authentication.

Problem

You need a fast, secure stream cipher that does not require hardware AES acceleration, such as on mobile or IoT devices.

Prerequisites

  • Understanding of stream ciphers
  • Knowledge of authenticated encryption

Steps

  1. 1. Generate a key and nonce

    ChaCha20 uses a 256-bit key and a 96-bit nonce (when used with Poly1305). Generate both using a CSPRNG. The nonce must be unique per key, just like in GCM.

    Input
    256-bit key + 96-bit nonce
    Output
    32 + 12 random bytes
  2. 2. Encrypt with ChaCha20-Poly1305

    Use the authenticated ChaCha20-Poly1305 construction rather than raw ChaCha20. Poly1305 provides integrity, preventing ciphertext tampering. The cipher produces ciphertext and a 128-bit authentication tag.

    Input
    plaintext + key + nonce
    Output
    ciphertext + tag
  3. 3. Verify the tag on decryption

    On decryption, verify the Poly1305 tag before using the plaintext. If the tag does not match, reject the data. This prevents using tampered or corrupted ciphertext.

    Input
    ciphertext + tag + key
    Output
    plaintext (if tag valid)

Expected result

Fast authenticated encryption suitable for environments without AES hardware acceleration.

Common errors

Using raw ChaCha20 without Poly1305
Raw ChaCha20 provides no integrity. Always use ChaCha20-Poly1305 for authenticated encryption.
Reusing the nonce
Like GCM, nonce reuse in ChaCha20-Poly1305 is catastrophic. Generate a unique nonce per encryption.

Troubleshooting

  • If performance is the concern, ChaCha20-Poly1305 is often faster than AES-GCM on devices without AES-NI.
  • ChaCha20-Poly1305 is used in TLS 1.3 and WireGuard, proving its real-world adoption.

Security limits

  • ChaCha20-Poly1305 is a modern, well-analyzed cipher. Its main risk is nonce reuse, which must be prevented.
  • All operations are local.

Related tools

Related tasks

Ready to run it?

References