๐Ÿช„ Generators

Encrypted Secret Note

Encrypt and decrypt notes with AES-GCM and a password.

How to Use Encrypted Secret Note

On the Encrypt tab, type a note and a password, then press the button โ€” the Base64 ciphertext appears below. Copy it to the recipient, who opens the Decrypt tab and enters the same password to recover the note. The password is never stored, so send it through a separate channel from the ciphertext.

Concrete examples

  • "Room PIN is 4821" + password tea-spoon-9 → a v2.salt.iv.body ciphertext like v2.k3v...== . pQ... . 9aB...
  • Encrypt the same note twice → the Base64 differs each time, because the salt and IV are random
  • Decrypt tab with that ciphertext + tea-spoon-9 → "Room PIN is 4821" is recovered
  • One wrong character in the password → "Wrong password or invalid ciphertext" (no content is shown)
  • Trim or tamper with the ciphertext → AES-GCM authentication fails, same decrypt error

Safe Sharing Pattern

Send the encrypted text through one channel and the password through another channel. For example, send the ciphertext in chat and share the password by voice. This tool is for short notes and temporary sharing; it is not a password manager or long-term secure storage system.

How the ciphertext is put together, and how long it gets

The output has four dot-separated parts. The decrypting side reads the shape to tell which generation of ciphertext it is looking at.

PartContentsBase64 characters
v2Format marker2 (plus the dot)
salt16 random bytes, so the same password yields a different key every time24
IV12 random bytes (the AES-GCM initialisation vector)16
bodyThe encrypted note plus a 16-byte authentication tagProportional to the note

So the length works out to roughly 66 + (UTF-8 bytes of the note ร— 1.34) characters. A 32-byte note comes to 109 characters. Japanese text runs three bytes per character, so every ten Japanese characters add about 40 characters of ciphertext โ€” handy when you need to fit inside a QR code or a chat length limit.

Base64 can contain +, / and =, so URL-encode the string before putting it in a query parameter. Line breaks inside the body are ignored on decryption, but losing the leading v2 or any of the dots makes the ciphertext undecryptable. The usual way this happens is pasting with a mail quote marker (>) or a bullet character stuck to the front. Older three-part ciphertexts without the v2 marker (made with 100,000 PBKDF2 iterations) still decrypt as they are.

Your password is what decides the strength

The key is stretched from your password with PBKDF2-HMAC-SHA256, 600,000 iterations, matching the figure OWASP publishes for PBKDF2. The point is to force that same work on every brute-force attempt, so pressing encrypt or decrypt can take up to about a second on some devices. That delay is the cost working as intended, not the page being slow.

No number of iterations rescues a guessable password such as 1234 or password. Avoid dictionary words and dates; use a passphrase of several unrelated words, or a long random string from the Password Generator. Because the salt changes every time, precomputed rainbow tables cannot attack many notes at once โ€” but none of that helps if the password itself is weak.

What this tool cannot protect you from

AES-GCM detects a change of even one byte, but that is tamper detection, not proof of authorship. Anyone who knows the password can produce a fresh ciphertext in the same format, so it says nothing about who wrote it. The password is never stored and cannot be recovered, which also means nobody โ€” including us โ€” can decrypt a note whose password has been forgotten. Use a password manager for long-term storage and credentials, and keep this tool for handing a short note over once.

If the device itself is compromised โ€” a keylogger, screen recording โ€” running inside the browser does not help; the input is captured before encryption. The failure message is deliberately the same for a wrong password and for tampering, so an attacker learns nothing from it. Encryption uses the browser's Web Crypto API, which assumes the page was opened over HTTPS.

  • There is no expiry. The ciphertext stays in chat history and mailboxes, and anyone who later learns the password can read it. Ask for the message to be deleted, or avoid reusing the password.
  • The decrypted text stays on screen. The field is read-only, so close the tab or reload the page when you are done.
  • The other person needs this same tool. The format is specific to this page, so general-purpose encryption software will not read it. Send them the URL along with the ciphertext.

FAQ

Is my data sent to a server?
No. Everything runs in your browser; nothing is transmitted or stored externally.
How to share?
Copy the Base64 ciphertext. Anyone with the same password can decrypt locally โ€” no server. Send the password through a separate channel (in person, another app), not alongside the ciphertext.
What if I forget the password?
The note can't be decrypted. The password is never stored and there is no recovery path โ€” a forgotten ciphertext is unreadable to anyone, including us. Keep the password somewhere safe.
Which encryption is used?
AES-GCM (256-bit). The password is turned into a key with PBKDF2 (SHA-256, 600,000 iterations), and a 16-byte salt and 12-byte IV are generated with crypto.getRandomValues on every encryption. The ciphertext is v2.salt.iv.body joined as Base64, so identical input never produces identical output. Ciphertexts created with the older format (no v2 prefix, 100,000 iterations) still decrypt as before.
How long does the ciphertext get?
Roughly 66 + 1.34 ร— the UTF-8 byte length of the note. A 32-byte note comes out as 109 characters. Japanese characters take 3 bytes each, so every 10 of them adds about 40 characters. Use this estimate when you need the ciphertext to fit a QR code or a chat message limit.
The password is right but decryption still fails
Check for stray characters around the ciphertext. Typical causes are a quote marker or bullet glyph pasted in front, a missing v2 prefix, or lost dot separators. Line breaks inside the Base64 body are ignored, so wrapping is not a problem. Because AES-GCM detects even a single changed byte, a wrong password and a tampered ciphertext produce the same error.