ChaCha20 Decrypt
Decrypt a Base64 ciphertext produced by ChaCha20 Encrypt.
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)));
'