A Full-Round Collision in Poseidon
Authors
QED
Category
Deep Dive
Published
September 14, 2026
Anthropic’s HAWK post showed that LLMs can do actual cryptanalysis research. Since then, we have been exploring LLM-based cryptanalysis across a range of targets.
With ChatGPT Pro, we constructed a full 28-round collision for the Poseidon Cryptanalysis Initiative’s Poseidon1 Collision challenge. Two distinct messages with the required prefix produce identical 16-word outputs under the challenge’s reference implementation.
The challenge
In this challenge, the Poseidon function operates over the prime field , where , with a 16-word state in . Its 28 rounds consist of four full rounds, twenty partial rounds, and four more full rounds.

If is the state entering round , then
where is the public round constant and is the full or partial S-box layer.
A full-round S-box layer cubes every coordinate, whereas a partial-round layer cubes only coordinate 0.
Write for the complete 28-round permutation. The challenge uses feed-forward compression:
The full-collision goal is to find two distinct inputs and such that
The challenge allowed submitters to choose the MDS matrix . We designed the collision first and the matrix second: we constructed two state trajectories that collide, then solved for the linear map that realizes them.
Decoupling midpoint and difference
Let and be the two states entering round , with and . Define their midpoint and half-difference by
Equivalently, and .
If the permutation ends with
then and . Feed-forward gives
so .
Our construction uses two mechanisms:
-
reset the midpoint to zero;
-
keep control of the half-difference and return it with the opposite sign.
Together, these two mechanisms give 16 linear constraints on the same matrix : 14 from the midpoint reset and 2 from controlling the half-difference. These 16 constraints uniquely determine .
Mechanism 1: Resetting the midpoint
The first key intuition is to constrain so that the midpoint () at every even round entry becomes zero. This is possible because the cubic S-box is odd: if its two inputs are exact opposites, its outputs are also exact opposites, so their midpoint is zero.
After adding , the midpoint immediately before the first S-box is . Let the midpoint after that S-box be
If the matrix satisfies
then the midpoint after is . Adding turns it into .
The second S-box therefore sees exact opposites. Cubing preserves that relation, and multiplying by preserves it again, so the block ends with
There are fourteen two-round blocks, so the reset eventually gives fourteen requirements
At this point, these are only requirements. The vectors depend on the half-differences entering the blocks, so they cannot be computed until the difference has been designed. We therefore leave the matrix aside and determine the half-differences first.
Mechanism 2: Keeping the difference on one coordinate
We force the half-difference at every even-round boundary to be nonzero only in coordinate 1:
where is the scalar amplitude of the half-difference.
During the twenty partial rounds, we keep the even-round half-difference equal to for one nonzero field element . The key is to arrange the twenty partial rounds so that the same two-round differential pattern can be repeated throughout.
Choose a vector with
while remains free. Let be the vector determined by what the second partial S-box does when the midpoint is zero:
This mechanism contributes exactly two constraints on :
The same two constraints will be reused in every pair of partial rounds.
Now we can see the pattern of half-difference during one pair of partial rounds:
The full two-round blocks work similarly. The half-difference remains on coordinate 1, but its amplitude changes.
Building the trajectories
and determine , and we already know and is determined by . Therefore, we will build the solution by fixing .
First, choose a nonzero field element at random and set . We can show that once is chosen, and are already fixed as well. Also, feed-forward requires the initial amplitude to be the negative of the final one, so
We then solve for the amplitude immediately before the partial rounds. For the block covering rounds 2 and 3, the following relation must hold:
A root in gives . Finally, the first block has both endpoint amplitudes determined, and . Its equation determines the required coordinate-1 value of the initial midpoint .
The resulting sequence is shown below.
If one of the required root conditions fails, we try another . The remaining coordinates of , the active coordinate , and the passive signs of are still available when constructing the matrix.
Constructing the matrix
Now all conditions are known. At even rounds , the midpoint is zero, and every half-difference is the known value . Together with the selected initial midpoint, this determines the midpoint immediately after the first S-box in every block.
The fourteen midpoint requirements and the two difference requirements are
Collect their sixteen source vectors and targets as the columns of two matrices:
The first fourteen columns encode the midpoint resets, while the last two encode difference control.
All requirements are contained in . If is invertible, exactly one matrix satisfies them:
Note: is not automatically MDS (equivalently, every square submatrix is nonsingular), nor is it guaranteed to pass the linear-layer checks. Those properties are filters. When we experimented with random , more than 30% of attempts produced a valid trajectory (that is, the equations had a solution) and an MDS matrix that passed the Initiative’s checks.
Verification
We verified that the witness passes the Initiative’s verifier, and independently checked that is MDS. The GitHub repository contains the matrix, both inputs, and the verification code.
The construction relies on choosing . After reviewing this class of custom-matrix submissions, the Poseidon Group said that these submissions were outside the intended scope of the main bounty. They nevertheless described the submissions as highlighting a previously unexplored attack vector and offered us a special US$10,000 ex gratia payment.
What the construction shows
This is a failure mode of adaptive parameter selection. The round constants are not individually weak, and the matrix passes the required matrix-level checks. The collision comes from their correlation: the matrix was constructed as a function of the already specified round constants.
This does not apply when the matrix is specified, as in deployed Poseidon instances. A related parameter-selection viewpoint appeared independently in Slipway through a different Poseidon attack mechanism.
Takeaway
Since then, we have kept working on cryptanalysis using LLMs and found several meaningful results: Witness Encryption Scheme Based on Affine Determinant Programs, a major witness-encryption candidate, and A Key-Recovery Attack on TALUS v4, a candidate for the NIST post-quantum threshold call.
Cryptography broadly is moving fast right now. The McEliece cryptosystem, unbroken for nearly 50 years, is now under real cryptanalytic pressure. A claimed polynomial-time quantum algorithm for the Dihedral Coset Problem, which would have broken the lattice assumptions behind ML-KEM and ML-DSA, was soon refuted. Three independent teams found new attacks on Poseidon within weeks of each other.
At the same time, AI-assisted research is making SHA/BLAKE proving much faster, as Flock and the SNARK.fast challenge demonstrate. Justin Drake announced Ethereum’s planned move from Poseidon to SHA/BLAKE at L1. With LLMs, more efficient cryptography will emerge and will be contested super hard, and only the safe ones will survive.