Decrypt AES ciphertext locally
Paste the base64 ciphertext, IV, and raw AES key — get the plaintext back. Supports AES-GCM and AES-CBC. Runs entirely in your browser.
Decrypt to see the plaintext…
How to decrypt an AES ciphertext
Provide the matching key, IV, and mode that were used during encryption. Web Crypto verifies (in GCM mode) and decrypts back to UTF-8 plaintext.
- 01
Paste the key
Raw AES key, base64. 128 / 192 / 256 bits.
Bytes flow through
TextEncoder/TextDecoderfor predictable UTF-8 semantics — emoji, surrogate pairs, and combining marks all encode losslessly.keyUTF-8TextEncoderlosslesslivekey · raw bytes256 bit · UTF-8base64(rawKey)
loaded · UTF-8MIME · ready - 02
Paste the IV
12 bytes for GCM, 16 bytes for CBC.
Hash and signature operations call
crypto.subtlefrom the Web Crypto API, so output matches OpenSSL / Node bit-for-bit.ivWeb Cryptosubtledeterministicliveiv · options12 B · livebase64(iv)
options applied · livelive - 03
Paste ciphertext
Output of AES encryption, base64.
Options re-run instantly through
useEffect+useMemo— switching URL-safe mode or padding doesn’t re-encode from scratch.ctmemoisedoptionsinstantreactivect · encodedb64 · readybase64(ct)
encoded · livelossless - 04
Decrypt
GCM also verifies authenticity — wrong key/IV throws.
Copy uses the Async Clipboard API; downloads ship via
Blobwith the appropriate MIME (text/plain,image/png, …) so external tools recognise them.decryptclipboardblobMIME-correctclient-sideok · copiedready · doneHello, world
done · ready to shipsuccess
Encoding without surprises
Always UTF-8 first
Use TextEncoder / TextDecoder for bytes ↔ string conversion. btoa alone breaks on non-ASCII.
URL-safe vs standard Base64
Standard uses +, /, =; URL-safe swaps to -, _, no padding. Don’t mix them.
Hashes aren’t passwords
SHA-256 is fast; that’s good for fingerprints, bad for passwords. Use bcrypt / argon2 for credentials.
Watch padding rules
Some decoders are strict about = padding, others auto-pad. If round-trips fail at exactly 1 or 2 bytes, check padding.
Use Web Crypto for keys
Generate cryptographic keys via crypto.subtle, never Math.random. The latter is predictable.
JWT decode ≠ verify
Decoding a JWT just splits and base64-decodes. Verification needs the issuer’s public key / shared secret.
When to decrypt AES locally
Reading own ciphertexts, cross-tool verification, debugging.
Read your backups
Recover content from local AES-encrypted backups. Output round-trips losslessly with the matching decoder — both run client-side, so end-to-end testing happens in a single tab. Encoding flows through TextEncoder for predictable UTF-8 semantics.
RFC-compliantCross-tool verify
Match outputs of openssl, libsodium, PyCryptodome. Web Crypto's subtle.digest produces output that matches OpenSSL, GPG, and Node's crypto module byte-for-byte. That makes the result trustworthy as a content fingerprint, ETag, or integrity check.
OpenSSL-matchedAPI debugging
Inspect AES-encrypted blobs returned by your service. Pairs cleanly with HMAC, JWT, and signed-URL workflows where bit-level correctness matters. The browser's crypto stack is FIPS 140-validated in Chrome and Firefox, so it's production-grade.
losslessForensics
Decrypt known-key blobs during incident response. Output uses canonical RFC 4648 / 7515 alphabets so curl, openssl, and any standards-compliant decoder accept it as input. URL-safe variants drop padding for tokens that travel in query strings.
byte-identicalTeaching
Show GCM's authenticated-decrypt failure behavior. Heavy hashing runs through useMemo so large inputs don't block typing. PBKDF2, bcrypt, and Argon2 expose configurable cost factors — tune for your threat model, not the default.
spec-gradeMigration
Validate ciphertext while moving providers. Same input plus same options always yields identical bytes. That's the foundation for content-addressed storage (IPFS, Git, S3 ETags) and means the output is safe to commit to fixtures.
production-readyFrequently asked questions
Something missing?
Tell us what you need. We ship the top requests every two weeks.