bacon · 5-bit a/b code · steganographic · live

Encode with the Bacon cipher

Francis Bacons 17th-century binary cipher: each letter becomes a 5-character A/B pattern. Designed for steganographic hiding in two different typefaces. Runs locally.

Bacon Cipher
Input
5 B
1 lines
Output
29 B
1 lines
Status
ready
live
Ratio
5.80×
out/in
input · text
output · bacon
AABBB AABAA ABABB ABABB ABBBA
Quick Start

How to use the Bacon cipher

Each letter is replaced by a 5-character A/B sequence. The originally intended use was steganographic — A and B could be two slightly different fonts hidden inside ordinary text.

  1. 01

    Pick a mode

    Encrypt produces 5-character codes; decrypt parses them back to letters.

    Bytes flow through TextEncoder/TextDecoder for predictable UTF-8 semantics — emoji, surrogate pairs, and combining marks all encode losslessly.

    modeUTF-8TextEncoderlosslesslive
    mode · raw bytesencrypt · UTF-8
    encrypt | decrypt
    loaded · UTF-8MIME · ready
  2. 02

    Type or paste input

    Letters when encrypting, A/B groups when decrypting. Non-A/B characters are stripped before decoding.

    Hash and signature operations call crypto.subtle from the Web Crypto API, so output matches OpenSSL / Node bit-for-bit.

    inputWeb Cryptosubtledeterministiclive
    input · optionstext · live
    HELLO
    options applied · livelive
  3. 03

    Five-bit lookup

    H = AABBB. Codes are space-separated in the output for readability.

    Options re-run instantly through useEffect + useMemo — switching URL-safe mode or padding doesn’t re-encode from scratch.

    codememoisedoptionsinstantreactive
    table · encoded26x5 · ready
    A=AAAAA · B=AAAAB · ...
    encoded · livelossless
  4. 04

    Copy or download

    One click to clipboard. Download as .txt.

    Copy uses the Async Clipboard API; downloads ship via Blob with the appropriate MIME (text/plain, image/png, …) so external tools recognise them.

    exportclipboardblobMIME-correctclient-side
    out · copiedcode · done
    AABBB AABAA ABABB ABABB ABBBA
    shipped · ready to shipsuccess
Pro tips

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.

Use Cases

When to use the Bacon cipher

Steganography demos, escape rooms, historical study.

Steganography intro

Concrete example of hiding bits inside ordinary text. 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-compliant

CTF puzzles

Frequent decoding step in mid-tier challenges. 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-matched

Escape rooms

Print two-font passages and let players decode. 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.

lossless

Historical study

Reproduce passages from Bacons own writings on cipher. 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-identical

Binary intro

Friendly approach to binary encoding (5 bits per letter). 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-grade

Cross-tool checks

Verify Bacon implementations on the wire. 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-ready
FAQ

Frequently asked questions

5 bits encode 2^5 = 32 codes, enough for the 26-letter alphabet with room to spare. Bacon used a 24-letter alphabet (I=J, U=V); modern variants use 26 distinct codes.
A and B were meant to map to two visually similar typefaces. The reader sees ordinary prose; the cipher hides inside the choice of glyphs.
Only A-Z are encoded. Everything else passes through (encrypt) or is stripped (decrypt).
No — the mapping is fixed and well-known. Treat it as encoding for steganographic effect, not as encryption.
No. Encoding and decoding run locally in your browser.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!