<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Parag Mali - tag: falcon</title><description>Posts tagged falcon.</description><link>https://paragmali.com/</link><language>en-US</language><lastBuildDate>Sat, 25 Jul 2026 08:57:52 GMT</lastBuildDate><atom:link href="https://paragmali.com/tags/falcon/rss.xml" rel="self" type="application/rss+xml"/><item><title>How Falcon Would Break: NTRU Lattices and the Structure Nobody Fully Trusts</title><link>https://paragmali.com/blog/how-falcon-would-break-ntru-lattices-and-the-structure-nobod/</link><guid isPermaLink="true">https://paragmali.com/blog/how-falcon-would-break-ntru-lattices-and-the-structure-nobod/</guid><description>Falcon is NIST&apos;s smallest post-quantum signature and its only lattice one still in draft. A structural case for why its likeliest break is NTRU-specific.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><content:encoded>
**Falcon is the smallest signature NIST chose for the post-quantum era, and the only lattice one still in draft.** Its security rests on three assumptions. Two are provably solid; one -- the NTRU quotient $h = g/f$ -- is not. This is the argument that when Falcon eventually breaks, the crack most likely starts in that NTRU structure: not from Shor (which cannot touch it), not from the transcript leak that broke its ancestor (which Falcon provably closes), but from the one assumption Falcon cannot insure. &quot;Most likely&quot; is a ranked judgment, and the safety margin behind it is thinner than you would expect.
&lt;h2&gt;1. The One Standardized Signature Nobody Fully Trusts&lt;/h2&gt;
&lt;p&gt;Falcon is the smallest signature NIST chose for the post-quantum era. A Falcon-512 signature is 666 bytes and its public key is 897 bytes -- roughly the classical security of RSA-2048 [@falcon-spec]. It is also the only one of NIST&apos;s lattice signatures still stuck in draft. &lt;a href=&quot;https://paragmali.com/blog/one-event-three-assumptions-five-answers-a-field-guide-to-th/&quot; rel=&quot;noopener&quot;&gt;ML-DSA and SLH-DSA&lt;/a&gt; were finalized as FIPS 204 and FIPS 205 in 2024, while FN-DSA -- Falcon&apos;s standardized name -- remains a draft as of mid-2026 [@nist-pqc] [@fips-206-status]. And it is the only standardized signature whose core hardness assumption has a published regime where it simply collapses [@ducas-vanwoerden-2021].&lt;/p&gt;
&lt;p&gt;Here is the detail that should make you lean in. Pierre-Alain Fouque co-designed Falcon [@falcon-spec]. He is also a co-author of the attack that maps where NTRU&apos;s collapse begins [@kirchner-fouque-2017]. The person who helped build the trapdoor also helped chart its fault line. That is not a scandal. It is the tell.&lt;/p&gt;
&lt;p&gt;So this article asks the diagnostic question of the &lt;em&gt;How It Would Break&lt;/em&gt; series: when Falcon eventually cracks, where does the crack start? The answer, argued before any math, is that the likeliest &lt;strong&gt;structural&lt;/strong&gt; break is NTRU-specific -- a sharper exploitation of the ratio $h = g/f$, or a downward push of a documented failure boundary toward Falcon&apos;s own parameters.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Among all the ways Falcon&apos;s own mathematics could fail, the most likely structural break is NTRU-specific. It ranks above a generic lattice-reduction advance (which threatens every lattice scheme equally, so is not Falcon&apos;s alone) and above the transcript leakage that broke Falcon&apos;s ancestor (which Falcon provably closes). This is a ranked judgment, not a documented break -- and earning that ranking is the whole point of the article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Three hypotheses will compete for the title of &quot;Falcon&apos;s likeliest crack.&quot; Hypothesis A is the NTRU-specific advance -- the thesis. Hypothesis B is a generic improvement to lattice reduction that would hit Dilithium and Kyber too. Hypothesis C is the transcript leak that felled NTRUSign. By the end you will see why A wins the &lt;em&gt;structural, Falcon-specific&lt;/em&gt; question, why B is the larger but non-specific existential risk, and why C is already closed.&lt;/p&gt;

flowchart LR
    A[&quot;NTRU 1996: public key is the ratio g/f&quot;] --&amp;gt; B[&quot;NTRUSign 2003: deterministic good-basis signing&quot;]
    B --&amp;gt; C[&quot;Nguyen-Regev 2006: the transcript reveals the key&quot;]
    C --&amp;gt; D[&quot;GPV 2008: provable Gaussian sampling&quot;]
    D --&amp;gt; E[&quot;Falcon 2017: GPV over NTRU, fast-Fourier sampled&quot;]
    E --&amp;gt; F[&quot;Overstretched NTRU 2016-2021: a documented cliff&quot;]
    F --&amp;gt; G[&quot;Draft FIPS 206: where does the crack start?&quot;]

Falcon -- Fast-Fourier Lattice-based Compact signatures over NTRU, standardized as FN-DSA -- is a hash-and-sign digital signature over an NTRU lattice. Its private key is a short trapdoor basis; its public key is the single ring element $h = g/f$; signing samples a short discrete-Gaussian preimage of the hashed message [@falcon-spec]. It produces the smallest signatures of any standardized lattice scheme and is draft FIPS 206 as of mid-2026 [@fips-206-status].
&lt;p&gt;One fence, stated once: this is a structural analysis. Side channels, Falcon&apos;s floating-point sampler, fault and power attacks, RNG failures, and protocol misuse attack the &lt;em&gt;code&lt;/em&gt;, not the mathematics. They belong to this article&apos;s empirical sibling, &lt;em&gt;How the NIST Finalists Broke: Rainbow in a Weekend, SIKE in an Afternoon, and the Graveyard of Post-Quantum Candidates&lt;/em&gt;, and appear here only to mark the boundary. This is Part 7 of the series.&lt;/p&gt;
&lt;p&gt;To see why the crack starts in the NTRU structure, you first have to see what Falcon actually is -- and why its smallness is not free.&lt;/p&gt;
&lt;h2&gt;2. What Falcon Actually Is: GPV Hash-and-Sign over an NTRU Lattice&lt;/h2&gt;
&lt;p&gt;Every signature scheme is a way to prove you know a secret without revealing it. Falcon&apos;s way is to be the only person on earth who can find a &lt;em&gt;short&lt;/em&gt; vector in one particular lattice.&lt;/p&gt;
&lt;p&gt;Start with the public key. It is a single element of a polynomial ring, $h = g/f$, where $f$ and $g$ are two short secret polynomials and the division happens modulo a prime $q = 12289$ [@falcon-spec] [@falcon-wiki]. That element $h$ pins down a lattice -- the NTRU lattice -- in which the secret pair $(f, g)$ is an unusually short vector. The private key is a &lt;em&gt;short basis&lt;/em&gt; of that lattice, built from $(f, g)$ and a completing pair. Anyone with the short basis can solve a hard-looking geometry problem cheaply; anyone without it cannot.&lt;/p&gt;

A signature design in which the signer hashes the message to a target point, then uses a secret trapdoor to produce a short value that maps to that target. Verification recomputes the target and checks the value is short and consistent. It contrasts with challenge-response (Fiat-Shamir) designs, which build a signature from an interactive identification protocol made non-interactive [@gpv-2008].
&lt;p&gt;To sign a message, Falcon hashes it (with a random salt) to a target point $c$ in the lattice&apos;s ambient space, then samples a short preimage $(s_1, s_2)$ satisfying $s_1 + s_2 h = c$, with both parts small. That sampling step is the heart of the scheme. Falcon draws the preimage from a &lt;strong&gt;discrete Gaussian&lt;/strong&gt; using a fast-Fourier tree walk over the ring&apos;s recursive structure -- the operation the designers call ffSampling, which runs in $O(n \log n)$ time [@dlp-2014] [@falcon-spec].The FFT tree mirrors the tower of subfields inside the cyclotomic ring: descend it once, sampling one Gaussian coordinate per node, and you have drawn a short preimage without ever forming a full basis matrix.&lt;/p&gt;
&lt;p&gt;To verify, anyone recomputes $s_1 = c - s_2 h$ from the public $h$ and checks that $|(s_1, s_2)|$ falls below a fixed norm bound. The compact half of the signature, $s_2$, plus the salt, is all that travels.&lt;/p&gt;

A probability distribution that gives each lattice point a weight that decays like a bell curve in its distance from a chosen center. Sampling it yields short lattice vectors. Its essential property for Falcon: if the Gaussian is wide enough relative to the basis quality, the output distribution depends only on the lattice and target, not on which basis produced it [@gpv-2008].

sequenceDiagram
    participant M as Message
    participant S as Signer (secret short basis)
    participant T as ffSampling tree
    participant V as Verifier (public h only)
    M-&amp;gt;&amp;gt;S: hash message plus salt to a coset point c
    S-&amp;gt;&amp;gt;T: request a short preimage of c
    T--&amp;gt;&amp;gt;S: discrete-Gaussian preimage s1, s2
    Note over S,T: output is short and provably basis-independent
    S-&amp;gt;&amp;gt;V: send signature, the salt and compact s2
    V-&amp;gt;&amp;gt;V: recompute s1 from c and h, check the norm is small
&lt;p&gt;The numbers are the reason Falcon exists. At Falcon-512 the public key is 897 bytes and the signature 666 bytes; at Falcon-1024 they are 1793 and 1280 bytes [@falcon-spec]. Its nearest standardized rival at the low end of the security range, ML-DSA-44, needs a 1312-byte key and a 2420-byte signature [@fips-204]. Falcon wins on size by a wide margin, and the win comes from NTRU.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Both standardized lattice signatures defeat transcript leakage, by different routes. Falcon uses &lt;strong&gt;hash-and-sign&lt;/strong&gt; with a provable discrete-Gaussian sampler, so the output law is independent of the secret basis. ML-DSA (Dilithium) uses &lt;strong&gt;Fiat-Shamir with aborts&lt;/strong&gt;: it builds a challenge-response proof and applies rejection sampling so the transcript distribution is independent of the secret [@fips-204]. Same goal, two mechanisms -- and only one of them needs the NTRU quotient.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That contrast runs through the rest of the article. ML-DSA rests on Module-LWE; Falcon rests on NTRU. They live over the same kind of polynomial ring, yet one is routinely called the conservative choice and the other the aggressive one. Everything rests on a single asymmetry: with the short trapdoor you can sample these tiny preimages; without it, finding a short vector that maps to $c$ is the NTRU lattice problem, believed hard.FALCON is a backronym: &lt;strong&gt;FA&lt;/strong&gt;st-Fourier &lt;strong&gt;L&lt;/strong&gt;attice-based &lt;strong&gt;CO&lt;/strong&gt;mpact signatures over &lt;strong&gt;N&lt;/strong&gt;TRU [@falcon-spec]. Because the trapdoor lives in the NTRU lattice specifically, it is NTRU -- not &quot;a lattice&quot; in the abstract -- that stands trial here.&lt;/p&gt;
&lt;p&gt;There is one more guarantee to bank. With a genuine discrete Gaussian, Falcon&apos;s key stays statistically hidden even after roughly $2^{64}$ signatures from a single key -- a leakage bound it inherits directly from the underlying proof, discussed in Section 5 [@falcon-spec].That $2^{64}$ figure is a structural, information-theoretic bound on transcript leakage for a true Gaussian. Whether a floating-point implementation emits a true Gaussian is a separate, out-of-scope question, flagged at the boundary in Section 6.&lt;/p&gt;
&lt;p&gt;That compact public key $h = g/f$ is a ratio -- and a ratio is a very particular thing to hand an attacker. To see the handle it creates, we have to go back to 1996.&lt;/p&gt;
&lt;h2&gt;3. Where the Handle Comes From: NTRU and the Quotient&lt;/h2&gt;
&lt;p&gt;In 1996, three Brown University mathematicians -- Jeffrey Hoffstein, Jill Pipher, and Joseph Silverman -- circulated a public-key system built not on factoring or discrete logs but on arithmetic in a polynomial ring. They wanted something far faster than RSA, and they got it. NTRU was published at the Third Algorithmic Number Theory Symposium in 1998 [@ntru-1998]. Hoffstein would, two decades later, be a co-author of Falcon [@falcon-spec]. The line from that ring to the smallest post-quantum signature is short and direct.&lt;/p&gt;
&lt;p&gt;Here is the move that matters for everything after. NTRU works in a polynomial ring and makes its public key a &lt;em&gt;ratio&lt;/em&gt; of two secret elements: $h = g/f$, computed as $g \cdot f^{-1}$ modulo a prime $q$ [@ntru-1998]. Both $f$ and $g$ are &lt;em&gt;short&lt;/em&gt; -- their coefficients are tiny. Their quotient $h$ is not short; it looks like a uniform random element of the ring. To recover the secret is to recover the short $(f, g)$ from the innocuous-looking $h$. That is the NTRU problem.The original 1998 NTRU used the convolution ring $\mathbb{Z}[x]/(x^N - 1)$ with $N$ prime [@ntru-1998]. Falcon keeps the same $g/f$ quotient idea but instantiates it over the power-of-two cyclotomic ring $\mathbb{Z}_q[x]/(x^n + 1)$, with $n = 512$ or $1024$ and $q = 12289$ [@falcon-wiki]. The dense-sublattice argument is identical for both rings, so the difference is historical precision, not a change in the mechanism.&lt;/p&gt;

The lattice of all pairs of ring elements $(u, v)$ with $v \equiv u \cdot h \pmod q$. Because $h = g/f$ implies $f \cdot h \equiv g$, the secret pair $(f, g)$ lives inside this lattice, and it is one of the shortest vectors there since $f$ and $g$ are short. Recovering a shortest vector recovers the key [@ntru-1998].
&lt;p&gt;Publishing a ratio is not the same as publishing two independent random-looking numbers. The quotient ties $g$ to $f$ through $h$, and that tie is geometric: it plants inside the NTRU lattice a &lt;strong&gt;dense sublattice&lt;/strong&gt;, a region unusually rich in short vectors, spanned by ring-shifts of the secret $(f, g)$. This is the object the entire thesis turns on. Module-LWE -- the assumption under Dilithium and Kyber -- builds its public data differently and does not expose this same handle. Two schemes, the same ring, but only one hands the attacker a ratio.&lt;/p&gt;

The NTRU lattice is the set of pairs of ring elements $(u, v)$ with $v$ congruent to $u \cdot h$ modulo $q$. Each ring element carries $n$ coefficients, so a pair has $2n$ coordinates: a $2n$-dimensional lattice. The secret satisfies $f \cdot h \equiv g$, so $(f, g)$ sits inside it, and it is short because $f$ and $g$ are short. Finding it is a shortest-vector problem in dimension $2n$.
&lt;p&gt;You can watch the quotient hide its secret. The toy below works in a tiny eight-dimensional ring with Falcon&apos;s real modulus. It picks two short secrets, forms the public ratio, and confirms the relation $f \cdot h \equiv g$ -- yet the published $h$ is smeared across the whole range $[0, q)$.&lt;/p&gt;
&lt;p&gt;{`
// NTRU public key in the ring R = Z_q[x]/(x^n + 1).
// The secret is a SHORT pair (f, g); the public key is the ratio h = g/f.
// h looks like uniform noise mod q, yet it hides the short (f, g).
// Recovering (f, g) from h is the NTRU lattice problem: trivial at n = 8,
// believed hard at Falcon&apos;s n = 512.
const q = 12289;   // Falcon&apos;s modulus (prime, 12*1024 + 1)
const n = 8;       // a tiny ring, so every coefficient is printable&lt;/p&gt;
&lt;p&gt;const mod = (a, m) =&amp;gt; ((a % m) + m) % m;
const invMod = (a, m) =&amp;gt; {           // scalar inverse via extended Euclid
  let [o, r] = [mod(a, m), m], [os, s] = [1, 0];
  while (r !== 0) { const k = Math.floor(o / r);
    [o, r] = [r, o - k * r]; [os, s] = [s, os - k * s]; }
  return mod(os, m);
};
const polyMul = (a, b) =&amp;gt; {          // negacyclic convolution: x^n = -1
  const o = new Array(n).fill(0);
  for (let i = 0; i &amp;lt; n; i++) for (let j = 0; j &amp;lt; n; j++) {
    const k = i + j, c = a[i] * b[j];
    if (k &amp;lt; n) o[k] = mod(o[k] + c, q); else o[k - n] = mod(o[k - n] - c, q);
  } return o;
};
const deg = p =&amp;gt; { let d = p.length - 1; while (d &amp;gt; 0 &amp;amp;&amp;amp; p[d] === 0) d--; return d; };
const trim = p =&amp;gt; { const c = p.slice(); while (c.length &amp;gt; 1 &amp;amp;&amp;amp; c[c.length-1] === 0) c.pop(); return c; };
const divmod = (a, b) =&amp;gt; {           // polynomial division over Z_q
  const rem = a.slice(), db = deg(b), lead = invMod(b[db], q);
  const quo = new Array(Math.max(1, rem.length)).fill(0);
  for (let i = rem.length - 1; i &amp;gt;= db; i--) { if (rem[i] === 0) continue;
    const fct = mod(rem[i] * lead, q); quo[i - db] = fct;
    for (let j = 0; j &amp;lt;= db; j++) rem[i - db + j] = mod(rem[i - db + j] - fct * b[j], q);
  } return [trim(quo), trim(rem)];
};
const polyInv = f =&amp;gt; {               // inverse in Z_q[x]/(x^n + 1)
  let r0 = new Array(n + 1).fill(0); r0[0] = 1; r0[n] = 1;
  let r1 = trim(f.slice()), t0 = [0], t1 = [1];
  while (deg(r1) &amp;gt; 0 || r1[0] !== 0) {
    const [quo, rem] = divmod(r0, r1);
    const qt = new Array(quo.length + t1.length).fill(0);
    for (let i = 0; i &amp;lt; quo.length; i++) for (let j = 0; j &amp;lt; t1.length; j++)
      qt[i + j] = mod(qt[i + j] + quo[i] * t1[j], q);
    const tn = new Array(Math.max(t0.length, qt.length)).fill(0);
    for (let i = 0; i &amp;lt; tn.length; i++) tn[i] = mod((t0[i] || 0) - (qt[i] || 0), q);
    [r0, r1] = [r1, rem]; [t0, t1] = [t1, trim(tn)];
  }
  if (deg(r0) !== 0) return null;    // f not invertible; try another f
  const sc = invMod(r0[0], q), o = new Array(n).fill(0);
  for (let i = 0; i &amp;lt; t0.length; i++) o[i] = mod(t0[i] * sc, q);
  return o;
};&lt;/p&gt;
&lt;p&gt;const f = [1, 1, -1, 0, 1, -1, 0, -1];   // short secret (ternary)
const g = [-1, 0, 1, 1, 0, -1, 1, 0];    // short secret (ternary)&lt;/p&gt;
&lt;p&gt;const h = polyMul(g, polyInv(f));          // public key: the ratio g/f
console.log(&quot;secret f (short) :&quot;, f.join(&quot;, &quot;));
console.log(&quot;secret g (short) :&quot;, g.join(&quot;, &quot;));
console.log(&quot;public h = g/f   :&quot;, h.join(&quot;, &quot;));
console.log(&quot;-&amp;gt; h is spread across [0, &quot; + q + &quot;): it looks uniform, but (f, g) are tiny.&quot;);
const ctr = x =&amp;gt; x &amp;gt; q/2 ? x - q : x;  // center into (-q/2, q/2]
const gCheck = polyMul(f, h).map(ctr);     // recompute g = f * h to prove the relation
console.log(&quot;verify f*h == g  :&quot;, gCheck.join(&quot;, &quot;), &quot;(equals g)&quot;);
`}&lt;/p&gt;
&lt;p&gt;In one dimension a ratio modulo $q$ is easy to invert -- rational reconstruction reads off small numerator and denominator in moments. NTRU&apos;s hardness comes from doing this with $n$ coefficients at once, where the short $(f, g)$ is buried in a $2n$-dimensional lattice and only the best reduction algorithms have any chance of digging it out.Falcon&apos;s modulus is $q = 12289 = 12 \cdot 1024 + 1$, chosen so the number-theoretic transform (a fast ring multiplication) has the roots of unity it needs. The value comes from the specification and standard parameter descriptions [@falcon-wiki].&lt;/p&gt;

flowchart TD
    A[&quot;Secret: two short polynomials f and g&quot;] --&amp;gt; B[&quot;Publish h, the ratio of g over f, mod q&quot;]
    B --&amp;gt; C[&quot;h defines the NTRU lattice of dimension 2n&quot;]
    C --&amp;gt; D[&quot;The pair f, g is an unusually short vector in it&quot;]
    C --&amp;gt; E[&quot;The quotient plants a dense sublattice&quot;]
    E --&amp;gt; F[&quot;A structural handle Module-LWE does not expose&quot;]

A sublattice of the NTRU lattice that is unusually rich in short vectors, created by the $g/f$ quotient structure and spanned by ring-shifts of the secret. When the modulus $q$ is large relative to the dimension $n$, this sublattice becomes so short that ordinary lattice reduction discovers it far below the generic cost -- the mechanism behind the overstretched-NTRU attacks of Section 8 [@kirchner-fouque-2017].
&lt;p&gt;A ratio you publish is a door you cannot fully close. The first people to walk through it were not attacking NTRU encryption at all. They were attacking NTRU&apos;s &lt;em&gt;signature&lt;/em&gt; -- and they walked away with the key.&lt;/p&gt;
&lt;h2&gt;4. NTRUSign and the Break That Defines the Design&lt;/h2&gt;
&lt;p&gt;The first NTRU signature verified perfectly, ran fast, and fit in a handful of bytes. It was also fatally, provably insecure -- and the reason has nothing to do with a bug.&lt;/p&gt;
&lt;p&gt;The idea came from a 1997 template by Goldreich, Goldwasser, and Halevi (GGH): a lattice has many bases, some useful and some useless, and that gap is a trapdoor [@ggh-1997].&lt;/p&gt;

A lattice has infinitely many bases for the same set of points. A *good* basis is short and nearly orthogonal, so it solves closest-vector problems cheaply. A *bad* basis spans the identical lattice but is long and skewed, and it does not. Publish the bad basis, keep the good one: everyone can verify, only the holder can sign [@ggh-1997].
&lt;p&gt;NTRUSign, in 2003, made this compact by using the NTRU lattice, whose basis is a few ring elements rather than a full matrix [@ntrusign-2003]. To sign, it hashed the message to a target point and used the secret good basis to round to the nearest lattice vector; the short difference was the signature. Fast, tiny, and correct. And deterministic -- the same message always rounded the same way. That determinism was the wound.&lt;/p&gt;
&lt;p&gt;Think about what each signature reveals. Rounding a target with the secret basis lands you inside the basis&apos;s &lt;strong&gt;fundamental parallelepiped&lt;/strong&gt; -- the tilted box you get by taking the basis vectors as edges. Every signature is one point drawn from that box. Collect a few thousand and their &lt;em&gt;shape&lt;/em&gt; emerges; collect enough and the box&apos;s edges are simply visible, and the edges are the secret basis vectors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Deterministic good-basis signing turns every signature into a sample from the secret fundamental parallelepiped. The signatures are not leaking information &lt;em&gt;about&lt;/em&gt; the key in some indirect way -- their distribution literally &lt;em&gt;is&lt;/em&gt; the secret box. Enough of them, and the secret is not deduced but read off [@nguyen-regev-2006].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In 2006 Phong Nguyen and Oded Regev made this precise and devastating. They cast key recovery as finding the directions in which the signature cloud is flattest -- a fourth-moment (kurtosis) minimization solved by a gradient descent, the same shape of computation as independent-component analysis. From roughly 90,000 signatures they recovered the NTRUSign secret key outright [@nguyen-regev-2006].The ~90,000-signature figure is the original NTRUSign-251 experiment; later analysis cut the sample count and went on to defeat the countermeasures [@nguyen-regev-2006] [@ducas-nguyen-2012]. This was not brute force and not a quantum computer. It was statistics applied to a leak that was baked into the design.&lt;/p&gt;

Correctness is not security -- a hash-and-sign lattice signature can bleed its key through its own transcript.
&lt;p&gt;NTRUSign&apos;s authors tried to save it. They added &lt;em&gt;perturbations&lt;/em&gt; to blur the parallelepiped into a more complicated shape, a zonotope (the Minkowski sum of several segments), hoping to hide the edges. In 2012 Leo Ducas and Nguyen extended the moment method with a covariance-gradient refinement and learned the zonotope too [@ducas-nguyen-2012]. The patch bought a little sample complexity and nothing else.&lt;/p&gt;
&lt;p&gt;This was not the first NTRU-signature dead end, either: the earlier NSS design of 2001 leaked its key almost immediately [@nss-2001], and GGH&apos;s own encryption had already fallen to Nguyen in 1999 [@nguyen-ggh-1999]. GGH-style objects bleed structure; that was becoming a pattern.&lt;/p&gt;
&lt;p&gt;The lesson was total, and it reshaped the field. You cannot obfuscate your way out of an information-theoretic leak. A hash-and-sign lattice signature must leak &lt;em&gt;nothing&lt;/em&gt; about which basis produced it, and &quot;nothing&quot; has to be a theorem, not a hope. This is the first of our three hypotheses for how Falcon breaks -- Hypothesis C, transcript leakage -- raised here so the next section can show how Falcon shuts it. Everything that made NTRUSign attractive survives in Falcon: the NTRU lattice, the compact keys, the hash-and-sign shape. Only the fatal part was cut out.&lt;/p&gt;
&lt;p&gt;And two years before NTRUSign&apos;s perturbation patch even fell, someone had already shown exactly how to prove a signature leaks nothing.&lt;/p&gt;
&lt;h2&gt;5. The Fix Was a Theorem: GPV and Provable Gaussian Sampling&lt;/h2&gt;
&lt;p&gt;The answer to NTRUSign was not a cleverer patch. It was a proof.&lt;/p&gt;
&lt;p&gt;In 2008 Craig Gentry, Chris Peikert, and Vinod Vaikuntanathan published a general framework for trapdoors on hard lattices, and with it the repair for the entire NTRUSign class [@gpv-2008]. The change is one word: stop &lt;em&gt;rounding&lt;/em&gt;, start &lt;em&gt;sampling&lt;/em&gt;. Instead of deterministically snapping a target to the nearest lattice point, draw a preimage from a discrete Gaussian centered on the target, using the secret basis only as a sampling aid.&lt;/p&gt;

Given many random elements of a ring or vector space, find a short, nonzero integer combination of them that sums to zero. It is believed hard on average. Forging a GPV signature reduces to SIS: a forgery is exactly a short solution that the forger should not be able to produce without the trapdoor [@gpv-2008].
&lt;p&gt;The magic is in the width. If the Gaussian is wider than the basis&apos;s longest Gram-Schmidt vector, the distribution of the output depends only on the lattice and the target -- and &lt;em&gt;not&lt;/em&gt; on which basis did the sampling.GPV&apos;s sampler is a randomized nearest-plane walk, the Klein sampler: descend the Gram-Schmidt-orthogonalized basis and draw one discrete-Gaussian coordinate per step. The width must exceed the basis&apos;s longest Gram-Schmidt vector for the independence proof to hold [@gpv-2008]. A good basis and a bad basis, fed the same target, produce statistically identical signatures. So the transcript that gave away NTRUSign now gives away nothing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For a genuine discrete Gaussian, GPV&apos;s output law is a function of the lattice and the target alone; the trapdoor cancels. A transcript is therefore independent of the secret basis in the information-theoretic sense: there is nothing to learn from it, no matter how many signatures an adversary gathers. This is why transcript leakage -- Hypothesis C -- is not Falcon&apos;s likely break. It is closed by a theorem [@gpv-2008].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is also where lattice signatures earn a word they wear with pride. GPV&apos;s security &lt;em&gt;reduces&lt;/em&gt; to SIS, and SIS in the relevant settings enjoys something NTRU does not.&lt;/p&gt;

A proof that solving *random* instances of a problem is at least as hard as solving the *worst imaginable* instance of a related lattice problem. It converts &quot;we tried and could not break this random key&quot; into &quot;breaking a random key would solve a problem believed hard in the absolute worst case.&quot; It is the strongest structural insurance a lattice scheme can carry, because it rules out weak-key classes by construction [@peikert-decade-2016].
&lt;p&gt;Keep that definition in your pocket. It is the hinge of the whole thesis, and it will swing in Section 7.&lt;/p&gt;

flowchart LR
    subgraph D[&quot;Design chain, each fix answers the last break&quot;]
      G1[&quot;GGH and NTRUSign, deterministic rounding&quot;] --&amp;gt; G2[&quot;GPV 2008, provable Gaussian sampling&quot;]
      G2 --&amp;gt; G3[&quot;Falcon, GPV over NTRU&quot;]
    end
    subgraph K[&quot;Attack chain, where each break lands&quot;]
      A1[&quot;Transcript geometry, parallelepiped and zonotope&quot;]
      A2[&quot;NTRU structure, overstretched dense sublattice&quot;]
    end
    A1 -. closed by .-&amp;gt; G2
    A2 -. still open, aimed at .-&amp;gt; G3
&lt;p&gt;There is a catch, and it is the reason GPV alone is not a product. Sampling over a &lt;em&gt;general&lt;/em&gt; lattice needs the full Gram-Schmidt basis in memory and costs on the order of $n^2$ time and space, with signatures and keys to match [@gpv-2008]. GPV is not a broken scheme; it is the &lt;em&gt;correct&lt;/em&gt; scheme, too heavy to deploy as written. It was outgrown, not defeated -- a distinction worth holding onto, because it is the opposite of what happened to NTRUSign.&lt;/p&gt;
&lt;p&gt;So the state of play by 2008 was strange and specific. Cryptographers had a signature that provably leaked nothing, backed by a reduction to SIS, and it was too slow and too large to use. They had, separately, a lattice with tiny keys and a fast ring structure -- NTRU -- carrying an assumption nobody could prove. GPV told you &lt;em&gt;what&lt;/em&gt; to sample. It did not tell you how to do it small and fast. The lattice that answered that question was the one with the handle.&lt;/p&gt;
&lt;h2&gt;6. Falcon: GPV, NTRU Compactness, and a Tree You Can Walk in n log n&lt;/h2&gt;
&lt;p&gt;Take the theorem that fixes the leak. Instantiate it over the lattice with the smallest keys in the business. Sample its Gaussian by walking a tree in $O(n \log n)$. That is Falcon -- and its genius is also its single uninsured bet.&lt;/p&gt;
&lt;p&gt;The missing engine arrived in 2014, when Ducas, Lyubashevsky, and Prest built a discrete-Gaussian sampler that exploits the recursive tower of the cyclotomic ring [@dlp-2014]. Instead of storing and walking a full Gram-Schmidt basis, it descends a binary &quot;Falcon tree,&quot; sampling one Gaussian coordinate per node. The generic GPV sampler&apos;s $n^2$ cost collapses to $n \log n$, and the full-matrix key shrinks to a few ring elements. Bolt this sampler onto GPV, run it over the NTRU lattice, and you have Falcon, submitted to NIST in 2017 [@falcon-spec].&lt;/p&gt;
&lt;p&gt;Key generation shows how tightly the pieces fit. Falcon samples short secrets $f$ and $g$, then solves the NTRU equation $fG - gF = q$ for a completing pair $(F, G)$; the secret basis is built from all four, and the public key is the familiar single element $h = g/f$ [@falcon-spec]. Signing draws a short preimage with ffSampling; verification checks a norm. The result is the smallest footprint of any standardized lattice signature [@falcon-spec].&lt;/p&gt;
&lt;p&gt;Now count what Falcon has actually insured. Deterministic leakage: closed, because ffSampling emits a true discrete Gaussian, and GPV&apos;s theorem then makes the transcript independent of the trapdoor, with key leakage negligible past $2^{64}$ signatures from one key [@falcon-spec] [@gpv-2008]. Large keys and slow signing: closed, by NTRU compactness and the FFT tree. Falcon is the scheme that fixed every wound its ancestors died of.&lt;/p&gt;
&lt;p&gt;Except one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Falcon&apos;s smallness is not free. GPV&apos;s proof closes the transcript leak, and NTRU&apos;s ring structure closes the size and speed problems -- but the very choice of NTRU reintroduces the one bet the entire lineage could never insure: an assumption with a dense-sublattice handle and no worst-case-to-average-case reduction at Falcon&apos;s parameters. Every other risk got insured. This one got concentrated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the shift worth pausing on. It is tempting to read Falcon as simply a well-engineered, compressed signature -- smaller is better, end of story. But by closing the transcript branch and shrinking the generic exposure, the compression funnels nearly all of Falcon&apos;s remaining structural risk onto a single assumption. Its safety is not spread across three independent bets. It rides on one.&lt;/p&gt;
&lt;p&gt;The field&apos;s own hedge against this bet is HAWK, a Falcon-class hash-and-sign that removes the $g/f$ quotient entirely and works over the integers. Two of the NTRU-Fatigue authors co-designed it -- an institutional tell that Section 12 returns to [@hawk-2022].&lt;/p&gt;
&lt;p&gt;Before we press on that assumption, one honest boundary marker.&lt;/p&gt;

Falcon&apos;s ffSampling uses floating-point arithmetic to walk the FFT tree. Specifying it for safe, constant-time execution across platforms is genuinely hard, and that difficulty -- not any mathematical weakness -- is the reason FIPS 206 trails FIPS 204 and 205 [@fips-206-status]. Sampler timing leaks, fault injection, and RNG failures are real attacks, but they attack the *code*, not the mathematics, and they belong to the empirical sibling. This article draws its line right here and does not step over it. When we say &quot;structural,&quot; we mean the math, and the math has not yet spoken about $q = 12289$.
&lt;p&gt;There is a temptation to treat the draft status as the story -- &quot;Falcon is late, so Falcon is shaky.&quot; That gets it backwards. The lateness is an implementation problem about a sampler. The structural question is entirely separate, and it is more interesting: Falcon could ship tomorrow with a flawless constant-time sampler and still rest on the least-insured assumption in the standardized lattice family.&lt;/p&gt;
&lt;p&gt;It could not prove that the lattice it stands on is hard. To see why that gap is unique to Falcon -- why the same is not said of Dilithium, which lives over the same kind of ring -- compare the bet Falcon made to the bet Dilithium made.&lt;/p&gt;
&lt;h2&gt;7. The Least Conservative Bet: NTRU Versus Module-LWE&lt;/h2&gt;
&lt;p&gt;Both Falcon and Dilithium live over the same kind of polynomial ring. So why do cryptographers call one of them the conservative choice and the other the aggressive one?&lt;/p&gt;
&lt;p&gt;The lazy answer is &quot;NTRU has more algebraic structure.&quot; That answer is wrong, and getting it right is the center of this article. NTRU and Module-LWE are built over the &lt;em&gt;same&lt;/em&gt; class of rings; neither has &quot;more ring&quot; than the other. The difference that matters is precise, and it has exactly two parts.&lt;/p&gt;

The assumption beneath Dilithium (ML-DSA) and Kyber: given a random matrix over a module and noisy linear equations in a secret, recover the secret. Module-LWE carries an *asymptotic* worst-case-to-average-case reduction to hard module-lattice problems, so breaking random keys is anchored to worst-case lattice hardness -- an anchor NTRU at Falcon&apos;s parameters does not have [@fips-204] [@peikert-decade-2016] [@langlois-stehle-2015].
&lt;p&gt;&lt;strong&gt;First difference: the public key is a quotient.&lt;/strong&gt; Module-LWE publishes noisy products; NTRU publishes the ratio $h = g/f$. As Section 3 showed, that ratio plants a dense sublattice -- an extra geometric handle that the overstretched attacks will grab. Module-LWE&apos;s public data does not expose that same handle [@peikert-decade-2016].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second difference: the reduction gap.&lt;/strong&gt; Module-LWE has a worst-case-to-average-case reduction in its parameter regime; NTRU &lt;em&gt;at Falcon&apos;s parameters&lt;/em&gt; has none [@peikert-decade-2016] [@langlois-stehle-2015]. This is the structural insurance policy from Section 5, and Dilithium holds it while Falcon does not. That policy is worth reading precisely, though, because it is weaker than the slogan &quot;Dilithium is proven&quot; suggests.&lt;/p&gt;

The reduction is genuine insurance, not a trophy, and reading it precisely matters. What it buys: solving *random* Module-LWE keys is provably at least as hard as approximating a worst-case problem over *every* module lattice of that rank, which rules out a hidden class of secretly weak random keys [@langlois-stehle-2015] [@regev-jacm-2009]. What it does not buy comes in three parts. First, it is *asymptotic and non-tight* -- it constrains the family as $n$ grows, not the concrete bit-security at ML-DSA-44&apos;s exact numbers, which are still set by the lattice estimator rather than by the theorem [@peikert-decade-2016]. Second, Regev&apos;s original reduction is *quantum*; the known classical routes cost either an exponentially large modulus [@peikert-stoc-2009] or a dimension-increasing detour [@blprs-stoc-2013], so the clean, tight statement stays quantum [@regev-jacm-2009]. Third, the textbook reduction assumes *Gaussian* secrets, while ML-DSA samples its secret coefficients *uniformly* from a small range and rejection-samples, so it does not apply verbatim to the deployed distribution [@dilithium-tches-2018]. Discount all three, and the anchor is still strictly more than NTRU has at $q = 12289$, which is none at all. That is why &quot;least conservative&quot; is a precise placement of Falcon on a map, not name-calling.

The route Dilithium takes to leak-freedom: build a signature from an interactive identification protocol, make it non-interactive by hashing the commitment into the challenge, and use rejection sampling (&quot;aborts&quot;) so the published transcript&apos;s distribution is independent of the secret. It is the counterpart of Falcon&apos;s Gaussian sampler -- a different answer to the same leakage problem [@fips-204].
&lt;p&gt;Line the standardized signatures up and the trade becomes visible.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Falcon-512 (FN-DSA)&lt;/th&gt;
&lt;th&gt;ML-DSA-44 (Dilithium)&lt;/th&gt;
&lt;th&gt;SLH-DSA (SPHINCS+)&lt;/th&gt;
&lt;th&gt;HAWK-512&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;GPV hash-and-sign over NTRU&lt;/td&gt;
&lt;td&gt;Fiat-Shamir with aborts over Module-LWE&lt;/td&gt;
&lt;td&gt;stateless hash-based&lt;/td&gt;
&lt;td&gt;hash-and-sign over Module-LIP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public key&lt;/td&gt;
&lt;td&gt;897 bytes&lt;/td&gt;
&lt;td&gt;1312 bytes&lt;/td&gt;
&lt;td&gt;32 bytes&lt;/td&gt;
&lt;td&gt;Falcon-class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature&lt;/td&gt;
&lt;td&gt;666 bytes&lt;/td&gt;
&lt;td&gt;2420 bytes&lt;/td&gt;
&lt;td&gt;7856+ bytes&lt;/td&gt;
&lt;td&gt;Falcon-class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arithmetic&lt;/td&gt;
&lt;td&gt;floating-point (FFT)&lt;/td&gt;
&lt;td&gt;integer only&lt;/td&gt;
&lt;td&gt;integer (hashing)&lt;/td&gt;
&lt;td&gt;integer only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worst-case reduction&lt;/td&gt;
&lt;td&gt;no (at q = 12289)&lt;/td&gt;
&lt;td&gt;yes (Module-LWE)&lt;/td&gt;
&lt;td&gt;not applicable&lt;/td&gt;
&lt;td&gt;Module-LIP (younger)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural handle&lt;/td&gt;
&lt;td&gt;g/f dense sublattice&lt;/td&gt;
&lt;td&gt;none of that kind&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;no quotient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status, mid-2026&lt;/td&gt;
&lt;td&gt;draft FIPS 206&lt;/td&gt;
&lt;td&gt;final FIPS 204&lt;/td&gt;
&lt;td&gt;final FIPS 205&lt;/td&gt;
&lt;td&gt;not standardized&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The sizes come from the Falcon specification, FIPS 204, and FIPS 205; the reduction column from the survey literature and the standards; the handle and status columns summarize Sections 3 and 6 [@falcon-spec] [@fips-204] [@fips-205] [@peikert-decade-2016] [@nist-pqc]. Read across the Falcon column and the shape of the bet is stark: it is the only entry that is smallest on size &lt;em&gt;and&lt;/em&gt; alone in carrying both a dense-sublattice handle and no worst-case reduction. SLH-DSA sits at the opposite corner, resting on nothing but hash functions and paying for it in multi-kilobyte signatures [@nist-pqc].&lt;/p&gt;

Among the standardized lattice signatures, Falcon rests on the only assumption with a dense-sublattice handle and no worst-case reduction at $q = 12289$. That is what &quot;least conservative&quot; means -- stated precisely, not rhetorically.
&lt;p&gt;Now for the honest complication, because the thesis has to survive it.&lt;/p&gt;

It is not that NTRU can never earn a reduction. In 2011 Damien Stehle and Ron Steinfeld proved that a *modified* NTRU -- with wider Gaussian secrets and a much larger modulus, which makes $h$ statistically close to uniform -- is as hard as worst-case problems over ideal lattices [@stehle-steinfeld-2011]. A provable-NTRU reduction genuinely exists. But Falcon&apos;s $q = 12289$ is far too small to inherit it: the proof lives in a parameter regime Falcon deliberately avoids for the sake of compactness. That sharpens the point rather than softening it. The theorem tells you exactly what Falcon trades away to be small.
&lt;p&gt;So the &quot;least conservative&quot; verdict is not a slur on Falcon. It is a factual placement on a map that Stehle-Steinfeld themselves drew: the reduction sits over &lt;em&gt;there&lt;/em&gt;, at big parameters; Falcon sits over &lt;em&gt;here&lt;/em&gt;, at small ones, in the open country between the proof and the best-known attacks. Its security in that country is a well-tested assumption, not a theorem.&lt;/p&gt;
&lt;p&gt;An assumption with no proof beneath it is only as safe as the attacks that have failed to reach it so far. That would be a comfortable enough position -- most of cryptography lives there -- if not for one specific, documented fact about NTRU. For some parameters, the attacks do not fail. They succeed completely. The only question is how far those parameters sit from Falcon&apos;s.&lt;/p&gt;
&lt;h2&gt;8. The Documented Failure Regime: Overstretched NTRU&lt;/h2&gt;
&lt;p&gt;There is a number that decides whether NTRU is safe or doomed, and it is not the dimension. It is the modulus $q$ -- and NTRU has a cliff.&lt;/p&gt;
&lt;p&gt;To see the cliff you need the yardstick every lattice scheme is measured against: generic lattice reduction.&lt;/p&gt;

BKZ is the workhorse lattice-reduction algorithm. It improves a basis block by block, and each block of dimension $\beta$ (the &quot;blocksize&quot;) requires a near-exact shortest-vector computation, supplied by *sieving*. The best known heuristic sieve, BDGL 2016, costs about $2^{0.292\beta}$ operations classically. A scheme&apos;s security is the cost of the smallest blocksize $\beta$ at which reduction recovers a key or a forgery [@bdgl-2016].
&lt;p&gt;The generic curve is the same for every lattice scheme, Falcon and Dilithium and Kyber alike: pick the blocksize that breaks you, read off $2^{0.292\beta}$. You can run the mapping yourself. The blocksizes below are the ones the standard estimator assigns to Falcon-512, which we return to in Section 9.&lt;/p&gt;
&lt;p&gt;{&lt;code&gt;// R3: Core-SVP cost. A lattice attack must run BKZ with block size beta; // the best heuristic sieve costs about 2^(0.292*beta) classically (BDGL 2016). // Falcon-512&apos;s cheapest structural attack (in this conservative model) is // forgery at beta = 415; key recovery needs beta = 481. const classicalBits = beta =&amp;gt; 0.292 * beta;   // BDGL sieving exponent const quantumBits   = beta =&amp;gt; 0.265 * beta;   // model-dependent quantum sieve for (const [label, beta] of [[&quot;forgery (SIS)&quot;, 415], [&quot;key recovery (NTRU)&quot;, 481]]) {   const c = classicalBits(beta), qb = quantumBits(beta);   console.log(label + &quot;: beta = &quot; + beta +     &quot;  -&amp;gt;  classical 2^&quot; + c.toFixed(1) + &quot;,  quantum 2^&quot; + qb.toFixed(1)); } console.log(&quot;Doubling the attack&apos;s reach means moving beta -- an exponential wall.&quot;);&lt;/code&gt;}&lt;/p&gt;
&lt;p&gt;Those two numbers -- forgery near $2^{121}$, key recovery near $2^{140}$ -- are Falcon-512&apos;s generic security floor in the conservative model, computed with the standard lattice estimator, and they are shared-shape risk: an advance in sieving lowers that exponent for &lt;em&gt;everyone&lt;/em&gt; [@estimator-tool] [@bdgl-2016].&lt;/p&gt;
&lt;p&gt;It is worth knowing what fixes that blocksize, because it sets the entire floor. After BKZ reduces a basis, the lengths of its Gram-Schmidt vectors fall along a predictable downward &lt;em&gt;profile&lt;/em&gt;, and an attack succeeds at the smallest $\beta$ whose profile first lets the target vector poke through -- the projected-target picture behind the standard estimate [@newhope-2016] [@agvw-scn-2018]. Two things lower the $\beta$ you need: a shorter or more uniquely planted target, and a flatter, lower profile.&lt;/p&gt;
&lt;p&gt;That is why Falcon-512&apos;s two costs differ. Forgery needs only &lt;em&gt;some&lt;/em&gt; vector under a relatively loose norm bound and clears its profile at $\beta \approx 415$; key recovery must expose the &lt;em&gt;specific&lt;/em&gt;, very short secret module and only clears at $\beta \approx 481$ -- which is why the one $0.292$ constant reads out $2^{121}$ for the first and $2^{140}$ for the second [@estimator-tool]. Those constants come from the model, not from a derivation here: this is the intuition for what sets the floor, kept on the near side of the scope fence.&lt;/p&gt;
&lt;p&gt;Now watch what NTRU does that Module-LWE does not.&lt;/p&gt;
&lt;p&gt;In 2016, Martin Albrecht, Shi Bai, and Leo Ducas showed that when $q$ is large relative to $n$, you can project NTRU into a subfield of the ring, shrink the dimension, and expose the secret far below the generic cost [@albrecht-bai-ducas-2016].&lt;/p&gt;
&lt;p&gt;A year later, Paul Kirchner and Pierre-Alain Fouque removed the subfield crutch: plain BKZ, run on the NTRU lattice directly, &lt;em&gt;finds the dense sublattice&lt;/em&gt; on its own once $q$ is large enough [@kirchner-fouque-2017]. The $g/f$ quotient&apos;s planted structure becomes so short that reduction stumbles onto it early. This is a structural collapse, not a generic speedup -- the cost falls because of what NTRU &lt;em&gt;is&lt;/em&gt;, not because sieving got faster.&lt;/p&gt;
&lt;p&gt;Why does the planted sublattice go short exactly when $q$ is &lt;em&gt;large&lt;/em&gt;? The mechanism is a one-line volume argument, and it turns on two lengths inside the NTRU lattice that move with $q$ in opposite directions.&lt;/p&gt;
&lt;p&gt;Begin with the ambient lattice. The NTRU lattice has dimension $2n$ and volume $q^n$ -- one factor of $q$ for each of the $n$ coset constraints $v \equiv u \cdot h$ [@ntrufatigue-code]. The Gaussian heuristic estimates the shortest vector of a structureless lattice of dimension $d$ and volume $V$ at about $\sqrt{d / 2\pi e} \cdot V^{1/d}$ [@newhope-2016]. Substitute $d = 2n$ and $V = q^n$:&lt;/p&gt;
&lt;p&gt;$$
\mathrm{gh}(\Lambda_h) = \sqrt{\tfrac{2n}{2\pi e}} \cdot \left(q^{n}\right)^{1/(2n)} = \sqrt{\tfrac{n}{\pi e}} \cdot \sqrt{q}.
$$&lt;/p&gt;
&lt;p&gt;So the &lt;em&gt;generic&lt;/em&gt; shortest vector -- what plain reduction finds in a lattice of this shape with no planted structure -- grows like $\sqrt{q}$. Now take the planted sublattice. The secret $(f, g)$ and its $n$ ring-shifts $x^i \cdot (f, g)$ span a rank-$n$ sublattice inside the NTRU lattice. Multiplication by $x$ in the ring is only a signed coordinate rotation, so every one of those generators has the &lt;em&gt;same&lt;/em&gt; norm as $(f, g)$ itself -- a length set by how short the secret is, and completely &lt;em&gt;independent&lt;/em&gt; of $q$.&lt;/p&gt;
&lt;p&gt;Put the two lengths together and the whole overstretched phenomenon falls out. As $q$ climbs, the ambient generic length rises like $\sqrt{q}$ while the planted sublattice stays pinned at $|(f, g)|$. The secret module grows steadily more anomalous against its own surroundings. The security-relevant quantity is their ratio, proportional to $|(f, g)| / \sqrt{q}$, and it &lt;em&gt;shrinks&lt;/em&gt; as $q$ grows. That is the entire content of the warning that a bigger modulus is backwards: enlarging $q$ inflates the haystack&apos;s generic vectors while leaving the secret needle exactly as long, so the needle protrudes further, not less.&lt;/p&gt;
&lt;p&gt;Past a threshold, that protrusion changes what reduction finds &lt;em&gt;first&lt;/em&gt;. Instead of isolating the single shortest secret, BKZ surfaces the whole planted block. Ducas and van Woerden separate the two outcomes experimentally: a &lt;em&gt;Dense-Sublattice-Discovery&lt;/em&gt; event, in which reduction reveals vectors of the planted module, versus a &lt;em&gt;Secret-Key-Recovery&lt;/em&gt; event, in which it pins down the one shortest secret [@ntrufatigue-code]. Overstretched NTRU is precisely the regime where the Dense-Sublattice-Discovery event fires first, at a blocksize far below the cost of ordinary key recovery. That early discovery is the structural short-cut, and it is the engine of Hypothesis A.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The natural intuition is that a bigger modulus is &quot;more room&quot; and therefore safer. For NTRU it is exactly backwards. A &lt;em&gt;large&lt;/em&gt; $q$ shortens the dense sublattice relative to the rest of the NTRU lattice, and a shorter planted sublattice is easier for reduction to catch. Overstretched means large $q$. Falcon&apos;s small $q = 12289$ is not a weakness here -- it is the very thing that keeps Falcon out of the overstretched regime [@albrecht-bai-ducas-2016] [@kirchner-fouque-2017].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How large is large? In 2021 Ducas and van Woerden answered it with an extensive experimental campaign, pinning the exact crossover.&lt;/p&gt;

NTRU is *overstretched* when its modulus $q$ is large relative to its dimension $n$, so that the dense sublattice is short enough for reduction to find cheaply. The *fatigue point* is the crossover modulus at which this overstretched attack overtakes ordinary key recovery. Ducas and van Woerden measured it experimentally at $q \approx 0.004 \cdot n^{2.484}$ for ternary secrets [@ducas-vanwoerden-2021].
&lt;p&gt;That formula is the whole game, so read it carefully. It says the cliff scales like $n^{2.484}$: as the dimension grows, you can afford a much larger modulus before falling off. It is also, in two specific ways, softer than a theorem -- it is an experimental average-case crossover rather than a proven bound, and it was fit to &lt;em&gt;ternary&lt;/em&gt; secrets, whereas Falcon samples discrete-Gaussian secrets. Both caveats matter enormously, and Section 9 makes them do work.Pierre-Alain Fouque co-designed Falcon and co-authored the Kirchner-Fouque overstretched attack. The designer and the cryptanalyst of the failure regime are the same person -- the strongest signal available that this is the live fault line, not a hypothetical one [@falcon-spec] [@kirchner-fouque-2017].&lt;/p&gt;

The same expertise that built Falcon&apos;s trapdoor also mapped its one uninsured failure regime.
&lt;p&gt;So the cliff is real, it has a mechanism -- the dense sublattice going short -- and it has a formula, fit from real computation. Falcon&apos;s whole claim to safety is that it sits on the near side of that cliff. The only question left is arithmetic. Plug in Falcon&apos;s numbers. How much margin is there?&lt;/p&gt;
&lt;h2&gt;9. The Margin: Why Falcon Stays Clear, For Now&lt;/h2&gt;
&lt;p&gt;Falcon-512 uses $q = 12289$. The fatigue formula says the cliff at $n = 512$ sits near $q \approx 21{,}500$. That is a safety factor of about 1.75. Sit with that number for a moment.&lt;/p&gt;
&lt;p&gt;Here is the calculation, laid out so you can move the dimension yourself and watch the margin change.&lt;/p&gt;
&lt;p&gt;{&lt;code&gt;// R2: NTRU &quot;fatigue&quot; margin. Ducas-van Woerden (2021) measured the modulus q // at which the overstretched (dense-sublattice) attack overtakes ordinary key // recovery: q ~= 0.004 * n^2.484, for TERNARY secrets. Falcon uses q = 12289. const fatigueQ = n =&amp;gt; 0.004 * Math.pow(n, 2.484); const FALCON_Q = 12289; for (const n of [512, 1024]) {   const fq = fatigueQ(n);   console.log(&quot;n = &quot; + n + &quot;:  fatigue-q ~= &quot; + Math.round(fq) +     &quot;   Falcon q = &quot; + FALCON_Q +     &quot;   margin ~= &quot; + (fq / FALCON_Q).toFixed(2) + &quot;x&quot;); } console.log(&quot;Caveat: this fit is experimental and for ternary secrets;&quot;); console.log(&quot;Falcon uses discrete-Gaussian secrets, so the margin is an extrapolation.&quot;);&lt;/code&gt;}&lt;/p&gt;
&lt;p&gt;The two rows are the whole story of Falcon&apos;s structural safety today.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension $n$&lt;/th&gt;
&lt;th&gt;Fatigue-$q$, from $0.004 \cdot n^{2.484}$&lt;/th&gt;
&lt;th&gt;Falcon&apos;s $q$&lt;/th&gt;
&lt;th&gt;Margin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;512 (Falcon-512)&lt;/td&gt;
&lt;td&gt;about 21,500&lt;/td&gt;
&lt;td&gt;12,289&lt;/td&gt;
&lt;td&gt;about 1.75x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024 (Falcon-1024)&lt;/td&gt;
&lt;td&gt;about 120,000&lt;/td&gt;
&lt;td&gt;12,289&lt;/td&gt;
&lt;td&gt;about 9.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;At $n = 1024$ the margin is roughly 9.8x -- comfortable by any standard. At $n = 512$ it is about 1.75x, and Falcon-512 is likely to be the more widely deployed of the two, because it is the small, fast one [@ducas-vanwoerden-2021] [@falcon-spec]. With FN-DSA still in draft and nothing yet in production, that is a prediction rather than a measured fact -- but if it holds, the thinnest margin in the standardized lattice family sits under the Falcon most deployments will reach for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The 1.75x is softer than it looks, in two independent ways. First, the fatigue point is an &lt;em&gt;experimental, average-case&lt;/em&gt; crossover measured from computation -- not a proof that NTRU is hard for any $q$ below it. Second, it was fit to &lt;em&gt;ternary&lt;/em&gt; secrets, while Falcon uses &lt;em&gt;discrete-Gaussian&lt;/em&gt; secrets, so applying it to Falcon is an extrapolation across secret distributions. The 1.75x is an estimate of exposure, not a security theorem [@ducas-vanwoerden-2021].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Take those caveats seriously in both directions. They do not prove Falcon is in danger; nobody has broken $q = 12289$, and the extrapolation could just as easily place the true cliff &lt;em&gt;higher&lt;/em&gt; for Gaussian secrets as lower. But they do mean the number guarding Falcon-512 is not a proven wall. It is a measured, extrapolated fence, and its exact location for Falcon&apos;s own secret distribution has never been pinned.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The margin widens with dimension, so the conservative long-term choice is Falcon-1024, while the thinnest exposure sits under the Falcon-512 that most deployments are expected to prefer. A break from this direction would not arrive as a bolt from the blue -- it would arrive as the fatigue boundary $q \approx 0.004 \cdot n^{2.484}$ being pushed downward, or extended rigorously to Gaussian secrets and landing lower than hoped [@ducas-vanwoerden-2021].&lt;/p&gt;
&lt;/blockquote&gt;

The concrete blocksizes come from the open Sage tool lattice-estimator. Load it, call NTRU.estimate and SIS.estimate on Falcon-512&apos;s parameters, and record the commit, because the outputs are model- and commit-dependent. The rough (Core-SVP) model returns forgery at blocksize 415 and key recovery at blocksize 481; the exact bit-costs, 0.292 times 415 giving 121.2 and 0.292 times 481 giving 140.5, confirm that the rough numbers are Core-SVP numbers. Refined models push these above 146 and 160 respectively [@estimator-tool] [@estimator-paper-2015].
&lt;p&gt;A 1.75x margin below an unproven, extrapolated cliff is not a reason to panic. Falcon is not broken, and this section has not shown a break -- it has shown a boundary and measured a distance to it. But it is a reason to ask the real question, the one the whole article has been building toward. When Falcon eventually breaks, is &lt;em&gt;this&lt;/em&gt; where it starts -- the NTRU cliff creeping toward $q = 12289$ -- or does it start somewhere else entirely, in a generic advance or a quantum machine? To answer that, we have to rank.&lt;/p&gt;
&lt;h2&gt;10. Weighing the Hypotheses: Where Does Falcon&apos;s Crack Start?&lt;/h2&gt;
&lt;p&gt;Now we can rank. There are exactly three ways Falcon&apos;s own mathematics could fail, and only one of them is both open and Falcon&apos;s alone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hypothesis A -- an NTRU-specific advance.&lt;/strong&gt; Someone finds a sharper way to exploit the $g/f$ dense sublattice at Falcon&apos;s small $q$, or pushes the fatigue boundary $q \approx 0.004 \cdot n^{2.484}$ downward -- or extends it rigorously to discrete-Gaussian secrets and it lands lower than the ternary fit suggested. Any of these would break Falcon while leaving Module-LWE schemes untouched. It is open, it is aimed squarely at NTRU, and it is the one hypothesis with an already-documented failure regime one factor of 1.75 away [@kirchner-fouque-2017] [@ducas-vanwoerden-2021].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hypothesis B -- a generic reduction advance.&lt;/strong&gt; Someone improves BKZ or sieving and lowers the exponent below the classical $2^{0.292\beta}$ (or the model-dependent quantum $2^{0.265\beta}$), where $\beta$ is the attack blocksize, for &lt;em&gt;all&lt;/em&gt; lattices [@bdgl-2016]. This is the larger threat in absolute terms: it would weaken Dilithium, Kyber, and Falcon in a single stroke. But that universality is exactly why it is the wrong answer to our question. It moves the whole floor, not Falcon&apos;s floor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hypothesis C -- transcript leakage.&lt;/strong&gt; The break that felled NTRUSign. Closed, structurally, by GPV&apos;s provable Gaussian sampling, as Section 5 showed. A true-Gaussian transcript is independent of the secret basis, so there is nothing to learn [@gpv-2008] [@nguyen-regev-2006].&lt;/p&gt;

flowchart TD
    Q[&quot;How could Falcon&apos;s mathematics fail?&quot;] --&amp;gt; A[&quot;A. NTRU-specific advance, sharper g/f or the cliff moves down&quot;]
    Q --&amp;gt; B[&quot;B. Generic reduction or sieving advance&quot;]
    Q --&amp;gt; C[&quot;C. Transcript leakage&quot;]
    A --&amp;gt; AV[&quot;Open and Falcon-specific, with a documented regime, ranked first&quot;]
    B --&amp;gt; BV[&quot;Open but hits every lattice scheme, largest yet non-specific&quot;]
    C --&amp;gt; CV[&quot;Closed by GPV Gaussian sampling, dismissed&quot;]
&lt;p&gt;Set them side by side on the properties that matter.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Hypothesis A (thesis)&lt;/th&gt;
&lt;th&gt;Hypothesis B (rival)&lt;/th&gt;
&lt;th&gt;Hypothesis C (dismissed)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Target&lt;/td&gt;
&lt;td&gt;NTRU&apos;s $g/f$ quotient&lt;/td&gt;
&lt;td&gt;every lattice scheme&lt;/td&gt;
&lt;td&gt;deterministic good-basis signing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mechanism&lt;/td&gt;
&lt;td&gt;dense sublattice goes short, cliff moves&lt;/td&gt;
&lt;td&gt;faster BKZ and sieving&lt;/td&gt;
&lt;td&gt;key leaks through the signature cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best-known cost&lt;/td&gt;
&lt;td&gt;fatigue-$q$ about 21,500 at $n = 512$, Falcon below&lt;/td&gt;
&lt;td&gt;about $2^{0.292\beta}$ classical, $2^{0.265\beta}$ quantum&lt;/td&gt;
&lt;td&gt;about 90,000 signatures on NTRUSign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falcon-specific?&lt;/td&gt;
&lt;td&gt;yes, misses Module-LWE&lt;/td&gt;
&lt;td&gt;no, moves the whole floor&lt;/td&gt;
&lt;td&gt;historically NTRU, now closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status versus Falcon&lt;/td&gt;
&lt;td&gt;open, specific, measured&lt;/td&gt;
&lt;td&gt;open, non-specific&lt;/td&gt;
&lt;td&gt;closed by GPV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The table is the argument in miniature. Column C is greyed out by a theorem. Column B is real and frightening, but it is a threat to lattice cryptography as a category, not a Falcon story -- if it lands, the headline is &quot;lattices weakened,&quot; and Falcon is one name in a long list. Column A is the only one where the headline reads &quot;Falcon&quot; and no one else.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The series asks a specific question: where does &lt;em&gt;Falcon&apos;s&lt;/em&gt; crack start? That question selects for Falcon-specificity. Hypothesis B is the larger existential threat to lattice cryptography as a whole, and this article concedes that plainly. But a generic sieving advance breaks Dilithium and Kyber in the same motion -- it is not where Falcon fails &lt;em&gt;first and alone&lt;/em&gt;. Hypothesis A is the only break that is open, aimed at Falcon in particular, and already carries a measured failure regime. That is why A outranks B on this question, even though B is bigger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Say the honest part out loud, because the thesis lives or dies on it. &quot;Most likely&quot; here is a &lt;em&gt;ranked judgment&lt;/em&gt;, not a documented fact. No one has broken Falcon&apos;s actual parameters; the overstretched attacks break &lt;em&gt;other&lt;/em&gt;, large-$q$ NTRU, and the 1.75x margin is an extrapolation across secret distributions.&lt;/p&gt;
&lt;p&gt;If you want a claim of the form &quot;here is Falcon, broken,&quot; this article cannot give it to you, and neither can anyone else today. What it can give you is a disciplined ordering: given that Falcon &lt;em&gt;will&lt;/em&gt; eventually face sharper mathematics, the break that is simultaneously open, Falcon-specific, and already partway documented is the one to bet on first.&lt;/p&gt;

The assumption Falcon cannot insure -- the NTRU quotient plus the missing worst-case reduction -- is exactly where the crack is likeliest to begin.
&lt;p&gt;Notice what carries the ranking. It is not that the NTRU attack is close to working -- it is a comfortable distance away. It is that the NTRU attack is the only one of the three that is both &lt;em&gt;live&lt;/em&gt; and &lt;em&gt;specific&lt;/em&gt;. Hypothesis C had specificity but is dead; Hypothesis B is alive but generic. Only Hypothesis A has both at once -- and in a &quot;how would &lt;em&gt;this&lt;/em&gt; scheme break&quot; question, both are what you rank on.&lt;/p&gt;
&lt;p&gt;The whole ranking, though, rests on two load-bearing assumptions of its own: that Shor&apos;s algorithm really cannot touch Falcon, so the quantum future does not simply erase the question, and that the fatigue cliff really is unproven, so the margin is a research frontier rather than a settled bound. Both deserve a hard look, and the second is more fragile than the first.&lt;/p&gt;
&lt;h2&gt;11. Theoretical Limits and the Quantum Question&lt;/h2&gt;
&lt;p&gt;The most important fact about Falcon&apos;s quantum security is a non-result: the algorithm that broke RSA does nothing here.&lt;/p&gt;
&lt;p&gt;That deserves to be stated carefully, because it is the reason the whole field exists. &lt;a href=&quot;https://paragmali.com/blog/how-q-day-breaks-everything-shors-algorithm-and-the-simultan/&quot; rel=&quot;noopener&quot;&gt;Shor&apos;s algorithm&lt;/a&gt; is not a general code-breaker. It solves one abstract problem exceptionally well, and factoring and discrete logarithm happen to be instances of it.&lt;/p&gt;

The abstract problem Shor&apos;s algorithm solves: given a function that is constant on the cosets of a hidden subgroup of an *abelian* (commutative) group, find the subgroup. Factoring and discrete logarithm are instances, which is why a quantum computer breaks RSA and elliptic-curve cryptography. Lattice problems are *not* an instance of it -- and that is precisely why they are candidates for post-quantum security [@regev-quantum-2004].
&lt;p&gt;Lattices sit outside the abelian-HSP family, so Shor has no purchase on Falcon. The closest anyone has come to a quantum handle is a 2004 result of Oded Regev connecting a lattice problem (unique-SVP) to the &lt;em&gt;dihedral&lt;/em&gt; hidden-subgroup problem -- but the reduction runs one way only, and no one knows how to prepare the quantum states it would need to run usefully in reverse [@regev-quantum-2004]. Two decades of effort have not reversed it.&lt;/p&gt;

flowchart TD
    Q[&quot;Is the hard problem an abelian hidden-subgroup problem?&quot;] --&amp;gt;|Yes, such as RSA and ECC| S[&quot;Shor solves it, the scheme is broken&quot;]
    Q --&amp;gt;|No, as with lattices| L[&quot;Shor does not apply&quot;]
    L --&amp;gt; R[&quot;The only quantum lever is a faster sieve&quot;]
    R --&amp;gt; E[&quot;The classical 0.292 beta exponent drops toward 0.265 beta&quot;]
    E --&amp;gt; N[&quot;A constant-factor gain in the exponent, not a structural collapse&quot;]
&lt;p&gt;So what &lt;em&gt;does&lt;/em&gt; a quantum computer buy an attacker against Falcon? One thing, and it is modest in shape if not in size: a faster sieve. Quantum near-neighbor search lowers the sieving exponent from the classical $2^{0.292\beta}$ toward roughly $2^{0.265\beta}$ in the sieve blocksize $\beta$ -- a model-dependent figure associated with the Core-SVP quantum line [@bdgl-2016] [@newhope-2016]. That is a genuine improvement, but look at what &lt;em&gt;kind&lt;/em&gt; it is: it lowers the exponent&apos;s constant. It makes Hypothesis B a little cheaper. It does not convert the problem into one Shor can solve, and it does not touch the NTRU-specific structure at all.Regev&apos;s one-directional reduction lands lattices on the &lt;em&gt;dihedral&lt;/em&gt; hidden-subgroup problem [@regev-quantum-2004] -- the same problem Kuperberg&apos;s sub-exponential algorithm attacks [@kuperberg-2005]. But no one knows how to prepare the coset states that algorithm needs from a lattice instance, which is why it drives attacks on isogeny schemes such as CSIDH [@csidh-2018] rather than on lattices. It is a frequent source of confusion in exactly this discussion.Grover&apos;s algorithm speeds up unstructured brute-force search [@grover-1996], but Falcon&apos;s security rests on the hardness of a lattice problem, not on guessing a symmetric key, so Grover has no structural target here. It is named once and set aside as a generic search speedup, not a break.&lt;/p&gt;
&lt;p&gt;Now stack the two things the theory leaves unproven, because together they are the real picture.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Falcon&apos;s safety lives in two unproven gaps at once. The &lt;em&gt;reduction gap&lt;/em&gt;: at $q = 12289$ there is no worst-case-to-average-case reduction, so no theorem sits beneath the assumption. The &lt;em&gt;fatigue gap&lt;/em&gt;: only about 1.75x separates Falcon-512 from an experimental, ternary-secret cliff. Shor cannot touch either gap, and a faster sieve only nudges the generic floor. The real exposure is the NTRU-specific space between those two gaps -- which is exactly why the likeliest structural crack is Hypothesis A, not a quantum collapse and not a generic advance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the understanding that flips the usual intuition. Most people carry a mental model in which &quot;NIST standardized it, so it is proven, and the only danger is a future quantum computer running Shor.&quot; Every clause of that is off. Shor cannot touch Falcon. A quantum computer buys only a constant-factor sieving gain against a floor that is already high. And &quot;standardized&quot; does not mean &quot;proven&quot;: Falcon&apos;s exact parameters have no reduction beneath them, and the boundary that keeps them safe is an experimental fit to a different secret distribution.&lt;/p&gt;
&lt;p&gt;There is a positive impossibility in the mix too, and it belongs on the ledger in Falcon&apos;s favor. For a &lt;em&gt;true&lt;/em&gt; discrete Gaussian, GPV&apos;s theorem makes transcript-based key recovery information-theoretically impossible -- not hard, impossible [@gpv-2008]. Falcon&apos;s quantum-and-theory scorecard is therefore lopsided in a very specific way: strong where people fear weakness (Shor, transcripts), and quietly exposed where people assume strength (the reduction and fatigue gaps).&lt;/p&gt;
&lt;p&gt;So the theory leaves Falcon standing on an assumption with no proof beneath it and a cliff whose exact location for its own secrets nobody has pinned. That is not a flaw to hide. It is a research frontier to map -- and the people best placed to map it are already at work. Here is where that frontier actually is.&lt;/p&gt;
&lt;h2&gt;12. Open Problems and the NTRU-Free Frontier&lt;/h2&gt;
&lt;p&gt;The people best positioned to know where Falcon breaks are already building the scheme that would replace it. That is the most honest signal in this whole story.&lt;/p&gt;
&lt;p&gt;The research frontier around Falcon is not vague hand-wringing; it is five specific questions, and each one is a lever on the thesis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can the fatigue analysis be made a proof?&lt;/strong&gt; Ducas and van Woerden measured the crossover; no one has proven that NTRU is hard for every $q$ &lt;em&gt;below&lt;/em&gt; it, and no one has redone the measurement for Falcon&apos;s discrete-Gaussian secrets rather than ternary ones [@ducas-vanwoerden-2021]. A proof would settle Falcon-512&apos;s safety; a sharper measurement could move the cliff either way. This is the single most decisive open problem for the thesis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is there an unexploited handle at Falcon&apos;s dimension?&lt;/strong&gt; Both overstretched routes -- subfield and subfield-free -- need a large $q$. Whether some &lt;em&gt;other&lt;/em&gt; structural attack on $h = g/f$ beats generic reduction at Falcon&apos;s small $q$ is open; the consolidated survey of refinements records steady progress but no sub-generic attack there yet [@albrecht-ducas-2021] [@kirchner-fouque-2017]. Such an attack would be Hypothesis A made real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does quantum help lattices beyond sieving?&lt;/strong&gt; Reversing Regev&apos;s one-directional reduction, or finding any quantum lever past the sieving speedup, would reshape the entire field [@regev-quantum-2004]. Widely believed impossible, entirely unproven.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can NTRU&apos;s reduction be narrowed to Falcon&apos;s parameters?&lt;/strong&gt; This is the one open problem whose success would &lt;em&gt;strengthen&lt;/em&gt; Falcon.OP4 is the escape hatch: narrow the Stehle-Steinfeld reduction toward $q = 12289$ and Falcon&apos;s assumption would finally gain the theorem it currently lacks, softening the &quot;least conservative&quot; verdict at the center of this article [@stehle-steinfeld-2011]. No one has managed it; the reduction still lives only at large parameters [@stehle-steinfeld-2011].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is Module-LWE&apos;s reduction worth the bytes?&lt;/strong&gt; The practitioner&apos;s version of the thesis: quantify how much the worst-case reduction is worth against Falcon&apos;s roughly 1.5x to 3.6x size advantage. NIST&apos;s answer so far is an institutional hedge -- standardize both, ML-DSA as the default and Falcon for the compact niche -- rather than a resolved ranking [@nist-pqc] [@fips-204].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Be clear about what is and is not in dispute. The &lt;em&gt;mechanisms&lt;/em&gt; in this article are settled results: the NTRU quotient and its dense sublattice, GPV&apos;s provable sampling, the overstretched fatigue phenomenon. What is contested is the &lt;em&gt;ranking&lt;/em&gt; -- which failure arrives first. That combination, rigorous foundations under an open ordering, is exactly the right shape for a &quot;How It Would Break&quot; question.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then there is the tell.&lt;/p&gt;

The clearest signal that the thesis names the right fault line is institutional. HAWK is a Falcon-class hash-and-sign that drops the $g/f$ quotient entirely, basing security on the module lattice-isomorphism problem and running over the integers with no floating-point sampler [@hawk-2022]. Two of the NTRU-Fatigue authors -- Leo Ducas and Wessel van Woerden -- co-designed it. The people who measured NTRU&apos;s cliff went and built the NTRU-free alternative. The honest counter-caveat runs the other way: the lattice-isomorphism problem is younger and less battle-tested than NTRU, so HAWK trades a well-scrutinized assumption for a less-scrutinized one. It is a hedge, not a verdict.
&lt;p&gt;That HAWK exists, and that its designers overlap with NTRU&apos;s own cliff-mappers, is the strongest available evidence that Falcon&apos;s NTRU assumption is a &lt;em&gt;chosen trade-off&lt;/em&gt; rather than a free lunch. No standardized scheme occupies the ideal corner -- compact, integer-only, reduction-backed, and quotient-free all at once. Falcon has the compactness and pays with the assumption; ML-DSA has the reduction and pays with bytes; HAWK reaches for the quotient-free corner and pays with youth. The design space has no free lunch, only priced trades.&lt;/p&gt;
&lt;p&gt;None of this is a reason to avoid Falcon. It is a reason to deploy it with your eyes open -- which, for a defender planning a real migration, is a concrete and answerable question. What do you actually do on Monday?&lt;/p&gt;
&lt;h2&gt;13. What a Defender Does on Monday&lt;/h2&gt;
&lt;p&gt;You are a defender planning a post-quantum migration. You have read the argument. What do you actually do?&lt;/p&gt;
&lt;p&gt;Start by matching the signature to the constraint, not to the hype.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; - &lt;strong&gt;Default: ML-DSA (FIPS 204).&lt;/strong&gt; Finalized, integer-only, easy to implement in constant time, and backed by a worst-case reduction. Choose it unless a hard constraint forces otherwise [@fips-204] [@peikert-decade-2016]. - &lt;strong&gt;Bandwidth-critical: Falcon (FN-DSA), eyes open.&lt;/strong&gt; When the smallest signature and key are decisive -- certificate chains, constrained links -- and you accept both the thinner NTRU margin and the draft status [@falcon-spec] [@fips-206-status]. - &lt;strong&gt;Assumption-minimal: SLH-DSA (FIPS 205).&lt;/strong&gt; When you want to depend on nothing but hash functions and can pay multi-kilobyte signatures [@nist-pqc]. - &lt;strong&gt;Belt-and-suspenders: hybrids.&lt;/strong&gt; Pair a classical signature with a post-quantum one during migration, or pair ML-DSA with Falcon for both a reduction and compactness. - &lt;strong&gt;Frontier, watch but do not deploy: HAWK.&lt;/strong&gt; The NTRU-free hash-and-sign that removes the exact handle this article isolates; not standardized [@hawk-2022].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then decide what you &lt;em&gt;watch&lt;/em&gt;, because the thesis tells you exactly what an early warning looks like. Watch the fatigue margin: any result pushing $q \approx 0.004 \cdot n^{2.484}$ downward, or extending it rigorously to discrete-Gaussian secrets and landing lower, is a signal aimed straight at Falcon-512 [@ducas-vanwoerden-2021]. Watch for a new $g/f$ sublattice technique that bites at Falcon&apos;s small $q$ [@kirchner-fouque-2017]. What you do &lt;em&gt;not&lt;/em&gt; need to watch for is a sudden Shor-style collapse -- the mathematics rules that out. An NTRU break announces itself as a shrinking margin, not a thunderclap.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; FN-DSA is draft FIPS 206 as of mid-2026, with final publication expected late 2026 or early 2027 [@fips-206-status] [@encryptionconsulting-fndsa]. Treat it as plan-and-test, not production. Keep ML-DSA as the drop-in conservative sibling, and keep your stack crypto-agile so you can swap schemes if the margin moves.&lt;/p&gt;
&lt;/blockquote&gt;


No. Lattice problems are not an instance of the abelian hidden-subgroup problem that Shor&apos;s algorithm solves, which is the very reason Falcon is a post-quantum candidate. A quantum computer only speeds up generic sieving, a constant-factor gain in the exponent, not a structural collapse [@regev-quantum-2004] [@bdgl-2016].


No. Those attacks require a *large* modulus $q$ relative to the dimension. Falcon&apos;s $q = 12289$ is deliberately small and sits below the measured fatigue cliff, in the regime where the NTRU lattice is believed to behave generically [@albrecht-bai-ducas-2016] [@ducas-vanwoerden-2021].


No. NTRUSign leaked its key because it signed *deterministically*, making every signature a sample from the secret parallelepiped. Falcon&apos;s GPV discrete-Gaussian sampling provably closes that exact leak: a true-Gaussian transcript is independent of the secret basis [@nguyen-regev-2006] [@gpv-2008].


Here it is the opposite. A large modulus shortens NTRU&apos;s dense sublattice and invites the overstretched attack; Falcon&apos;s small $q$ is precisely what keeps it clear of that regime [@kirchner-fouque-2017] [@albrecht-bai-ducas-2016].


Not yet. FIPS 206 is still draft; ML-DSA (FIPS 204) is the finalized default for general use. Reach for Falcon where bytes are genuinely scarce, with the NTRU margin and draft status understood [@fips-206-status] [@fips-204].


A paper pushing the fatigue boundary $q \approx 0.004 \cdot n^{2.484}$ downward, or extending it rigorously to Falcon&apos;s discrete-Gaussian secrets and finding it lower than the ternary fit, or a new $g/f$ sublattice technique effective at Falcon&apos;s dimension. Not a sudden quantum collapse [@ducas-vanwoerden-2021] [@kirchner-fouque-2017].


It is the same ring and the same $h = g/f$ quotient, but a different use -- a GPV trapdoor signature rather than encryption -- with carefully chosen, deliberately non-overstretched parameters [@ntru-1998] [@falcon-spec].


This article analyzed only Falcon&apos;s mathematics. The other half of Falcon&apos;s risk -- the floating-point and FFT sampler&apos;s implementation pitfalls, timing and power side channels, fault injection, RNG failures, and protocol misuse -- attacks the code, not the assumption, and it is the subject of the empirical sibling, *How the NIST Finalists Broke: Rainbow in a Weekend, SIKE in an Afternoon, and the Graveyard of Post-Quantum Candidates*. It is drawn here only to mark the line: a real deployment must defend both sides, and they fail in completely different ways.
&lt;p&gt;Return, finally, to the paradox we opened with. Pierre-Alain Fouque helped build Falcon&apos;s trapdoor, and he helped map the overstretched regime that is its likeliest structural fault line. That is not a scandal and not a warning to run from Falcon. It is how good cryptography is supposed to work: the same experts who build a scheme are the ones who probe hardest at where it could give way, in public, with formulas and CPU-years, long before an adversary gets there.&lt;/p&gt;

When Falcon eventually cracks, the crack most likely starts in the NTRU structure -- not in Shor, not in a generic sieve, but in the one assumption Falcon&apos;s compactness could never insure.
&lt;p&gt;That is the whole argument, assembled from the evidence: transcript leakage is closed by a theorem, a generic advance is real but hits everyone alike, and the NTRU-specific break is the only failure that is open, aimed at Falcon in particular, and already one measured factor of 1.75 away. The ranking is a judgment, not a proof -- but it is the judgment the evidence supports. Deploy Falcon where its smallness earns its place, watch the fatigue margin like a hawk, and keep ML-DSA one configuration change away.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;how-falcon-would-break&quot; keyTerms={[
  { term: &quot;NTRU lattice&quot;, definition: &quot;The 2n-dimensional lattice fixed by the public key h = g/f, in which the short secret pair (f, g) is a shortest vector.&quot; },
  { term: &quot;The g/f quotient&quot;, definition: &quot;NTRU publishes a ratio of two short secrets, not two independent values; the ratio plants a dense sublattice.&quot; },
  { term: &quot;Dense sublattice&quot;, definition: &quot;A region of the NTRU lattice unusually rich in short vectors, created by the quotient and exploited when q is large.&quot; },
  { term: &quot;GPV sampling&quot;, definition: &quot;Provable discrete-Gaussian preimage sampling whose output law is independent of the secret basis, closing transcript leakage.&quot; },
  { term: &quot;Worst-case-to-average-case reduction&quot;, definition: &quot;A proof that a random key is as hard as the worst case; Module-LWE has an asymptotic one in its parameter regime, NTRU at q equals 12289 does not.&quot; },
  { term: &quot;Overstretched NTRU and fatigue point&quot;, definition: &quot;The large-q regime where the dense sublattice goes short; the crossover q is about 0.004 times n to the 2.484, for ternary secrets.&quot; },
  { term: &quot;Core-SVP model&quot;, definition: &quot;A conservative cost model mapping a BKZ blocksize beta to about 2 to the 0.292 beta classical operations.&quot; },
  { term: &quot;Module-LWE&quot;, definition: &quot;The assumption under Dilithium and Kyber; same ring class as NTRU but no g/f quotient and an asymptotic worst-case reduction in its parameter regime.&quot; }
]} questions={[
  { q: &quot;Derive why enlarging the modulus q makes NTRU&apos;s planted secret easier to find, not harder.&quot;, a: &quot;The NTRU lattice has volume q to the n, so its generic shortest vector grows like the square root of q, while the planted (f, g) module and its ring-shifts keep a length independent of q; the ratio of secret length to square-root-of-q shrinks as q grows, so the secret protrudes further above the generic floor.&quot; },
  { q: &quot;Why does Module-LWE&apos;s worst-case reduction being asymptotic and quantum limit what it guarantees at ML-DSA-44&apos;s deployed numbers?&quot;, a: &quot;Being asymptotic and non-tight, it constrains the family as n grows rather than pinning the concrete bit-security at ML-DSA-44&apos;s exact parameters, which the lattice estimator still sets; and the clean, tight form of Regev&apos;s reduction is quantum, since the known classical routes need either an exponentially large modulus or a dimension-increasing detour.&quot; },
  { q: &quot;Why is Falcon-512&apos;s forgery blocksize (about 415) smaller than its key-recovery blocksize (about 481)?&quot;, a: &quot;Forgery needs only some vector under a relatively loose norm bound, which reduction clears at a smaller blocksize; key recovery must expose the specific, very short secret module, so it clears only at a larger blocksize, and the same 0.292 constant then reads out 2 to the 121 versus 2 to the 140.&quot; },
  { q: &quot;What is Falcon-512&apos;s fatigue margin, and why is it only an extrapolation?&quot;, a: &quot;About 1.75x, from an experimental average-case fit measured on ternary secrets while Falcon uses discrete-Gaussian secrets.&quot; },
  { q: &quot;Rank the three ways Falcon could structurally break.&quot;, a: &quot;NTRU-specific advance first (open, specific, measured), generic sieving second (open but non-specific), transcript leakage last (closed by GPV).&quot; }
]} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Part 8 of &lt;em&gt;How It Would Break&lt;/em&gt; turns to a different assumption entirely -- but the question stays the same: when it breaks, where does the crack start?&lt;/p&gt;
</content:encoded><category>post-quantum-cryptography</category><category>falcon</category><category>ntru</category><category>lattice-cryptography</category><category>digital-signatures</category><category>cryptanalysis</category><category>fn-dsa</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>One Event, Three Assumptions, Five Answers: A Field Guide to the Post-Quantum Toolkit</title><link>https://paragmali.com/blog/one-event-three-assumptions-five-answers-a-field-guide-to-th/</link><guid isPermaLink="true">https://paragmali.com/blog/one-event-three-assumptions-five-answers-a-field-guide-to-th/</guid><description>A field guide to the five NIST post-quantum primitives -- ML-KEM, ML-DSA, SLH-DSA, FN-DSA, HQC: math intuition, exact sizes, failures, and decision rules.</description><pubDate>Tue, 14 Jul 2026 01:32:13 GMT</pubDate><content:encoded>
Shor&apos;s 1994 algorithm condemned RSA, Diffie-Hellman, and elliptic curves [@shor-1994], and &quot;harvest now, decrypt later&quot; means the clock is already running on today&apos;s traffic. NIST&apos;s answer is not one replacement but a **toolkit**: three finalized standards -- ML-KEM for key exchange, ML-DSA and SLH-DSA for signatures, all published on 2024-08-13 [@fips-203] [@fips-204] [@fips-205] -- and two more still on the way, FN-DSA (Falcon) and HQC, both pre-final [@fips-206-perlner-2025] [@nist-ir-8545]. The five are spread deliberately across lattices, hash functions, and codes so that no single mathematical break takes everything down. There is no free lunch: every choice trades size against speed against how conservative the assumption is. And, tellingly, **nothing in the toolkit has been mathematically broken.** Every real-world failure so far has been an implementation leak -- KyberSlash&apos;s secret-dependent division [@kyberslash-site], Falcon&apos;s floating-point hazard [@fouque-gsnorm-2019] -- while the era&apos;s two famous cryptanalytic breaks, SIKE and Rainbow, hit schemes that never made the cut [@castryck-decru-sidh-2022] [@beullens-rainbow-2022].
&lt;h2&gt;1. Somebody Is Already Saving Your Handshake&lt;/h2&gt;
&lt;p&gt;Right now, somewhere, a machine may be recording this very TLS session -- not to read today, but to decrypt on the afternoon a large quantum computer finally boots. That is not a thriller premise. It is the stated design assumption behind a change that is already shipping in production TLS software, where the default key exchange offered is no longer plain X25519 but a hybrid whose second half is called ML-KEM [@openssl-35-notes]. The strange part is not that the field replaced the math. It is that replacing it took &lt;strong&gt;five&lt;/strong&gt; different algorithms, resting on &lt;strong&gt;three&lt;/strong&gt; unrelated hard problems, to answer a &lt;strong&gt;single&lt;/strong&gt; result published in 1994 -- and that, so far, not one of the five has actually been broken.&lt;/p&gt;
&lt;p&gt;The single result is Shor&apos;s algorithm. In 1994 Peter Shor showed that a large, fault-tolerant quantum computer could factor integers and compute discrete logarithms in polynomial time [@shor-1994]. That one capability condemns essentially every public-key system deployed on the internet: RSA rests on factoring, Diffie-Hellman and elliptic-curve cryptography rest on discrete logarithms. (This series covered those primitives directly in &lt;a href=&quot;https://paragmali.com/blog/rsa-is-a-trapdoor-not-a-cryptosystem-oaep-pss-and-the-25-yea/&quot; rel=&quot;noopener&quot;&gt;Part 14 on RSA&lt;/a&gt;, &lt;a href=&quot;https://paragmali.com/blog/the-curve-was-hard-the-gap-was-soft-a-field-guide-to-using-e/&quot; rel=&quot;noopener&quot;&gt;Part 15 on elliptic curves&lt;/a&gt;, and &lt;a href=&quot;https://paragmali.com/blog/nobody-broke-the-discrete-log-a-field-guide-to-diffie-hellma/&quot; rel=&quot;noopener&quot;&gt;Part 18 on Diffie-Hellman&lt;/a&gt;.) The moment a cryptographically relevant quantum computer exists, all three fall together.&lt;/p&gt;

An attack strategy in which an adversary records encrypted traffic today, stores it, and decrypts it years later once a quantum computer becomes available. It means the quantum threat is not purely in the future: any secret that must stay confidential past the arrival of quantum computing is already exposed the moment it crosses the wire.
&lt;p&gt;Harvest now, decrypt later is why this is urgent before any quantum computer exists. If your threat model includes an adversary who can afford disk space and patience, then a session key protecting a 20-year secret is already at risk today [@nist-pqc-project]. That is the reasoning behind migrating key establishment first, and it is why the hybrid X25519MLKEM768 key share now ships as a default key share in OpenSSL 3.5, and was enabled by default in OpenSSH 9.9 before becoming the default key exchange in OpenSSH 10.0 [@openssl-35-notes] [@openssh-99-notes] [@openssh-pq].&lt;/p&gt;
&lt;p&gt;So the threat is one thing, sharp and singular. Why is the answer five things? NIST did not standardize one post-quantum cipher; it assembled a &lt;strong&gt;toolkit&lt;/strong&gt; -- three finalized standards and two more in progress -- and spread it across three unrelated families of hard problem: structured lattices, hash functions, and error-correcting codes. The bet is that a mathematical breakthrough against one family is unlikely to touch the others. To see why the answer is a toolkit, not a single cipher: its parts are older than the threat they answer.&lt;/p&gt;
&lt;h2&gt;2. The Threat, and the Three Old Ideas That Outlived It&lt;/h2&gt;
&lt;p&gt;Here is the twist that makes the whole story make sense: the replacements predate the threat. The oldest members of the toolkit were invented for reasons that had nothing to do with quantum computers, and they turned out to be quantum-safe by accident.&lt;/p&gt;
&lt;p&gt;Robert McEliece published a code-based public-key cryptosystem in 1978, hiding a secret, efficiently decodable error-correcting code (a binary Goppa code) behind a scrambled generator matrix so that an attacker faces the task of decoding a random-looking linear code [@mceliece-1978]. One year later, Ralph Merkle showed how to build digital signatures out of nothing but a hash function, chaining one-time keys under a binary hash tree whose root is the public key [@merkle-thesis-1979]; he polished the construction a decade later as &quot;A Certified Digital Signature&quot; [@merkle-cds-1989]. Both predate Shor by fifteen-plus years. Both are still standing.&lt;/p&gt;
&lt;p&gt;Then, in 1994, the threat arrived. Shor&apos;s quantum algorithm solves factoring and discrete logarithm in polynomial time, condemning RSA, Diffie-Hellman, and elliptic curves the moment a large quantum computer runs it [@shor-1994]. Two years later Lov Grover found a quantum search algorithm with a quadratic speedup [@grover-1996]. Grover is the good news that bounds the damage: a mere square-root speedup means doubling a symmetric key or hash-output length restores the security margin, which is exactly why hash-based signatures are considered the most conservative branch of the toolkit.Shor is catastrophic (exponential to polynomial); Grover is survivable (a square-root factor). The asymmetry is the reason symmetric ciphers and hash functions merely need bigger parameters, while public-key cryptography needed entirely new hard problems.&lt;/p&gt;
&lt;p&gt;Lattices arrived on a separate track, and again for their own reasons. In 1996 Miklos Ajtai proved a startling worst-case-to-average-case reduction: breaking a &lt;em&gt;random&lt;/em&gt; instance of a certain lattice problem is as hard as breaking the &lt;em&gt;worst&lt;/em&gt; case [@ajtai-1996]. That single result promoted lattices from a curiosity to a rigorous foundation. In 1998 Hoffstein, Pipher, and Silverman published NTRU, the first lattice scheme compact and fast enough to consider deploying, working over a small polynomial ring with tiny coefficients [@ntru-1998].NTRU was first announced at the CRYPTO 1996 rump session but formally published at ANTS-III in 1998, so you will see both dates in the literature. Merkle&apos;s hash-tree work has the same two-date character: the 1979 thesis, then the 1989 CRYPTO paper.&lt;/p&gt;
&lt;p&gt;Oded Regev tied the knot in 2005 with Learning With Errors (LWE), a versatile assumption whose hardness reduces (quantumly) to worst-case lattice problems and whose one-sentence intuition -- add noise to linear algebra -- runs through every lattice member of the toolkit [@regev-lwe-2005].&lt;/p&gt;
&lt;p&gt;The last pieces are the mechanisms that make these foundations into safe schemes. The Fujisaki-Okamoto transform (1999) upgrades a weak encryption scheme into a strong one by re-encrypting on decryption and checking consistency [@fo-1999]. The GPV framework (2008) showed how to build lattice hash-and-sign signatures using a trapdoor and discrete-Gaussian sampling [@gpv-2007]. Lyubashevsky&apos;s &quot;Fiat-Shamir with aborts&quot; (2009) offered a rival way to sign, rejecting and restarting whenever a candidate would leak the key [@lyubashevsky-fswa-2009]. Ring-LWE (2010) moved LWE into polynomial rings for compact keys and fast arithmetic [@lpr-ringlwe-2010]. And in 2015, SPHINCS made hash-based signatures &lt;em&gt;stateless&lt;/em&gt;, removing the operational footgun that had kept Merkle&apos;s idea out of ordinary hands [@sphincs-2015].&lt;/p&gt;

timeline
    title Post-quantum foundations predate the 1994 threat
    1978 : McEliece code-based encryption
    1979 : Merkle hash-based signatures
    1994 : Shor algorithm breaks RSA and ECC
    1996 : Grover search : Ajtai hard lattices
    1998 : NTRU ring lattices
    2005 : Regev Learning With Errors
    2008 : GPV lattice hash-and-sign
    2009 : Fiat-Shamir with aborts
    2010 : Ring-LWE efficiency
    2015 : SPHINCS stateless hashing
&lt;p&gt;Read the timeline as three columns hiding in one line. Codes and hashes (1978, 1979) are the ancient, conservative branches. Lattices (1996 to 2010) are the young, efficient branch that took the most theoretical work to make safe. The mechanisms (FO, GPV, Fiat-Shamir-with-aborts) are the connective tissue that turns a hard problem into a usable cipher.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Idea&lt;/th&gt;
&lt;th&gt;Why it mattered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1978&lt;/td&gt;
&lt;td&gt;McEliece&lt;/td&gt;
&lt;td&gt;Code-based encryption&lt;/td&gt;
&lt;td&gt;Oldest surviving PQC family; ancestor of HQC [@mceliece-1978]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1979&lt;/td&gt;
&lt;td&gt;Merkle&lt;/td&gt;
&lt;td&gt;Hash-based signatures&lt;/td&gt;
&lt;td&gt;Weakest possible assumption; ancestor of SLH-DSA [@merkle-thesis-1979]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;Shor&lt;/td&gt;
&lt;td&gt;Quantum factoring and discrete log&lt;/td&gt;
&lt;td&gt;The single threat the toolkit answers [@shor-1994]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;Ajtai&lt;/td&gt;
&lt;td&gt;Worst-case lattice hardness&lt;/td&gt;
&lt;td&gt;Made lattices a rigorous foundation [@ajtai-1996]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;Regev&lt;/td&gt;
&lt;td&gt;Learning With Errors&lt;/td&gt;
&lt;td&gt;The assumption under ML-KEM and ML-DSA [@regev-lwe-2005]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;Bernstein et al.&lt;/td&gt;
&lt;td&gt;Stateless hash signatures&lt;/td&gt;
&lt;td&gt;Made hash signatures deployable [@sphincs-2015]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Each of these old ideas was quantum-safe. And none was deployable as written. To see why, watch each one walk straight into a different wall.&lt;/p&gt;
&lt;h2&gt;3. Three Walls: Why the Old Ideas Could Not Ship&lt;/h2&gt;
&lt;p&gt;A cipher can be perfectly correct -- decrypting every honest message, verifying every honest signature -- and still be unusable, or worse, still hand over its secret key. The first generation of post-quantum schemes taught that lesson three times, each on a different axis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first wall is size.&lt;/strong&gt; McEliece&apos;s cryptosystem has resisted cryptanalysis for more than forty-five years, which is a stronger track record than RSA has. But its public key is an entire generator matrix. In the modern Classic McEliece parameter sets, that means a public key from roughly 261 KB (for the &lt;code&gt;mceliece348864&lt;/code&gt; set) up to about 1.36 MB (for &lt;code&gt;mceliece8192128&lt;/code&gt;) [@classic-mceliece]. A megabyte of key material per connection is a non-starter for a TLS handshake that budgets a few kilobytes. McEliece is not broken; it is simply too big to carry. Its security was never the problem. Its shape was.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second wall is state.&lt;/strong&gt; Merkle&apos;s hash-tree signatures, engineered into the modern XMSS and LMS schemes and standardized by NIST in SP 800-208, are compact and rest on the most conservative assumption in cryptography [@nist-sp-800-208]. But they are &lt;em&gt;stateful&lt;/em&gt;: the signer must advance a one-time-key index after every signature and must never, ever reuse one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; NIST SP 800-208 warns that if an attacker obtains two signatures made with the same one-time key, &quot;it would become computationally feasible for that attacker to forge signatures on arbitrary messages&quot; [@nist-sp-800-208]. Restore a virtual machine from a snapshot, clone a key into a backup, or run two signer replicas, and you can silently reuse an index. The math is impeccable; the operational requirement -- perfect, rollback-proof, monotonic state, forever -- is what ordinary systems cannot guarantee.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The third wall is the subtle one, and it reframes the whole problem: leakage.&lt;/strong&gt; The natural way to sign with a lattice is hash-and-sign in the style of GGH and its NTRU instantiation, NTRUSign: hash the message to a target point, then use your secret &quot;good&quot; basis to round to a nearby lattice point. A verifier checks the point is on the lattice and close to the target. It verifies perfectly. It is also fatally broken.&lt;/p&gt;
&lt;p&gt;In 2006, Phong Nguyen and Oded Regev showed why in a paper with a wonderful title: &quot;Learning a Parallelepiped&quot; [@nguyen-regev-2006]. Every signature is the difference between the hashed target and a lattice point, and those differences are distributed over the &lt;em&gt;fundamental parallelepiped&lt;/em&gt; of the secret basis. Collect a few hundred signatures, and you can reconstruct the shape of that parallelepiped -- which is to say, you can recover the secret key. The signer was leaking the key a little at a time, in the statistical shape of its own outputs, while every individual signature passed verification.&lt;/p&gt;

When the distribution of a scheme&apos;s public outputs (its signatures or its decryption behavior) depends on the secret key, an attacker who collects enough outputs can infer the key -- even though each individual output is valid. The break is statistical, not logical: nothing is forged, yet the key is recovered from the shape of honest data.
&lt;p&gt;Put the three walls side by side and a pattern appears. McEliece fails on size, stateful hashes fail on operational state, and NTRUSign fails on leakage -- three completely different axes. The naive strategy of &quot;pick the oldest unbroken idea and ship it&quot; runs aground because being unbroken is not the same as being safe to deploy. The NTRUSign failure is the sharpest version of the lesson, because it severs two ideas most people treat as one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Correctness is not security. A scheme can verify every honest signature and still surrender its secret key through the statistical shape of a few hundred outputs. The real design goal is not &quot;find math no one has broken.&quot; It is &quot;make the outputs reveal nothing about the secret.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That reframing is the hinge of the entire toolkit. Once you decide the enemy is any correlation between your public outputs and your private key, the design problem becomes concrete: engineer the transcript, the ciphertext, and the failure behavior so they are provably independent of the secret. That single idea, applied four different ways, is the modern toolkit.&lt;/p&gt;
&lt;h2&gt;4. The Competition: One Fix, Four Times&lt;/h2&gt;
&lt;p&gt;The forcing function was not a single genius. It was an open, adversarial competition. NIST issued its public Call for Proposals in December 2016 and spent the next years pruning dozens of submissions across multiple rounds, documenting the reasoning in status reports as it went [@nistir-8413]. What emerged was not one lineage but four convergent tracks, running inside three unrelated hardness assumptions, each track advancing by fixing the specific flaw that sank its predecessor.&lt;/p&gt;

flowchart LR
    subgraph TA[&quot;Track A -- codes&quot;]
      A1[McEliece 1978] --&amp;gt; A2[Niederreiter] --&amp;gt; A3[QC-MDPC BIKE] --&amp;gt; A4[HQC]
    end
    subgraph TB[&quot;Track B -- hashes&quot;]
      B1[Lamport OTS] --&amp;gt; B2[Merkle WOTS] --&amp;gt; B3[XMSS LMS] --&amp;gt; B4[SPHINCS+]
    end
    subgraph TC[&quot;Track C -- lattice KEM&quot;]
      C1[NTRU] --&amp;gt; C2[LWE] --&amp;gt; C3[Ring-LWE] --&amp;gt; C4[Module-LWE]
    end
    subgraph TD[&quot;Track D -- lattice signatures&quot;]
      D1[GGH NTRUSign] --&amp;gt; D2[GPV Falcon]
      D1 --&amp;gt; D3[Fiat-Shamir Dilithium]
    end
    A4 --&amp;gt; TK[Five toolkit tips]
    B4 --&amp;gt; TK
    C4 --&amp;gt; TK
    D2 --&amp;gt; TK
    D3 --&amp;gt; TK
    P1[SIKE isogeny] -.broke 2022.-&amp;gt; XX[Pruned families]
    P2[Rainbow multivariate] -.broke 2022.-&amp;gt; XX
&lt;p&gt;&lt;strong&gt;Track A, codes, is a war on key size.&lt;/strong&gt; McEliece&apos;s matrix is enormous, so Niederreiter published the &quot;dual&quot; version that sends a compact syndrome instead of a full codeword -- smaller ciphertext, but the public key is still a matrix. Quasi-cyclic MDPC codes then collapsed that key to a few kilobytes by making the matrix reconstructable from a single row, an idea realized in the BIKE scheme [@mdpc-mceliece-2013].&lt;/p&gt;

The hard problem under every code-based scheme: given a random-looking parity-check matrix and a syndrome (the matrix applied to an unknown low-weight error), recover the error. Decoding a general random linear code is NP-hard; a code-based cryptosystem hides a secret, efficiently decodable code so that only the key holder can decode, while an attacker faces the random-code version.
&lt;p&gt;But BIKE walked into a wall of its own. Its iterative bit-flipping decoder occasionally fails, and -- this is the trap -- &lt;em&gt;those failures depend on the secret key&lt;/em&gt;. In 2016 Guo, Johansson, and Stankovski turned that into a full reaction attack: feed the decoder crafted ciphertexts, watch which ones fail, and recover the private key from the pattern of failures [@gjs-mdpc-2016]. The very feature that shrank the key opened a side channel.&lt;/p&gt;

The probability that correct decapsulation fails on an honest ciphertext. For post-quantum KEMs this is not merely a correctness nuisance: if the failure rate is non-negligible and correlated with the secret, each failure leaks information, and enough failures recover the key. DFR is therefore a security parameter, and a good scheme drives it to a cryptographically negligible level with a bound that does not depend on the secret.
&lt;p&gt;HQC is the fix: keep the quasi-cyclic key size, but decode with a &lt;em&gt;public&lt;/em&gt;, fixed code whose failure rate can be bounded analytically and does not depend on the secret. That is precisely why NIST chose HQC over BIKE -- its DFR analysis was judged more mature [@nist-ir-8545].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Track B, hashes, is a war on state&lt;/strong&gt;, and the whole story is the fight against one number: the leaf index. Lamport&apos;s one-time signature signs once per key; Merkle put many one-time keys under a tree so one root signs many messages; XMSS and LMS engineered that into standardized, stateful schemes [@nist-sp-800-208]; and SPHINCS removed the state entirely by choosing a random leaf from a space so vast that collisions are negligible, backed by a few-time signature to absorb the rare clash [@sphincs-2015]. SPHINCS+ then hardened it with tweakable hashes and a tighter few-time scheme called FORS [@sphincs-plus-framework-2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Track C, lattice KEMs, is a war over structure.&lt;/strong&gt; NTRU was fast but rested on a heuristic assumption; LWE bought a worst-case hardness reduction but needed a full random matrix as its key; Ring-LWE compressed that matrix to a single polynomial with fast NTT arithmetic [@lpr-ringlwe-2010]; and Module-LWE dialed the ring structure partway back down, trading a sliver of efficiency for a hedge against the possibility that too much algebraic structure helps the attacker [@crystals-kyber].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Track D, lattice signatures, is where the tree forks and both branches survive.&lt;/strong&gt; The GGH/NTRUSign transcript leak forced a choice, and the field kept two answers: GPV hash-and-sign, which samples from a discrete Gaussian whose shape is provably independent of the secret basis (this becomes Falcon), and Fiat-Shamir with aborts, which rejects and restarts until the transcript is key-independent (this becomes Dilithium) [@gpv-2007] [@lyubashevsky-fswa-2009].&lt;/p&gt;
&lt;p&gt;Stare at those four tracks and the same move appears in every one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Every surviving generation makes the transcript or the failure channel provably independent of the secret. Gaussian sampling and rejection sampling remove the signature-transcript leak; the Fujisaki-Okamoto transform removes the decryption-failure oracle; statelessness removes the operational-state leak; HQC&apos;s public decoder removes BIKE&apos;s secret-dependent failures. The toolkit is not five unrelated tricks. It is one principle instantiated five ways.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The competition also pruned in public, and the prunings are the best argument for the whole strategy.&lt;/p&gt;

Two schemes that had survived years of scrutiny fell in 2022, within months of each other. Ward Beullens broke Rainbow, a multivariate signature finalist, in what his paper title advertised as a weekend on a laptop [@beullens-rainbow-2022]. Then Wouter Castryck and Thomas Decru broke SIKE, an isogeny-based KEM, with a key-recovery attack that runs in about ten minutes on a single core [@castryck-decru-sidh-2022]. Both schemes had strong theory and years of failed attacks behind them. Both were destroyed by a single new idea. And both were *outside* the final toolkit -- Rainbow was not selected, and SIKE advanced to NIST&apos;s fourth round only to be broken before it could be selected. That is the empirical case for diversity in one sentence: no amount of survived cryptanalysis is a proof, so you hedge across unrelated assumptions rather than bet everything on one.
&lt;p&gt;This is the moment to state the honest ending up front -- the argument the rest of the article defends.&lt;/p&gt;

Nothing in the toolkit has been mathematically broken. Every real-world failure so far has been an implementation leak -- and the two famous algorithmic breaks of the era hit schemes that never made the cut.
&lt;p&gt;It helps to see every notable failure of the era in one place, sorted by what actually went wrong. Two of these are implementation leaks in surviving schemes (the math is intact); two are historical breaks of superseded designs; and two are the non-toolkit cryptanalytic breaks that justify the hedge.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Scheme&lt;/th&gt;
&lt;th&gt;Root cause&lt;/th&gt;
&lt;th&gt;Lesson&lt;/th&gt;
&lt;th&gt;In the toolkit?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Parallelepiped leak&lt;/td&gt;
&lt;td&gt;GGH / NTRUSign&lt;/td&gt;
&lt;td&gt;Signature distribution depends on the secret basis [@nguyen-regev-2006]&lt;/td&gt;
&lt;td&gt;Make the transcript key-independent&lt;/td&gt;
&lt;td&gt;No -- superseded ancestor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reaction attack&lt;/td&gt;
&lt;td&gt;QC-MDPC / BIKE&lt;/td&gt;
&lt;td&gt;Secret-dependent decoding failures form an oracle [@gjs-mdpc-2016]&lt;/td&gt;
&lt;td&gt;Bound the DFR with a public decoder&lt;/td&gt;
&lt;td&gt;No -- not selected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIKE key recovery&lt;/td&gt;
&lt;td&gt;SIDH isogenies&lt;/td&gt;
&lt;td&gt;Torsion-point structure enables recovery [@castryck-decru-sidh-2022]&lt;/td&gt;
&lt;td&gt;A decade unbroken is not a proof&lt;/td&gt;
&lt;td&gt;No -- non-toolkit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rainbow weekend break&lt;/td&gt;
&lt;td&gt;Multivariate&lt;/td&gt;
&lt;td&gt;Structural attack on the oil-and-vinegar map [@beullens-rainbow-2022]&lt;/td&gt;
&lt;td&gt;Diversify assumptions&lt;/td&gt;
&lt;td&gt;No -- non-toolkit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KyberSlash&lt;/td&gt;
&lt;td&gt;ML-KEM (Kyber)&lt;/td&gt;
&lt;td&gt;Secret-dependent division timing [@kyberslash-site]&lt;/td&gt;
&lt;td&gt;Constant-time reduction; math untouched&lt;/td&gt;
&lt;td&gt;Yes -- implementation leak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gram-Schmidt leak&lt;/td&gt;
&lt;td&gt;FN-DSA (Falcon)&lt;/td&gt;
&lt;td&gt;Floating-point sampler leaks basis norms [@fouque-gsnorm-2019]&lt;/td&gt;
&lt;td&gt;Use a vetted constant-time sampler&lt;/td&gt;
&lt;td&gt;Yes -- implementation hazard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Notice that the bottom two rows -- the only failures inside the toolkit -- are both in the &quot;implementation&quot; column, never the &quot;math&quot; column. That distinction is the spine of everything that follows. By 2024 the pruned tree had five surviving tips. Three of them became law on a single day.&lt;/p&gt;
&lt;h2&gt;5. Three Standards in One Day&lt;/h2&gt;
&lt;p&gt;On 2024-08-13, NIST published three Federal Information Processing Standards at once: FIPS 203 (ML-KEM) for key encapsulation, FIPS 204 (ML-DSA) and FIPS 205 (SLH-DSA) for signatures [@fips-203] [@fips-204] [@fips-205]. That single date is when post-quantum cryptography crossed from an open competition into the law of the land, the thing an auditor can require and a protocol can mandate.&lt;/p&gt;
&lt;p&gt;Each standard is the hardened descendant of a competition submission, and each carries one defining idea forward.&lt;/p&gt;

A KEM is a three-function object -- key generation, encapsulate, decapsulate -- that lets two parties agree on a random shared secret. Encapsulate takes a public key and returns a ciphertext plus a shared secret; decapsulate takes the ciphertext and the private key and returns the same shared secret. It is the post-quantum replacement for the key-exchange half of Diffie-Hellman, and it composes with a symmetric cipher through the KEM-DEM pattern this series covered in [Part 19 on HPKE](/blog/the-standard-was-boring-that-was-the-point-a-field-guide-to-/). Crucially, a KEM is not a drop-in for a static-static Diffie-Hellman handshake -- a distinction we return to in the limits.
&lt;p&gt;&lt;strong&gt;ML-KEM&lt;/strong&gt; is Module-LWE encryption wrapped in a Fujisaki-Okamoto transform with &lt;em&gt;implicit rejection&lt;/em&gt;, so that an invalid ciphertext yields a pseudo-random shared secret rather than an error -- there is no decapsulation-failure oracle to probe [@fips-203]. &lt;strong&gt;ML-DSA&lt;/strong&gt; is a Fiat-Shamir-with-aborts signature built entirely from uniform integers, chosen deliberately so the implementation needs no floating point and is easy to make constant-time [@fips-204]. &lt;strong&gt;SLH-DSA&lt;/strong&gt; is a stateless hash-based signature whose security rests on nothing but its hash function -- the conservative backstop [@fips-205].&lt;/p&gt;
&lt;p&gt;ML-KEM is the standardized CRYSTALS-Kyber; ML-DSA is Dilithium; SLH-DSA is SPHINCS+. These are the same schemes under new NIST names, with standardization edits (tweaked hashing, encodings, and parameter cleanups), not fresh designs. If you have working knowledge of Kyber, you already understand ML-KEM.&lt;/p&gt;
&lt;p&gt;Two things follow that people routinely get wrong. First, the renaming is not a redesign: &quot;Kyber&quot; and &quot;ML-KEM&quot; are essentially the same scheme [@crystals-kyber]. Second, the toolkit is not finished -- only three of the five are standardized, and the fourth and fifth are genuinely pre-final.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; FN-DSA (Falcon), destined for FIPS 206, was still in development as of this writing, with a final expected around late 2026 or 2027 [@fips-206-perlner-2025]. HQC was only &lt;em&gt;selected&lt;/em&gt; for standardization on 2025-03-11, with a draft FIPS still pending [@nist-ir-8545]. Do not deploy either in production yet. Every FN-DSA and HQC size in this article is pre-final and may change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The migration is already underway on the finalized three. But a standard is a promise about an interface, not a proof of security. To defend a design in a review, you need what is under each name: the math, the exact sizes, and the specific way each one can still fail.&lt;/p&gt;
&lt;h2&gt;6. The Five Primitives in Depth&lt;/h2&gt;
&lt;p&gt;One workhorse, one default, one backstop, one compact hopeful, one insurance policy. That is the toolkit in five phrases: ML-KEM is the workhorse KEM, ML-DSA the default signature, SLH-DSA the conservative backstop, FN-DSA the compact hopeful, and HQC the non-lattice insurance policy. Three of the five are lattice schemes, so learn the lattice intuition once and reuse it three times.&lt;/p&gt;

LWE is &quot;add noise to linear algebra.&quot; Given a random matrix $A$ and the product $b = A\mathbf{s} + \mathbf{e}$ where $\mathbf{e}$ is small random noise, recovering the secret $\mathbf{s}$ is believed hard, classically and quantumly. Module-LWE is the same idea over a small polynomial ring, arranged as a rank-$k$ module so the security level is set by $k$ rather than by resizing everything. Raising $k$ adds structure-diluting hedge; lowering it saves bytes. ML-KEM and ML-DSA both live here; only the rank and the noise change.
&lt;p&gt;All byte sizes below are exact for the finalized three and explicitly pre-final for FN-DSA and HQC. Cycle counts come from the pqm4 Cortex-M4 benchmark harness unless labeled otherwise [@pqm4-benchmarks].Never compare a Cortex-M4 cycle count against an AVX2 desktop number directly -- they are different machines. HQC&apos;s own figures are measured on an Intel i7-11850H and Falcon&apos;s on an Intel i5-8259U, so those live on a different scale than the M4 numbers used for cross-scheme comparison.&lt;/p&gt;
&lt;h3&gt;6.1 ML-KEM (FIPS 203): the workhorse&lt;/h3&gt;
&lt;p&gt;ML-KEM is the standardization of CRYSTALS-Kyber, finalized as FIPS 203, and it is the only post-quantum primitive deployed at scale today [@fips-203] [@crystals-kyber]. Its security rests on Module-LWE over the ring $R_q = \mathbb{Z}_q[X]/(X^{256}+1)$ with modulus $q = 3329$; the module rank $k \in {2,3,4}$ selects ML-KEM-512, ML-KEM-768, and ML-KEM-1024.&lt;/p&gt;
&lt;p&gt;The scheme has two layers. The inner layer is an IND-CPA encryption scheme over the ring. The outer layer upgrades it to a CCA-secure KEM using the Fujisaki-Okamoto transform.&lt;/p&gt;

The FO transform turns a weak (chosen-plaintext-secure) encryption scheme into a strong (chosen-ciphertext-secure) KEM by re-encrypting on decapsulation and checking the result. The modern twist -- *implicit rejection* -- is that a failed check returns a deterministic pseudo-random shared secret derived from a secret seed $z$, never an error. Because every ciphertext yields a well-formed key, an attacker who submits tampered ciphertexts learns nothing from the response, closing the decapsulation-failure oracle that broke earlier schemes [@fo-1999] [@hhk-fo-2017].

sequenceDiagram
    participant S as Sender
    participant R as Receiver
    R-&amp;gt;&amp;gt;S: public encapsulation key ek
    Note over S: pick random m, derive shared key K and coins r
    S-&amp;gt;&amp;gt;R: ciphertext c that encapsulates m
    Note over R: decrypt c to m-prime, re-derive K-prime and r-prime
    Note over R: re-encrypt m-prime to c-prime and compare
    alt c-prime equals c
        Note over R: return true shared secret K-prime
    else mismatch
        Note over R: return pseudo-random key from secret z, no error
    end
&lt;p&gt;That implicit-rejection branch is the load-bearing idea. It is worth seeing in code just how little a tampered ciphertext reveals.&lt;/p&gt;
&lt;p&gt;{`
// Illustrative only -- NOT production crypto.
// ML-KEM decapsulation never reports &quot;invalid&quot;. On a re-encryption mismatch it
// returns a pseudo-random key derived from a per-key secret z, so a tampered
// ciphertext produces a well-formed but useless key -- no distinguishable signal.&lt;/p&gt;
&lt;p&gt;function toyHash(s) {
  let h = 2166136261 &amp;gt;&amp;gt;&amp;gt; 0;
  for (const c of String(s)) h = Math.imul(h ^ c.charCodeAt(0), 16777619) &amp;gt;&amp;gt;&amp;gt; 0;
  return (h &amp;gt;&amp;gt;&amp;gt; 0).toString(16).padStart(8, &apos;0&apos;);
}&lt;/p&gt;
&lt;p&gt;const z = &apos;per-key-secret-z&apos;; // implicit-rejection secret, never leaves the device&lt;/p&gt;
&lt;p&gt;// Receiver decrypts c to m&apos;, re-encrypts m&apos;, and compares the result to c.
function decapsulate(c, mDecrypted, cReencrypted) {
  if (cReencrypted === c) {
    return toyHash(&apos;real-shared-secret:&apos; + mDecrypted); // the genuine key
  }
  return toyHash(z + &apos;:&apos; + c);                           // pseudo-random reject key
}&lt;/p&gt;
&lt;p&gt;// Honest ciphertext: re-encryption matches, real key returned.
console.log(&apos;honest   :&apos;, decapsulate(&apos;c123&apos;, &apos;m&apos;, &apos;c123&apos;));
// Tampered ciphertext: mismatch -&amp;gt; still a key, still no error.
console.log(&apos;tampered :&apos;, decapsulate(&apos;c999&apos;, &apos;m-garbled&apos;, &apos;c123&apos;));
// The reject key is deterministic per (z, c) and looks like any other key,
// so the attacker cannot tell rejection from success. The oracle is closed.
`}&lt;/p&gt;
&lt;p&gt;The exact bytes are what a protocol actually carries. For ML-KEM the encapsulation key / decapsulation key / ciphertext / shared secret sizes are 800 / 1632 / 768 / 32 for ML-KEM-512, 1184 / 2400 / 1088 / 32 for ML-KEM-768, and 1568 / 3168 / 1568 / 32 for ML-KEM-1024 [@fips-203]. The decryption-failure rates are $2^{-138.8}$, $2^{-164.8}$, and $2^{-174.8}$ respectively -- negligible by design, which as we saw is a security requirement, not a mere nicety [@fips-203]. On Cortex-M4, ML-KEM-768 costs roughly 642k / 659k / 708k cycles for keygen / encapsulate / decapsulate [@pqm4-benchmarks].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Several Kyber implementations divided a &lt;em&gt;secret&lt;/em&gt; numerator by the public modulus $q = 3329$ inside compression, and on many CPUs division time depends on the inputs -- so the timing leaked secret data. That is KyberSlash [@kyberslash-site] [@kyberslash-eprint-2024]. The FIPS 203 mathematics was never in question; the fix is constant-time (Barrett-style) reduction. It is the toolkit&apos;s headline real-world failure, and it is an implementation bug, exactly as the thesis predicts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The three small prime moduli to remember: $q = 3329$ for ML-KEM, $q = 8380417$ for ML-DSA, and $q = 12289$ for Falcon. KyberSlash lived in the division by 3329.&lt;/p&gt;
&lt;p&gt;ML-KEM excels because it is small, fast, and easy to implement over small integers mod a fixed prime. It is the default post-quantum KEM in shipping software: the X25519MLKEM768 hybrid is a default key share in OpenSSL 3.5, and it was enabled by default in OpenSSH 9.9 before becoming the default key exchange in OpenSSH 10.0 [@openssl-35-notes] [@openssh-99-notes] [@openssh-pq]. Where it is least comfortable is its assumption: Module-LWE is younger and more structured than code- or hash-based hardness, which is the entire reason the field wants a non-lattice KEM in reserve.&lt;/p&gt;
&lt;h3&gt;6.2 ML-DSA (FIPS 204): the default signature&lt;/h3&gt;
&lt;p&gt;ML-DSA is the standardized CRYSTALS-Dilithium, and it is the signature you should reach for by default [@fips-204] [@crystals-dilithium]. It builds on the same Module-LWE ring world as ML-KEM (here with $q = 8380417$), but it signs by a completely different route than the hash-and-sign that leaked in NTRUSign.&lt;/p&gt;

Turn an interactive identification protocol into a signature by replacing the verifier&apos;s challenge with a hash (Fiat-Shamir), then add a rejection step: whenever the candidate signature would correlate with the secret, discard it and restart with fresh randomness. The signatures that survive are, by construction, distributed independently of the secret key. The cost is that signing runs a variable number of attempts [@lyubashevsky-fswa-2009].
&lt;p&gt;The signer commits to a masking vector $\mathbf{y}$, derives a sparse challenge $c$ by hashing the commitment together with the message, and forms $\mathbf{z} = \mathbf{y} + c\mathbf{s}_1$. If $\mathbf{z}$ strays outside a safe range, releasing it would leak the secret, so the signer aborts and tries again.&lt;/p&gt;

flowchart TD
    A[Sample fresh masking vector y] --&amp;gt; B[Derive sparse challenge c by hashing commitment and message]
    B --&amp;gt; C[Form candidate z as y plus c times secret s1]
    C --&amp;gt; D{&quot;Is z inside the safe range?&quot;}
    D -- No, would leak the secret --&amp;gt; A
    D -- Yes --&amp;gt; E[Publish signature challenge, z, hint]
&lt;p&gt;You can watch the loop behave. The number of attempts varies from signature to signature, and every released value stays inside the safe bound -- the mechanism that makes the transcript reveal nothing about the key.&lt;/p&gt;
&lt;p&gt;{`
// Illustrative only -- NOT production crypto.
// Keep sampling a masking value y until z = y + c*s1 lands in a safe range.
// Candidates that would correlate z with the secret are rejected; only
// key-independent z escape. Signing time therefore varies run to run.&lt;/p&gt;
&lt;p&gt;const GAMMA1 = 100;   // masking range
const BETA   = 20;    // how far c*s1 can push z
const secret = 37;    // s1, unknown to the verifier
const c = 1;          // toy sparse challenge
const rand = (n) =&amp;gt; Math.floor(Math.random() * n);&lt;/p&gt;
&lt;p&gt;function signOnce() {
  let attempts = 0;
  while (true) {
    attempts++;
    const y = rand(2 * GAMMA1) - GAMMA1;       // uniform masking
    const z = y + c * secret;
    if (Math.abs(z) &amp;lt; GAMMA1 - BETA) return { z, attempts }; // safe -&amp;gt; release
    // otherwise abort and retry with fresh y
  }
}&lt;/p&gt;
&lt;p&gt;let total = 0, n = 20000, maxAbsZ = 0;
for (let i = 0; i &amp;lt; n; i++) {
  const r = signOnce();
  total += r.attempts;
  maxAbsZ = Math.max(maxAbsZ, Math.abs(r.z));
}
console.log(&apos;avg attempts / signature:&apos;, (total / n).toFixed(2));
console.log(&apos;max |z| ever released   :&apos;, maxAbsZ, &apos;bound is&apos;, GAMMA1 - BETA);
console.log(&apos;variable attempt count is why ML-DSA signing time is not constant&apos;);
`}&lt;/p&gt;
&lt;p&gt;The Dilithium team chose this uniform-integer, rejection-based route deliberately, rather than Falcon&apos;s Gaussian sampler, and they were blunt about why.&lt;/p&gt;

&quot;Gaussian sampling is hard to implement securely and efficiently.&quot; -- the CRYSTALS-Dilithium team, on why ML-DSA uses uniform integers and no floating point [@crystals-dilithium].
&lt;p&gt;The private key / public key / signature sizes are 2560 / 1312 / 2420 for ML-DSA-44, 4032 / 1952 / 3309 for ML-DSA-65, and 4896 / 2592 / 4627 for ML-DSA-87, targeting NIST categories 2, 3, and 5 [@fips-204]. Verification is fast and constant-time; signing is fast but variable-time because of the abort loop, which is the single most important operational fact about the scheme. On Cortex-M4, ML-DSA-65 signing averages near 6.19M cycles but ranges from about 2.92M to 26.0M across a thousand runs [@pqm4-benchmarks].&lt;/p&gt;
&lt;p&gt;FIPS 204 supports both hedged (randomized) and deterministic signing; the hedged mode is the default and is more resilient to fault and bad-randomness mishaps. It also adds a context string of up to 255 bytes so applications can domain-separate their signatures and prevent cross-protocol reuse.&lt;/p&gt;
&lt;p&gt;ML-DSA excels as the general-purpose default: no floating point, easy constant-time code, moderate sizes, fast verification. Its weak spot is the signature-size wall this series flagged for interfaces in &lt;a href=&quot;https://paragmali.com/blog/the-math-held-the-interface-leaked-a-field-guide-to-digital-/&quot; rel=&quot;noopener&quot;&gt;Part 17 on digital signatures&lt;/a&gt; -- a 3309-byte signature is roughly fifty times an Ed25519 signature, and that multiplies through certificate chains.&lt;/p&gt;
&lt;h3&gt;6.3 SLH-DSA (FIPS 205): the conservative backstop&lt;/h3&gt;
&lt;p&gt;SLH-DSA is the standardized SPHINCS+, and it makes the most conservative bet in the toolkit: its security rests on nothing but the properties of its hash function, the same primitives this series covered in &lt;a href=&quot;https://paragmali.com/blog/the-fingerprint-two-files-shared-a-field-guide-to-cryptograp/&quot; rel=&quot;noopener&quot;&gt;Part 10 on cryptographic hashes&lt;/a&gt; [@fips-205] [@sphincs-plus-spec]. If every lattice and code assumption fell tomorrow, a signature that depends only on a hash would still stand.&lt;/p&gt;

SLH-DSA composes three hash-based gadgets. WOTS+ is a one-time signature that signs by revealing points along hash chains. FORS (&quot;Forest Of Random Subsets&quot;) is a *few-time* signature that signs the message digest and tolerates rare index collisions. A hypertree stacks many layers of Merkle trees, each layer&apos;s WOTS+ keys authenticating the roots below, up to one public root. Picking the FORS instance pseudo-randomly from the message removes the state that made XMSS dangerous [@sphincs-plus-framework-2019].

flowchart TD
    M[Message digest] --&amp;gt; R[Randomizer picks a FORS instance pseudo-randomly]
    R --&amp;gt; F[FORS few-time signature over the digest]
    F --&amp;gt; W[WOTS+ one-time key authenticates the FORS root]
    W --&amp;gt; H[Hypertree of Merkle layers, each signs the layer below]
    H --&amp;gt; PK[Single long-lived public root]
&lt;p&gt;The trade is stark. Public keys are tiny (32 to 64 bytes), but signatures are enormous and signing is slow. FIPS 205 defines twelve parameter sets -- three security levels, each with a &quot;small&quot; (&lt;code&gt;s&lt;/code&gt;) and &quot;fast&quot; (&lt;code&gt;f&lt;/code&gt;) variant, over SHA-2 and SHAKE. The public key / signature sizes run 32 / 7856 for 128s, 32 / 17088 for 128f, 48 / 16224 for 192s, 48 / 35664 for 192f, 64 / 29792 for 256s, and 64 / 49856 for 256f [@fips-205]. Signing hashes whole subtrees and costs hundreds of millions to billions of Cortex-M4 cycles, orders of magnitude slower than lattice signing [@pqm4-benchmarks]. The &lt;code&gt;s&lt;/code&gt;/&lt;code&gt;f&lt;/code&gt; knob only trades one pain for the other: smaller signatures mean slower signing.&lt;/p&gt;
&lt;p&gt;That profile makes SLH-DSA the right tool for low-volume, high-assurance signing -- firmware, boot chains, and software-update roots -- where you sign rarely, verify occasionally, and value a rock-bottom assumption over compactness.&lt;/p&gt;

If you can guarantee perfect state, the stateful hash signatures XMSS and LMS (NIST SP 800-208) are markedly smaller than SLH-DSA [@nist-sp-800-208]. The catch is the catch from Section 3: reuse a one-time leaf index and you enable forgery. They are the right call only in a tightly controlled setting -- a hardware security module or a firmware signer that can enforce monotonic, rollback-proof state. For everyone else, SLH-DSA trades bytes for the removal of that footgun, which is usually the better deal.
&lt;h3&gt;6.4 FN-DSA / Falcon: the compact hopeful (pre-final)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Falcon is destined to become FIPS 206, but that document was still in development as of this writing, with a final expected around late 2026 or 2027 [@fips-206-perlner-2025] [@digicert-fndsa]. Every name and size below is pre-final and comes from the Falcon specification, not from a FIPS [@falcon-spec]. Do not ship FN-DSA in production yet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Falcon instantiates the GPV hash-and-sign framework over NTRU lattices ($q = 12289$, dimension $n = 512$ or $1024$), and it produces the smallest signatures and keys of any standardized-track scheme [@falcon-spec] [@gpv-2007].&lt;/p&gt;

The safe way to do lattice hash-and-sign. A secret trapdoor lets the signer sample a short lattice vector near a hashed target from a discrete Gaussian whose distribution is provably independent of the secret basis. That independence is exactly what NTRUSign lacked -- it closes the parallelepiped leak by construction, rather than hoping the outputs happen not to correlate with the key.

flowchart LR
    M[Message] --&amp;gt; HP[Hash message to a point c in the ring]
    HP --&amp;gt; TS[Use NTRU trapdoor basis to target c]
    TS --&amp;gt; GS[Fast-Fourier Gaussian sampling, the delicate floating-point step]
    GS --&amp;gt; SV[Short vector s1, s2 near the lattice]
    SV --&amp;gt; SIG[Signature is a salt plus compressed s2]
&lt;p&gt;The payoff is compactness. Falcon-512 has an 897-byte public key and a 666-byte signature (roughly RSA-2048&apos;s classical security level, as this series discussed in Part 14, at a fraction of the byte size); Falcon-1024 is 1793 / 1280 [@falcon-spec]. On a desktop i5-8259U the reference code signs about 5948 times per second and verifies about 27933 times per second for Falcon-512 [@falcon-spec]. A Falcon-512 signature is under a third the size of ML-DSA-44&apos;s.&lt;/p&gt;
&lt;p&gt;So why is it the last of the five to standardize? Because the Gaussian sampler runs on floating-point arithmetic, and making floating point constant-time across compilers and CPUs is genuinely hard. Timing or precision leakage of the sampler&apos;s Gram-Schmidt norms can recover the secret key [@fouque-gsnorm-2019]. Mitigations exist -- Pornin&apos;s constant-time integer implementation and isochronous Gaussian sampling among them -- but they are intricate and platform-sensitive [@pornin-ctfalcon-2019] [@howe-isochronous-2019].&lt;/p&gt;
&lt;p&gt;Want concrete evidence that FN-DSA is pre-final? When researchers fetched the expected FIPS 206 Initial Public Draft URL during the source verification for this article, it returned HTTP 404 -- the draft was not yet published. The compact math is done; the standardization and safe-implementation work is not.&lt;/p&gt;
&lt;p&gt;Falcon is the right tool when signature and key bandwidth is the binding constraint &lt;em&gt;and&lt;/em&gt; you can guarantee a vetted constant-time implementation -- and even then, not before FIPS 206 lands. Until it does, prefer ML-DSA.&lt;/p&gt;
&lt;h3&gt;6.5 HQC: the non-lattice insurance policy (pre-final)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; NIST selected HQC on 2025-03-11 as a code-based KEM to stand alongside ML-KEM, with a draft FIPS expected in 2026 and a final around 2027 [@nist-ir-8545]. The parameters below come from the HQC specification and are pre-final [@hqc-spec]. Do not deploy it in production yet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;HQC (&quot;Hamming Quasi-Cyclic&quot;) is the toolkit&apos;s deliberate non-lattice hedge. Its security rests on the hardness of decoding random quasi-cyclic codes -- syndrome decoding, unrelated to lattices -- so a future lattice break would leave it untouched [@hqc-spec]. It solves the problem that sank BIKE by separating the secret from the decoder: HQC encrypts by adding a low-weight error and decodes with a &lt;em&gt;public&lt;/em&gt;, fixed code (a concatenation of Reed-Muller and Reed-Solomon codes) whose decoding-failure rate can be bounded analytically and does not depend on the secret. That bounded, secret-independent DFR is exactly why NIST preferred it over BIKE [@nist-ir-8545] [@gjs-mdpc-2016].&lt;/p&gt;
&lt;p&gt;The cost is bandwidth. The encapsulation key / decapsulation key / ciphertext / shared secret sizes are 2241 / 2321 / 4433 / 32 for HQC-1, 4514 / 4602 / 8978 / 32 for HQC-3, and 7237 / 7333 / 14421 / 32 for HQC-5 [@hqc-spec]. The ciphertext is roughly four to nine times ML-KEM&apos;s. HQC is the reserve KEM, not the first choice: you carry the extra kilobytes precisely because its assumption is unrelated to everything else in the box.&lt;/p&gt;
&lt;h3&gt;6.6 Tier C: the signposts&lt;/h3&gt;
&lt;p&gt;Four more schemes sit just outside the toolkit and are worth knowing by name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Classic McEliece&lt;/strong&gt; is the most conservative code-based KEM, unbroken since 1978, but with public keys from roughly 261 KB to over a megabyte [@classic-mceliece]. It was not selected for the FIPS set and is advancing on an ISO track; choose it only where a huge, static, long-lived key is acceptable and maximal conservatism is the goal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BIKE&lt;/strong&gt; is the quasi-cyclic KEM that HQC beat out; its secret-dependent decoding-failure rate was judged less mature than HQC&apos;s bounded public decoder, so NIST did not select it [@bike-suite] [@nist-ir-8545].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XMSS and LMS&lt;/strong&gt; are the standardized stateful hash signatures -- compact, conservative, and safe only where perfect state is guaranteed [@nist-sp-800-208].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSIDH&lt;/strong&gt; is the one post-quantum candidate for a non-interactive Diffie-Hellman-style shared key, but its quantum security is contested -- subexponential quantum attacks push it toward much larger parameters [@peikert-csieves-2019] -- and its isogeny cousin SIKE was broken in 2022 [@castryck-decru-sidh-2022]. Treat it as research, not deployment.&lt;/p&gt;
&lt;p&gt;Now the exact bytes, all in one place. The table below is the empirical anchor for every trade discussed next -- the literal number of bytes a protocol must carry for each choice.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;th&gt;Param set&lt;/th&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;Public/enc key (B)&lt;/th&gt;
&lt;th&gt;Ciphertext or signature (B)&lt;/th&gt;
&lt;th&gt;NIST cat&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ML-KEM&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;lattice KEM&lt;/td&gt;
&lt;td&gt;800&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Final [@fips-203]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML-KEM&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;td&gt;lattice KEM&lt;/td&gt;
&lt;td&gt;1184&lt;/td&gt;
&lt;td&gt;1088&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Final [@fips-203]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML-KEM&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;lattice KEM&lt;/td&gt;
&lt;td&gt;1568&lt;/td&gt;
&lt;td&gt;1568&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Final [@fips-203]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HQC&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;code KEM&lt;/td&gt;
&lt;td&gt;2241&lt;/td&gt;
&lt;td&gt;4433&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Pre-final [@hqc-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HQC&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;code KEM&lt;/td&gt;
&lt;td&gt;4514&lt;/td&gt;
&lt;td&gt;8978&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Pre-final [@hqc-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HQC&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;code KEM&lt;/td&gt;
&lt;td&gt;7237&lt;/td&gt;
&lt;td&gt;14421&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Pre-final [@hqc-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML-DSA&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;lattice sig&lt;/td&gt;
&lt;td&gt;1312&lt;/td&gt;
&lt;td&gt;2420&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Final [@fips-204]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML-DSA&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;lattice sig&lt;/td&gt;
&lt;td&gt;1952&lt;/td&gt;
&lt;td&gt;3309&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Final [@fips-204]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML-DSA&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;lattice sig&lt;/td&gt;
&lt;td&gt;2592&lt;/td&gt;
&lt;td&gt;4627&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Final [@fips-204]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FN-DSA/Falcon&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;lattice sig&lt;/td&gt;
&lt;td&gt;897&lt;/td&gt;
&lt;td&gt;666&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Pre-final [@falcon-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FN-DSA/Falcon&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;lattice sig&lt;/td&gt;
&lt;td&gt;1793&lt;/td&gt;
&lt;td&gt;1280&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Pre-final [@falcon-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;128s&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;7856&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;128f&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;17088&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;192s&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;16224&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;192f&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;35664&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;256s&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;29792&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLH-DSA&lt;/td&gt;
&lt;td&gt;256f&lt;/td&gt;
&lt;td&gt;hash sig&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;49856&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Final [@fips-205]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two footnotes complete the picture. For the KEMs, the decapsulation (secret) keys are larger than the encapsulation keys -- 1632 / 2400 / 3168 bytes for ML-KEM and 2321 / 4602 / 7333 bytes for HQC -- and both produce a 32-byte shared secret [@fips-203] [@hqc-spec]. For ML-DSA, the private keys are 2560 / 4032 / 4896 bytes [@fips-204]. Now the uncomfortable question: given all five, which do you actually deploy, and what do you give up to get it?&lt;/p&gt;
&lt;h2&gt;7. Choosing Inside the Toolkit&lt;/h2&gt;
&lt;p&gt;There is no universal winner, and looking for one is the wrong frame. In practice you make two decisions -- which KEM, and which signature -- plus one deployment choice about hybrids. Everything else follows from the bytes in the master table and the assumption you are willing to trust.&lt;/p&gt;
&lt;p&gt;The KEM decision is really ML-KEM versus HQC, because the other code-based options are signposts rather than shipping choices.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;ML-KEM-768 (final)&lt;/th&gt;
&lt;th&gt;HQC-3 (pre-final)&lt;/th&gt;
&lt;th&gt;Classic McEliece (signpost)&lt;/th&gt;
&lt;th&gt;BIKE (signpost)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Assumption&lt;/td&gt;
&lt;td&gt;Module-LWE (lattice)&lt;/td&gt;
&lt;td&gt;quasi-cyclic syndrome decoding (code)&lt;/td&gt;
&lt;td&gt;Goppa-code decoding&lt;/td&gt;
&lt;td&gt;QC-MDPC decoding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enc. key&lt;/td&gt;
&lt;td&gt;1184 B&lt;/td&gt;
&lt;td&gt;4514 B&lt;/td&gt;
&lt;td&gt;261 KB to ~1.36 MB&lt;/td&gt;
&lt;td&gt;few KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ciphertext&lt;/td&gt;
&lt;td&gt;1088 B&lt;/td&gt;
&lt;td&gt;8978 B&lt;/td&gt;
&lt;td&gt;~100 to 200 B&lt;/td&gt;
&lt;td&gt;few KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best-known attack&lt;/td&gt;
&lt;td&gt;lattice sieving $\approx 2^{0.292\beta}$&lt;/td&gt;
&lt;td&gt;information-set decoding (exp.)&lt;/td&gt;
&lt;td&gt;information-set decoding (exp.)&lt;/td&gt;
&lt;td&gt;ISD, plus a reaction attack given a failure oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DFR&lt;/td&gt;
&lt;td&gt;$2^{-164.8}$&lt;/td&gt;
&lt;td&gt;bounded, secret-independent&lt;/td&gt;
&lt;td&gt;negligible&lt;/td&gt;
&lt;td&gt;secret-dependent (the problem)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maturity&lt;/td&gt;
&lt;td&gt;final and deployed&lt;/td&gt;
&lt;td&gt;selected 2025, pre-final&lt;/td&gt;
&lt;td&gt;ISO track, not in FIPS&lt;/td&gt;
&lt;td&gt;not selected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best suited for&lt;/td&gt;
&lt;td&gt;default KEM everywhere&lt;/td&gt;
&lt;td&gt;non-lattice diversity backup&lt;/td&gt;
&lt;td&gt;huge static keys, max conservatism&lt;/td&gt;
&lt;td&gt;superseded by HQC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ML-KEM wins on size and ubiquity. HQC&apos;s entire reason to exist is that its assumption is unrelated to ML-KEM&apos;s, so a lattice break would not take both down -- and you pay roughly eight times the ciphertext for that insurance [@fips-203] [@hqc-spec] [@nist-ir-8545].&lt;/p&gt;
&lt;p&gt;The signature decision spans three finalists on very different paradigms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;ML-DSA-65 (final)&lt;/th&gt;
&lt;th&gt;FN-DSA / Falcon-512 (pre-final)&lt;/th&gt;
&lt;th&gt;SLH-DSA-128s (final)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Construction&lt;/td&gt;
&lt;td&gt;Fiat-Shamir with aborts&lt;/td&gt;
&lt;td&gt;GPV hash-and-sign over NTRU&lt;/td&gt;
&lt;td&gt;stateless hash-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assumption&lt;/td&gt;
&lt;td&gt;Module-LWE and Module-SIS&lt;/td&gt;
&lt;td&gt;NTRU and SIS (lattice)&lt;/td&gt;
&lt;td&gt;hash function only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public key&lt;/td&gt;
&lt;td&gt;1952 B&lt;/td&gt;
&lt;td&gt;897 B&lt;/td&gt;
&lt;td&gt;32 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature&lt;/td&gt;
&lt;td&gt;3309 B&lt;/td&gt;
&lt;td&gt;666 B&lt;/td&gt;
&lt;td&gt;7856 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signing&lt;/td&gt;
&lt;td&gt;fast, variable-time&lt;/td&gt;
&lt;td&gt;fast, floating-point sampler&lt;/td&gt;
&lt;td&gt;very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation risk&lt;/td&gt;
&lt;td&gt;low (no floating point)&lt;/td&gt;
&lt;td&gt;high (constant-time floating point is hard)&lt;/td&gt;
&lt;td&gt;low (hashing only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maturity&lt;/td&gt;
&lt;td&gt;final, the default&lt;/td&gt;
&lt;td&gt;FIPS 206 in development&lt;/td&gt;
&lt;td&gt;final&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best suited for&lt;/td&gt;
&lt;td&gt;general-purpose default&lt;/td&gt;
&lt;td&gt;size-critical, constant-time guaranteed&lt;/td&gt;
&lt;td&gt;firmware and roots, low volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;There is no free lunch in that table [@fips-204] [@falcon-spec] [@fips-205]. Falcon is smallest but hardest to implement safely and not yet final; SLH-DSA is the safest to trust but by far the largest and slowest; ML-DSA is the sensible middle and the recommended default.&lt;/p&gt;
&lt;p&gt;To feel the gap, anchor on the classical world this series has used throughout. An Ed25519 signature is 64 bytes; an X25519 public key is 32. Nothing in the post-quantum toolkit comes close, as Part 15 on elliptic curves makes vivid.&lt;/p&gt;
&lt;p&gt;The smallest post-quantum signature, Falcon-512 at 666 bytes, is about ten times larger and carries a floating-point hazard; the most conservative, SLH-DSA-128s at 7856 bytes, is about one hundred and twenty times larger; and the default KEM ciphertext, ML-KEM-768 at 1088 bytes, is about thirty-four times an X25519 share [@falcon-spec] [@fips-205] [@fips-203]. Every column of these tables buys one property -- small size, easy constant-time code, a conservative assumption, or non-lattice diversity -- by giving up another.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; No post-quantum primitive wins on every axis. The five are not a menu awaiting a single winner; they are deliberate coverage of a trade surface, chosen so that whatever your binding constraint -- bytes, speed, assumption conservatism, or implementation safety -- one of them is the defensible answer.&lt;/p&gt;
&lt;/blockquote&gt;

The toolkit is five points on a trade surface, not an arbitrary menu.
&lt;p&gt;One more choice cuts across both decisions: hybrid versus pure. The shipping default, X25519MLKEM768, runs a classical X25519 exchange and a post-quantum ML-KEM-768 encapsulation together and combines both shared secrets, so the session stays secure as long as &lt;em&gt;either&lt;/em&gt; half holds [@openssl-35-notes]. During a migration that is the conservative posture: it defends against a future quantum computer and against an implementation bug in the young post-quantum half at once -- a belt-and-suspenders design, the security-definition thinking of Part 1 made concrete. These trades feel like engineering. Underneath them sits something humbler: we cannot prove any of it is hard.&lt;/p&gt;
&lt;h2&gt;8. What We Cannot Prove&lt;/h2&gt;
&lt;p&gt;Here is the headline most readers do not expect: none of the five rests on an unconditional hardness proof. &quot;Standardized by NIST&quot; does not mean &quot;proven secure.&quot; It means &quot;no efficient attack is known, backed by decades of failed attempts and, for lattices, an unusually strong reduction.&quot; That is a different and more honest claim.&lt;/p&gt;
&lt;p&gt;The lattice story is the one people most often overstate. Ajtai and then Regev proved worst-case-to-average-case reductions: breaking random instances is as hard as breaking the worst case [@ajtai-1996] [@regev-lwe-2005]. That is remarkable, and it is genuinely reassuring.&lt;/p&gt;
&lt;p&gt;But three caveats matter. First, those reductions are cleanest for &lt;em&gt;plain&lt;/em&gt; LWE, while the standards use &lt;em&gt;structured&lt;/em&gt; Module-LWE and NTRU, whose reductions are weaker or looser. Second, the actual parameters are not chosen from the reduction at all; they are sized against the best-known attack, lattice sieving, whose cost is heuristically $\approx 2^{0.292\beta}$ classically and roughly $2^{0.265\beta}$ quantumly under debated memory assumptions [@bdgl-sieving-2015]. Third, at the approximation factors these schemes use, the underlying lattice problems sit in $\mathsf{NP} \cap \mathsf{coNP}$, so they are not NP-hard under standard assumptions [@aharonov-regev-2005]. A genuine super-polynomial lower bound for any of them would prove $\mathsf{P} \neq \mathsf{NP}$ -- which no one can currently do.&lt;/p&gt;
&lt;p&gt;Codes and hashes are no different in kind. General syndrome decoding is NP-hard, but HQC&apos;s security depends on the &lt;em&gt;average-case&lt;/em&gt; hardness of decoding random quasi-cyclic codes, which is an assumption, not a theorem [@hqc-spec]. SLH-DSA reduces tightly to standard properties of its hash function, with no algebraic structure to exploit -- the most conservative bet in the box, but still a bet [@fips-205].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Realize what this means taken together: the security of the entire toolkit is a &lt;em&gt;monitored cryptanalytic bet&lt;/em&gt;, not a proof. The strong lattice reductions do not cover the structured schemes actually deployed; the parameters are justified empirically; and a real hardness proof for any of them would settle the biggest open question in computer science. This is precisely why the field standardized a diversified portfolio and keeps a non-lattice spare. The humility is not a weakness in the design -- it &lt;em&gt;is&lt;/em&gt; the design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two results in this area are not assumptions but hard walls, and they pull in opposite directions. The first is Shor&apos;s algorithm itself: no choice of RSA, Diffie-Hellman, or elliptic-curve parameters can ever be post-quantum, because the attack is a capability of the adversary, not a bound you can tune [@shor-1994]. The second constrains the replacements.&lt;/p&gt;

A NIKE lets two parties who know only each other&apos;s long-term public keys compute a shared secret with no interaction -- the static-static magic of Diffie-Hellman, where two published keys silently agree. A KEM does not provide this: encapsulation produces a fresh ciphertext that must be sent, so at least one message is required. There is no efficient, well-trusted post-quantum NIKE (the only candidate, CSIDH, has contested quantum security under subexponential quantum attack [@peikert-csieves-2019]).
&lt;p&gt;That second wall -- KEM is not NIKE -- is why post-quantum migration is not a mechanical find-and-replace. Any protocol that relied on Diffie-Hellman&apos;s non-interactive static-static agreement has to be redesigned around an interactive KEM handshake, as Part 18 on Diffie-Hellman foreshadowed. It is a design-level impossibility, not a tuning problem.&lt;/p&gt;
&lt;p&gt;One more subtlety links two sections: for the FO-transformed KEMs, the decryption-failure rate is a &lt;em&gt;security&lt;/em&gt; bound, not merely a correctness figure. A noticeable, secret-correlated failure rate is an oracle -- the exact mechanism behind the BIKE reaction attack -- which is why ML-KEM specifies rates like $2^{-164.8}$ and HQC insists on an analytically bounded one [@gjs-mdpc-2016].&lt;/p&gt;
&lt;p&gt;Put it all together and the shape of the toolkit becomes inevitable. The theoretically perfect primitive would have elliptic-curve-sized keys and signatures, fast constant-time software with no floating point, a conservative and well-understood assumption, and strong chosen-ciphertext or unforgeability guarantees. No known construction reaches all four corners at once: lattices are small and fast on a young, structured assumption; hashes are conservative but huge; codes offer diversity but cost kilobytes. The five primitives are the field&apos;s best simultaneous coverage of that surface. If we cannot prove hardness, the honest posture is to keep asking what we still cannot do -- and to keep a spare.&lt;/p&gt;
&lt;h2&gt;9. The Frontier the Toolkit Does Not Close&lt;/h2&gt;
&lt;p&gt;A field guide should be honest about what remains open. Seven problems sit on the near horizon, and together they explain why the toolkit is best understood as a monitored bet with an insurance policy attached.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The signature-size wall.&lt;/strong&gt; No post-quantum signature reaches the 64-byte classical world while keeping a conservative assumption &lt;em&gt;and&lt;/em&gt; an easy constant-time implementation. Falcon-512 is 666 bytes but floating-point; ML-DSA-44 is 2420 bytes; SLH-DSA-128s is 7856 bytes and up. Certificate chains, TLS handshakes, DNSSEC responses, and firmware manifests all multiply signature size by depth, so a few-kilobyte signature reshapes protocols. NIST&apos;s ongoing &quot;Additional Digital Signature Schemes&quot; on-ramp is the active response, hunting for small-signature options on different assumptions [@nist-pqc-project].This on-ramp is deliberately looking beyond lattices -- for schemes whose assumptions differ from ML-DSA and Falcon -- so that a future small-signature standard also widens the toolkit&apos;s assumption diversity rather than deepening its lattice exposure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Constant-time Falcon without floating point.&lt;/strong&gt; Falcon&apos;s fast-Fourier Gaussian sampler is defined over floating-point arithmetic, and a portable, high-precision, provably constant-time sampler is hard to guarantee across compilers and CPUs. This is the chief obstacle to shipping FN-DSA safely and the reason it standardizes last [@pornin-ctfalcon-2019] [@howe-isochronous-2019]. The motivating attack -- key recovery from Gram-Schmidt norm leakage -- is concrete, not hypothetical [@fouque-gsnorm-2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shrinking code-based ciphertexts.&lt;/strong&gt; HQC buys assumption diversity at 4.4 to 14.4 KB ciphertexts, and the smaller-key alternative (BIKE) was set aside precisely because its secret-dependent failure rate is a reaction-attack surface. An open goal is a code-based KEM with McEliece-like conservatism, ML-KEM-like size, and a provable secret-independent DFR [@nist-ir-8545].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formally verified, side-channel-hardened implementations of all five.&lt;/strong&gt; KyberSlash showed that even widely used reference code can leak through timing [@kyberslash-site]. Machine-checked constant-time implementations of ML-KEM exist, but ML-DSA&apos;s variable-time abort loop and FN-DSA&apos;s floating point are materially harder to verify end to end. The standards are only as safe as the code that runs them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is the algebraic structure free?&lt;/strong&gt; Ring-LWE, Module-LWE, and NTRU all add ring structure for compact keys and fast transforms. No attack exploits that structure at the standardized parameters, but there is no proof it is as hard as unstructured LWE -- and all three lattice primitives share the exposure, so a structural breakthrough could touch most of the toolkit at once. The Module-LWE design dilutes structure as a hedge, but the conjecture that it is essentially as hard as plain LWE remains believed and unproven.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Migrating static-static protocols.&lt;/strong&gt; Because a KEM is not a NIKE, any protocol that assumed non-interactive Diffie-Hellman agreement must be redesigned, not reconfigured. Interactive hybrid handshakes cover key establishment well; a practical, trusted post-quantum NIKE does not exist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The real quantum cost of sieving.&lt;/strong&gt; The quantum sieving exponent near $2^{0.265\beta}$ depends on memory and qRAM models whose real-world cost is uncertain, and NIST&apos;s security categories inherit that uncertainty [@bdgl-sieving-2015]. Conservative defaults -- recommending Category-3 ML-KEM-768 rather than the smaller set -- absorb the doubt, but a settled cost model would tighten every lattice parameter.&lt;/p&gt;
&lt;p&gt;None of that blocks you from shipping the right thing today. Here is exactly what to ship.&lt;/p&gt;
&lt;h2&gt;10. Exact Decision Rules&lt;/h2&gt;
&lt;p&gt;Enough theory. Here are defensible defaults you can carry into a design review, phrased as &quot;use X with these parameters in case Y.&quot;&lt;/p&gt;

flowchart TD
    Q1{&quot;Signing or key exchange?&quot;}
    Q1 -- Key exchange --&amp;gt; K1{&quot;Bandwidth very tight and Category 1 acceptable?&quot;}
    K1 -- Yes --&amp;gt; KEM512[ML-KEM-512 in a hybrid]
    K1 -- No --&amp;gt; K2{&quot;Long-term or Category 5 secret?&quot;}
    K2 -- Yes --&amp;gt; KEM1024[ML-KEM-1024 in a hybrid]
    K2 -- No --&amp;gt; KEM768[ML-KEM-768 hybrid, the default]
    Q1 -- Signing --&amp;gt; S1{&quot;Low-volume firmware or root of trust?&quot;}
    S1 -- Yes --&amp;gt; SLH[SLH-DSA-128s or 128f]
    S1 -- No --&amp;gt; S2{&quot;Is signature size the hard limit?&quot;}
    S2 -- No --&amp;gt; MLDSA[ML-DSA-65, the default]
    S2 -- Yes --&amp;gt; FN[Consider FN-DSA, vetted constant-time only, after FIPS 206]
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Key establishment (TLS, SSH, VPN):&lt;/strong&gt; use &lt;strong&gt;ML-KEM-768 in a hybrid&lt;/strong&gt; (X25519MLKEM768). It is the shipping default and the conservative middle category [@openssl-35-notes] [@openssh-99-notes]. Drop to ML-KEM-512 only under tight bandwidth with Category-1 acceptance; step up to ML-KEM-1024 for Category-5 or long-lived secrets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;General-purpose signatures:&lt;/strong&gt; use &lt;strong&gt;ML-DSA-65&lt;/strong&gt; (Category 3). No floating point, easy constant-time, moderate sizes [@fips-204].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firmware, boot, root-of-trust (low volume, maximum conservatism):&lt;/strong&gt; use &lt;strong&gt;SLH-DSA-128s&lt;/strong&gt; for smaller signatures or &lt;strong&gt;128f&lt;/strong&gt; for faster signing. You sign rarely, so absorb the large signature in exchange for a hash-only assumption [@fips-205].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When signature size is the binding constraint:&lt;/strong&gt; consider &lt;strong&gt;FN-DSA / Falcon&lt;/strong&gt; -- but only with a vetted constant-time implementation, and &lt;strong&gt;not in production until FIPS 206 is final&lt;/strong&gt; [@fips-206-perlner-2025]. Until then, prefer ML-DSA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For KEM assumption diversity:&lt;/strong&gt; plan for &lt;strong&gt;HQC&lt;/strong&gt; as a standardized non-lattice backup &lt;strong&gt;once its FIPS lands&lt;/strong&gt;, not today [@nist-ir-8545]. If you need maximal conservatism now and can absorb a huge static key, Classic McEliece is the code-based option outside the FIPS set [@classic-mceliece].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The single most useful thing you can build is an intuition for how many bytes each choice adds. Run the numbers.&lt;/p&gt;
&lt;p&gt;{`
// Illustrative only. Estimate the extra bytes post-quantum adds versus classical
// X25519 / Ed25519, for a KEM share and for a 3-certificate chain.&lt;/p&gt;
&lt;p&gt;const sizes = {
  &apos;Ed25519&apos;:      { sig: 64,   pk: 32 },
  &apos;ML-DSA-65&apos;:    { sig: 3309, pk: 1952 },
  &apos;Falcon-512&apos;:   { sig: 666,  pk: 897 },
  &apos;SLH-DSA-128s&apos;: { sig: 7856, pk: 32 },
};&lt;/p&gt;
&lt;p&gt;// A chain of 3 certificates, each carrying one signature + one public key.
function chainBytes(name) {
  const s = sizes[name];
  return (s.sig + s.pk) * 3;
}&lt;/p&gt;
&lt;p&gt;for (const n of [&apos;Ed25519&apos;,&apos;ML-DSA-65&apos;,&apos;Falcon-512&apos;,&apos;SLH-DSA-128s&apos;]) {
  console.log(n.padEnd(14), String(chainBytes(n)).padStart(6), &apos;bytes over a 3-cert chain&apos;);
}&lt;/p&gt;
&lt;p&gt;console.log(&apos;---&apos;);
const x25519Share = 32 + 32;            // classical key share, round trip
const mlkemAdds   = 1184 + 1088;        // ML-KEM-768 key + ciphertext
console.log(&apos;KEM share, classical X25519 :&apos;, x25519Share, &apos;bytes&apos;);
console.log(&apos;KEM share, ML-KEM-768 hybrid:&apos;, x25519Share + mlkemAdds, &apos;bytes&apos;);
`}&lt;/p&gt;
&lt;p&gt;Rules pick the primitive; discipline keeps it safe. A short pitfall list, drawn straight from the failure catalog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not divide a secret by the modulus in variable time.&lt;/strong&gt; That was KyberSlash; use constant-time (Barrett) reduction and a library whose constant-time behavior has been tested [@kyberslash-site].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer hedged (randomized) signing for ML-DSA, and feed it a good RNG.&lt;/strong&gt; The randomized mode is the default and is more resilient to fault and nonce mishaps [@fips-204].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use context strings&lt;/strong&gt; to domain-separate signatures across applications and prevent cross-protocol reuse [@fips-204].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep implicit rejection constant-time.&lt;/strong&gt; Never let a KEM surface a decapsulation failure as a distinguishable error or timing tell.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not hand-roll any of these.&lt;/strong&gt; Every primitive has subtle side channels; use standard libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; During migration, run post-quantum alongside classical (X25519MLKEM768) so a break or bug in either half is survivable, and migrate &lt;em&gt;key establishment&lt;/em&gt; before signatures -- harvest-now-decrypt-later already threatens today&apos;s recorded traffic, while forged signatures require an attacker who is present in the future [@openssl-35-notes].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On availability: the finalized three are production-ready across the toolchain. OpenSSL 3.5 ships X25519MLKEM768 as a default key share, OpenSSH enabled &lt;code&gt;mlkem768x25519-sha256&lt;/code&gt; by default in 9.9 and made it the default in 10.0, and ML-KEM and ML-DSA are broadly available across open-source libraries -- liboqs, BoringSSL, AWS-LC, Microsoft SymCrypt, Bouncy Castle, and pyca/cryptography -- with formally verified ML-KEM through the libcrux line [@openssl-35-notes] [@openssh-pq] [@open-quantum-safe]. FN-DSA and HQC are experimental only until their FIPS documents are final. For a sense of how this looks in real deployments, this blog&apos;s companion posts trace &lt;a href=&quot;https://paragmali.com/blog/post-quantum-cryptography-on-windows-the-thirty-year-migrati/&quot; rel=&quot;noopener&quot;&gt;the post-quantum migration on Windows&lt;/a&gt; and &lt;a href=&quot;https://paragmali.com/blog/the-thirty-year-migration-ships-in-a-pip-install-how-post-qu/&quot; rel=&quot;noopener&quot;&gt;the moment ML-KEM arrived in an ordinary &lt;code&gt;pip install&lt;/code&gt;&lt;/a&gt;. The forthcoming Part 21 on crypto-agility and cryptographic bills of materials covers how to keep these choices swappable as the toolkit evolves.&lt;/p&gt;

Post-quantum migration now has deadlines attached. NIST&apos;s guidance and its IR 8547 transition plan point toward deprecating quantum-vulnerable algorithms by 2035, and comparable government profiles set similar horizons [@nist-pqc-project]. The practical reading is simple: inventory where you use RSA, Diffie-Hellman, and ECC now, because a decade is not long for a full cryptographic transition, and the harvest-now clock started before the standards were even published.

If you have OpenSSL 3.5 or later installed, you can list its post-quantum groups and signature algorithms with `openssl list -kem-algorithms` and `openssl list -signature-algorithms`. Seeing `ML-KEM-768` and `X25519MLKEM768` in that output is the concrete, on-your-own-machine version of this entire article: the migration is not a forecast, it is already in your crypto library [@openssl-35-notes].
&lt;p&gt;The rules above answer &quot;what.&quot; These next answer the questions that come up in review.&lt;/p&gt;
&lt;h2&gt;11. Questions From the Review Room&lt;/h2&gt;


No. There is no cryptanalytic break of any of the five. The only real-world failures are implementation leaks -- KyberSlash&apos;s secret-dependent division timing [@kyberslash-site] and Falcon&apos;s floating-point Gram-Schmidt leakage [@fouque-gsnorm-2019] -- and both are fixed by better code, not new math. The era&apos;s two famous breaks, SIKE and Rainbow, hit schemes that were never selected for the toolkit [@castryck-decru-sidh-2022] [@beullens-rainbow-2022].


Against a classical attacker, yes. Against harvest-now-decrypt-later, not for long-lived secrets: an adversary can record today&apos;s session and decrypt it once a quantum computer arrives, which is why you migrate key establishment first and why hybrids are already shipping [@nist-pqc-project] [@openssl-35-notes].


Not in general. A KEM is not a non-interactive key exchange -- there is no trusted post-quantum static-static agreement -- so protocols that relied on that property must be redesigned around an interactive KEM handshake rather than reconfigured in place.


No. FN-DSA (Falcon) was still in development toward FIPS 206 as of this writing [@fips-206-perlner-2025], and HQC was only selected on 2025-03-11 with a draft FIPS pending [@nist-ir-8545]. Do not ship either in production yet.


Because no single primitive wins on size, speed, assumption conservatism, and maturity at once, and because spreading the toolkit across three unrelated hard problems -- lattices, hashes, and codes -- means one mathematical break cannot take everything down. The 2022 breaks of SIKE and Rainbow, both outside the toolkit, are the empirical argument for that hedge [@nist-ir-8545] [@castryck-decru-sidh-2022].


Essentially yes. ML-KEM (FIPS 203) is the standardized CRYSTALS-Kyber with standardization edits, and the same relationship holds for Dilithium to ML-DSA and SPHINCS+ to SLH-DSA [@fips-203] [@crystals-kyber]. If you learned Kyber, you already know ML-KEM.


No and no. All five primitives run on ordinary classical hardware today [@nist-pqc-project]. Quantum key distribution is a physics-layer technique that uses quantum hardware to exchange keys; post-quantum cryptography is classical software designed to resist quantum *attacks*. They solve related problems by completely different means.

&lt;p&gt;Step back to the shape of the whole thing. One event in 1994 condemned all deployed public-key cryptography [@shor-1994]. The field&apos;s answer was not a single replacement but a portfolio hedged across three unrelated assumptions and tuned to five different binding constraints, three of them already law and two still in progress. The most striking fact remains the quietest one: after a decade of open, adversarial cryptanalysis, nothing in the toolkit has been broken -- only its early code has leaked.&lt;/p&gt;
&lt;p&gt;The real test is still ahead. When the next break comes, and history suggests one eventually will, the entire point of this design is that it lands on one assumption family while the others carry the load. That is not a promise that the math is unbreakable. It is a bet, made in the open, that diversity outlasts any single idea -- and a spare, HQC, waiting in reserve for the day the bet is called.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;the-post-quantum-toolkit&quot; keyTerms={[
  { term: &quot;ML-KEM (FIPS 203)&quot;, definition: &quot;The standardized Module-LWE key-encapsulation mechanism; the deployed post-quantum KEM, small and fast, secured by FO with implicit rejection.&quot; },
  { term: &quot;ML-DSA (FIPS 204)&quot;, definition: &quot;The default post-quantum signature; a Fiat-Shamir-with-aborts lattice scheme using uniform integers and no floating point.&quot; },
  { term: &quot;SLH-DSA (FIPS 205)&quot;, definition: &quot;The conservative backstop signature; stateless hash-based, resting only on hash-function security, with tiny keys but very large signatures.&quot; },
  { term: &quot;FN-DSA / Falcon&quot;, definition: &quot;Pre-final (FIPS 206 in development). GPV hash-and-sign over NTRU with the smallest signatures, but a hard-to-implement floating-point sampler.&quot; },
  { term: &quot;HQC&quot;, definition: &quot;Pre-final (selected 2025-03-11). A code-based KEM providing non-lattice assumption diversity, with a public decoder and a bounded, secret-independent failure rate.&quot; },
  { term: &quot;Harvest now, decrypt later&quot;, definition: &quot;Recording encrypted traffic today to decrypt once quantum computers exist; the reason key establishment migrates first.&quot; },
  { term: &quot;Fujisaki-Okamoto with implicit rejection&quot;, definition: &quot;The transform giving KEMs chosen-ciphertext security by returning a pseudo-random key on failure, closing the decapsulation-failure oracle.&quot; },
  { term: &quot;Fiat-Shamir with aborts&quot;, definition: &quot;Signing by reject-and-restart so the released transcript is provably independent of the secret key.&quot; },
  { term: &quot;Transcript leakage&quot;, definition: &quot;When public outputs statistically depend on the secret key, so enough valid outputs recover it, as in the NTRUSign parallelepiped break.&quot; },
  { term: &quot;KEM is not NIKE&quot;, definition: &quot;A key-encapsulation mechanism cannot replace non-interactive static-static Diffie-Hellman, so some protocols need redesign, not a drop-in swap.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>post-quantum-cryptography</category><category>ml-kem</category><category>ml-dsa</category><category>slh-dsa</category><category>falcon</category><category>hqc</category><category>lattice-cryptography</category><category>cryptography</category><author>noreply@paragmali.com (Parag Mali)</author></item></channel></rss>