Tooleux

ChaCha20 Decrypt

ChaCha20 (2)

Decrypt a Base64 ciphertext produced by ChaCha20 Encrypt.

Runs in your browser. Nothing leaves your device.
Decrypt ChaCha20-Poly1305 or XChaCha20-Poly1305 ciphertext in your browser. Free, offline. Read more Show less

What is ChaCha20-Poly1305 Decrypt?

This tool reverses the encryption performed by ChaCha20 Encrypt. It reads a single Base64 string that contains the random salt, nonce, ciphertext, and authentication tag, then recovers the original plaintext using your password.

If the ciphertext has been modified - even a single bit - the Poly1305 authentication tag will not match and the tool will refuse to decrypt. This is the point of AEAD: you learn about tampering instead of silently getting corrupted output.

How to use

Paste the Base64 ciphertext, enter the same password you used to encrypt, choose the matching variant, then press Decrypt.

The variant (ChaCha20-Poly1305 or XChaCha20-Poly1305) determines the nonce length. Choose the wrong one and decryption will fail with an authentication error - the ciphertext itself is not damaged.

Why did decryption fail?

Three common causes:

Wrong password. PBKDF2 derives a different key, Poly1305 rejects the tag.

Wrong variant. The nonce offset is different, so the byte stream is misaligned.

Corrupted ciphertext. The ciphertext was truncated, had whitespace inserted, or was copied from a different tool that uses a different output format.

FAQ

Can I decrypt data from another tool?

Only if that tool uses the same format: base64(salt -" nonce -" ciphertext+tag) with PBKDF2-SHA-256 at 100,000 iterations. Other tools may use a different salt length, KDF, or iteration count. For maximum interoperability, use a standard library such as libsodium or OpenSSL directly.

Is the output safe to paste anywhere?

The decrypted plaintext appears in your browser only. Nothing is uploaded. Do not paste secrets you do not control into any tool you did not audit.

Command line equivalent
# Node with @noble/ciphers
node --input-type=module -e '
import { chacha20poly1305, xchacha20poly1305 } from "@noble/ciphers/chacha";
const key = new Uint8Array(32);
const nonce = new Uint8Array(12);
const ct = Buffer.from("...base64 ciphertext...", "base64");
const c = chacha20poly1305(key, nonce);
console.log(new TextDecoder().decode(c.decrypt(ct)));
'
Loads a test value into the form
Ciphertext
Plaintext