Skip to content
Also from us: TypologyOnline.com · Free personality tests

Columnar Transposition Cipher: When the Key Rearranges the Columns

How a keyword turns a message into a grid, then hides it by changing the order in which the columns are read.

Try the Columnar Transposition Cipher tool
Illustration of a Columnar Transposition cipher grid with keyword-ordered columns
Columnar Transposition writes plaintext into rows beneath a keyword, then reads the columns in alphabetical key order.

Most beginner ciphers change letters. Caesar shifts them, Atbash reverses them, Affine sends them through modular arithmetic, and Vigenere changes them with a repeating keyword. The Columnar Transposition cipher does something different: it leaves the letters alone, then it moves them.

A message is written into a rectangular grid under a keyword. The keyword determines the order of the columns. Once the grid is filled, the ciphertext is created by reading the columns in alphabetical key order. The result is a message made from the same letters, but in a different arrangement.

That makes Columnar Transposition a transposition cipher, not a substitution cipher. In a substitution cipher, letters change identity. In a transposition cipher, letters keep their identity but change position.

The Columnar Transposition cipher is more structured than the Rail Fence cipher. Rail Fence uses a zigzag path. Columnar Transposition uses a grid and a keyword. The keyword does not tell you how to replace letters; it tells you how to reorder columns.

Caesar changes the alphabet. Rail Fence changes the path. Columnar Transposition changes the columns.

Columnar Transposition cipher at a glance

Feature Columnar Transposition Cipher
Type Transposition cipher
Main idea Write plaintext into rows under a keyword, then read columns in keyword order
Key A keyword
What the key controls The order in which columns are read
What changes Letter positions
What stays the same The letters themselves
Example key ZEBRAS
Number of columns Equal to the keyword length
Example plaintext WEAREDISCOVEREDFLEEATONCE
Example ciphertext EVLNA CDTES EAROF ODEEC WIREE
Padding Optional; this classic example uses no padding
Duplicate key letters Ordered left-to-right when tied
Security Educational only; weak by modern standards
Best use Learning transposition, grids, column ordering, and positional cryptanalysis

Columnar Transposition is one of the most important classical transposition patterns because it is simple, visual, and more flexible than a basic zigzag.

The key is not a number of rails. The key is a word. That word becomes a column-ordering machine.

What is the Columnar Transposition cipher?

The Columnar Transposition cipher is a classical method for rearranging letters using a grid.

The sender chooses a keyword, such as:

ZEBRAS

The number of letters in the keyword determines the number of columns. Since ZEBRAS has 6 letters, the grid has 6 columns.

The plaintext is then written into the grid from left to right, row by row.

For example:

WEAREDISCOVEREDFLEEATONCE

becomes:

Z E B R A S
W E A R E D
I S C O V E
R E D F L E
E A T O N C
E

Then the columns are read in alphabetical order of the keyword letters.

Column 1 2 3 4 5 6
Key letter Z E B R A S

Alphabetically, the key letters go:

A, B, E, R, S, Z

So the read order is:

Key letter A B E R S Z
Original column 5 3 2 4 6 1

That gives the read order:

5 -> 3 -> 2 -> 4 -> 6 -> 1

The ciphertext is made by reading those columns from top to bottom: column 5 first, then column 3, then column 2, then column 4, then column 6, then column 1.

That is the whole cipher.

Write by rows. Read by columns. But not in ordinary column order. Read in keyword order.

How does Columnar Transposition work?

Columnar Transposition has four main stages:

  1. Choose a keyword.
  2. Write the plaintext into a grid under that keyword.
  3. Rank the keyword letters alphabetically.
  4. Read the columns in rank order.

The message itself is not substituted. The letters are not changed into new letters. Instead, their positions are permuted.

Suppose the keyword is:

ZEBRAS

Write the keyword above six columns:

Z E B R A S

Now assign each column a rank. Alphabetically, A comes first, B comes second, E comes third, R comes fourth, S comes fifth, and Z comes sixth.

So the keyword letters receive these ranks:

Key letter Z E B R A S
Rank 6 3 2 4 1 5

That means:

Rank 1 2 3 4 5 6
Column read 5 3 2 4 6 1

So column 5 is read first because its key letter is A. Column 1 is read last because its key letter is Z.

That gives Columnar Transposition its identity. The keyword is not used to change letters. It is used to sort columns.

Key and rules

The key for Columnar Transposition is a keyword.

The keyword controls two things:

Key property Effect
Keyword length Determines the number of columns
Alphabetical order of letters Determines the column read order

For example:

ZEBRAS

has 6 letters, so the grid has 6 columns. Its alphabetical ordering gives:

A, B, E, R, S, Z

So the columns are read:

5 -> 3 -> 2 -> 4 -> 6 -> 1

The main rules are:

Rule Explanation
Use a keyword The keyword determines the columns
Remove or preserve non-letters depending on tool settings Classical examples often use letters only
Write plaintext row by row Fill the grid from left to right
Rank key letters alphabetically This gives each column a read order
Read columns by rank Read each selected column from top to bottom
Duplicate key letters need a tie rule This site's tool keeps duplicates in original left-to-right order
Padding may or may not be used The classic ZEBRAS example uses no padding
Decryption must reconstruct column lengths Short final columns must be handled correctly

The duplicate-letter rule is important.

If the keyword is:

BALLOON

then L appears twice and O appears twice. The cipher must decide which repeated letter comes first.

This site's tool uses a clean rule: duplicate key letters keep their original left-to-right order. That avoids ambiguity. Without a consistent duplicate-letter rule, encryption and decryption may disagree.

Worked example: WEAREDISCOVEREDFLEEATONCE with ZEBRAS

Now encrypt the classic plaintext:

WEAREDISCOVEREDFLEEATONCE

using the keyword:

ZEBRAS

First, write the keyword:

Z E B R A S

Now write the plaintext into the grid row by row:

Z E B R A S
W E A R E D
I S C O V E
R E D F L E
E A T O N C
E

The final row is incomplete. No padding is added in this classic example, and short final columns are handled during decryption.

Now rank the keyword letters.

Column 1 2 3 4 5 6
Key Z E B R A S
Rank 6 3 2 4 1 5

Read columns in rank order:

Read position Column Key letter
1st 5 A
2nd 3 B
3rd 2 E
4th 4 R
5th 6 S
6th 1 Z

So the read order is:

5 -> 3 -> 2 -> 4 -> 6 -> 1

Now read each column from top to bottom.

Column Key Letters Column text
5 A E V L N EVLN
3 B A C D T ACDT
2 E E S E A ESEA
4 R R O F O ROFO
6 S D E E C DEEC
1 Z W I R E E WIREE

Now join the columns:

EVLNACDTESEAROFODEECWIREE

Grouped into blocks of five:

EVLNA CDTES EAROF ODEEC WIREE

So:

Item Value
Plaintext WEAREDISCOVEREDFLEEATONCE
Keyword ZEBRAS
Column read order 5 -> 3 -> 2 -> 4 -> 6 -> 1
Ciphertext EVLNACDTESEAROFODEECWIREE
Grouped ciphertext EVLNA CDTES EAROF ODEEC WIREE

The grouped spaces are only formatting. They do not change the cipher.

What the keyword really does

The keyword in Columnar Transposition can be misunderstood.

It does not act like a Vigenere keyword. It does not provide letter shifts. It does not decide that A becomes Q or E becomes X.

Instead, the keyword controls column order.

With the key:

ZEBRAS

the columns are labelled:

Column 1 2 3 4 5 6
Key Z E B R A S

Then those labels are sorted alphabetically:

A, B, E, R, S, Z

That sorted order tells the cipher which columns to read first.

So the keyword is really a compact way to create a permutation. A permutation is a rearrangement.

Here, the original column order is:

1, 2, 3, 4, 5, 6

The keyword turns it into:

5, 3, 2, 4, 6, 1

That is the mathematical core of the cipher.

Columnar Transposition is not only "write in a box and read down." It is: write in normal order, read in permuted order.

Decrypting Columnar Transposition

Decryption reverses the process.

Encryption writes the plaintext row by row, then reads the columns in key order. Decryption must do the opposite:

  1. Work out the grid dimensions.
  2. Work out the column read order.
  3. Work out how long each column should be.
  4. Split the ciphertext into column chunks.
  5. Put each chunk into the correct column.
  6. Read the grid row by row.

The hard part is not the alphabetic order. The hard part is column length.

If padding is used, every column has the same length. But the classic ZEBRAS example uses no padding, so some final columns are shorter than others.

The plaintext:

WEAREDISCOVEREDFLEEATONCE

has 25 letters. The key:

ZEBRAS

has 6 columns.

So the grid has:

25 / 6 = 4 remainder 1

That means most columns have 4 letters, and the first column has 5 letters because it receives the extra final-row letter.

Column Key Length
1 Z 5
2 E 4
3 B 4
4 R 4
5 A 4
6 S 4

But the ciphertext is read in this order:

5 -> 3 -> 2 -> 4 -> 6 -> 1

So the ciphertext chunks must be split according to those columns:

Read order Column Length Ciphertext chunk
1 5 4 EVLN
2 3 4 ACDT
3 2 4 ESEA
4 4 4 ROFO
5 6 4 DEEC
6 1 5 WIREE

Now place those chunks back into their original columns:

Z E B R A S
W E A R E D
I S C O V E
R E D F L E
E A T O N C
E

Now read row by row:

WEAREDISCOVEREDFLEEATONCE

The decryption problem is a grid reconstruction problem. The keyword gives the column order. The message length gives the column lengths. The receiver puts the columns back where they belong.

History and origin

Columnar Transposition belongs to the long family of transposition ciphers: systems that hide messages by rearranging letters rather than replacing them.

This family is ancient in spirit. The basic idea of rearranging text is old, simple, and practical. A message can be written into a shape, route, grid, strip, or table, then read in a different order.

Columnar Transposition is one of the cleanest grid-based versions of that idea. It does not require advanced mathematics. It does not require a cipher machine. It only requires a keyword, a writing grid, a rule for sorting columns, and agreement about padding and duplicate letters.

Its historical significance is not that it was unbreakable. It was not. But it shows a very important cryptographic principle:

The order of information can be as important as the symbols themselves.

A message can be hidden by changing its path through a grid. That same broad idea, rearrangement and permutation, becomes much more sophisticated in modern cryptography.

Columnar Transposition is not modern encryption. But it teaches a primitive form of a lasting idea.

Why Columnar Transposition was useful

Columnar Transposition was useful because it gave a simple way to scramble a message without changing the letters.

Compared with Rail Fence, it had a more flexible key.

Rail Fence usually uses a number:

3 rails

Columnar Transposition uses a keyword:

ZEBRAS

That keyword produces a specific column order:

5 -> 3 -> 2 -> 4 -> 6 -> 1

A longer keyword creates more columns and a more complex permutation.

The cipher had several practical strengths:

Strength Why it mattered
Easy to perform by hand A grid and keyword are enough
Keyword-based Easier to remember than a numeric permutation
More flexible than Rail Fence Different keywords produce different column orders
Preserves letters Useful for teaching transposition clearly
Can be combined with other methods Transposition can be layered with substitution
Good for programming practice Teaches grids, sorting, indexing, and reconstruction

It also helps learners understand a key distinction.

A substitution cipher asks: what does this letter become?

A transposition cipher asks: where does this letter go?

Columnar Transposition makes that question visible. The message enters the grid in one order. It leaves in another.

Weaknesses and limitations

Columnar Transposition is stronger than the very simplest transposition ciphers, but it is still weak by modern standards.

The main problem is that the letters are unchanged. Only their positions move. That means the ciphertext contains exactly the same letter frequencies as the plaintext.

If the plaintext has many Es, the ciphertext has the same number of Es. If the plaintext has no Qs, the ciphertext has no Qs. This gives an attacker an important clue: the message may have been transposed rather than substituted.

The main weaknesses are:

Weakness Why it matters
Letter frequencies are preserved The same letters remain present
Human keywords are guessable Real keywords are often short or meaningful
Keyword length may be estimated Grid structure can leak likely lengths
Anagrams can appear Some local letter relationships survive
Padding conventions leak clues Missing or filler cells reveal grid shape
Duplicate-key rules must match Ambiguity can break decryption
Single transposition is limited One rearrangement may not hide enough structure
No authentication It cannot detect tampering

Columnar Transposition can be made more difficult by using longer keys, double transposition, or combining it with substitution. But the basic single-columnar version remains a classical educational cipher.

It should not be used to protect real information.

How Columnar Transposition is broken

A practical attack begins by asking:

Is this substitution or transposition?

If the ciphertext has roughly normal English letter frequencies but the letters appear scrambled, a transposition cipher becomes plausible.

Columnar Transposition preserves the letters but disrupts their order. An attacker may look for normal letter frequencies, likely keyword lengths, repeated patterns, possible anagrams, common English fragments, column widths that produce readable row reconstructions, padding behaviour, and likely plaintext cribs.

A simple brute-force attack may try different column counts.

For example, if the ciphertext has 25 letters, possible column counts include:

Columns Approximate rows
3 9
4 7
5 5
6 5
7 4
8 4

The attacker can test likely grid widths and look for row reconstructions that produce English-like fragments.

If the keyword length is known but the keyword order is not, the problem becomes one of finding the column permutation.

For 6 columns, there are:

6! = 720

possible column orders. That is not many for a computer.

For 10 columns, there are:

10! = 3,628,800

possible orders. That is larger, but still manageable with scoring methods and enough ciphertext.

Modern attacks can use language scoring. A program can try many column orders and score the resulting plaintext according to how English-like it is. Common letter pairs, word fragments, and n-gram frequencies help identify promising candidates.

The cipher is therefore not broken by one universal shortcut. It is broken by exploiting its structure: same letters, grid layout, keyword length, column permutation, and language patterns.

Columnar Transposition is more structured than Rail Fence. That structure is useful to the sender. It is also useful to the attacker.

Columnar Transposition vs Rail Fence

Columnar Transposition and Rail Fence are both transposition ciphers.

They both rearrange letters instead of replacing them, but they use different movement systems.

Feature Rail Fence Columnar Transposition
Main shape Zigzag Grid
Key Number of rails Keyword
Writing method Down-and-up diagonal path Row by row
Reading method Rail by rail Column by column in key order
Flexibility Low Higher
Main teaching value Shows transposition visually Shows keyed permutation
Example key 3 rails ZEBRAS
What changes Letter order Letter order

Rail Fence is easier to see. Columnar Transposition is more systematic.

Rail Fence asks: which rail does this letter land on?

Columnar Transposition asks: which column is read first?

That makes Columnar Transposition a natural next step after Rail Fence. Rail Fence teaches movement. Columnar Transposition teaches ordered rearrangement.

Columnar Transposition sits inside a wider family of rearrangement ciphers.

Cipher Relationship
Rail Fence cipher A simpler transposition cipher using a zigzag path
Route cipher Writes into a grid and reads along a route
Columnar Transposition Writes rows and reads columns in keyword order
Double Transposition Applies columnar transposition twice
Scytale Ancient-style transposition using wrapping around a rod
Caesar cipher Substitution rather than transposition
Vigenere cipher Polyalphabetic substitution using a keyword
Product cipher Combines substitution and transposition ideas

The comparison with product ciphers is useful.

A single transposition step is weak. A single substitution step is often weak too. But combining substitution and transposition repeatedly can create much stronger systems.

Modern encryption is far beyond classical hand ciphers, but the broad idea of mixing substitution and permutation has roots in these older categories.

Columnar Transposition is not secure modern cryptography, but it is one of the simplest ways to see positional diffusion begin.

Where Columnar Transposition appears today

Columnar Transposition is common in:

  • classical cryptography lessons
  • online cipher tools
  • programming exercises
  • puzzle hunts
  • escape rooms
  • recreational cryptography
  • CTF warm-up challenges
  • transposition cipher demonstrations
  • geocaching-style clues

It is less visually immediate than Caesar or Atbash, but more systematic than Rail Fence. That makes it useful for serious beginners.

A good Columnar Transposition tool can show the keyword, the column ranks, the read order, the plaintext grid, the ciphertext chunks, and how decryption reconstructs the columns.

Columnar Transposition is best understood visually. The reader should be able to see the grid, then see the columns move.

A simple Python Columnar Transposition cipher

Columnar Transposition is a good programming exercise because it uses several useful ideas: cleaning text, ranking keyword letters, handling duplicate key letters, building a grid, reading columns in a custom order, and reconstructing short final columns during decryption.

The code below implements a simple no-padding Columnar Transposition cipher.

Python exampleShow code
def normalise_key(key):
    """
    Keep A-Z letters only and convert to uppercase.
    """
    cleaned = ""

    for char in key.upper():
        if char.isalpha():
            cleaned += char

    if cleaned == "":
        raise ValueError("Key must contain at least one letter.")

    return cleaned


def get_column_order(key):
    """
    Return the column read order for a keyword.

    Duplicate letters are tied left-to-right.
    """
    key = normalise_key(key)

    indexed_letters = []

    for index, letter in enumerate(key):
        indexed_letters.append((letter, index))

    sorted_letters = sorted(indexed_letters)

    order = []

    for letter, index in sorted_letters:
        order.append(index)

    return order


def clean_text_letters(text):
    """
    Keep letters only and uppercase them.
    """
    cleaned = ""

    for char in text.upper():
        if char.isalpha():
            cleaned += char

    return cleaned


def columnar_encrypt(plaintext, key, group_size=0):
    """
    Encrypt plaintext using no-padding Columnar Transposition.

    Plaintext is written row by row.
    Columns are read in alphabetical key order.
    """
    key = normalise_key(key)
    text = clean_text_letters(plaintext)

    columns = len(key)
    order = get_column_order(key)

    ciphertext = ""

    for col in order:
        index = col

        while index < len(text):
            ciphertext += text[index]
            index += columns

    if group_size:
        groups = []

        for i in range(0, len(ciphertext), group_size):
            groups.append(ciphertext[i:i + group_size])

        return " ".join(groups)

    return ciphertext


def column_lengths(message_length, columns):
    """
    Work out how many letters each original column contains
    when no padding is used.
    """
    full_rows = message_length // columns
    extra = message_length % columns

    lengths = []

    for col in range(columns):
        if col < extra:
            lengths.append(full_rows + 1)
        else:
            lengths.append(full_rows)

    return lengths


def columnar_decrypt(ciphertext, key):
    """
    Decrypt no-padding Columnar Transposition.

    The ciphertext is split into chunks according to the
    length of each original column, then the grid is read row by row.
    """
    key = normalise_key(key)
    text = clean_text_letters(ciphertext)

    columns = len(key)
    order = get_column_order(key)
    lengths = column_lengths(len(text), columns)

    column_text = [""] * columns
    position = 0

    for col in order:
        length = lengths[col]
        column_text[col] = text[position:position + length]
        position += length

    plaintext = ""
    rows = max(lengths)

    for row in range(rows):
        for col in range(columns):
            if row < len(column_text[col]):
                plaintext += column_text[col][row]

    return plaintext


plaintext = "WEAREDISCOVEREDFLEEATONCE"
key = "ZEBRAS"

ciphertext = columnar_encrypt(plaintext, key)
grouped = columnar_encrypt(plaintext, key, group_size=5)
decrypted = columnar_decrypt(ciphertext, key)

print("Plaintext :", plaintext)
print("Key       :", key)
print("Encrypted :", ciphertext)
print("Grouped   :", grouped)
print("Decrypted :", decrypted)

Expected output:

Plaintext : WEAREDISCOVEREDFLEEATONCE
Key       : ZEBRAS
Encrypted : EVLNACDTESEAROFODEECWIREE
Grouped   : EVLNA CDTES EAROF ODEEC WIREE
Decrypted : WEAREDISCOVEREDFLEEATONCE

The most important part of the encryption is:

for col in order:
    index = col

    while index < len(text):
        ciphertext += text[index]
        index += columns

That reads one column at a time.

The variable order contains the keyword-driven column order. For ZEBRAS, it is:

[4, 2, 1, 3, 5, 0]

That is the zero-based version of:

5 -> 3 -> 2 -> 4 -> 6 -> 1

The code is not replacing letters. It is walking through the message in a different order.

That is transposition in programming form.

Reading the code like the cipher

The function:

get_column_order(key)

turns the keyword into a column order.

For:

ZEBRAS

the letters and positions are:

Index Letter
0 Z
1 E
2 B
3 R
4 A
5 S

Sorting those alphabetically gives:

Sorted letter Original index
A 4
B 2
E 1
R 3
S 5
Z 0

So the read order is:

[4, 2, 1, 3, 5, 0]

That corresponds to column 5, column 3, column 2, column 4, column 6, column 1.

The encryption function does not need to physically draw the grid. Instead, it uses indexing. If there are 6 columns, then letters in the same column are spaced 6 positions apart in the plaintext string.

Column 5, using zero-based index 4, contains:

text[4], text[10], text[16], text[22], ...

That is how the code reads down a column.

Decryption is slightly more complicated because the final row may be incomplete. The function:

column_lengths(message_length, columns)

works out how many letters each original column should contain.

For 25 letters and 6 columns:

[5, 4, 4, 4, 4, 4]

That means column 1 has 5 letters, while columns 2 through 6 have 4 letters.

Then the ciphertext is split into chunks using the keyword read order. Finally, the grid is read row by row to recover the plaintext.

Encryption:

rows -> columns

Decryption:

columns -> rows

Common questions about the Columnar Transposition cipher

Is Columnar Transposition secure?

No. Columnar Transposition is not secure by modern standards. It preserves letter frequencies, has a recoverable grid structure, and can be attacked by testing likely column counts and permutations.

It is useful for education, puzzles, and historical interest only.

Is Columnar Transposition a substitution cipher?

No. It is a transposition cipher. That means it rearranges the letters rather than replacing them. The ciphertext contains the same letters as the plaintext, just in a different order.

What is the key in Columnar Transposition?

The key is usually a keyword.

The keyword determines how many columns the grid has and the order in which those columns are read.

For example:

ZEBRAS

has 6 letters, so the grid has 6 columns. Its read order is:

5 -> 3 -> 2 -> 4 -> 6 -> 1

How are duplicate key letters handled?

Duplicate key letters need a consistent tie rule.

This site's tool uses a left-to-right rule: duplicate key letters keep their original order. For example, if two columns are both labelled L, the leftmost L is ranked before the later L.

This matters because encryption and decryption must agree.

Does Columnar Transposition use padding?

Sometimes.

Some versions pad the final row with filler letters so every column has the same length. The classic example with ZEBRAS uses no padding. Short final columns are handled correctly during decryption.

Both approaches are valid as long as sender and receiver use the same convention.

What happens to spaces and punctuation?

Classical examples often remove spaces and punctuation before encryption.

This site's tool can keep punctuation and numbers visible, but only transposes letters. With punctuation kept on, non-letters stay where they are and only the letters are rearranged.

That makes the tool easier to use, but it can leak structure.

What is a good Columnar Transposition example?

A classic example is:

Item Value
Plaintext WEAREDISCOVEREDFLEEATONCE
Keyword ZEBRAS
Read order 5 -> 3 -> 2 -> 4 -> 6 -> 1
Ciphertext EVLNACDTESEAROFODEECWIREE
Grouped ciphertext EVLNA CDTES EAROF ODEEC WIREE

This matches the example in the tool.

Why Columnar Transposition still matters

The Columnar Transposition cipher should not be used to protect anything serious.

Not passwords.

Not private messages.

Not personal information.

Not financial data.

Not API keys.

Not recovery phrases.

Modern encryption depends on carefully analysed algorithms, secure keys, randomness, authentication, and resistance to many kinds of attack. Columnar Transposition has none of that.

But it still earns its place.

It shows that a cipher can hide a message without changing the letters. It shows how a keyword can become a permutation. It shows why grids matter. It shows why padding conventions matter. It shows why preserving letter frequency is dangerous. It shows how a message can be written one way and read another.

And most importantly, it teaches that encryption is not only about symbols.

It is also about position.

Rail Fence makes text move in a zigzag. Columnar Transposition makes text move through ordered columns.

The message enters as rows. It leaves as columns.

That is why the Columnar Transposition cipher still matters. Not because it is strong, but because it teaches the power and the weakness of rearrangement.

Sources and further reading

Try the Columnar Transposition Cipher Tool

Want to experiment with the idea in practice? Open the matching tool and try your own text.

Open Columnar Transposition Cipher
Signal acquired

A note from the team

We build these tools because we love cryptography, encoding, and making difficult ideas easier to explore. If they've helped you, even a small coffee means the world to the project. Thank you!

Say thanks on Ko-fi

Read next

Transposition Rail Fence Cipher: The Zigzag That Hid the Message How one of the simplest transposition ciphers scrambled plaintext by changing where the letters sit, not what the letters are. Fractionation ADFGX and ADFGVX: Fracturing Letters for Wartime Radio The World War I field ciphers that split characters into coordinates, scattered those coordinates across the page, and made intercepted radio traffic far harder to analyse at speed. Cryptanalysis Frequency Analysis: The Statistical Fingerprint That Broke Classical Ciphers How counting letters turned cryptanalysis from educated guesswork into a science, and why weak ciphers still betray themselves through the shape of language.
Back to all articles