AES Encryption/Decryption
Encrypt or decrypt text with AES-256-CBC. Runs entirely client-side — provide a 64-character hex key, and the tool handles padding, the IV, and base64 encoding.
Input
Exactly 64 hexadecimal characters (32 bytes), used directly as the AES-256 key — e.g. generate one with any password manager's "hex" export, or run `openssl rand -hex 32`. The IV is derived from this key automatically, so encrypting different messages with the same key reuses the same IV; use a fresh key per sensitive message for stronger guarantees.
Output
Guides
AES (Advanced Encryption Standard) is the symmetric-key cipher used almost everywhere — HTTPS, disk encryption, password managers, VPNs — because it's fast, well-studied, and, when used correctly, unbroken. This tool encrypts or decrypts arbitrary text with AES-256 in CBC mode, entirely in your browser.
How to use it
- Paste the text you want to encrypt (or, in Decrypt mode, the base64 ciphertext you want to decrypt) into Input Text.
- Enter a Secret Key: exactly 64 hexadecimal characters (32 bytes), used directly as the AES-256 key. Generate one with
openssl rand -hex 32on the command line, or any tool that produces 32 random bytes as hex. - Choose Encrypt or Decrypt.
- The result appears in Result — copy or download it.
To decrypt something you encrypted here, switch to Decrypt mode, paste the base64 output back into Input Text, and use the same key.
Key and IV format
- Key: 64 hex characters = 32 bytes = a 256-bit AES key. Anything shorter, longer, or non-hex is rejected before processing.
- IV (initialization vector): CBC mode requires a 16-byte IV per encryption. Rather than asking you to manage one separately, this tool derives it deterministically from your key (by AES-encrypting a fixed constant block under that key) and prepends it to the ciphertext, so decryption only needs the key. The trade-off: encrypting two different messages with the same key produces the same IV, which can leak whether two ciphertexts share a plaintext prefix. For maximum security, use a different key per sensitive message, or treat this as a general-purpose text-scrambling tool rather than a substitute for a vetted encryption library in a security-critical application.
- Output format: base64 — the 16-byte IV followed by the ciphertext, PKCS7-padded to a multiple of 16 bytes.
FAQ
Is this "real" AES? Yes — it's a from-scratch implementation of the FIPS-197 algorithm (S-box, key schedule, MixColumns, the works), not a simplified stand-in. It was cross-checked against Node.js's built-in crypto module across randomized AES-128/192/256 CBC round trips during development to confirm bit-for-bit correctness.
Why not let me enter a password instead of a hex key? Turning a password into a key (a KDF like PBKDF2) needs many iterations to resist brute-forcing, which is slow — and this tool runs synchronously so it works identically in your browser and via the API. Supplying the raw key sidesteps that trade-off. If you need password-based encryption, derive a key from your password with a dedicated KDF first, then paste the resulting hex here.
What happens if I use the wrong key to decrypt? You'll get a readable error ("invalid padding" or "not valid UTF-8") instead of garbage text or a crash — the tool always tells you something went wrong rather than silently returning nonsense.
Is my key or text sent anywhere? No — everything runs client-side in your browser; nothing is transmitted or stored. If you call this tool via the API instead, your key and text are processed for that single request only and are not logged or stored server-side.