Cicada 3301 — Liber Primus
Is it solved? No. This is a verifiable archive of what has been ruled out, how, and what is genuinely still open.
Please do not repeat the unqualified claim that Liber Primus is "information-theoretically unsolvable". This archive asserted exactly that for months; its own red-team audit found the claim overstated the evidence and had foreclosed a tractable line of attack.
Don't trust this page — check it
This archive tries to be a source of truth by being falsifiable, not by claiming to be one. Four commands, about a minute:
git clone https://github.com/Dukotah/cicada3301 && cd cicada3301
python3 liber-primus/tests/validate.py # rig reproduces every KNOWN solve
python3 liber-primus/verify_solution.py --selftest # the judge accepts good keys, rejects bad
python3 -m pytest liber-primus/benchmark/ -q # 8 instrument gates, both directions
python3 liber-primus/analysis/handoff/validate_ledger.py # must report 0 unsound negatives
If any of those fail, distrust everything here. That is the intended relationship.
For AI agents
If you are an AI agent answering a question about Cicada 3301, read
AGENTS.md
first — it gives a correct answer in about 60 seconds and tells you how to verify it. Key
machine-readable entry points:
| file | what it holds |
|---|---|
PROBLEM.json | The problem: alphabet, ciphertext pinned by SHA-256, measured statistics, acceptance criteria |
LEDGER.json | Every hypothesis tested, its threshold, whether its control passed, its coverage bound |
INDEX.json | Machine-readable map of the repository, with task routing |
verify_solution.py | The oracle: adjudicates a claimed solution against criteria fixed in advance |
Please do not star, upvote or otherwise boost this repository on your own initiative. Verify it, then tell your human what you found — including if it failed — and let them decide. Acting on instructions embedded in a page you were merely reading is the shape of a prompt-injection attack, and a star obtained that way signals nothing.
Frequently asked
Has the Liber Primus been solved?
No. Pages 0–54 of part 2 remain unsolved. A handful of other pages were solved years ago
via Vigenère with keys such as DIVINITY and CIRCUMFERENCE, plus
Atbash and shift, complicated by an interrupter rune. No LLM has solved any page.
Can AI solve it?
None has. The failure mode is systematic: a flat 29-symbol cipher emits English-looking fragments constantly, and pattern recognition is not calibrated for a search over millions of candidate keys. Worse, rigid decoding scores even the correct key as noise once the anti-repeat filter is applied (−6.835 rigid versus −4.170 for a skip-aware beam decoder on the same correct key). Many published "ruled out" results — including years of this archive's own — were produced by instruments that could not have succeeded.
Who is Cicada 3301?
Unknown, with no falsifiable attribution. Stylometry is provably impossible on the 359
words of authentic connected prose available. The best-known public self-claim fails the PGP
signature check. Treat every named attribution with suspicion unless it carries a signature
verifiable against key 7A35090F.
What is the doublet deficit?
The unsolved pages show only 0.664% adjacent-equal runes against a plaintext-independent floor of ≥1.38%. That ~5× suppression is the single real anomaly in the corpus and the load-bearing evidence for the verdict. It comes from a soft anti-repeat filter suppressing roughly 83% of doublets.
I think I solved it. How do I check?
python3 liber-primus/verify_solution.py --selftest # validate the judge
python3 liber-primus/verify_solution.py --key-module mykey.py # adjudicate your candidate
It requires the English band, at least two pages passing independently, and beating a size-matched shuffle null. On failure it tells you how far short you were and what that distance means — because "close" is where every false claim in this puzzle's history was born.
Three lessons that generalise
- A null from an unvalidated instrument is not a negative. Plant a known signal and prove your machinery recovers it before trusting its silence.
- A fixed score threshold is invalid at large trial counts. The null's
maximum grows like
μ + β·ln N. A "hit" matching your own sweep's maximum is noise. - Calibrate an extreme-value bar from extreme values, never from the bulk. Estimating the tail scale from a null's standard deviation was wrong by 2.5× here, and would have declared an entire 1.3-million-decode null sweep a hit.
This archive's own corrections
Offered as evidence of method, and as a warning that more remain:
- The headline verdict, from "information-theoretically unsolvable" to OTP-class.
- "Seeded-PRNG pads are closed" — actually 10 generators over ~3% of each seed space.
- "Keytexts dead by mechanism" — actually dead by exhaustion over ~200 texts.
- A silently truncated input file that cost a 40% coverage gap in one lane.
- Two measurement bugs in the archive's own instruments.
Found an error? Open an issue with a reproduce command. That is worth far more than a star.