Fix a field K with charK=2,3. An algebraic closure of K is denoted K and is a field extension of K where every non-constant polynomial with coefficients in K has a root in K.
An elliptic curve can be represented by a short Weierstrass equation
E:y2=x3+ax+b,a,b∈K.
Such a curve is smooth (nonsingular) if and only if the discriminant
Δ=−16(4a3+27b2)
is nonzero, which simplifies to the condition 4a3+27b2=0.
The j-invariant of the curve, which will play a central role in the protocol, is defined as
j(E)=17284a3+27b24a3.
Supersingular Curves
Assume charK=p>0. We call Esupersingular if the only point satisfying pP=O is P=O, equivalently, there are no nonzero p-torsion points over K. Otherwise the curve is ordinary.
Why supersingular curves.
A practical advantage of supersingular curves is that all supersingular j-invariants lie in Fp2. Consequently, we can perform arithmetic entirely over the quadratic field Fp2, avoiding computations in higher extensions which are more expensive.
The ℓ-torsion subgroup
For ℓ≥1, the ℓ-torsion subgroup consists of all points annihilated by multiplication by ℓ:
E[ℓ]={P∈E(K):ℓP=O}.
Let K be a field with charK=p and E/K an elliptic curve. Denote by E[p] the p-torsion subgroup. Then
E[p](K)≅{O}orE[p](K)≅Z/pZ.
Equivalently,
E is supersingular ⟺E[p](K)={O},
while for ordinary curves one has E[p](K)≅Z/pZ.
Example
Let's find the 2-torsion subgroup for the curve y2=x3+x+3 defined over F5. The definition of a 2-torsion subgroup is
E[2]={P∈E(F5):2P=O}.
If we visualize this, the 2-torsion points are the intersections on the x-axis
so to find these points we need to solve for x3+x+3=0
### Field and curveF = GF(5)E = EllipticCurve(F,[0,0,0,1,3])# y^2 = x^3 + 1*x + 3### --- 2-torsion criterion (char ≠ 2): points with y=0 and x roots of f(x)=x^3 + x + 3R.<x>= PolynomialRing(F)f = x^3+ x +3print("Over F_5, f factors as:", f.factor())### We see only one linear factor (x-1), so only (1,0) is 2-torsion over F_5P_F5 = E(1,0)print("Check 2*P_F5 == O?",2*P_F5 == E(0))### --- Go to quadratic extension to get full E[2]K.<u>= GF(5^2)## quadratic extensionEK = E.change_ring(K)R2.<x>= PolynomialRing(K)fK = R2(f)print("Over F_25, f factors as:", fK.factor())### Collect all 2-torsion points over F_25: the three roots give (x_i, 0), plus Oroots =[r for(r, mult)in fK.roots()]## three distinct roots in K (since char!=2 and Δ ≠ 0)E2 =[EK(0)]+[EK(r, K(0))for r in roots]print("E[2] over F_25 has size:",len(E2))print("E[2] points:")for Q in E2:print(" ", Q)### Sanity: each nonzero 2-torsion point has order 2print("Orders of nonzero 2-torsion points:")for Q in E2[1:]:print(Q.order())
After running the code we see that there are 3 non-trivial 2-torsion points along with the point at infinity in the subgroup.
Isogenies
An isogenyφ:E1→E2 is a non-constant group homomorphism given by rational functions. Such maps are automatically surjective with finite kernel. On short Weierstrass models, after normalizing so that φ(O)=O, an isogeny takes the affine form
φ(x,y)=(g1(x)f1(x),y⋅g2(x)f2(x)),
where the degree is defined as degφ=max{degf1,degg1}. When φ is separable, meaning the derivative (g1f1)′ is not identically zero, the degree equals the size of the kernel: degφ=#kerφ.
Supersingularity is preserved by isogeny:
E1 supersingular ⟺E2 supersingular.
Example
Let's look at the isogeny from the elliptic curve y2=x3+x+3 defined over F5 to itself defined by the multiplication-by-2 map. The isogeny takes every point P to its double
φ:P→2P
### Field and curveF = GF(5)E = EllipticCurve(F,[0,0,0,1,3])## y^2 = x^3 + 1*x + 3### --- Go to quadratic extensionK.<u>= GF(5^2)## quadratic extensionEK = E.change_ring(K)Xmap, Ymap = EK.multiplication_by_m(2)print("x(2P) =", Xmap)print("y(2P) =", Ymap)
The kernel for this isogeny is exactly the 2-torsion subgroup we saw earlier, the cardinality of which was 4 and that is consistent with the degree of our isogeny.
Composition and Duality
If φ:E→E′ and ψ:E′→E′′ are isogenies, their composition
ψ∘φ:E⟶E′′
is again an isogeny, and its degree multiplies:
deg(ψ∘φ)=degψ⋅degφ.
An isomorphism is just an isogeny of degree 1 whose kernel is {O}; composing an isomorphism with its inverse is the identity. For a general isogeny φ:E→E′ of degree d>1, there is no inverse in the usual sense. Instead, there exists a unique dual isogenyφ:E′→E that "acts like" an inverse up to multiplication-by-d:
φ∘φ=[d] on E,φ∘φ=[d] on E′.
Thus the composition returns to the same curve and its kernel is the full d-torsion:
ker(φ∘φ)=E[d],ker(φ∘φ)=E′[d].
Isomorphisms and the j-Invariant
An isomorphismψ:E1→E2 over K is an isogeny of degree 1, taking the form
(x,y)⟼(u2x,u3y),u∈K×.
Isomorphisms preserve the j-invariant: if ψ:E1→E2 is an isomorphism, then j(E1)=j(E2). Over an algebraically closed field, the converse holds: two elliptic curves are isomorphic if and only if their j-invariants coincide.
The number of supersingular j-invariants in characteristic p is
sp=⌊12p⌋+εp,εp∈{0,1,2},s2=s3=1,
giving approximately sp≈p/12 such invariants.
Constructing Isogenies from Kernels
In some applications, we know the kernel of a desired isogeny but need to construct the explicit map. Specifically, given an elliptic curve E and a finite subgroup G⊆E, we wish to compute the isogeny φ:E→E/G whose kernel is precisely G.
Vélu's formulas solve this problem. They take as input the coefficients (a,b) defining the curve E:y2=x3+ax+b and the list of all nonzero points in the subgroup G (or simply a generator when G is cyclic). From this data, Vélu's formulas produce:
The rational functions φ(x,y)=(X(x),Y(x,y)) defining the isogeny, and
The coefficients (a′,b′) of the codomain curve E/G:y2=x3+a′x+b′.
For a cyclic subgroup ⟨P⟩ of order m, the resulting isogeny
φ:E⟶E/⟨P⟩
is separable with degφ=m=#kerφ. This kernel-first approach is fundamental to isogeny-based cryptography, where parties construct secret isogenies by choosing secret kernel generators.
### Base curve over F_5, then extend to F_{5^2} so E[2] is fully definedF = GF(5)E = EllipticCurve(F,[0,0,0,1,3])## y^2 = x^3 + x + 3K.<u>= GF(5^2)EK = E.change_ring(K)### E[2] points: roots of x^3 + x + 3 with y=0 R.<x>= PolynomialRing(K)f = x^3+ x +3roots =[r for(r, _)in f.roots()]## 3 distinct roots in KE2_pts =[EK(r, K(0))for r in roots]## the three nonzero 2-torsion points### Pass a LIST OF GENERATORS for the kernel subgroup (any two independent E[2] points)phi2 = EllipticCurveIsogeny(EK, E2_pts[:2])## uses Vélu with kernel generated by these pointsE2cod = phi2.codomain()print("deg(phi2) =", phi2.degree())## should be 4### Kernel sanity: all of E[2] (including O) maps to Ofor Q in[EK(0)]+ E2_pts:assert phi2(Q)== E2cod(0)print("Kernel OK (E[2] → O).")
In SageMath the EllipticCurveIsogeny constructor takes as input a starting curve and a point or list of points that generate the kernel and uses Vélu's formulas to construct the isogeny.
The SIDH Protocol
Protocol Parameters
SIDH begins with a prime of the form
p=2eA3eB−1,
where eA and eB are positive integers chosen such that 2eA≈3eB. All computations are performed over the quadratic extension field Fp2.
This prime structure is carefully chosen. For a supersingular curve E defined over Fp2, the number of Fp2-rational points is
#E(Fp2)=(p+1)2,
and the group structure is
E(Fp2)≅Zp+1×Zp+1.
Since p+1=2eA3eB, the curve contains points of every order dividing 2eA3eB. This enables Alice and Bob to independently traverse their respective isogeny graphs using powers of 2 and 3.
The Isogeny Graphs
The protocol operates on two supersingular isogeny graphs sharing the same vertex set but with different edge structures.
Vertices represent isomorphism classes of supersingular elliptic curves over Fp2, uniquely identified by their j-invariants.
Edges are defined by isogenies: for a prime ℓ coprime to p, an ℓ-edge connects vertices [E] and [E′] if there exists a separable ℓ-isogeny φ:E→E′ over Fp2.
For ℓ=p, the ℓ-torsion subgroup has structure
E[ℓ]≅(Z/ℓZ)2,
containing exactly ℓ+1 cyclic subgroups of order ℓ. Each cyclic subgroup G⊆E[ℓ] determines a unique separable isogeny φG:E→E/G via Vélu's formulas. Consequently, each vertex in the ℓ-isogeny graph has exactly ℓ+1 neighbors.
For Alice's 2-isogeny graph, each vertex has 3 outgoing edges (with negligible exceptions). For Bob's 3-isogeny graph, each vertex has 4 outgoing edges.
Public Parameters
The protocol requires a fixed supersingular starting curve E0 defined over Fp2 and two pairs of torsion basis points:
{PA,QA}⊂E0[2eA],{PB,QB}⊂E0[3eB].
These bases generate the torsion subgroups
E0[2eA]≅(Z/2eAZ)2,E0[3eB]≅(Z/3eBZ)2.
Key Generation
Alice's key generation:
Alice selects a secret integer kA∈{0,1,…,2eA−1} and constructs the kernel generator
RA=PA+[kA]QA.
The cyclic subgroup GA=⟨RA⟩⊂E0[2eA] has order 2eA. Alice computes the isogeny
φA:E0→EA:=E0/GA
as a composition of eA successive degree-2 isogenies, effectively traversing eA edges in the 2-isogeny graph.
Alice's public key is
PKA=(EA,φA(PB),φA(QB)).
The public key includes both the image curve EA and the images of Bob's torsion basis points under her secret isogeny.
Bob's key generation:
Bob follows the analogous procedure using 3-power isogenies. He selects a secret kB∈{0,1,…,3eB−1} and constructs
RB=PB+[kB]QB,GB=⟨RB⟩⊂E0[3eB].
Bob computes the isogeny
φB:E0→EB:=E0/GB
as a composition of eB successive degree-3 isogenies.
Bob's public key is
PKB=(EB,φB(PA),φB(QA)).
Shared Secret Computation
Alice's computation:
Upon receiving Bob's public key, Alice constructs
using the fact that isogenies are group homomorphisms. The cyclic subgroup ⟨SA′⟩ equals φB(GA), the image of Alice's original kernel under Bob's isogeny.
Alice then computes
ϕA′:EB→EBA:=EB/⟨SA′⟩.
Bob's computation:
Bob performs the symmetric computation, constructing
SB′=φA(PB)+[kB]φA(QB)=φA(RB)
so that ⟨SB′⟩=φA(GB), and computing
ϕB′:EA→EAB:=EA/⟨SB′⟩.
The shared secret:
A fundamental theorem of isogeny theory guarantees a canonical isomorphism
(E0/GA)/φA(GB)≅(E0/GB)/φB(GA),
which implies EAB≅EBA and therefore j(EAB)=j(EBA).
The shared secret is the common j-invariant:
Shared secret=j(EAB)=j(EBA)
Both parties arrive at isomorphic curves and compute the same j-invariant. The security of SIDH relies on the computational difficulty of determining the isogeny φA (or φB) from knowledge of E0 and EA (or EB), a problem believed to be hard even for quantum computers.
Example Walkthrough
For our example we choose the prime to be p=2433−1, the starting curve E0 is y2=x3+a0x2+x where a0=329i+423. Next we fix the basis points for Alice and Bob
Alice generates a secret number kA=11 and computes the kernel generator point
SA=PA+[kA]QA=(271i+79,153i+430).
This point has order 16 which could express a degree 16 isogeny or a composition of 4 degree 2 isogenies. The latter is favorable for computational purposes so Alice computes the 4 "hops" in the isogeny graph using Vélu's formulas at each step and lands on the image curve which will be her public key (encoded by its Montgomery parameter) along with Bob's basis points under the same secret isogeny
The below image shows the "hops" Alice takes on the j-invariants of her respective curves.
Bob also chooses a secret parameter kB=2 and computes the corresponding generator point
SB=PB+[kB]QB=(122i+309,291i+374).
which has order 27 meaning Bob can interpret it as a composition of 3 degree 3 isogenies. His public key is also the resulting curve and Alice's basis points under his secret isogeny
Now for the shared secret computation, Alice takes Bob's codomain curve from his public key as the starting point then calculates the kernel using the image of her basis points that Bob provided
SA′=φB(PA)+[kA]φB(QA)=(125i+357,415i+249).
and just like before computes the image curve using the kernel generated by SA′.
Bob goes through the same steps and ends up with
SB′=φA(PB)+[kB]φA(QB)=(393i+124,187i+380).
After these steps they both land on the node with j-invariant = 243, and this shared secret can be used to derive cryptographic keys.
The Castryck-Decru Attack
The Security Problem and Attack Strategy
The security of SIDH rests on the hardness of the following problem: given two supersingular curves E0 and EB=E0/⟨RB⟩, recover the secret cyclic kernel ⟨RB⟩ that defines the separable isogeny of degree 3eB.
When walking along a 3-isogeny path, there are 4 degree-3 choices at the first step. After ruling out the dual edge (which returns to the previous curve), there remain 3 choices at each subsequent step. If an oracle existed that could test whether a proposed next 3-isogeny lies on the secret path, one could recover the entire path by testing the 3 candidates at each level.
The Castryck-Decru attack constructs such an oracle by lifting from elliptic curves (dimension 1) to principally polarized abelian surfaces (dimension 2), where testing whether the surface is a Jacobian versus a product of elliptic curves provides the required signal.
The Oracle Construction
The core idea is based on a theorem by Kani relating isogeny diamonds to products of elliptic curves.
The attack constructs such a diamond in dimension 2 by:
Starting with a product of elliptic curves C×Eicand
Using a (2eA,2eA)-isogeny that "glues" the product into a genus-2 Jacobian
Computing a chain of Richelot (2,2)-isogenies (the higher-dimensional analogue of degree-2 isogenies between elliptic curves)
Testing whether the final codomain splits back into a product
The key insight is that the final surface is a product of elliptic curves if and only if the candidate 3-isogeny Ei−1→Eicand lies on Bob's secret path. This follows from Kani's theorem combined with the specific structure of the diamond.
Since a random principally polarized abelian surface of dimension 2 is a Jacobian with probability approximately 1−1/p, while a product occurs with probability roughly 1/p, this test reliably distinguishes correct from incorrect candidates.
The Attack Algorithm
The attack recovers Bob's secret isogeny φB:E0→EB=E0/⟨RB⟩ of degree 3eB by determining it one step at a time. Since Bob computes his isogeny as a composition of eB successive degree-3 isogenies, the attacker recovers each individual 3-isogeny in the chain using the dimension-2 oracle.
Input
The starting curve E0
The image curve EB=E0/⟨RB⟩
The torsion images (φB(PA),φB(QA)) from Bob's public key, where {PA,QA} generates E0[2eA]
The Iterative Recovery Process
Bob's secret isogeny is a composition of eB degree-3 isogenies:
The attack recovers these isogenies sequentially. At step i, having already recovered φ1,…,φi−1, the attacker knows the current curve Ei−1 and seeks to determine φi:Ei−1→Ei.
Step i: Recovering the next 3-isogeny
Identify the candidate edges:
From curve Ei−1, there are 4 outgoing 3-isogenies. However, one of these is the dual of the incoming isogeny φi−1, which can be ruled out (except at the first step). This leaves 3 candidate edges to test.
Construct the auxiliary isogeny:
The oracle requires an auxiliary isogeny of degree c=2eA−3eB−i. Assuming E0 has a known endomorphism (such as 2i satisfying 2i∘2i=[−4]), and assuming c can be written as c=u2+4v2, construct the degree-c endomorphism:
γ:E0→C,γ=[u]+[v]∘2i.
Evaluate γ on the generators to obtain:
Pc=γ(PA),Qc=γ(QA)∈C[2eA].
Test each candidate:
For each of the 3 candidate isogenies φicand:Ei−1→Eicand:
a. Push the torsion through the candidate path:
Compute the images of the generators under the composition of the recovered path and the candidate:
b. Form the diamond kernel:
Consider the (2eA,2eA)-subgroup of C×Eicand generated by:
⟨(Pc,Picand),(Qc,Qicand)⟩.
This subgroup always defines a (2eA,2eA)-isogeny.
c. Glue into dimension 2:
The first step of this (2eA,2eA)-isogeny is a gluing map that takes the product of elliptic curves C×Eicand to the Jacobian of a genus-2 curve Jac(H).
d. Compute the Richelot chain:
Compose eA−1 successive Richelot (2,2)-isogenies:
Jac(H0)→Jac(H1)→⋯→Jac(HeA−1)→AeA.
e. Test for splitting:
After the chain of Richelot isogenies, check whether the final (2,2)-isogeny splits—that is, whether its codomain AeA is a product of two elliptic curves rather than a Jacobian of a genus-2 curve.
The test is straightforward: in the Richelot formulas, a certain determinant δ appears. The codomain is a product if and only if δ=0.
f. Apply Kani's theorem:
If δ=0 (splits): By Kani's theorem, this happens if and only if the candidate φicand lies on the true secret path. The attacker has found the correct next edge.
If δ=0 (Jacobian): The candidate is incorrect. Since the probability that a random abelian surface is a product is approximately 1/p, this test reliably distinguishes correct from incorrect candidates.
Advance to the next step:
Once the unique candidate that makes the diamond split is identified, set φi=φicand and update the current curve to Ei. Proceed to step i+1.
Termination and Output
After eB iterations, the complete chain φ1∘φ2∘⋯∘φeB has been recovered. This determines Bob's secret isogeny φB and its kernel ⟨RB⟩.
In terms of Bob's secret key: if Bob's private key is the integer kB∈[0,3eB) such that kerφB=⟨PB+[kB]QB⟩, then the attack recovers kB one base-3 digit at a time.
Why the Auxiliary Information Enables the Attack
A crucial aspect of the attack is its reliance on the torsion point information in SIDH public keys. Recall that Alice's public key includes not just her image curve EA, but also the images φA(PB),φA(QB) of Bob's torsion basis.
This auxiliary information is essential for SIDH's key exchange mechanism—without it, Bob cannot compute the shared secret. However, it also provides the attacker with the ability to:
Push torsion points through candidate isogeny paths
Construct the (2eA,2eA)-subgroups needed for the gluing maps
Build the dimension-2 diamonds that form the oracle
Without this torsion point information, the attack does not apply. This observation led to the development of SIDH variants that attempt to hide or obfuscate the torsion point images, though designing secure and efficient alternatives remains an active area of research.
Generalizations and Variants
The simplified description above assumes:
The starting curve is E0 itself (no intermediate isogeny to a special curve)
Each iteration recovers a single 3-isogeny (one base-3 digit at a time)
The degree c=2eA−3eB−i has the form u2+4v2
In the more general attack:
The starting curve E0 may differ from a curve with known endomorphisms, requiring an initial isogeny τ:E0→Estart where Estart has explicit endomorphisms
Each iteration may recover multiple 3-isogenies at once (larger steps, recovering multiple base-3 digits), reducing the total number of iterations at the cost of more candidates per iteration
The construction of the auxiliary isogeny may use different quadratic forms or more sophisticated techniques when c does not have the form u2+4v2
Regardless of these variations, the core logic remains the same: use the dimension-2 oracle to test candidate edges one step at a time until the entire secret path is recovered.
Impact and Aftermath
The Castryck-Decru attack, published in July 2022, completely broke SIDH security. Within hours of the preprint appearing on ePrint, the attack was implemented and verified against SIDH implementations. The attack applies to all standard SIDH parameter sets and cannot be mitigated by simply increasing key sizes.
This development eliminated SIDH as a candidate for post-quantum cryptography standardization. The attack highlighted the danger of including auxiliary information (torsion point images) in isogeny-based protocols, spurring research into alternative designs that either avoid this information or protect it through other means.
Acknowledgements
This write-up closely follows and synthesizes material from the three references listed below.
The author gratefully acknowledges these works for their clear notation, precise statements of facts, and concrete algorithmic descriptions, which this post reproduces and condenses for a cohesive, technically faithful walkthrough of SIDH and its break.