frequency · cipher · histogram · live

Analyse letter frequency for cryptanalysis

Plot observed letter frequency against expected English distribution. The classic first move for cracking monoalphabetic ciphers like Caesar, Atbash, or Vigenère.

Letter Frequency Analyzer
Input
103 B
text
Letters
83
A–Z
Top
E
13.3%
Status
analysed
live
English baseline: E T A O I N S H R D…
input · ciphertext
output · histogram
ltr
count
observed vs english
pct
E
11
13.3
O
7
8.4
R
7
8.4
T
6
7.2
H
5
6.0
I
5
6.0
N
5
6.0
L
4
4.8
S
4
4.8
U
4
4.8
D
3
3.6
F
3
3.6
A
2
2.4
C
2
2.4
G
2
2.4
Q
2
2.4
Y
2
2.4
B
1
1.2
J
1
1.2
K
1
1.2
M
1
1.2
P
1
1.2
V
1
1.2
W
1
1.2
X
1
1.2
Z
1
1.2

Bars show observed frequency; ticks mark expected English frequency. High observed E / T / A pattern likely means a Caesar / Vigenère cipher.

Quick Start

How to do frequency analysis

Most natural-language English has a stable letter distribution: E ≈ 12.7%, T ≈ 9.1%, A ≈ 8.2%. Simple substitution preserves the shape — just relabels the bars.

  1. 01

    Paste ciphertext

    Letters only count — punctuation and case are ignored.

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

    inputUTF-8TextEncoderlosslesslive
    input · raw bytescipher · UTF-8
    KHOOR ZRUOG
    loaded · UTF-8MIME · ready
  2. 02

    Inspect the histogram

    Bars are observed counts; ticks are expected English frequency.

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

    chartWeb Cryptosubtledeterministiclive
    obs · optionsvs en · live
    E ████  T ███  A ██
    options applied · livelive
  3. 03

    Map the peaks

    The tallest observed letter is probably E; second is probably T.

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

    guessmemoisedoptionsinstantreactive
    map · encodedpeaks · ready
    K → E, R → T?
    encoded · livelossless
  4. 04

    Try a Caesar shift

    If the whole histogram is shifted by N, you've got a Caesar cipher.

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

    solveclipboardblobMIME-correctclient-side
    ok · copiedready · done
    Shift 3 → HELLO WORLD
    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 do frequency analysis

CTF challenges, classroom cryptography, casual ciphers.

CTF puzzles

First-pass attack on any monoalphabetic substitution. 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

Classroom demos

Show why simple substitution ciphers are weak. 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

Caesar / ROT-N

Spot a Caesar shift by visual offset of peaks. 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

Vigenère with known key length

Slice ciphertext by key length, then analyse each slice. 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

Language detection

Different languages have very different distributions. 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

Writing analysis

Compare letter use across writing samples or styles. 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

Frequency analysis targets monoalphabetic English ciphers, which work on the 26-letter alphabet. Digits and punctuation usually pass through unchanged.
A mnemonic for the twelve most common letters in English, in descending order — handy when matching observed peaks to plaintext.
No. Modern ciphers produce uniformly random ciphertext — a flat histogram. Frequency analysis is for classical ciphers only.
At least a few hundred letters for stable percentages. Short snippets are too noisy to match the baseline cleanly.
No. Analysis runs 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!