← Back to index
Crypto·Jun 24, 2026·14 min read

Sike: the post-quantum scheme that fell to a laptop

SIDH was one of the last key-exchange schemes standing in NIST's post-quantum competition. Then a classical laptop recovered its secret key in an hour. How it works, the one formula that forces it to leak, and the two-dimensional trick that breaks it — with the actual math — plus a challenge so you can watch it fall.

A supersingular isogeny graph

In the summer of 2022, isogeny-based cryptography was having a good year. SIDH — Supersingular Isogeny Diffie–Hellman — had been studied for over a decade, and SIKE, the key-encapsulation scheme built on it, was one of the last few candidates standing in NIST's post-quantum competition. It was the elegant one: tiny keys, security resting on a problem with no known efficient solution, classical or quantum.

Then, on July 30th, Wouter Castryck and Thomas Decru posted An efficient key recovery attack on SIDH, with a few hundred lines of Magma attached. On one core of an ordinary laptop, it recovered the secret key of the top SIKE parameter set in about an hour. Re-implementations got that to minutes, then seconds. No quantum computer was involved at any point. The scheme was dead inside a month.

I think this is one of the most instructive failures in modern cryptography, so I turned it into a challenge. This post is the background — and this time I'll write the math out, because the break is genuinely beautiful and you can't feel it from prose alone. The challenge is at the bottom; I won't spoil it.

First, the objects

Everything lives over the field Fp2\mathbb{F}_{p^2}, with a prime of the shape

p=2eA3eB1.p = 2^{e_A}\,3^{e_B} - 1 .

Fix a supersingular elliptic curve E0/Fp2E_0/\mathbb{F}_{p^2}. Supersingularity buys one very clean fact about the group of points:

#E0(Fp2)=(p+1)2=(2eA3eB)2.\#E_0(\mathbb{F}_{p^2}) = (p+1)^2 = \big(2^{e_A}3^{e_B}\big)^2 .

So for any np+1n \mid p+1 the nn-torsion is fully rational and is free of rank two:

E0[n]={PE0:[n]P=O}    (Z/nZ)2.E_0[n] = \{\,P \in E_0 : [n]P = \mathcal{O}\,\} \;\cong\; (\mathbb{Z}/n\mathbb{Z})^2 .

In particular E0[2eA]E_0[2^{e_A}] and E0[3eB]E_0[3^{e_B}] each have a two-element basis. That rank-two structure is the whole game.

An isogeny φ:EE\varphi : E \to E' is a non-constant morphism of curves with φ(O)=O\varphi(\mathcal{O}) = \mathcal{O}; it is automatically a group homomorphism. A separable isogeny is pinned down by its kernel: for any finite subgroup GEG \subset E there is a curve E/GE/G and a map

φ:EE/G,kerφ=G,degφ=G,\varphi : E \to E/G, \qquad \ker \varphi = G, \qquad \deg \varphi = |G|,

unique up to isomorphism of the target and computable from GG by Vélu's formulas. "Walking the graph" means repeatedly quotienting by a small cyclic subgroup: the vertices are supersingular curves up to isomorphism (tagged by their jj-invariant), the edges are degree-\ell isogenies, and the graph is a (+1)(\ell+1)-regular Ramanujan expander — walks mix fast and look random.

SIDH, written out

The public parameters are E0E_0, a basis {PA,QA}\{P_A, Q_A\} of E0[2eA]E_0[2^{e_A}], and a basis {PB,QB}\{P_B, Q_B\} of E0[3eB]E_0[3^{e_B}].

Alice picks a secret αZ/2eAZ\alpha \in \mathbb{Z}/2^{e_A}\mathbb{Z} and walks the 2-isogeny whose kernel is one cyclic subgroup of E0[2eA]E_0[2^{e_A}]:

A=PA+[α]QA,φA:E0EA=E0/A.A = \langle P_A + [\alpha]Q_A \rangle, \qquad \varphi_A : E_0 \to E_A = E_0/A .

Bob picks βZ/3eBZ\beta \in \mathbb{Z}/3^{e_B}\mathbb{Z} and walks the 3-isogeny:

B=PB+[β]QB,φB:E0EB=E0/B.B = \langle P_B + [\beta]Q_B \rangle, \qquad \varphi_B : E_0 \to E_B = E_0/B .

Now the subtlety that the cartoon version skips. To finish, Alice has to push her kernel through Bob's isogeny — she needs φB(PA+[α]QA)\varphi_B(P_A + [\alpha]Q_A). She never sees φB\varphi_B, only the curve EBE_B. But an isogeny is a homomorphism, so it commutes with the group law:

φB(PA+[α]QA)=φB(PA)+[α]φB(QA).\varphi_B\big(P_A + [\alpha]Q_A\big) = \varphi_B(P_A) + [\alpha]\,\varphi_B(Q_A) .

That one identity is the reason SIDH publishes torsion-point images. If Bob hands over φB(PA)\varphi_B(P_A) and φB(QA)\varphi_B(Q_A), Alice can evaluate the right-hand side for her own secret α\alpha without ever knowing φB\varphi_B. So the public keys are

Alice:(EA, φA(PB), φA(QB)),Bob:(EB, φB(PA), φB(QA)).\text{Alice}: \big(E_A,\ \varphi_A(P_B),\ \varphi_A(Q_B)\big), \qquad \text{Bob}: \big(E_B,\ \varphi_B(P_A),\ \varphi_B(Q_A)\big) .

Each side re-walks on the other's curve,

EBA=EB/φB(PA)+[α]φB(QA),EAB=EA/φA(PB)+[β]φA(QB),E_{BA} = E_B \big/ \big\langle \varphi_B(P_A) + [\alpha]\varphi_B(Q_A) \big\rangle, \qquad E_{AB} = E_A \big/ \big\langle \varphi_A(P_B) + [\beta]\varphi_A(Q_B) \big\rangle,

and because both quotients equal E0/A,BE_0/\langle A, B\rangle up to isomorphism, the two parties land on the same curve. The shared secret is its fingerprint:

j(EAB)=j(EBA)=:shared key.j(E_{AB}) = j(E_{BA}) =: \text{shared key}.

Hold onto that identity φB(PA+[α]QA)=φB(PA)+[α]φB(QA)\varphi_B(P_A + [\alpha]Q_A) = \varphi_B(P_A) + [\alpha]\varphi_B(Q_A). The torsion images are the gear that makes SIDH turn — and the crack the whole thing splits along.

Why it looked hard

Breaking Bob means solving the supersingular isogeny problem with torsion: given E0E_0, EBE_B, and the images φB(PA),φB(QA)\varphi_B(P_A), \varphi_B(Q_A), recover φB\varphi_B (equivalently β\beta). The secret lives in a space of size 3eBp3^{e_B} \approx \sqrt{p}, and the best generic method is a meet-in-the-middle / claw-finding walk from both endpoints, which costs

3eB/2p1/4.\approx 3^{e_B/2} \approx p^{1/4}.

At SIKE's sizes (p2434p \approx 2^{434}) that is 2108\approx 2^{108} — out of reach. No quantum algorithm did meaningfully better once you account for memory. For ten years, p1/4p^{1/4} was the security level, and the torsion images — published in plain sight the whole time — were assumed to be harmless.

The break, in two dimensions

Castryck and Decru's move is to stop searching for φB\varphi_B and instead certify guesses about it, by building a higher-dimensional object that only fits together when the guess is right.

The engine is Kani's lemma (Ernst Kani, 1997), a statement about when a 2-dimensional isogeny between abelian surfaces is "reducible." Set d=degφB=3eBd = \deg\varphi_B = 3^{e_B} and pick an auxiliary power

N=2eAwithN>d.N = 2^{e_A} \quad\text{with}\quad N > d .

Kani packages φB\varphi_B, together with a complementary isogeny of degree NdN - d, into a single NN-isogeny of abelian surfaces

Φ:E0×EBA,\Phi : E_0 \times E_B \longrightarrow \mathcal{A},

whose kernel is essentially the graph of φB\varphi_B on the NN-torsion:

kerΦ  =  {(θ(P), φB(P)):PE0[2eA]},\ker \Phi \;=\; \big\lbrace\, \big(\theta(P),\ \varphi_B(P)\big) : P \in E_0[2^{e_A}] \,\big\rbrace,

where θEnd(E0)\theta \in \mathrm{End}(E_0) is an endomorphism realizing the complementary degree, θθ^=[Nd]=[2eA3eB]\theta\hat{\theta} = [\,N - d\,] = [\,2^{e_A} - 3^{e_B}\,]. Two things make this computable:

Because N=2eAN = 2^{e_A} is a power of two, Φ\Phi factors into a chain of eAe_A (2,2)(2,2)-isogenies between principally polarized abelian surfaces — each step an explicit Richelot isogeny on a genus-2 curve. And here is the punchline. A principally polarized abelian surface is exactly one of two things:

A    Jac(C)(genus-2 curve)orA    E×E(product of elliptic curves).\mathcal{A} \;\cong\; \mathrm{Jac}(\mathcal{C}) \quad(\text{genus-2 curve}) \qquad\text{or}\qquad \mathcal{A} \;\cong\; E \times E' \quad(\text{product of elliptic curves}).

Kani's criterion says the chain splits into a product of elliptic curves precisely when the diamond closes — i.e. when the piece of φB\varphi_B you fed in is the real one. That boolean,

Does22ChainSplit(){true, false},\texttt{Does22ChainSplit}(\cdot) \in \{\text{true},\ \text{false}\},

is an oracle for correctness. Now turn it into key recovery. Write Bob's secret in base 3,

β=idi3i,di{0,1,2},\beta = \sum_{i} d_i\, 3^{i}, \qquad d_i \in \{0,1,2\},

guess the top handful of digits, assemble the corresponding (2,2)(2,2)-chain from the torsion images, and ask whether it splits. Correct guesses split; wrong ones do not. Peel off digits a few at a time (a refinement by Oudompheng recovers the rest directly from the first split). Each test is a fixed-length chain of Richelot steps — polynomial in logp\log p — and there are O(eB)O(e_B) of them:

cost  =  O ⁣(poly(logp))vs.p1/4.\text{cost} \;=\; O\!\big(\mathrm{poly}(\log p)\big) \quad\text{vs.}\quad p^{1/4}.

The wall is gone. The irony is exact: the data that made the key exchange possible is the data that makes the attack possible. The one delicate point is the inequality N=2eA>3eBN = 2^{e_A} > 3^{e_B}; SIKE's most balanced sets (22162^{216} vs 313722173^{137} \approx 2^{217}) sit a hair on the wrong side, repaired by a short auxiliary isogeny. Within weeks, Maino–Martindale and Robert generalized the whole thing to provably polynomial time in every case. SIKE was withdrawn.

"Quantum-safe" was never the whole promise

The part I keep coming back to: SIKE's quantum resistance was real. There was no good quantum algorithm for the underlying problem, and there still isn't. It fell to a classical attack nobody had found in ten years — one that climbed the scheme's algebraic structure, not its key size.

None of this was obvious in advance. The torsion images had been published for a decade and studied by experts. The break needed a tool — Kani's lemma, genus-2 isogenies — that simply wasn't in the average cryptographer's kit. It wasn't a bug; it was a bridge between two fields that hadn't been crossed yet.

A challenge: SIKE!

I built a challenge around exactly this, and it's live on Dreamhack: SIKE!.

It hands you one complete run of the key exchange — both public keys, the torsion images φ()\varphi(\cdot), and a flag sealed under j(EAB)j(E_{AB}). The parameters are real-SIKE-sized: large enough that the brute-force instincts (guess β\beta, meet in the middle at p1/4p^{1/4}) are hopeless, small enough that the right attack finishes in seconds. (An earlier version of mine was small enough to meet-in-the-middle — which missed the entire point, because the torsion images went untouched, the one part that actually matters. So I grew it until the only door left was the structure.)

I won't tell you which attack. If you read this far, you already know its name, and you've seen the shape of the oracle it's built on. The real work is the part this post skipped: going from "I know this break exists" to "I made it run on these numbers." That gap is most of applied cryptanalysis, and it's a genuinely satisfying one to cross.

Go break it. It won't even take an afternoon.

← All writingTop ↑