<?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: threshold-cryptography</title><description>Posts tagged threshold-cryptography.</description><link>https://paragmali.com/</link><language>en-US</language><lastBuildDate>Tue, 21 Jul 2026 14:16:36 GMT</lastBuildDate><atom:link href="https://paragmali.com/tags/threshold-cryptography/rss.xml" rel="self" type="application/rss+xml"/><item><title>The Trusted Party Nobody Has to Be: Secure Multiparty Computation and Threshold Cryptography, Where No One Holds the Secret</title><link>https://paragmali.com/blog/the-trusted-party-nobody-has-to-be-secure-multiparty-computa/</link><guid isPermaLink="true">https://paragmali.com/blog/the-trusted-party-nobody-has-to-be-secure-multiparty-computa/</guid><description>Secure multiparty computation and threshold cryptography let distrusting parties compute on private data and sign with a key no single party ever holds.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>
Secure multiparty computation (MPC) lets mutually distrusting parties jointly compute an agreed function over their private inputs while learning nothing but the output, as if an incorruptible trusted party ran the computation, except no one ever gets to be that party. One humble primitive, oblivious transfer, is provably enough to build it, and three classic constructions -- Yao&apos;s garbled circuits, GMW, and BGW -- trade rounds against bandwidth against trust assumptions in opposite ways. Threshold cryptography is the deployed special case: fix the function to &quot;sign&quot; or &quot;decrypt,&quot; generate the key as shares, and it is used but never reassembled, which is why an MPC custody wallet can truthfully say no single box holds the key. The honest catch: MPC hides inputs, not outputs; complete fairness is provably impossible for general-purpose computation when most parties are dishonest; and most shipped threshold signatures still rest on the discrete logarithm, the gap NIST&apos;s post-quantum threshold call now targets.
&lt;h2&gt;1. Compute on It, but Nobody Gets to See It&lt;/h2&gt;
&lt;p&gt;Two hospitals each hold half the patients in a rare-disease study, and one shared statistic could save lives. Neither is allowed to see the other&apos;s records. The obvious fix, &quot;hand both datasets to a trusted broker,&quot; just moves every secret into a single database that can be hacked, subpoenaed, or bribed. Down the street, a custodian must sign a billion-dollar transfer, and any one server that holds the signing key is one breach away from catastrophe. In each case the answer everyone reaches for -- a trusted party in the middle -- is precisely the party nobody can afford to trust.&lt;/p&gt;
&lt;p&gt;This article is about the forty-five-year project to build that party out of pure protocol, so that no one ever has to be it. That is the one idea the whole piece defends: &lt;strong&gt;mutually distrusting parties can jointly compute a function over private inputs while learning only the output, and the special case where the function is &quot;sign&quot; or &quot;decrypt&quot; splits a key so that no single party -- or box -- ever holds it&lt;/strong&gt; [@lindell21-cacm].&lt;/p&gt;

A set of parties, each holding a private input, run a protocol that computes an agreed function and reveals only its output. No party learns anything about the others&apos; inputs beyond what the output itself implies. The security goal is stated by comparison to an ideal world in which a trusted party collects the inputs, computes the function, and hands back only the result [@lindell21-cacm, @ekr-monograph].
&lt;p&gt;One refrain recurs in every section: each technique is a different way to &lt;em&gt;simulate&lt;/em&gt; an incorruptible trusted party -- one who takes all private inputs, computes the agreed function, and returns only the result, without anyone ever getting to play that party.&lt;/p&gt;
&lt;p&gt;Three sharp lines keep the primitives from blurring together, because this is Part 3 of a series and each part hides data a different way.&lt;/p&gt;

These four privacy technologies answer different questions under different trust models. **[Fully homomorphic encryption](/blog/never-decrypted-how-fully-homomorphic-encryption-computes-on/)** (Part 1) lets one server compute on *your* single ciphertext, so trust rests on a hardness assumption, not on other parties. **[Zero-knowledge proofs](/blog/never-decrypted-proving-you-ran-the-computation-without-reve/)** (Part 2) let one prover convince one verifier that a computation ran correctly, revealing nothing else. **MPC** splits the trust itself across several parties, so privacy holds as long as too few of them collude. A **trusted execution environment** trusts hardware rather than mathematics. This post owns the third door, and it also draws a line against the sibling secret-sharing post: [that post splits a key so it can be reconstructed once, later](/blog/nobody-broke-shamir-a-field-guide-to-secret-sharing-and-thre/); this post computes on shared data and uses keys without ever assembling them.
&lt;p&gt;The invariant that ties them is blunt: no party ever sees a value in the clear that it is not entitled to see. Everything below is the machinery that enforces it, and the honesty about what the machinery still cannot do.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; The trusted third party is not the cure. It is the disease. Its database is the breach surface, and the same box that can compute the answer can be hacked, subpoenaed, or bribed. MPC&apos;s move is not to make the trusted party safer -- it is to remove it entirely, and simulate its behavior with a protocol that gives the same output and leaks nothing more.&lt;/p&gt;
&lt;/blockquote&gt;

Every technique in this article is a different way to simulate the trusted party nobody has to be.
&lt;p&gt;Before we can build a party out of protocol, though, we need to say precisely what &quot;secure&quot; even means. Otherwise we are just trading a trusted party for a wish.&lt;/p&gt;
&lt;h2&gt;2. The Yardstick: The Ideal World You Simulate&lt;/h2&gt;
&lt;p&gt;In 1982, at Berkeley, Andrew Yao asked a question that sounds like a party riddle. Two millionaires want to know who is richer, but neither will reveal how much money he has. Can they learn the single bit &quot;who is larger&quot; and nothing else? Yao&apos;s paper turned that riddle into the founding question of a field: can a computation be as good as handing your inputs to a trusted party you never actually have to trust [@yao82]?&lt;/p&gt;
&lt;p&gt;The riddle exposes a harder question underneath. Suppose someone hands you a protocol and swears it &quot;leaks nothing.&quot; How would you even check that claim? &quot;Leaks nothing&quot; is not a property you can eyeball in a transcript of messages.&lt;/p&gt;
&lt;p&gt;The answer is the definition the entire discipline rests on, and it is worth stating carefully because every later construction is judged against it.&lt;/p&gt;

A protocol is secure if whatever an adversary can learn by participating in the *real* protocol, it could also have computed in an *ideal* world where a trusted party takes all inputs, evaluates the function, and returns only the output. Formally, a *simulator* given only the ideal-world output must be able to reproduce the adversary&apos;s entire real-world view. If it can, the real protocol reveals nothing the ideal output did not already imply [@lindell21-cacm, @ekr-monograph].
&lt;p&gt;That is the whole trick of defining privacy: &quot;secure&quot; means &quot;as good as a trusted party you never have to trust.&quot; The strongest version of this idea, universal composability, demands that the guarantee survive even when the protocol runs concurrently alongside arbitrary other protocols [@canetti01-uc].&lt;/p&gt;

flowchart TB
    subgraph REAL[&quot;Real world -- a protocol&quot;]
      ax[A holds input x] --&amp;gt; msgs[Rounds of protocol messages]
      by[B holds input y] --&amp;gt; msgs
      msgs --&amp;gt; rout[Output f of x and y]
    end
    subgraph IDEAL[&quot;Ideal world -- a trusted party&quot;]
      ax2[A holds input x] --&amp;gt; tp[Incorruptible trusted party]
      by2[B holds input y] --&amp;gt; tp
      tp --&amp;gt; iout[Output f of x and y]
    end
    adv[Adversary view in the real run] -. must be reproducible by .-&amp;gt; sim[Simulator given only the ideal output]
&lt;p&gt;The definition also exposes the knobs every real protocol has to set. These choices, not raw speed, are what separate one construction from another.&lt;/p&gt;

A *semi-honest* (honest-but-curious) adversary follows the protocol exactly but tries to infer private inputs from the messages it sees. A *malicious* (active) adversary may deviate arbitrarily: lie about its input, send malformed messages, or abort. Security against a malicious adversary is strictly harder and usually more expensive, and a protocol proven only semi-honest is worthless against an attacker willing to cheat [@lindell21-cacm].

In the *honest-majority* setting the adversary corrupts fewer than half the parties; in the *dishonest-majority* setting it may corrupt all but one. The distinction is not cosmetic: information-theoretic security and guaranteed output are possible with an honest majority, while a dishonest majority forces reliance on cryptographic assumptions and, as we will see, gives up the guarantee that everyone receives the answer [@ekr-monograph].
&lt;p&gt;Two more knobs matter. &lt;em&gt;Fairness&lt;/em&gt; asks whether either everyone gets the output or no one does. &lt;em&gt;Guaranteed output delivery&lt;/em&gt; asks whether honest parties are assured of the answer even if others quit. Both turn out to be luxuries you cannot always buy.&lt;/p&gt;
&lt;p&gt;There is one caveat so important that misunderstanding it undoes everything. The guarantee is &quot;nothing beyond the output,&quot; and the output itself can be revealing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; MPC promises that parties learn nothing &lt;em&gt;beyond&lt;/em&gt; the agreed output. It does not promise the output is safe. If two parties compute their sum, each learns the other&apos;s number by subtraction. If they compute &quot;who is richer,&quot; the poorer party learns an upper bound on the richer one. Choosing a function whose output leaks too much is a design error no protocol can fix, and it is the single most common misconception about what MPC buys you [@lindell21-cacm].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Keep one table open and fill it in as each construction arrives. Here it is seeded with the two anchors we already have: the ideal we are simulating, and Yao&apos;s special-purpose answer.Yao framed his 1982 result as the &quot;millionaires&apos; problem&quot; precisely because a wealth comparison is the smallest interesting function whose output is a single bit yet whose inputs must stay hidden [@yao82].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What is hidden&lt;/th&gt;
&lt;th&gt;Who computes&lt;/th&gt;
&lt;th&gt;Adversary model&lt;/th&gt;
&lt;th&gt;Parties&lt;/th&gt;
&lt;th&gt;Rounds&lt;/th&gt;
&lt;th&gt;Trust assumption&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;One trusted party&lt;/td&gt;
&lt;td&gt;None, by fiat&lt;/td&gt;
&lt;td&gt;n plus a broker&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Total trust in a single box (the thing we remove)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both wealth values&lt;/td&gt;
&lt;td&gt;The two parties themselves&lt;/td&gt;
&lt;td&gt;Semi-honest&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A few&lt;/td&gt;
&lt;td&gt;A hardness assumption; no trusted party&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The definition says a trusted party can be simulated. It does not say how, or out of what. The smallest answer turns out to be almost insultingly humble.&lt;/p&gt;
&lt;h2&gt;3. The Engine: Oblivious Transfer, and Why One Primitive Is Enough&lt;/h2&gt;
&lt;p&gt;In 1981, Michael Rabin described a primitive that sounds like a bug report. A sender transmits a message that the receiver gets with probability one-half, and the sender never learns whether it arrived [@rabin81-ot]. Why would anyone want a channel that loses your mail at random and hides the tracking number from you?&lt;/p&gt;
&lt;p&gt;Because that lossy, blindfolded channel turns out to be the entire trust engine of secure computation. The version everyone actually uses was pinned down by Even, Goldreich, and Lempel in 1985 and is cleaner to state.&lt;/p&gt;

The sender holds two messages, `m0` and `m1`. The receiver holds a choice bit `b`. After the protocol the receiver learns `m_b` and nothing about `m_(1-b)`, while the sender learns nothing about `b`. Two secrets are kept at once: the receiver&apos;s choice is hidden from the sender, and the unchosen message is hidden from the receiver [@egl85].

sequenceDiagram
    participant R as Receiver picks bit b
    participant S as Sender holds m0 and m1
    R-&amp;gt;&amp;gt;S: blinded choice that hides b
    Note over R,S: the sender cannot tell which message R wants
    S-&amp;gt;&amp;gt;R: encrypted pair only b can unlock
    Note over R: R opens exactly the chosen message
    Note over R: the other message stays unreadable
    Note over S: the sender never learns b
&lt;p&gt;Here is a toy version you can run. The parameters are tiny and the key-derivation is a stand-in, so this is illustration, not production cryptography, but the information flow is faithful: the receiver publishes two keys whose product is a fixed value, knows the secret behind only one of them, and can therefore open only the message it chose.&lt;/p&gt;
&lt;p&gt;{`
// Bellare-Micali-style OT with BigInt. Tiny params, toy key-derivation.
const p = 2147483647n;   // Mersenne prime 2^31 - 1
const g = 7n;
const C = 1234567n;      // fixed element; nobody knows its discrete log&lt;/p&gt;
&lt;p&gt;function modpow(base, exp, mod) {
  let r = 1n; base %= mod;
  while (exp &amp;gt; 0n) { if (exp &amp;amp; 1n) r = (r * base) % mod; base = (base * base) % mod; exp &amp;gt;&amp;gt;= 1n; }
  return r;
}
const inv = (a, mod) =&amp;gt; modpow(a, mod - 2n, mod);   // Fermat inverse
const kdf = (x) =&amp;gt; Number(x % 100000n);             // toy key-derivation&lt;/p&gt;
&lt;p&gt;// Receiver: publish two keys with product C, but know the secret for pk[b] only.
function receiver(b, k) {
  const pk = [0n, 0n];
  pk[b] = modpow(g, k, p);
  pk[1 - b] = (C * inv(pk[b], p)) % p;
  return pk;
}
// Sender: verify pk0*pk1 = C, then mask each message with a key from pk[i]^r.
function sender(pk, m0, m1, r) {
  if ((pk[0] * pk[1]) % p !== C) throw new Error(&quot;receiver cheated&quot;);
  const gr = modpow(g, r, p);
  return { gr, c: [m0 + kdf(modpow(pk[0], r, p)), m1 + kdf(modpow(pk[1], r, p))] };
}&lt;/p&gt;
&lt;p&gt;for (const b of [0, 1]) {
  const k = 987654n, r = 424242n;
  const pk = receiver(b, k);
  const { gr, c } = sender(pk, 111, 222, r);
  const keyB = kdf(modpow(gr, k, p));        // = pk[b]^r, the only key R can form
  console.log(&quot;receiver chose b=&quot; + b + &quot; -&amp;gt; recovered &quot; + (c[b] - keyB) +
              &quot;  (wanted &quot; + (b === 0 ? 111 : 222) + &quot;)&quot;);
}
console.log(&quot;to open the other message R would need the discrete log of C, which it lacks&quot;);
`}&lt;/p&gt;
&lt;p&gt;Now the earthquake. In 1988 Joe Kilian proved that oblivious transfer is &lt;em&gt;complete&lt;/em&gt;: given a secure OT and nothing else, you can securely compute any function at all [@kilian88]. No additional cryptographic assumption is required. One blindfolded either-or choice is a universal building block, exactly the way a single NAND gate can express any Boolean circuit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Kilian&apos;s completeness theorem is the reason the rest of this article is engineering rather than invention. You do not need a bespoke protocol for each function you care about. Secure oblivious transfer alone is enough to compute everything, so the whole problem reduces to building good OT and wiring it into circuits.&lt;/p&gt;
&lt;/blockquote&gt;

Oblivious transfer is to secure computation what NAND is to Boolean logic: one humble gadget, and everything else follows.
&lt;p&gt;&quot;Complete&quot; is a theorem, not a performance promise, and the naive way to use it hits a wall immediately. Each OT, done from scratch, costs a public-key operation, the same expensive modular exponentiation you just watched. A circuit with a million AND gates would need on the order of a million public-key operations, which is far too slow to ship.&lt;/p&gt;
&lt;p&gt;The fix is one of the quiet triumphs of the field. In 2003, Ishai, Kilian, Nissim, and Petrank showed how to &lt;em&gt;extend&lt;/em&gt; oblivious transfer: starting from about 128 real base OTs, you can produce millions more using only fast symmetric-key operations, no further public-key crypto [@iknp03].The IKNP trick inverts the roles of sender and receiver over a matrix of random bits, so that a mere 128 genuine OTs &quot;bootstrap&quot; an effectively unlimited supply. Later work tightened the constants for practical use [@otext13]. The modern endpoint of that line is silent OT, where two parties expand short correlated seeds into vast amounts of OT-like randomness with almost no communication, resting on the learning-parity-with-noise assumption [@silentot19].&lt;/p&gt;
&lt;p&gt;That engine is shared by the dishonest-majority constructions we turn to next, the garbled-circuit and secret-sharing lines. So one primitive suffices. But &quot;suffices&quot; is a theorem, not a blueprint. How do you actually turn blind one-of-two choices into a working joint computation? The field found three different answers at once, and, awkwardly for anyone who likes tidy stories, all three are still in use.&lt;/p&gt;
&lt;h2&gt;4. The Evolution: Three Ways to Instantiate the Trusted Party&lt;/h2&gt;
&lt;p&gt;Between 1986 and 1988 the field produced three distinct general-purpose constructions with opposite trade-offs, and they coexist to this day. Read that sentence carefully, because the tempting story is wrong. This is a fork, not a ladder. Garbled circuits did not &quot;evolve into&quot; secret sharing, and none of the three is simply better than the others. In particular, and this is the single most-abused point in popular explanations, &lt;strong&gt;a garbled circuit is not a secret-sharing scheme&lt;/strong&gt;. It is built from symmetric encryption and oblivious transfer.&lt;/p&gt;
&lt;p&gt;If all three constructions can securely compute anything, why do all three still exist? Because each buys a different resource cheaply, and no application needs all resources at once.&lt;/p&gt;

timeline
    title Simulating the trusted party, 1981 to 2026
    1981 : Rabin introduces oblivious transfer
    1982 : Yao poses the millionaires problem
    1985 : Even-Goldreich-Lempel fix 1-out-of-2 OT
    1986 : Yao garbled circuits, first general 2PC
    1987 : GMW, anything is computable securely
    1988 : BGW and CCD go information-theoretic, Kilian proves OT complete
    1991 : Beaver triples split work into offline and online
    2003 : IKNP OT extension makes OT cheap at scale
    2012 : SPDZ, cheap malicious security at a dishonest majority
    2024 : FROST standardized as RFC 9591
    2026 : NIST IR 8214C calls for multi-party threshold schemes
&lt;h3&gt;Yao&apos;s garbled circuits: constant round, two parties&lt;/h3&gt;
&lt;p&gt;Yao&apos;s 1986 construction was the first protocol that could securely compute any function of two parties&apos; inputs [@yao86]. Its shape is unlike anything in the secret-sharing world.&lt;/p&gt;

A Boolean circuit encrypted so it can be evaluated blind. The *garbler* assigns each wire two random labels, one standing for 0 and one for 1, then replaces every gate&apos;s truth table with encryptions keyed by the input-wire labels. The *evaluator*, holding exactly one label per input wire, can decrypt exactly one row of each gate and learns only an output label, never the underlying bit. The evaluator gets its own input labels by oblivious transfer, so the garbler never learns the evaluator&apos;s input. Garbling is symmetric encryption plus OT; it is not secret sharing [@yao86, @mit-ygc].

flowchart TB
    g0[Garbler assigns two random labels per wire] --&amp;gt; g1[Garbler encrypts each gate truth table under input labels]
    g1 --&amp;gt; g2[Send garbled circuit plus garbler input labels]
    g2 --&amp;gt; ot[Evaluator obtains its input labels by oblivious transfer]
    ot --&amp;gt; ev[Evaluator decrypts one row per gate and learns only output labels]
    ev --&amp;gt; dec[Output labels decode to the result]
&lt;p&gt;The defining virtue is round complexity. The garbler encrypts the whole circuit and sends it in one shot, the evaluator runs it locally, and the number of communication rounds does not grow with the circuit&apos;s depth. On a high-latency link between two continents, where each round-trip costs real milliseconds, that constant-round behavior is decisive.&lt;/p&gt;
&lt;p&gt;The walls are just as concrete. The construction is inherently two-party. The entire garbled circuit must be transmitted, so communication grows with circuit size. And in its original form each AND gate cost four ciphertexts, one per row of the truth table, which point-and-permute lets the evaluator index directly [@mit-ygc].The FOCS 1986 abstract of record is titled &quot;How to Generate and Exchange Secrets,&quot; but the garbling construction itself is credited to Yao&apos;s oral presentation and later expositions, not spelled out in that short abstract. It is a mild historical irony that the most famous protocol in the field has no canonical originating paper for its own mechanism [@yao86].&lt;/p&gt;
&lt;p&gt;Those costs launched a decade of optimization. Free-XOR (2008) made every XOR gate cost zero ciphertexts by fixing a global offset between a wire&apos;s two labels [@freexor08]. Half-gates (2015) drove each AND gate down to two ciphertexts and proved that two is optimal for a broad class of linear garbling schemes, completing an arc from four to three to two [@halfgates15].&lt;/p&gt;
&lt;p&gt;BMR (1990) lifted garbling to &lt;code&gt;n&lt;/code&gt; parties while keeping the constant-round property, by having all parties jointly garble one circuit [@bmr90]. And authenticated garbling reached malicious two-party security at roughly 37 milliseconds total, about 1 millisecond online and about 6.7 milliseconds amortized per AES block, which is fast enough to be unremarkable [@wrk17-authgarbling].&lt;/p&gt;
&lt;h3&gt;GMW: many parties, sharing plus OT, rounds that grow with depth&lt;/h3&gt;
&lt;p&gt;A year after Yao, Goldreich, Micali, and Wigderson gave a different answer that scales to &lt;code&gt;n&lt;/code&gt; parties [@gmw87]. Every wire value is split into XOR (additive) shares, one per party, that reveal nothing until combined. XOR gates are then completely local: each party XORs its own shares, no messages required. The cost lives entirely in AND gates.&lt;/p&gt;
&lt;p&gt;Writing a shared bit &lt;code&gt;x&lt;/code&gt; as the XOR of the parties&apos; shares and likewise for &lt;code&gt;y&lt;/code&gt;, the product &lt;code&gt;x AND y&lt;/code&gt; expands into a sum of cross-terms, one for each pair of parties, and each cross-term is settled by a single oblivious transfer between that pair. Correctness for AND, privacy for everything, and the only cryptography in sight is OT.&lt;/p&gt;
&lt;p&gt;{`
// Split each bit into three XOR shares that reveal nothing on their own.
function share(bit) {
  const s1 = Math.round(Math.random());
  const s2 = Math.round(Math.random());
  const s3 = bit ^ s1 ^ s2;          // the three shares XOR back to the secret
  return [s1, s2, s3];
}
const reveal = (sh) =&amp;gt; sh[0] ^ sh[1] ^ sh[2];&lt;/p&gt;
&lt;p&gt;const x = 1, y = 0;
const X = share(x), Y = share(y);&lt;/p&gt;
&lt;p&gt;// Each party XORs its OWN two shares locally. No messages are exchanged.
const Z = [X[0] ^ Y[0], X[1] ^ Y[1], X[2] ^ Y[2]];&lt;/p&gt;
&lt;p&gt;console.log(&quot;shares of x =&quot;, X, &quot; reveal -&amp;gt;&quot;, reveal(X));
console.log(&quot;shares of y =&quot;, Y, &quot; reveal -&amp;gt;&quot;, reveal(Y));
console.log(&quot;local XOR of shares reveals -&amp;gt;&quot;, reveal(Z), &quot; and x XOR y =&quot;, (x ^ y));
console.log(&quot;one share of x alone is&quot;, X[0], &quot;-- a uniform bit, so it tells you nothing&quot;);
`}&lt;/p&gt;
&lt;p&gt;The trade-off is the mirror image of Yao&apos;s. Because each layer of AND gates needs a round of interaction, the number of rounds grows with the circuit&apos;s &lt;em&gt;depth&lt;/em&gt;. On a fast local network that is fine; across a high-latency wide-area link, depth-many round-trips are the dominant cost. So the field already had two general constructions that were fast in exactly opposite conditions.&lt;/p&gt;
&lt;p&gt;GMW also supplies the cleanest bridge to the previous post in this series. The base protocol is only semi-honest secure, but the &lt;em&gt;GMW compiler&lt;/em&gt; upgrades it to malicious security by having every party prove, in zero knowledge, that each message was computed correctly from committed inputs and honest randomness. That is &lt;a href=&quot;https://paragmali.com/blog/never-decrypted-proving-you-ran-the-computation-without-reve/&quot; rel=&quot;noopener&quot;&gt;zero-knowledge proofs&lt;/a&gt; doing exactly the job Part 2 described, bolted onto MPC. The honest footnote is that generic per-gate zero-knowledge is concretely expensive, and in practice it was largely superseded by the SPDZ-style techniques we reach in the next section [@lindell21-cacm].&lt;/p&gt;
&lt;h3&gt;BGW and CCD: an honest majority buys unconditional security&lt;/h3&gt;
&lt;p&gt;The third answer, from Ben-Or, Goldwasser, and Wigderson in 1988, and independently from Chaum, Crepeau, and Damgard the same year, dispenses with cryptographic assumptions entirely [@bgw88, @ccd88]. Instead of XOR shares it uses Shamir secret sharing over a finite field, where each secret is a point on a random polynomial [@shamir79]. Addition of shared values is local, as before. Multiplication is the hard step: multiplying two degree-&lt;code&gt;t&lt;/code&gt; sharings yields a product of degree &lt;code&gt;2t&lt;/code&gt;, which must be re-shared and its degree reduced back to &lt;code&gt;t&lt;/code&gt; through a round of interaction. That degree-reduction step is the engine of BGW.&lt;/p&gt;
&lt;p&gt;The security bounds are exact, and getting them right matters because they are widely misquoted.The completeness-theorem cluster is a genuine piece of conference drama: in the STOC 1988 proceedings, BGW (pages 1 to 10), CCD (pages 11 to 19), and Kilian&apos;s OT-completeness result (pages 20 to 31) sit on consecutive pages. Three foundational answers to &quot;what is computable securely&quot; arrived at one meeting [@bgw88, @ccd88, @kilian88]. BGW gives perfect privacy against a passive adversary that corrupts fewer than half the parties, &lt;code&gt;t &amp;lt; n/2&lt;/code&gt;, and perfect privacy &lt;em&gt;and&lt;/em&gt; correctness against a malicious (Byzantine) adversary corrupting &lt;code&gt;t &amp;lt; n/3&lt;/code&gt;. Those thresholds are tight, and the malicious bound is &lt;code&gt;t &amp;lt; n/3&lt;/code&gt;, not the &quot;&lt;code&gt;2t+1&lt;/code&gt;&quot; that appears in careless summaries.&lt;/p&gt;
&lt;p&gt;If you accept a negligible error probability and assume a broadcast channel, Rabin and Ben-Or later pushed the malicious threshold to &lt;code&gt;t &amp;lt; n/2&lt;/code&gt; [@rabin-benor89]. The price of dropping all assumptions is the honest majority itself, plus heavy per-multiplication interaction.&lt;/p&gt;
&lt;p&gt;The move that ties the modern secret-sharing world together came from Donald Beaver in 1991, and it is the reason &quot;MPC is slow&quot; is the wrong mental model.&lt;/p&gt;

A precomputed, secret-shared triple `([a], [b], [c])` where `a` and `b` are uniformly random and `c = a * b`, produced in an input-independent *offline* phase. In the *online* phase, multiplying two shared values `[x]` and `[y]` costs only opening `d = x - a` and `e = y - b`, then recombining locally. Because `a` and `b` are uniform, `d` and `e` reveal nothing about `x` and `y`, and the expensive work of making the triple happened before the inputs existed [@beaver91].
&lt;p&gt;Beaver triples split every secret-sharing protocol into a heavy, function-independent offline phase and a cheap, information-theoretic online phase. That shape is the direct ancestor of nearly all modern secret-sharing MPC, including the breakthrough in the next section.&lt;/p&gt;
&lt;p&gt;With three constructions and one unifying trick in hand, the security ledger has filled out. Notice that it is not a ranking. Each row wins a different column.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What is hidden&lt;/th&gt;
&lt;th&gt;Who computes&lt;/th&gt;
&lt;th&gt;Adversary model&lt;/th&gt;
&lt;th&gt;Parties&lt;/th&gt;
&lt;th&gt;Rounds&lt;/th&gt;
&lt;th&gt;Trust assumption&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;One trusted party&lt;/td&gt;
&lt;td&gt;None, by fiat&lt;/td&gt;
&lt;td&gt;n plus a broker&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Total trust in a single box (removed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both wealth values&lt;/td&gt;
&lt;td&gt;The two parties&lt;/td&gt;
&lt;td&gt;Semi-honest&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A few&lt;/td&gt;
&lt;td&gt;A hardness assumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both inputs&lt;/td&gt;
&lt;td&gt;Garbler and evaluator&lt;/td&gt;
&lt;td&gt;Semi-honest to malicious&lt;/td&gt;
&lt;td&gt;2 (BMR: n)&lt;/td&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;Symmetric crypto plus OT; dishonest majority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;n parties on XOR shares&lt;/td&gt;
&lt;td&gt;Semi-honest to malicious via ZK&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;OT; dishonest majority given OT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;n parties on Shamir shares&lt;/td&gt;
&lt;td&gt;Perfect, up to &lt;code&gt;t &amp;lt; n/3&lt;/code&gt; malicious&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;None; honest majority&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The same coexistence, read as engineering trade-offs rather than a timeline, is the comparison every practitioner eventually internalizes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Yao garbled circuits&lt;/th&gt;
&lt;th&gt;GMW&lt;/th&gt;
&lt;th&gt;BGW / CCD&lt;/th&gt;
&lt;th&gt;SPDZ family&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Rounds&lt;/td&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;Cheap online, heavy offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Whole circuit; 2 ciphertexts per AND (half-gates)&lt;/td&gt;
&lt;td&gt;1 OT per AND&lt;/td&gt;
&lt;td&gt;Interaction per multiplication&lt;/td&gt;
&lt;td&gt;Cheap online; heavy offline triples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parties&lt;/td&gt;
&lt;td&gt;2 (BMR: n)&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Majority&lt;/td&gt;
&lt;td&gt;Dishonest&lt;/td&gt;
&lt;td&gt;Dishonest, given OT&lt;/td&gt;
&lt;td&gt;Honest (&lt;code&gt;t &amp;lt; n/2&lt;/code&gt; passive, &lt;code&gt;t &amp;lt; n/3&lt;/code&gt; malicious)&lt;/td&gt;
&lt;td&gt;Dishonest (&lt;code&gt;n-1&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assumptions&lt;/td&gt;
&lt;td&gt;Symmetric crypto plus OT&lt;/td&gt;
&lt;td&gt;OT&lt;/td&gt;
&lt;td&gt;None (information-theoretic)&lt;/td&gt;
&lt;td&gt;Offline: SHE or OT; online: IT given the MAC key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best suited for&lt;/td&gt;
&lt;td&gt;2PC on high-latency links&lt;/td&gt;
&lt;td&gt;n-party Boolean on a LAN&lt;/td&gt;
&lt;td&gt;Honest majority, no assumptions, fairness&lt;/td&gt;
&lt;td&gt;Malicious n-party arithmetic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

flowchart TB
    goal[Simulate the trusted party for any function] --&amp;gt; y[Yao garbled circuits]
    goal --&amp;gt; g[GMW]
    goal --&amp;gt; b[BGW and CCD]
    y --&amp;gt; yt[Constant round, two parties, symmetric plus OT, dishonest majority]
    g --&amp;gt; gt[Depth rounds, n parties, OT, dishonest majority given OT]
    b --&amp;gt; bt[Depth rounds, n parties, no assumptions, honest majority]
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Yao&apos;s garbled circuits, GMW, and BGW are three different building blocks, not three rungs of one evolution. Garbled circuits use symmetric encryption and OT; GMW and BGW use secret sharing. They win in different network conditions and trust models, which is exactly why all three are still deployed almost forty years later. Any explanation that presents them as a single lineage has hidden the most useful thing about them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Beaver triples make multiplication cheap, but the version described so far only holds against a passive adversary. For twenty years the practitioner&apos;s dilemma was that malicious security, a dishonest majority, and practicality were pick-two. Then one idea got all three at once.&lt;/p&gt;
&lt;h2&gt;5. The Breakthrough: Cheap Malicious Security at a Dishonest Majority&lt;/h2&gt;
&lt;p&gt;Put yourself in the shoes of a practitioner around 2010. You can have information-theoretic security, but only with an honest majority you may not have. Or you can tolerate a dishonest majority, but only against a passive adversary, or by paying for a per-gate zero-knowledge compiler so expensive it is closer to a threat than a tool. The question that hung over the field was blunt: how do you catch a cheater who controls every party but you, without drowning in public-key cryptography?&lt;/p&gt;
&lt;p&gt;SPDZ, from Damgard, Pastro, Smart, and Zakarias at CRYPTO 2012, answered it with a single idea [@spdz12].The name is the authors&apos; initials and is pronounced &quot;speedz,&quot; which doubles as an accurate performance claim about its online phase. The idea is to authenticate every shared value so that tampering is caught the instant a value is opened.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Attach an information-theoretic message authentication code to every secret share. A single global MAC key, itself secret-shared and never revealed, guards all values at once. Any party that alters a share must forge a MAC it cannot compute, so one cheap check at the end catches a dishonest majority of active cheaters, and all the heavy cryptography hides in an offline phase that runs before any input exists.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Concretely, a global MAC key $\alpha$ is secret-shared and never opened. Every value &lt;code&gt;x&lt;/code&gt; is stored twice over: the parties hold shares of &lt;code&gt;x&lt;/code&gt; and shares of $\alpha \cdot x$, and linear operations preserve this relationship automatically. Multiplications consume authenticated Beaver triples generated offline, originally through somewhat-homomorphic encryption, later through oblivious transfer in the MASCOT variant and through faster homomorphic encryption in Overdrive [@spdz12, @spdz2-12].&lt;/p&gt;
&lt;p&gt;At the end, a single MAC check verifies that nobody altered a value. To cheat undetected, an adversary would have to produce a valid MAC $\alpha \cdot (x + e)$ for an error &lt;code&gt;e&lt;/code&gt; without knowing $\alpha$, which succeeds only with probability about $1/|\mathbb{F}|$ over the field.With a 128-bit field that cheating chance is around $2^{-128}$, far below any threshold anyone worries about. Make the field large and that probability is negligible.&lt;/p&gt;

A two-phase protocol structure. The *offline* (preprocessing) phase runs before any inputs are known and produces input-independent correlated randomness, such as authenticated Beaver triples, using the expensive cryptography. The *online* phase consumes that material to evaluate the actual function with cheap, mostly information-theoretic operations. Throughput is usually bounded by how fast the offline phase can manufacture triples [@spdz12, @beaver91].

flowchart TB
    subgraph OFFLINE[&quot;Offline phase -- input independent&quot;]
      o1[Manufacture authenticated Beaver triples] --&amp;gt; o2[Heavy crypto: SHE or OT]
    end
    subgraph ONLINE[&quot;Online phase -- cheap and information-theoretic&quot;]
      n1[Secret-share inputs with their MAC shares] --&amp;gt; n2[Evaluate circuit, consume triples]
      n2 --&amp;gt; n3[One MAC check catches any tampering]
      n3 --&amp;gt; n4[Open only the output]
    end
    OFFLINE --&amp;gt; ONLINE
&lt;p&gt;The online phase is exactly the Beaver-triple trick, now doing real work. Here it is, running:&lt;/p&gt;
&lt;p&gt;{`
const P = 65537;                                   // work in a prime field
const mod = (a) =&amp;gt; ((a % P) + P) % P;
const rnd = () =&amp;gt; Math.floor(Math.random() * P);
const shareVal = (v) =&amp;gt; { const s0 = rnd(); return [s0, mod(v - s0)]; };   // 2-party additive
const open = (sh) =&amp;gt; mod(sh[0] + sh[1]);&lt;/p&gt;
&lt;p&gt;// OFFLINE: one random triple ([a],[b],[c]) with c = a*b, made before inputs exist
const a = rnd(), b = rnd(), c = mod(a * b);
const A = shareVal(a), B = shareVal(b), C = shareVal(c);&lt;/p&gt;
&lt;p&gt;// Secret inputs, secret-shared between two parties
const x = 12345, y = 54321;
const X = shareVal(x), Y = shareVal(y);&lt;/p&gt;
&lt;p&gt;// ONLINE: open only d = x - a and e = y - b. Because a,b are uniform, these leak nothing.
const d = open([mod(X[0] - A[0]), mod(X[1] - A[1])]);
const e = open([mod(Y[0] - B[0]), mod(Y[1] - B[1])]);&lt;/p&gt;
&lt;p&gt;// Each party forms its share of x&lt;em&gt;y locally:  [xy] = [c] + d&lt;/em&gt;[b] + e*[a] + d&lt;em&gt;e
const Z0 = mod(C[0] + d * B[0] + e * A[0] + d * e);   // one party adds the public d&lt;/em&gt;e
const Z1 = mod(C[1] + d * B[1] + e * A[1]);&lt;/p&gt;
&lt;p&gt;console.log(&quot;opened only d = x - a and e = y - b:&quot;, d, e, &quot;(uniform, reveal nothing)&quot;);
console.log(&quot;reconstructed x&lt;em&gt;y =&quot;, open([Z0, Z1]));
console.log(&quot;direct    x&lt;/em&gt;y     =&quot;, mod(x * y));
`}&lt;/p&gt;
&lt;p&gt;The result is a protocol that securely computes any arithmetic circuit against up to &lt;code&gt;n-1&lt;/code&gt; malicious parties, with a cheap online phase and a single integrity check. It did not get superseded; it got refined. The SPDZ family is the current shape of general-purpose MPC, and the reference framework MP-SPDZ implements more than thirty protocol variants across the whole trade-off space [@mpspdz20, @mpspdz-github]. Modern offline phases increasingly draw their correlated randomness from silent OT, shrinking the preprocessing communication toward nothing [@silentot19].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; When a modern system says it runs &quot;maliciously secure MPC at a dishonest majority,&quot; it is almost always in the SPDZ family: authenticated secret shares, an offline triple factory, and a cheap online phase. Treat it as the baseline against which other choices are justified [@mpspdz20].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The general-purpose ledger is now complete, with SPDZ as the entry that finally combined the three properties the field had spent two decades unable to get together.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What is hidden&lt;/th&gt;
&lt;th&gt;Who computes&lt;/th&gt;
&lt;th&gt;Adversary model&lt;/th&gt;
&lt;th&gt;Parties&lt;/th&gt;
&lt;th&gt;Rounds&lt;/th&gt;
&lt;th&gt;Trust assumption&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;One trusted party&lt;/td&gt;
&lt;td&gt;None, by fiat&lt;/td&gt;
&lt;td&gt;n plus a broker&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Total trust in a single box (removed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both wealth values&lt;/td&gt;
&lt;td&gt;The two parties&lt;/td&gt;
&lt;td&gt;Semi-honest&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A few&lt;/td&gt;
&lt;td&gt;A hardness assumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both inputs&lt;/td&gt;
&lt;td&gt;Garbler and evaluator&lt;/td&gt;
&lt;td&gt;Semi-honest to malicious&lt;/td&gt;
&lt;td&gt;2 (BMR: n)&lt;/td&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;Symmetric crypto plus OT; dishonest majority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;n parties on XOR shares&lt;/td&gt;
&lt;td&gt;Semi-honest to malicious via ZK&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;OT; dishonest majority given OT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;n parties on Shamir shares&lt;/td&gt;
&lt;td&gt;Perfect, up to &lt;code&gt;t &amp;lt; n/3&lt;/code&gt; malicious&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Grows with depth&lt;/td&gt;
&lt;td&gt;None; honest majority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All inputs&lt;/td&gt;
&lt;td&gt;n parties on authenticated shares&lt;/td&gt;
&lt;td&gt;Malicious, up to &lt;code&gt;n-1&lt;/code&gt; corruptions&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Cheap online, heavy offline&lt;/td&gt;
&lt;td&gt;Offline crypto; online IT given the MAC key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;SPDZ can securely compute any arithmetic circuit against almost everyone cheating. But most of the world does not need &quot;any function.&quot; It needs exactly one function, over and over: &lt;em&gt;sign this&lt;/em&gt;, or &lt;em&gt;decrypt this&lt;/em&gt;. Fix the function, and something remarkable falls out.&lt;/p&gt;
&lt;h2&gt;6. The Deployed Special Case: Threshold Cryptography, Where No One Holds the Key&lt;/h2&gt;
&lt;p&gt;Here is the reframing that pays off the whole article. Take the general machinery and fix the function &lt;code&gt;f&lt;/code&gt; to just one operation: &lt;code&gt;sign&lt;/code&gt;, or &lt;code&gt;decrypt&lt;/code&gt;. Now the simulated trusted party has exactly one job, and its only output is a signature or a plaintext. If the key is never handed to anyone, where does it actually live?&lt;/p&gt;
&lt;p&gt;The answer is that it never becomes a thing at all. Through distributed key generation, the private key is &lt;em&gt;born&lt;/em&gt; as shares and is never reconstructed, not even at setup.&lt;/p&gt;

Threshold cryptography splits a private key into shares held by `n` parties so that any authorized threshold of them can perform the secret-key operation, while fewer than the threshold learn nothing and the key is never assembled. *Distributed key generation* is the setup protocol that produces the public key together with a secret sharing of the matching private key, so the private key exists only as shares from the very first moment. The construction mechanics -- Lagrange interpolation at signing time, verifiable sharing, proactive refresh -- are developed in the companion [secret-sharing post](/blog/nobody-broke-shamir-a-field-guide-to-secret-sharing-and-thre/) [@rfc9591].
&lt;p&gt;This is the sharp boundary with the sibling post, and it is worth drawing in bright lines, because the two ideas look similar and behave oppositely.&lt;/p&gt;

A Shamir backup and an MPC signing key are both &quot;a secret split into shares,&quot; but they differ at the decisive moment. A **backup** is a reconstruct-once design: you split a key to store it safely, and one day you gather the shares and rebuild the whole key to use it. A **threshold signing key** is a never-reconstruct design: the key is used, again and again, without ever being assembled anywhere. There is no moment when the full private key sits in memory. That is why an MPC custody wallet can truthfully claim no single box has ever held the key, a claim a backup scheme cannot make [@rfc9591, @cbmpc].
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Threshold cryptography is not a separate subject from MPC. It is MPC with the function permanently fixed to &quot;sign&quot; or &quot;decrypt.&quot; Everything in the first five sections applies, but because the function is fixed, the protocols can be specialized until they run in milliseconds, and the output is an ordinary signature any standard verifier accepts.&lt;/p&gt;
&lt;/blockquote&gt;

A signature scheme split so that any authorized subset of `n` signers can jointly produce a signature that verifies under a single ordinary public key, while no smaller subset can sign and the private key is never reconstructed. To the outside world the result is indistinguishable from an ordinary signature; the sharing is invisible to the verifier [@rfc9591, @shoup00].

sequenceDiagram
    participant P1 as Party 1 holds a share
    participant P2 as Combiner holds a share
    participant P3 as Party 3 holds a share
    participant V as Any standard verifier
    Note over P1,P3: distributed key generation, the private key is never assembled
    Note over P1,P3: each party computes a partial signature from its own share
    P1-&amp;gt;&amp;gt;P2: partial signature one
    P3-&amp;gt;&amp;gt;P2: partial signature three
    Note over P2: combine partials into one ordinary signature
    P2-&amp;gt;&amp;gt;V: a single standard signature
    Note over V: verifies under the ordinary public key, blind to the sharing
&lt;p&gt;The easy case is Schnorr. Because Schnorr signatures are linear, partial signatures simply add up, which makes the scheme friendly to thresholdize. FROST is the deployed standard here, and in 2024 it became RFC 9591, the first threshold-signature RFC, defining five ciphersuites and a two-round signing protocol [@rfc9591, @frost20].FROST stands for Flexible Round-Optimized Schnorr Threshold. The &quot;round-optimized&quot; part is the selling point: signing takes two rounds, and a preprocessing variant pushes the online phase to effectively one [@frost20].&lt;/p&gt;
&lt;p&gt;The hard case is ECDSA, and it is instructive precisely because it fights back. ECDSA signing requires multiplying two shared secrets and inverting a shared nonce, neither of which is linear, so thresholdizing it took real invention. Lindell made two-party threshold ECDSA practical in 2017 at roughly 37 milliseconds on the P-256 curve [@lindell17-ecdsa].&lt;/p&gt;
&lt;p&gt;From there the deployed line split into two branches that still compete. One uses Paillier encryption for its multiplicative-to-additive conversion: GG18, its follow-up GG20, and the proactive, identifiable-abort CGGMP protocol that ships as Fireblocks&apos; MPC-CMP [@gg18, @cggmp20]. The other avoids Paillier entirely and does the multiplication with oblivious transfer: the DKLs line, two-party in 2018 and multiparty in 2019, tested to hundreds of parties [@dkls18, @dkls19].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Paillier-MtA (GG18 / GG20 / CGGMP)&lt;/th&gt;
&lt;th&gt;OT-based (DKLs18 / DKLs19)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Multiplication primitive&lt;/td&gt;
&lt;td&gt;Paillier MtA plus range proofs&lt;/td&gt;
&lt;td&gt;Oblivious transfer, no Paillier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rounds to sign&lt;/td&gt;
&lt;td&gt;Multi-round; CGGMP has a non-interactive online phase&lt;/td&gt;
&lt;td&gt;&lt;code&gt;log(t)+6&lt;/code&gt;, two-party optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Lower bandwidth&lt;/td&gt;
&lt;td&gt;Higher bandwidth from OT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-party compute&lt;/td&gt;
&lt;td&gt;Heavier, Paillier operations&lt;/td&gt;
&lt;td&gt;Lighter, symmetric and OT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-party signing time&lt;/td&gt;
&lt;td&gt;Tens of milliseconds&lt;/td&gt;
&lt;td&gt;Single-digit milliseconds on a LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale tested&lt;/td&gt;
&lt;td&gt;Small to moderate &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Up to 256 parties, embedded devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra features&lt;/td&gt;
&lt;td&gt;Identifiable abort, proactive refresh, UC&lt;/td&gt;
&lt;td&gt;Fewest assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known integration risk&lt;/td&gt;
&lt;td&gt;TSSHOCK / BitForge in the range proofs&lt;/td&gt;
&lt;td&gt;Newer analysis surface, no Paillier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployed in&lt;/td&gt;
&lt;td&gt;Fireblocks MPC-CMP and many custody stacks&lt;/td&gt;
&lt;td&gt;Wallet SDKs favoring Paillier-free designs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Signing is not the only fixed function. Set &lt;code&gt;f&lt;/code&gt; to &lt;code&gt;decrypt&lt;/code&gt; and you get threshold decryption, where a ciphertext is jointly decrypted by share-holders without ever assembling the key, the pattern behind distributed key-management services and virtual hardware security modules. Victor Shoup showed as early as 2000 that a threshold of parties could produce standard RSA signatures without assembling the key [@shoup00], and Coinbase&apos;s open-source cb-mpc library is built for exactly this deployment [@cbmpc].&lt;/p&gt;

The key is never a value in any box. It is a capability the group can exercise but no single member can hold.
&lt;p&gt;There is one honest asterisk on all of this, and it points at the future. Almost every deployed threshold signature rests on the discrete logarithm, which a large quantum computer would break with &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;. The framework itself can be post-quantum -- BGW needs no computational assumption at all -- but the keys people actually ship are not. That gap is precisely what NIST is now moving on.&lt;/p&gt;

In January 2026, NIST finalized Interagency Report 8214C under its Multi-Party Threshold Cryptography project. It is a *First Call for Schemes*: a request for public submissions, organized into Class N for selected NIST-specified primitives and Class S for special ones including fully homomorphic encryption, zero-knowledge proofs, and auxiliary gadgets. Threshold ML-DSA, the post-quantum lattice signature, sits in Class N as an invited target. The precise verb matters: the call *places threshold ML-DSA in scope*. NIST has not standardized a threshold ML-DSA scheme, and saying it has is simply wrong [@nistir8214c, @nist-mptc, @nist-news-8214c].
&lt;p&gt;With that, the special case takes its place as the final row of the ledger. The function is fixed, the output is a signature, and the &quot;trust assumption&quot; column now reads: the key is never assembled.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What is hidden&lt;/th&gt;
&lt;th&gt;Who computes&lt;/th&gt;
&lt;th&gt;Adversary model&lt;/th&gt;
&lt;th&gt;Parties&lt;/th&gt;
&lt;th&gt;Rounds&lt;/th&gt;
&lt;th&gt;Trust assumption&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;The private key itself&lt;/td&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt; share-holders&lt;/td&gt;
&lt;td&gt;Malicious, scheme-dependent&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2 (FROST) to a few&lt;/td&gt;
&lt;td&gt;Key never assembled; discrete-log hardness today&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&quot;No one holds the key&quot; is not marketing. It is a property you can verify from the protocol. So where is it actually running today, and does the theory survive contact with production?&lt;/p&gt;
&lt;h2&gt;7. Where It Ships: Three Deployment Homes&lt;/h2&gt;
&lt;p&gt;The theory is settled; the products are here. The discipline that keeps this section honest is to attribute every deployment by a chain: the &lt;em&gt;scheme&lt;/em&gt; (a named protocol from a paper), the &lt;em&gt;library&lt;/em&gt; that implements it, and the &lt;em&gt;product&lt;/em&gt; that ships the library. Skip a link and you get the marketing gloss instead of the engineering.&lt;/p&gt;
&lt;p&gt;The first home is MPC custody. When an exchange or bank holds cryptocurrency, the signing key is the whole ballgame, and a single server holding it is a single point of catastrophic failure. So custody vendors run threshold ECDSA. Fireblocks ships MPC-CMP, whose scheme is the CGGMP protocol from CCS 2020 and whose core is open-sourced as mpc-lib [@fireblocks-mpccmp, @cggmp20].&quot;MPC-CMP&quot; is named for the CGGMP protocol of CCS 2020 -- Canetti, Gennaro, Goldfeder, Makriyannis, and Peled -- not &quot;Centralized Multi-Party&quot; as a widely copied web gloss claims. Mind the initials: those five surnames spell CGGMP, while the bare acronym &quot;CMP&quot; is the three-author Canetti-Makriyannis-Peled line, so &quot;CMP&quot; should never be expanded to the five CGGMP names. The whole point of the design is that nothing is centralized [@cggmp20].&lt;/p&gt;
&lt;p&gt;Coinbase open-sourced cb-mpc, which packages threshold ECDSA, Schnorr, and EdDSA with DKG, OT, and zero-knowledge proofs [@cbmpc, @coinbase-mpc-blog]. BitGo runs threshold ECDSA and EdDSA on the same never-reconstruct principle [@bitgo-tss]. In every case the signing key is generated as shares and used without assembly.&lt;/p&gt;
&lt;p&gt;That home also gives the series its sharpest cautionary tale, and it is the reason this post keeps insisting that an implementation bug is not a broken idea.&lt;/p&gt;

In 2023, the BitForge and TSSHOCK disclosures (CVE-2023-33241) showed that wallets built on the GG18 and GG20 threshold-ECDSA protocols could leak a full private key. An attacker who injected a malformed Paillier key and cheated in the accompanying range proof could extract the signing key in as few as 16 signatures, and the flaw touched more than ten libraries [@cve-2023-33241, @verichains-tsshock]. Read the failure precisely: it was an *implementation* bug in the Paillier-modulus validation bolted around the shares, not a break of the threshold-ECDSA idea. The core protocol was sound; the surrounding proof machinery was misimplemented [@fireblocks-tsshock-report, @safeheron-bitforge]. It is also a direct argument for the Paillier-free OT branch, which has less bolted-on machinery to get wrong.
&lt;p&gt;The second home looks nothing like the first. Private analytics gathers statistics from millions of devices without collecting anyone&apos;s individual data. Prio, from Corrigan-Gibbs and Boneh in 2017, is the template: each client splits its report into secret shares sent to a small number of non-colluding aggregators, which sum the shares and reconstruct only the aggregate, never any individual value [@prio17].The privacy rests on the aggregators not colluding: any single aggregator sees only uniform-looking shares, so the guarantee holds as long as at least one of them is honest. Correctness is enforced by secret-shared validity proofs, so a malicious client cannot poison the total without detection.&lt;/p&gt;
&lt;p&gt;This is aggregation-style MPC, quite distinct from garbled-circuit two-party computation, and it is being standardized at the IETF as the Distributed Aggregation Protocol (DAP) -- still a working-group draft -- while already running in production in ISRG&apos;s Divvi Up, alongside Apple and Google&apos;s Exposure Notifications analytics and Mozilla telemetry [@ietf-dap, @divviup]. These systems also add differential-privacy noise to the aggregate, a reminder that MPC protects the inputs while the output still needs its own defense [@enpa-whitepaper]. Newer aggregation systems lean on function secret sharing, which splits a &lt;em&gt;function&lt;/em&gt; rather than a value into two short keys, with the distributed point function as its point-query special case; Poplar uses exactly that to find frequent strings across many clients without a trusted aggregator, where Prio used plain additive shares [@dpf-gi14, @fss-bgi15, @poplar21].&lt;/p&gt;
&lt;p&gt;The most widely shipped special-purpose two-party computation is quieter than any of these. Private set intersection lets two parties learn only the elements their sets share, or an aggregate over those elements, and nothing else. Its clearest deployed form is privacy-preserving ad-conversion measurement, where Google&apos;s Private Join and Compute reveals only the size and value of an intersection and nothing about the individual records on either side [@psi-ion20]. Mobile contact discovery is the example people reach for, but it sharpens this article&apos;s thesis rather than illustrating it: the flagship privacy messenger, Signal, runs its production contact discovery inside an Intel SGX secure enclave with remote attestation [@signal-pcd] -- a trusted execution environment that trusts hardware, not a cryptographic two-party computation that trusts mathematics. Cryptographic private contact discovery has been demonstrated at scale as a research integration [@psi-kales19], yet messengers have not shipped it in place of enclaves. The construction mechanics are their own subject; the point here is that the flagship deployed 2PC is not a general circuit but this one tightly specialized function -- and where it genuinely ships, it ships as cryptography, not as hardware trust.&lt;/p&gt;
&lt;p&gt;The third home is distributed key management. A conventional key-management service or hardware security module concentrates trust in one box; the threshold version spreads it. Coinbase&apos;s cb-mpc doubles as a distributed KMS [@cbmpc], the virtual-HSM vendor Unbound was folded into Coinbase [@coinbase-unbound], and systems such as Zama&apos;s threshold key-management service keep decryption keys secret-shared, running sign and decrypt operations without ever reconstructing the full key [@zama-tkms]. The keys live only as shares, on purpose, from creation to retirement.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Scheme&lt;/th&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Product or deployment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Custody signing&lt;/td&gt;
&lt;td&gt;CGGMP threshold ECDSA&lt;/td&gt;
&lt;td&gt;Fireblocks mpc-lib&lt;/td&gt;
&lt;td&gt;Fireblocks MPC-CMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custody signing&lt;/td&gt;
&lt;td&gt;Threshold ECDSA, Schnorr, EdDSA&lt;/td&gt;
&lt;td&gt;Coinbase cb-mpc&lt;/td&gt;
&lt;td&gt;Coinbase custody and wallet services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custody signing&lt;/td&gt;
&lt;td&gt;Threshold ECDSA and EdDSA&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;BitGo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private analytics&lt;/td&gt;
&lt;td&gt;Prio secret-shared reports with validity proofs&lt;/td&gt;
&lt;td&gt;libprio and DAP&lt;/td&gt;
&lt;td&gt;Divvi Up, Exposure Notifications, Mozilla telemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private set intersection&lt;/td&gt;
&lt;td&gt;PSI (ad-conversion, aggregates)&lt;/td&gt;
&lt;td&gt;Audited PSI protocols&lt;/td&gt;
&lt;td&gt;Google Private Join and Compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private heavy hitters&lt;/td&gt;
&lt;td&gt;Function secret sharing / DPFs&lt;/td&gt;
&lt;td&gt;DPF-based (Poplar)&lt;/td&gt;
&lt;td&gt;Heavy-hitter analytics without a trusted aggregator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distributed KMS or virtual HSM&lt;/td&gt;
&lt;td&gt;Threshold ECDSA and decryption&lt;/td&gt;
&lt;td&gt;cb-mpc, Unbound, Zama TKMS&lt;/td&gt;
&lt;td&gt;Custody KMS and virtual HSM offerings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; When you evaluate an &quot;MPC&quot; product, ask which named scheme its library implements and which paper defines that scheme. &quot;We use MPC&quot; is not an answer. &quot;We run the CGGMP protocol with proactive refresh, or the DKLs OT-based protocol&quot; is. The attribution tells you the trust model, the failure modes, and whether the code path that broke in TSSHOCK is even present [@cggmp20, @dkls19].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every one of these systems made the same trade, and every trade has a price. It is time to be honest about the costs, and about the walls that no amount of engineering can move.&lt;/p&gt;
&lt;h2&gt;8. The Honest Costs and the Theoretical Limits&lt;/h2&gt;
&lt;p&gt;If MPC can compute anything privately, why is not everything already private? The lazy answer is &quot;MPC is slow,&quot; and it is the wrong frame. &quot;Slow&quot; implies a single number that hardware will eventually shrink to zero. The truth is more interesting and more permanent: the costs are a set of trade-offs, and beyond the trade-offs sits a set of theorems that no engineering will ever move.&lt;/p&gt;
&lt;p&gt;Start with the trade-offs, because they explain why the field never crowned a winner. Rounds and communication pull against each other. Garbled circuits are constant-round but transmit the entire circuit, so they are bandwidth-hungry. Secret-sharing protocols send little per gate but interact once per layer of multiplication, so their round count grows with depth. Which one wins is not a property of the protocol; it is a property of the network.&lt;/p&gt;
&lt;p&gt;On a wide-area link, where each round-trip costs tens of milliseconds, round complexity dominates and constant-round garbling pulls ahead. On a fast local network, bandwidth dominates and the lean secret-sharing protocols win. Add the security-model knobs from Section 2 -- semi-honest versus malicious, honest versus dishonest majority -- and the Yao/GMW/BGW/SPDZ trade-off table above becomes the real cost model. There is no single fastest MPC, only a fastest MPC for a given network and threat model [@ekr-monograph, @mpspdz20].&lt;/p&gt;
&lt;p&gt;Now the theorems, which are the deeper half of the story, because they say some of the ideal party&apos;s properties are simply unattainable.&lt;/p&gt;

A protocol computes a function with *complete fairness* if either all parties receive the output or none do, so no party can learn the answer while denying it to everyone else. This is strictly stronger than *security with abort*, in which a corrupted party may see the output and then quit before the honest parties obtain theirs. *Guaranteed output delivery* is stronger still: the honest parties are assured of the output even if the corrupted parties vanish entirely [@ekr-monograph].
&lt;p&gt;The foundational limit is Cleve&apos;s, from 1986. He proved that complete fairness is impossible for &lt;em&gt;general-purpose&lt;/em&gt; secure computation at a dishonest majority: no single protocol can fairly compute &lt;em&gt;every&lt;/em&gt; function, because for some functions -- fair coin-tossing is the classic witness -- whichever party sends the last message can abort at the decisive moment and bias the outcome [@cleve86].&lt;/p&gt;
&lt;p&gt;This is not a gap awaiting a cleverer protocol; it is a theorem. It is exactly why the SPDZ family, which aims at arbitrary circuits, provides security with abort rather than guaranteed output, so that &quot;the protocol just stopped&quot; is an accepted outcome rather than a bug.&lt;/p&gt;
&lt;p&gt;Then the story turns, and the turn is the real insight of this section. Cleve rules out a protocol that is fair for &lt;em&gt;every&lt;/em&gt; function; he does not rule out fairness &lt;em&gt;function by function&lt;/em&gt;. Fairness is a property of the function &lt;code&gt;f&lt;/code&gt;, not merely of the majority.&lt;/p&gt;
&lt;p&gt;In 2008, Gordon, Hazay, Katz, and Lindell overturned the folklore that nothing is fair without an honest majority. They proved that a broad class of functions -- those with no &quot;embedded XOR,&quot; which includes Boolean AND, Boolean OR, and Yao&apos;s millionaires&apos; comparison -- can be computed with complete fairness even at a dishonest majority, and they gave an explicit two-party protocol that computes Boolean AND fairly with no honest majority at all [@ghkl08].An &quot;embedded XOR&quot; is a two-by-two block inside the function&apos;s truth table whose two diagonals are each constant and differ from one another, the pattern that makes plain XOR the canonical &lt;em&gt;un&lt;/em&gt;fair function. AND, OR, and the millionaires&apos; comparison contain no such block, which is precisely why they slip past Cleve&apos;s obstruction [@ghkl08].&lt;/p&gt;
&lt;p&gt;The fuller map -- which remaining functions are fair, and at what round cost, since some feasibly fair ones demand a super-logarithmic number of rounds -- was charted afterward by Asharov and by Asharov, Beimel, Makriyannis, and Omri. The credit for that characterization belongs to them, not to the 2008 result [@asharov14-fairness, @abmo15-fairness].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The tempting summary, &quot;no function can be computed fairly without an honest majority,&quot; is false. Cleve&apos;s 1986 theorem forbids only a &lt;em&gt;single protocol that is fair for every function&lt;/em&gt;; specific functions with no embedded XOR -- Boolean AND, OR, and the millionaires&apos; comparison -- are completely fair even when every party but one is corrupt [@cleve86, @ghkl08]. General-purpose MPC still settles for security with abort precisely because it must also cover the functions, such as plain XOR, that Cleve&apos;s argument genuinely defeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other walls line up behind it. Information-theoretic security and guaranteed output require an honest majority, the perfect &lt;code&gt;t &amp;lt; n/3&lt;/code&gt; of BGW or the statistical &lt;code&gt;t &amp;lt; n/2&lt;/code&gt; of Rabin and Ben-Or with a broadcast channel [@bgw88, @rabin-benor89]. Oblivious transfer is both necessary and sufficient for dishonest-majority secure computation. Kilian proved the sufficiency: OT alone computes anything [@kilian88]. The necessity is the near-trivial converse, since OT is itself a two-party secure computation, so any protocol that computes arbitrary functions can in particular compute OT.&lt;/p&gt;
&lt;p&gt;There is also a provable separation in communication cost: information-theoretic MPC must send data that grows with the circuit size, on the order of $\Omega(n \cdot |C|)$, while computational MPC built on threshold fully homomorphic encryption needs communication proportional only to the input and output sizes [@dln-lowerbound, @asharov12-tfhe]. That is not a gap someone will close; it is the price of dropping assumptions, stated as a lower bound. Two more limits round out the list: the output-leakage wall from Section 2, where even a perfect protocol reveals whatever the output implies, and the deployment-era wall, the discrete logarithm under almost every shipped threshold signature, which Shor&apos;s algorithm breaks and the NIST post-quantum threshold call targets [@nistir8214c].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; The trusted party can be simulated arbitrarily well, but which of its ideal properties you keep depends on the function you compute and on how many parties you must distrust. An honest majority buys unconditional security and a guaranteed output. A dishonest majority forces cryptographic assumptions and, for general circuits, surrenders guaranteed output to Cleve&apos;s theorem -- yet even there, complete fairness survives for the specific functions that carry no embedded XOR. And no setting hides what the output itself reveals. There is no configuration that keeps every ideal property at once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That reframes the whole picture. MPC is not &quot;magic total privacy that happens to be slow.&quot; It is a provably bounded, trade-off-governed approximation of an ideal that is partly unattainable, function by function, and knowing exactly which part is unattainable is what separates an engineer from a marketer. These walls are permanent. But the frontier in front of them is very much alive, and the sharpest open question is the one a quantum computer will eventually force.&lt;/p&gt;
&lt;h2&gt;9. Open Problems: The Live Frontier&lt;/h2&gt;
&lt;p&gt;The theoretical spine of MPC has been settled for decades, which makes its live edges easy to see. Five stand out, and the first is the sharpest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post-quantum threshold cryptography.&lt;/strong&gt; The framework can be quantum-safe, but the deployed keys are not, and closing that gap is genuinely hard. Lattice signatures such as ML-DSA thresholdize awkwardly: their security relies on rejection sampling and carefully bounded noise, and splitting the signing operation across parties without leaking that noise, or aborting too often, is an open engineering problem. This is the explicit target of the NIST call, which places threshold ML-DSA in scope as an invited submission rather than a finished standard [@nistir8214c, @nist-mptc].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The most consequential open problem is not making MPC faster. It is making deployed threshold signatures quantum-safe. Today&apos;s custody keys rest on the discrete logarithm; a lattice-based threshold signature that is as efficient and as easy to implement as FROST does not yet exist. That is the gap NIST is now inviting the field to fill [@nistir8214c].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Collapsing the offline phase.&lt;/strong&gt; SPDZ&apos;s throughput is bounded by how fast it can manufacture triples. Silent OT and pseudorandom correlation generators shrink the preprocessing communication toward sublinear, but their local computation cost and the exact parameterization of their underlying assumption remain active research [@silentot19].The learning-parity-with-noise assumption behind silent OT is itself a candidate post-quantum assumption, which is why the modern offline phase and the post-quantum question are quietly related [@silentot19].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MPC at scale.&lt;/strong&gt; Pushing to many parties and billion-gate circuits, with overhead approaching that of insecure computation, is a moving target. Honest-majority protocols now run close to the $\Omega(n \cdot |C|)$ communication lower bound, so further gains have to come from assumptions or from restructuring the computation rather than from cleverer sharing [@dln-lowerbound, @asharov12-tfhe].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resilient and asynchronous MPC.&lt;/strong&gt; Delivering guaranteed output over real adversarial networks, where messages are delayed or dropped and parties may vanish, is possible only with an honest majority, because Cleve&apos;s theorem forbids it otherwise. Building practical asynchronous protocols that keep that guarantee is ongoing [@cleve86].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Standardization and interoperability.&lt;/strong&gt; RFC 9591 gave FROST a single interoperable definition, but custody vendors still ship mutually incompatible threshold-ECDSA stacks. Whether the NIST effort yields interoperable post-quantum threshold standards, the way the IETF is standardizing private analytics through the Distributed Aggregation Protocol draft, is an open question with real commercial stakes [@rfc9591, @ietf-dap].&lt;/p&gt;
&lt;p&gt;Finally, the synthesis this series has been building toward. The three privacy technologies are complementary, not competing. &lt;a href=&quot;https://paragmali.com/blog/never-decrypted-how-fully-homomorphic-encryption-computes-on/&quot; rel=&quot;noopener&quot;&gt;Fully homomorphic encryption&lt;/a&gt; outsources computation on a single party&apos;s ciphertext. &lt;a href=&quot;https://paragmali.com/blog/never-decrypted-proving-you-ran-the-computation-without-reve/&quot; rel=&quot;noopener&quot;&gt;Zero-knowledge proofs&lt;/a&gt; establish correctness without revealing the witness. MPC splits trust across parties. The interesting systems compose them: MPC for input privacy, zero-knowledge for correctness against active cheaters, and homomorphic encryption to offload heavy computation. Threshold FHE already lives at exactly that seam, using MPC to distribute the FHE decryption key so that no party can unilaterally decrypt [@asharov12-tfhe]. The frontier is not any one of these techniques winning; it is learning to wire them together.&lt;/p&gt;
&lt;p&gt;The research is thrilling. But you have a system to ship this quarter, so here is how to choose today, without rolling your own cryptography.&lt;/p&gt;
&lt;h2&gt;10. A Practical Guide: Which Primitive, Which Library&lt;/h2&gt;
&lt;p&gt;The decision is usually simpler than the theory. Match your problem to a construction, then reach for an audited implementation of it. Never write the protocol yourself.&lt;/p&gt;

flowchart TD
    A{&quot;What do you need?&quot;} --&amp;gt; B{&quot;Only sign or decrypt?&quot;}
    B --&amp;gt;|Yes| T[Threshold signatures: FROST, CGGMP, or DKLs]
    B --&amp;gt;|No| P{&quot;Just an intersection or an aggregate?&quot;}
    P --&amp;gt;|Set intersection| PSI[Private set intersection]
    P --&amp;gt;|Aggregate over many clients| AGG[Prio or DAP, or DPFs for heavy hitters]
    P --&amp;gt;|A general function| C{&quot;How many parties?&quot;}
    C --&amp;gt;|Two parties on a WAN| G[Garbled circuits with half-gates]
    C --&amp;gt;|Many parties on a LAN| D{&quot;Honest majority available?&quot;}
    D --&amp;gt;|Yes| E[BGW-style, no assumptions]
    D --&amp;gt;|No| F[SPDZ family, malicious at a dishonest majority]
&lt;p&gt;The rules behind the fan are short enough to memorize. If two parties must jointly evaluate a mostly-Boolean function across a high-latency link, use garbled circuits with half-gates, upgraded to authenticated garbling if the adversary may be malicious [@halfgates15, @wrk17-authgarbling]. If many parties compute an arithmetic function on a fast network and you need malicious security, use the SPDZ family [@spdz12, @mpspdz20]. If you have an honest majority and want no cryptographic assumptions, a post-quantum-safe framework, or guaranteed fairness, use a BGW-style protocol [@bgw88]. And if all you need is to sign or decrypt, use a threshold signature, FROST for Schnorr and EdDSA, CGGMP or DKLs for ECDSA, and do not build a general circuit for a job the specialized protocol does in milliseconds [@rfc9591, @cggmp20, @dkls19].&lt;/p&gt;
&lt;p&gt;Two specialized shortcuts finish the list. If two parties need only the intersection of their sets, or an aggregate over it, reach for private set intersection -- the flagship deployed 2PC, behind privacy-preserving ad-conversion measurement -- rather than a hand-rolled general circuit [@psi-ion20]. And for aggregate statistics across many clients with no trusted aggregator, use secret-shared reports in the Prio and DAP style, or function secret sharing and DPFs when you need private heavy hitters as in Poplar [@prio17, @poplar21, @fss-bgi15].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Reach for&lt;/th&gt;
&lt;th&gt;Audited implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Two parties, high-latency link, Boolean function&lt;/td&gt;
&lt;td&gt;Garbled circuits (half-gates; authenticated garbling if malicious)&lt;/td&gt;
&lt;td&gt;EMP-toolkit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Many parties, arithmetic, LAN, malicious security&lt;/td&gt;
&lt;td&gt;SPDZ family&lt;/td&gt;
&lt;td&gt;MP-SPDZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honest majority; no assumptions or fairness wanted&lt;/td&gt;
&lt;td&gt;BGW-style (Shamir or replicated three-party)&lt;/td&gt;
&lt;td&gt;MP-SPDZ honest-majority protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only need to sign or decrypt&lt;/td&gt;
&lt;td&gt;Threshold signatures (FROST, or CGGMP/DKLs for ECDSA)&lt;/td&gt;
&lt;td&gt;cb-mpc, FROST implementations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two parties, learn only a set intersection or an aggregate over it&lt;/td&gt;
&lt;td&gt;Private set intersection (PSI)&lt;/td&gt;
&lt;td&gt;Audited PSI protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private aggregate stats across many clients, no trusted aggregator&lt;/td&gt;
&lt;td&gt;Prio/DAP shares; FSS/DPFs for heavy hitters&lt;/td&gt;
&lt;td&gt;libprio, DAP, Poplar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One server computes on your single ciphertext&lt;/td&gt;
&lt;td&gt;Fully homomorphic encryption (Part 1)&lt;/td&gt;
&lt;td&gt;See Part 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prove a computation ran correctly&lt;/td&gt;
&lt;td&gt;Zero-knowledge proofs (Part 2)&lt;/td&gt;
&lt;td&gt;See Part 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The mature, audited frameworks are worth naming: MP-SPDZ spans more than thirty protocols across the trade-off space [@mpspdz-github], EMP-toolkit is a reference for semi-honest and malicious garbling [@emp-toolkit], and Fairplay, back in 2004, was the first general-purpose secure two-party system to leave the blackboard [@fairplay04].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Three rules save you from the failure modes this series keeps circling. First, a protocol proven only semi-honest is worthless against an attacker who is willing to deviate; match the security model to your real adversary. Second, nonce and randomness hygiene is catastrophic to get wrong in threshold signing, so use vetted code paths. Third, keep GG18 and GG20 deployments patched: the TSSHOCK class of bugs lives in the range proofs bolted around the protocol, not in the protocol&apos;s core idea, and an unpatched library leaks keys even though the theorem is sound [@cve-2023-33241].&lt;/p&gt;
&lt;/blockquote&gt;

Suppose you run custody and want five of eight operators to authorize each transfer, with no server ever holding the key. Walk the fan. Do you only need to sign? Yes. So you do not build a general circuit at all. The asset uses ECDSA, so you choose a threshold-ECDSA protocol, CGGMP if you want identifiable abort and proactive refresh, or a DKLs OT-based protocol if you want to avoid Paillier machinery entirely, a line tracked on its public project page [@dkls-info]. You run distributed key generation so the key is born as eight shares, you require any five to sign, and you deploy an audited library rather than your own. The output is an ordinary ECDSA signature the blockchain verifies with the normal public key, and no box ever held the private key [@cggmp20, @dkls19].
&lt;p&gt;One decision table cannot answer every worry, so here are the questions readers ask most, and the misconceptions most worth retiring.&lt;/p&gt;
&lt;h2&gt;11. Frequently Asked Questions&lt;/h2&gt;

No. Fully homomorphic encryption has one server compute on your single ciphertext, so trust rests on a hardness assumption. MPC splits the trust across several parties, so privacy holds as long as too few of them collude. They are different tools for different trust models, and they compose rather than compete [@lindell21-cacm].

No, and this is the most common misconception. MPC hides the inputs; the output is revealed to whoever is entitled to it, and the output can itself leak. If two parties compute their sum, each recovers the other&apos;s value by subtraction. Choosing a function whose output says too much is a design error no protocol can repair [@lindell21-cacm].

No. A Shamir backup is reconstruct-once: you gather the shares and rebuild the whole key to use it. An MPC signing key is never-reconstruct: it is used repeatedly without ever being assembled anywhere. That difference is the entire security claim of MPC custody [@rfc9591, @cbmpc].

The framework can be. BGW is information-theoretic and needs no computational assumption at all. But most deployed threshold signatures rest on the discrete logarithm, which Shor&apos;s algorithm breaks. NIST&apos;s IR 8214C places threshold ML-DSA in scope as an invited submission; it is a call for schemes, not a standardized scheme [@nistir8214c].

&quot;Slow&quot; is the wrong frame. The costs are trade-offs among rounds, bandwidth, and trust model, and the right choice depends on your network. Threshold signing in particular is millisecond-scale and ships in custody wallets today; general-purpose MPC has a cheap online phase after preprocessing [@ekr-monograph, @mpspdz20].

An honest majority is required only for information-theoretic security or a guaranteed output, which BGW gives at `t &amp;lt; n/3`; SPDZ-family protocols tolerate up to `n-1` malicious parties, a full dishonest majority, but only with security-with-abort, where a cheater can halt the protocol yet not forge the result [@bgw88, @spdz12]. Fairness is subtler. Complete fairness for *general* computation is impossible without an honest majority (Cleve), but fairness is a property of the function: specific functions with no &quot;embedded XOR&quot; -- Boolean AND, OR, and the millionaires&apos; comparison -- are completely fair even at a dishonest majority, so the common claim that &quot;no function is ever fair without an honest majority&quot; is simply false [@cleve86, @ghkl08].

No. The fragility lives in the integration, not the theorem. TSSHOCK and BitForge extracted full keys from real wallets, but the flaw was a range-proof implementation bug, not a break of threshold ECDSA. Use audited libraries, keep nonce handling vetted, and patch GG18 and GG20 deployments [@cve-2023-33241].
&lt;h2&gt;The Party Nobody Had to Be&lt;/h2&gt;
&lt;p&gt;Return to the two hospitals and the billion-dollar transfer. The instinct in both cases was to appoint a trusted party, and the whole article has been an argument that you can get everything that party would have given you without anyone ever being it.&lt;/p&gt;
&lt;p&gt;Read the evidence back in order. Kilian proved that one humble primitive, oblivious transfer, is enough to compute anything securely, which turned &quot;invent a protocol per problem&quot; into &quot;build good OT and wire it up&quot; [@kilian88]. Yao&apos;s garbled circuits, GMW, and BGW then instantiated that promise three different ways, trading rounds against bandwidth against trust assumptions so completely that all three still ship.&lt;/p&gt;
&lt;p&gt;The preprocessing model and SPDZ made malicious security at a dishonest majority cheap, by authenticating every share so a single check catches a cheater [@spdz12]. And threshold cryptography is the deployed special case: fix the function to sign or decrypt, generate the key by distributed key generation, and the key exists only as a capability the group can exercise, never as a value in any box [@rfc9591, @cbmpc].&lt;/p&gt;
&lt;p&gt;The honesty is the other half of the argument. MPC hides inputs, not outputs. Complete fairness for general-purpose computation is impossible at a dishonest majority, so a cheater can always halt, even though specific no-embedded-XOR functions stay fair even there. Information-theoretic security demands an honest majority. And almost every deployed threshold signature still rests on the discrete logarithm, which is why NIST&apos;s post-quantum threshold call, a call and not yet a standard, is the live frontier [@nistir8214c]. A companion post, &quot;How Secure Multiparty Computation Would Break,&quot; presses on exactly those seams, and the series through-line remains that MPC, zero-knowledge, and homomorphic encryption are three complementary ways to compute on data that is never decrypted.&lt;/p&gt;

The trusted party can be simulated arbitrarily well. Which of its ideal properties you keep depends on the function you compute and how many parties you must distrust, and that, not speed, is the real shape of secure computation.
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;never-decrypted-mpc-threshold-no-one-holds-the-secret&quot; keyTerms={[
  { term: &quot;Secure Multiparty Computation&quot;, definition: &quot;Parties jointly compute an agreed function over private inputs, learning only the output, as if a trusted party had run it.&quot; },
  { term: &quot;Real/Ideal Simulation&quot;, definition: &quot;A protocol is secure if a simulator given only the ideal output can reproduce everything the adversary sees in the real run.&quot; },
  { term: &quot;Oblivious Transfer&quot;, definition: &quot;A sender&apos;s receiver learns exactly one of two messages and hides which; Kilian proved it is complete for secure computation.&quot; },
  { term: &quot;Garbled Circuit&quot;, definition: &quot;A Boolean circuit encrypted with per-wire labels so it can be evaluated blind; built from symmetric encryption and OT, not secret sharing.&quot; },
  { term: &quot;GMW&quot;, definition: &quot;An n-party protocol on XOR shares where XOR gates are free and each AND gate costs an oblivious transfer; rounds grow with circuit depth.&quot; },
  { term: &quot;BGW&quot;, definition: &quot;Information-theoretic MPC on Shamir shares; perfect security for fewer than n/3 malicious parties, requiring an honest majority.&quot; },
  { term: &quot;Beaver Triple&quot;, definition: &quot;A precomputed shared triple with product relation that turns an online multiplication into two openings, splitting work into offline and online phases.&quot; },
  { term: &quot;SPDZ&quot;, definition: &quot;Preprocessing-model MPC that attaches an information-theoretic MAC to every share, giving malicious security at a dishonest majority with a cheap online phase.&quot; },
  { term: &quot;Threshold Cryptography&quot;, definition: &quot;MPC with the function fixed to sign or decrypt; via distributed key generation the key is born as shares and never reconstructed.&quot; },
  { term: &quot;Cleve&apos;s Theorem&quot;, definition: &quot;Complete fairness is impossible for general secure computation at a dishonest majority, which is why such protocols give security with abort.&quot; }
]} questions={[
  { q: &quot;Why is a garbled circuit not a secret-sharing scheme?&quot;, a: &quot;It encrypts a circuit with symmetric keys and delivers input labels by oblivious transfer; secret sharing is a different building block used by GMW and BGW.&quot; },
  { q: &quot;Does MPC hide the output of the computation?&quot;, a: &quot;No. It hides the inputs, but the output can still leak information, such as a sum revealing the other party&apos;s value.&quot; },
  { q: &quot;Why can an MPC wallet claim no box ever holds the key?&quot;, a: &quot;The key is generated as shares and used without reconstruction, unlike a Shamir backup that rebuilds the key once.&quot; },
  { q: &quot;What did SPDZ combine that was previously pick-two?&quot;, a: &quot;Malicious security, a dishonest majority, and practicality, achieved by authenticating every share with an information-theoretic MAC.&quot; },
  { q: &quot;Is threshold ML-DSA a NIST standard?&quot;, a: &quot;No. NIST IR 8214C places it in scope as an invited submission; it is a call for schemes, not a standardized scheme.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>secure-multiparty-computation</category><category>threshold-cryptography</category><category>oblivious-transfer</category><category>threshold-signatures</category><category>garbled-circuits</category><category>mpc-wallets</category><category>cryptography</category><category>post-quantum</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>Nobody Broke Shamir: A Field Guide to Secret Sharing and Threshold Cryptography</title><link>https://paragmali.com/blog/nobody-broke-shamir-a-field-guide-to-secret-sharing-and-thre/</link><guid isPermaLink="true">https://paragmali.com/blog/nobody-broke-shamir-a-field-guide-to-secret-sharing-and-thre/</guid><description>Shamir 1979 splits a secret so any t-of-n rebuild it and t-1 learn nothing. The perfect-secrecy core never broke; every failure was in the machinery around it.</description><pubDate>Mon, 13 Jul 2026 17:29:14 GMT</pubDate><content:encoded>
**Secret sharing splits a secret so any `t` of `n` holders can rebuild it and any `t-1` learn exactly nothing -- unconditionally, with no key and no hardness assumption.** Adi Shamir&apos;s 1979 polynomial scheme is the whole primitive: hide the secret as a point on a random curve, hand out other points, interpolate back [@shamir1979]. That perfect-secrecy core has never been broken and cannot be. Every real-world disaster -- weak-RNG coefficients, non-constant-time reconstruction, a lying dealer, the TSSHOCK/BitForge key-extraction bug [@cve-2023-33241] -- lives in the machinery bolted on top to make the point verifiable (VSS), dealerless (DKG), long-lived (proactive refresh), and signable without ever reassembling it (threshold signatures like FROST [@rfc9591]). This guide makes you fluent in the point, the layers, and the difference between a wallet that reconstructs the key once and one that never does.
&lt;h2&gt;1. Split the Key So No One Holds It&lt;/h2&gt;
&lt;p&gt;You want any 3 of your 5 executives to open the company&apos;s root-key vault, and you want any 2 of them -- colluding, or a thief who has picked two pockets -- to learn &lt;em&gt;nothing&lt;/em&gt;. Not &quot;a little less.&quot; Not &quot;a third of the key.&quot; Nothing at all, forever, against an adversary with a quantum computer and all the time until the heat death of the universe.&lt;/p&gt;
&lt;p&gt;That sounds impossible, or at least like it should demand a very strong assumption. Adi Shamir solved it completely in 1979, on two-thirds of a page, with nothing but a random polynomial -- and no one has broken it since [@shamir1979].&lt;/p&gt;
&lt;p&gt;Here is the whole idea, and every later section is a variation on it. Pick a random curve -- a polynomial &lt;code&gt;f&lt;/code&gt; of degree &lt;code&gt;t-1&lt;/code&gt; -- whose value at zero is the secret, so &lt;code&gt;f(0) = s&lt;/code&gt;. Hand holder &lt;code&gt;i&lt;/code&gt; the single point &lt;code&gt;(i, f(i))&lt;/code&gt;.Shares use indices &lt;code&gt;i = 1, 2, 3, ...&lt;/code&gt;, never &lt;code&gt;i = 0&lt;/code&gt;. The point at &lt;code&gt;x = 0&lt;/code&gt; is &lt;code&gt;f(0) = s&lt;/code&gt;, the secret itself, so handing out the zeroth point would hand over everything. Any &lt;code&gt;t&lt;/code&gt; holders can pool their points and reconstruct the curve by Lagrange interpolation, then read off &lt;code&gt;f(0) = s&lt;/code&gt;. Any &lt;code&gt;t-1&lt;/code&gt; holders have one point too few, and that gap is total.&lt;/p&gt;

A method that splits a secret `s` into `n` shares so any `t` of them reconstruct `s`, while any `t-1` reveal nothing about it. It is not encryption: there is no key to store and no computational assumption to break.
&lt;p&gt;Why &lt;em&gt;total&lt;/em&gt;? This is the part almost no one is shown. Fix any &lt;code&gt;t-1&lt;/code&gt; shares and guess a candidate secret &lt;code&gt;s&apos;&lt;/code&gt; -- any value you like. Exactly one degree-&lt;code&gt;t-1&lt;/code&gt; curve runs through your &lt;code&gt;t-1&lt;/code&gt; points and also through &lt;code&gt;(0, s&apos;)&lt;/code&gt;, because &lt;code&gt;t&lt;/code&gt; points pin a degree-&lt;code&gt;t-1&lt;/code&gt; polynomial uniquely. Every candidate secret is equally consistent with what you hold, so the secret&apos;s conditional distribution given &lt;code&gt;t-1&lt;/code&gt; shares stays perfectly uniform: you have learned zero bits, not &quot;a few&quot; [@shamir1979].&lt;/p&gt;
&lt;p&gt;This is a counting fact about polynomials over a finite field, not a hardness assumption a faster machine could someday overturn. Part 1 of this series drew the line between &lt;a href=&quot;https://paragmali.com/blog/secure-against-whom-the-security-definitions-every-protocol-/&quot; rel=&quot;noopener&quot;&gt;information-theoretic and computational security&lt;/a&gt;; plain Shamir sits firmly, and permanently, on the information-theoretic side.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Below the threshold, leakage is not small -- it is exactly zero. For every candidate secret there is precisely one degree-&lt;code&gt;t-1&lt;/code&gt; curve consistent with the &lt;code&gt;t-1&lt;/code&gt; shares an attacker holds, so the secret&apos;s conditional distribution stays uniform. No amount of computation, now or ever, narrows it down.&lt;/p&gt;
&lt;/blockquote&gt;

sequenceDiagram
    participant D as Dealer
    participant H1 as Holder 1
    participant H2 as Holder 2
    participant Ht as Holder t
    participant R as Reconstructor
    Note over D: Draw a random degree t-1 curve f, set f(0) to the secret s
    D-&amp;gt;&amp;gt;H1: Share (1, f(1))
    D-&amp;gt;&amp;gt;H2: Share (2, f(2))
    D-&amp;gt;&amp;gt;Ht: Share (t, f(t))
    H1-&amp;gt;&amp;gt;R: (1, f(1))
    H2-&amp;gt;&amp;gt;R: (2, f(2))
    Ht-&amp;gt;&amp;gt;R: (t, f(t))
    Note over R: t points pin one curve, Lagrange at x equals 0 gives f(0) which is s
&lt;p&gt;The scheme is short enough to run in your head, and short enough to run in a browser. Here it is over a small prime field, drawing its coefficients from a cryptographically secure generator -- the one rule that, broken, has caused more real-world Shamir failures than everything else combined.&lt;/p&gt;
&lt;p&gt;{`
// Pedagogical Shamir over GF(p). NOT production: real code uses a large prime
// and constant-time field arithmetic. Here p is tiny so the numbers stay readable.
const p = 2087;
const mod = (a) =&amp;gt; ((a % p) + p) % p;
const modpow = (b, e) =&amp;gt; { let r = 1; b = mod(b); while (e &amp;gt; 0) { if (e &amp;amp; 1) r = mod(r * b); b = mod(b * b); e &amp;gt;&amp;gt;= 1; } return r; };
const inv = (a) =&amp;gt; modpow(a, p - 2); // Fermat inverse, valid because p is prime
const rand = () =&amp;gt; { const x = new Uint32Array(1); crypto.getRandomValues(x); return mod(x[0]); };&lt;/p&gt;
&lt;p&gt;function split(secret, t, n) {
  const coeffs = [mod(secret)];          // a_0 is the secret
  for (let j = 1; j &amp;lt; t; j++) coeffs.push(rand()); // a_1 through a_(t-1) from a CSPRNG
  const f = (x) =&amp;gt; coeffs.reduce((acc, c, j) =&amp;gt; mod(acc + c * modpow(x, j)), 0);
  const shares = [];
  for (let i = 1; i &amp;lt;= n; i++) shares.push([i, f(i)]); // hand out (i, f(i)), never (0, s)
  return shares;
}&lt;/p&gt;
&lt;p&gt;function reconstruct(shares) {           // Lagrange interpolation evaluated at x = 0
  let s = 0;
  for (let i = 0; i &amp;lt; shares.length; i++) {
    let num = 1, den = 1;
    for (let k = 0; k &amp;lt; shares.length; k++) {
      if (k === i) continue;
      num = mod(num * (0 - shares[k][0]));
      den = mod(den * (shares[i][0] - shares[k][0]));
    }
    s = mod(s + shares[i][1] * mod(num * inv(den)));
  }
  return s;
}&lt;/p&gt;
&lt;p&gt;const shares = split(1234, 3, 5);        // 3-of-5 sharing of the secret 1234
console.log(&apos;any 3 shares  -&amp;gt;&apos;, reconstruct(shares.slice(0, 3)));
console.log(&apos;a different 3 -&amp;gt;&apos;, reconstruct([shares[1], shares[3], shares[4]]));
console.log(&apos;only 2 shares -&amp;gt;&apos;, reconstruct(shares.slice(0, 2)), &apos;(a line through 2 points, not the curve)&apos;);
`}&lt;/p&gt;
&lt;p&gt;That two-line scheme is not a museum piece. It is the seal on HashiCorp Vault, whose default configuration splits the unseal key into five shares and requires three to bring the server back [@vault-init, @vault-seal]. It is the SLIP-39 backup behind Trezor hardware wallets, engineered to survive a house fire, its recovery secret split into mnemonic word-lists kept in separate places [@slip39]. And it underlies the key-generation step of RFC 9591, the June 2024 standard for FROST threshold signatures, in which an Ed25519 or Bitcoin signing key is Shamir-shared and no single machine ever holds it whole [@rfc9591].&lt;/p&gt;
&lt;p&gt;So as you read, keep three diagnostic questions in hand, because the whole field is the story of answering them: (1) Did the dealer who drew the curve cheat? (2) Is the secret ever reassembled in one place? (3) Will the shares outlive an adversary who keeps coming back? Hold one invariant alongside them, and let it be the promise this article keeps: the point never breaks -- watch the machinery. The title rhymes with Part 18, &quot;Nobody Broke the Discrete Log,&quot; on purpose.&lt;/p&gt;
&lt;p&gt;If the math is this final, why is this Part 22 of a field guide and not a footnote? Because the moment anyone wanted the primitive to do &lt;em&gt;more&lt;/em&gt; -- catch a lying dealer, run with no dealer, stay alive for years, sign without ever reassembling the key -- they bolted machinery around the point. That machinery is where every real-world disaster you have heard of actually happened. To see how, we start where it started: two people, in the same year.&lt;/p&gt;
&lt;h2&gt;2. Two People, One Year, Two Ways to Hide a Point&lt;/h2&gt;
&lt;p&gt;In 1979 two researchers, working apart, answered the same question in the same year. Which one you have heard of tells you which idea won, and why.&lt;/p&gt;
&lt;p&gt;Adi Shamir published &quot;How to Share a Secret&quot; in the November 1979 &lt;em&gt;Communications of the ACM&lt;/em&gt;, on barely a page, motivated by exactly the executives-and-a-safe framing from the last section [@shamir1979]. Two properties made his the construction people built on. It is &lt;em&gt;ideal&lt;/em&gt;: each share is one field element, exactly the size of the secret and no larger. And it is &lt;em&gt;extensible&lt;/em&gt;: because a share is just the curve at a new index, you can mint fresh shares for new holders at any time without disturbing anyone&apos;s existing share, and pick any threshold &lt;code&gt;t&lt;/code&gt; up to &lt;code&gt;n&lt;/code&gt; at deal time.&lt;/p&gt;
&lt;p&gt;Those are not aesthetic niceties. They are why the scheme survived into production systems that add and retire shareholders for decades.&lt;/p&gt;

A scheme in which each share is exactly the size of the secret, meeting the information-theoretic lower bound on share size. Shamir&apos;s scheme is ideal; Blakley&apos;s geometric scheme is not, because its shares are larger than the secret.
&lt;p&gt;The same year, George Blakley published &quot;Safeguarding Cryptographic Keys&quot; at the AFIPS National Computer Conference with a completely different mental picture [@blakley1979]. Blakley&apos;s secret is a point in &lt;code&gt;t&lt;/code&gt;-dimensional space, and each share is one hyperplane passing through it. Any &lt;code&gt;t&lt;/code&gt; of the hyperplanes intersect in exactly that point, while &lt;code&gt;t-1&lt;/code&gt; of them intersect in a whole line of candidates that pins nothing down [@beimel-survey].Blakley&apos;s shares are each an entire hyperplane -- larger than the secret, a storage rate of &lt;code&gt;1/t&lt;/code&gt; rather than Shamir&apos;s &lt;code&gt;1&lt;/code&gt;. That non-ideal size, not any weakness in security, is the main reason polynomial sharing rather than geometry became the default [@beimel-survey]. The geometry is correct and it is elegant, but in cryptography, size is destiny, and the ideal scheme is the one that spread.&lt;/p&gt;

Two researchers, whole subfields apart, answered the same question in the same year -- Shamir with algebra, Blakley with geometry. Simultaneous invention usually means an idea was ripe. And notice the rhyme with the rest of this series: just as Part 18 could say nobody broke the discrete log, this guide can say nobody broke Shamir. The founding constructions were sound from the start. What broke, later, was everything built around them.
&lt;p&gt;Two years later, Robert McEliece and Dilip Sarwate added the observation that quietly armed the field for the next four decades: Shamir&apos;s shares are exactly the codewords of a Reed-Solomon code [@mceliece-sarwate1981]. That single sentence connected secret sharing to coding theory.The coding-theory bridge is not a curiosity. A Reed-Solomon decoder corrects up to &lt;code&gt;floor((n-t)/2)&lt;/code&gt; wrong shares, so &lt;em&gt;reconstructing correctly&lt;/em&gt; against &lt;code&gt;t&lt;/code&gt; active cheaters needs &lt;code&gt;n &amp;gt;= 3t+1&lt;/code&gt; -- a fact Section 9 leans on. The weaker &lt;code&gt;n &amp;gt;= 2t+1&lt;/code&gt; only buys an honest majority: enough to &lt;em&gt;detect&lt;/em&gt; tampering, not to decode through it. With it came error-correcting decoders that can rebuild the right secret even when some of the shares handed in are corrupted -- exactly the machinery a later section needs when we meet cheaters at reconstruction time.&lt;/p&gt;

gantt
    title Secret sharing and threshold cryptography, 1979 to 2026
    dateFormat YYYY
    axisFormat %Y
    section Primitive
    Shamir and Blakley schemes        :a1, 1979, 3y
    Reed-Solomon view                 :a2, 1981, 3y
    section Verifiability, longevity, dealerlessness
    VSS coined by CGMA                 :b1, 1985, 2y
    Feldman non-interactive VSS        :b2, 1987, 2y
    Pedersen VSS and first DKG         :b3, 1991, 2y
    Proactive secret sharing (HJKY)    :b4, 1995, 3y
    Resilient unbiased DKG (GJKR)     :b5, 1999, 3y
    section Threshold signatures and breaks
    Threshold ECDSA race              :c1, 2017, 3y
    FROST and GG20                     :c2, 2020, 3y
    TSSHOCK and BitForge break         :crit, c3, 2023, 1y
    FROST standardized as RFC 9591     :c4, 2024, 1y
    THORChain incident                 :crit, c5, 2026, 1y
&lt;p&gt;By the early 1980s the primitive was settled. Charles Asmuth and John Bloom added a third independent route in 1983, using the Chinese Remainder Theorem -- shares as residues modulo a chain of coprime numbers -- proving once more that thresholds were a natural idea with several natural constructions, not one lucky trick [@asmuth-bloom1983]. Together, Shamir, Blakley, and Asmuth-Bloom had defined the problem and answered it: distribute trust with a hard threshold, and prove that &lt;code&gt;t-1&lt;/code&gt; shares reveal nothing.&lt;/p&gt;
&lt;p&gt;The primitive settled fast and settled hard. But a proof about polynomials quietly assumes the person drawing the polynomial is honest and competent, and that everyone who later shows up to reconstruct is honest too. Neither assumption survives contact with an adversary. The first cracks were never in the math. They were in what the math took for granted.&lt;/p&gt;
&lt;h2&gt;3. What Plain Sharing Could Not Yet Do&lt;/h2&gt;
&lt;p&gt;Plain Shamir silently trusts two parties it should not, and it pays a price the math forces on it. Three gaps, and none of them is a crack in the secrecy proof.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The dealer.&lt;/strong&gt; The whole scheme rests on the dealer drawing &lt;em&gt;one&lt;/em&gt; real polynomial and handing out consistent points on it. Nothing stops a malicious dealer from doing otherwise. A dealer who hands holders points that do not all lie on a single degree-&lt;code&gt;t-1&lt;/code&gt; curve can arrange for one quorum to reconstruct one secret and a different quorum to reconstruct a different secret -- and plain Shamir gives the holders no way to notice. Worse, a &lt;em&gt;rushing&lt;/em&gt; dealer can wait to see challenges or other messages before committing to what it sends, tailoring its cheating to whatever it has already learned.&lt;/p&gt;

An adversary who waits to see the honest parties&apos; messages in a communication round before choosing its own -- for example, to hand out shares inconsistent with what it already sent, or to skew a later protocol in its favor.
&lt;p&gt;This exact gap is what Benny Chor, Shafi Goldwasser, Silvio Micali, and Baruch Awerbuch named in 1985 when they coined &lt;em&gt;verifiable secret sharing&lt;/em&gt; -- machinery to catch a cheating dealer -- which the next section builds out in full [@cgma1985].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The reconstructor.&lt;/strong&gt; Suppose the dealer was honest. At reconstruction the holders pool their shares -- and a single dishonest holder can poison the well. Martin Tompa and Heather Woll showed in 1988 that a participant who submits one &lt;em&gt;wrong&lt;/em&gt; share makes everyone else reconstruct a wrong secret, while the cheater, who alone knows the true share, privately computes the real one [@tompa-woll1988]. The honest majority walks away confidently holding garbage; the cheater walks away with the key.&lt;/p&gt;
&lt;p&gt;This is where the coding-theory bridge earns its keep: treating shares as Reed-Solomon codewords lets an authenticated, error-correcting reconstruction detect and route around wrong shares instead of trusting them blindly [@mceliece-sarwate1981].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The size wall.&lt;/strong&gt; The third gap is not about honesty at all -- it is a law of information. In &lt;em&gt;any&lt;/em&gt; perfect secret-sharing scheme, every share must be at least as large as the secret itself. Ehud Karnin, Jonathan Greene, and Martin Hellman proved this lower bound in 1983, and Shamir&apos;s scheme meets it exactly, which is what &quot;ideal&quot; means [@karnin-greene-hellman1983]. So you cannot perfectly share a one-gigabyte file into shares smaller than a gigabyte each.This is the first appearance of a trade the math forces everywhere in this field: you can have perfect secrecy or short shares, but not both. Section 9 states the lower bound precisely; the escape hatch below buys small shares only by trading unconditional secrecy for computational secrecy.&lt;/p&gt;
&lt;p&gt;Hugo Krawczyk&apos;s 1993 &quot;Secret Sharing Made Short&quot; escapes the wall by giving up the unconditional guarantee: encrypt the secret under a fresh random key, Shamir-share only the short key, and disperse the ciphertext with Rabin&apos;s Information Dispersal Algorithm so each holder stores roughly a &lt;code&gt;1/t&lt;/code&gt; slice [@krawczyk1993, @rabin1989]. The result is small shares -- at the price of dropping from information-theoretic to computational security, exactly the distinction Part 1 drew.&lt;/p&gt;
&lt;p&gt;You can watch the perfect-secrecy claim hold in a few lines. Fix everything an attacker below threshold could have -- here, a single share of a 2-of-&lt;code&gt;n&lt;/code&gt; scheme -- and count how many candidate secrets remain possible.&lt;/p&gt;
&lt;p&gt;{`
const p = 13; // a tiny prime field, small enough to enumerate every candidate
const mod = (a) =&amp;gt; ((a % p) + p) % p;
const inv = (a) =&amp;gt; { for (let k = 1; k &amp;lt; p; k++) if (mod(a * k) === 1) return k; };&lt;/p&gt;
&lt;p&gt;// A 2-of-n scheme: the curve is a line f(x) = s + a1 * x. We hold ONE share (x1, y1).
const x1 = 1, y1 = 7;&lt;/p&gt;
&lt;p&gt;// For every candidate secret s, is there a degree-1 curve through (0, s) and (x1, y1)?
let consistent = 0;
for (let s = 0; s &amp;lt; p; s++) {
  const a1 = mod((y1 - s) * inv(x1)); // the unique slope making f(0)=s and f(x1)=y1
  const f = (x) =&amp;gt; mod(s + a1 * x);
  if (f(0) === s &amp;amp;&amp;amp; f(x1) === y1) consistent++;
}
console.log(&apos;candidate secrets in the field:&apos;, p);
console.log(&apos;candidates still consistent with our 1 share:&apos;, consistent);
console.log(&apos;information gained about the secret:&apos;, consistent === p ? &apos;none -- every secret remains possible&apos; : &apos;some&apos;);
`}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; None of these is a flaw in Shamir&apos;s secrecy. Each is a &lt;em&gt;missing property&lt;/em&gt; the 1979 scheme was never built to provide: catching a dishonest dealer, surviving a dishonest reconstructor, and shrinking shares below the perfect-scheme wall. The rest of this article is the story of adding those properties -- and two more, longevity and dealerlessness -- one layer at a time, on top of a point that never moves.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Three gaps, and each names a defense. The first two decades after 1979 are the story of building those defenses -- and of a hard truth waiting inside them: you cannot have perfect secrecy and short shares, and, as the next section shows, you cannot have perfect hiding and perfect binding either. The point never moves. The machinery around it is a sequence of honest trade-offs.&lt;/p&gt;
&lt;h2&gt;4. Layering Verifiability, Longevity, and Dealerlessness onto a Curve That Never Moves&lt;/h2&gt;
&lt;p&gt;For the next twenty years the picture never changes -- it only gains armor. This is the place to state the rule that governs the whole field, because it is the one experts see violated most often. Progress here runs along two different axes, and conflating them is the classic mistake. On the &lt;em&gt;property&lt;/em&gt; axis, nothing ever supersedes Shamir: each generation bolts a new capability onto the same unmoved point, and plain &lt;code&gt;(t,n)&lt;/code&gt; sharing stays the ideal, unbroken base underneath every one of them.&lt;/p&gt;
&lt;p&gt;Genuine &quot;X replaced Y&quot; supersession happens only one layer up, among the &lt;em&gt;protocols&lt;/em&gt; that deliver those capabilities -- and each time it does, this article says so out loud. Keep the two axes apart and the history reads cleanly. Blur them and you will say something false, like &quot;Shamir was replaced,&quot; which never happened.&lt;/p&gt;

flowchart BT
    P[&quot;Shamir point: f(0) = s, perfect secrecy, never superseded&quot;]
    V[&quot;Verifiable secret sharing: prove the dealer drew one real curve&quot;]
    R[&quot;Proactive refresh: redraw the shares without moving the point&quot;]
    K[&quot;Distributed key generation: draw the curve with no single dealer&quot;]
    S[&quot;Threshold signatures: use the point without ever assembling it&quot;]
    P --&amp;gt; V --&amp;gt; R --&amp;gt; K --&amp;gt; S
&lt;h3&gt;Verifiability: did the dealer cheat?&lt;/h3&gt;

Machinery that lets shareholders confirm their shares all lie on one degree-`t-1` polynomial the dealer publicly committed to -- catching a cheating dealer -- without anyone learning the secret.
&lt;p&gt;Chor, Goldwasser, Micali, and Awerbuch defined VSS in 1985, realized with an interactive protocol among dealer and holders [@cgma1985]. Two years later Paul Feldman made it non-interactive and, therefore, deployable [@feldman1987]. The idea is clean. The dealer publishes a commitment to each coefficient of the secret polynomial, $C_j = g^{a_j}$, in a group where &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;discrete logs&lt;/a&gt; are hard. Any holder checks its share against the commitments with one equation:&lt;/p&gt;
&lt;p&gt;$$g^{f(i)} = \prod_{j=0}^{t-1} C_j^{(i^j)}.$$&lt;/p&gt;
&lt;p&gt;If the check passes, share &lt;code&gt;i&lt;/code&gt; provably lies on the one polynomial the dealer committed to; a dealer who hands out inconsistent shares is caught in public, by anyone, in one round. Part 21 of this series develops this as commitments and sigma protocols; we reuse it here rather than rebuild it, and its security rests on the discrete-log hardness of Part 18.&lt;/p&gt;
&lt;p&gt;There is a tax, and it is the single most important caveat in this article. The zeroth commitment is $C_0 = g^{a_0} = g^s$. That value leaks. To a normal, computationally bounded observer, &lt;code&gt;g^s&lt;/code&gt; hides &lt;code&gt;s&lt;/code&gt; behind a discrete log. But to an &lt;em&gt;unbounded&lt;/em&gt; adversary -- the one that &quot;information-theoretic&quot; secrecy is defined against -- &lt;code&gt;g^s&lt;/code&gt; reveals &lt;code&gt;s&lt;/code&gt; outright, because that adversary can simply take the logarithm. So Feldman VSS&apos;s hiding is only &lt;em&gt;computational&lt;/em&gt;. The moment you commit with &lt;code&gt;g^s&lt;/code&gt;, you have left the information-theoretic world.&lt;/p&gt;
&lt;p&gt;Torben Pedersen fixed the hiding in 1991 by committing with two independent generators, $C_j = g^{a_j} h^{b_j}$, blinding each coefficient with a second random polynomial [@pedersen1991-vss]. Now the commitment is perfectly hiding: the blinding term makes every candidate value equally consistent, so even an unbounded adversary learns nothing. The price is that binding drops to computational -- someone who knew the discrete log of &lt;code&gt;h&lt;/code&gt; to the base &lt;code&gt;g&lt;/code&gt; could open a commitment two ways. That is the seesaw, and it is not an accident of engineering.&lt;/p&gt;

A commitment must hide a value and bind the committer to it. Feldman&apos;s single-generator commitment `g^{a_j}` is perfectly *binding* -- there is exactly one exponent it opens to -- but only computationally *hiding*, because an unbounded adversary can take a discrete log and read `s` straight off `g^s`. Pedersen&apos;s two-generator commitment `g^{a_j} h^{b_j}` is perfectly *hiding* -- the blinding term leaves every value possible -- but only computationally *binding*. You can move the perfection from one side to the other; a theorem says you cannot have it on both. This is a fact about commitments, not a gap in anyone&apos;s code. Part 21 builds the Pedersen commitment and its Schnorr and Fiat-Shamir relatives in full.
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &quot;Information-theoretic&quot; and &quot;perfect&quot; describe &lt;em&gt;plain Shamir only&lt;/em&gt;. Feldman VSS is computationally hiding; Pedersen VSS is information-theoretically hiding but only computationally binding; any distributed-key-generation deployment inherits a computational assumption from its commitments. Calling such a system &quot;information-theoretically secure&quot; is not a rounding error -- it misstates the adversary it can survive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The choice between them is a genuine trade, not a ranking:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Feldman VSS (1987)&lt;/th&gt;
&lt;th&gt;Pedersen VSS (1991)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Commitment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g^{a_j}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g^{a_j} h^{b_j}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hiding&lt;/td&gt;
&lt;td&gt;Computational (leaks &lt;code&gt;g^s&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Perfect / information-theoretic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binding&lt;/td&gt;
&lt;td&gt;Perfect&lt;/td&gt;
&lt;td&gt;Computational (under discrete log)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra cost&lt;/td&gt;
&lt;td&gt;one generator&lt;/td&gt;
&lt;td&gt;second generator, second polynomial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use when&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g^s&lt;/code&gt; becomes a public key anyway&lt;/td&gt;
&lt;td&gt;the committed value must stay hidden&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Longevity: will the shares outlive a mobile adversary?&lt;/h3&gt;

Refreshing every share each epoch -- by re-sharing zero and adding it in -- so the secret is unchanged but every old share becomes useless, defeating an adversary that collects shares slowly over time.
&lt;p&gt;A static &lt;code&gt;(t,n)&lt;/code&gt; split has a slow-motion weakness. An attacker who steals share 1 in January, share 2 in March, and one more each month eventually holds &lt;code&gt;t&lt;/code&gt; of them, and the split is broken -- not by any cryptographic advance, just by patience.This slow collector is called a &lt;em&gt;mobile adversary&lt;/em&gt;: it compromises different machines at different times, never all at once, and accumulates shares across months or years. Proactive refresh is the answer designed specifically for it. Amir Herzberg, Stanislaw Jarecki, Hugo Krawczyk, and Moti Yung closed this in 1995 [@hjky1995].&lt;/p&gt;
&lt;p&gt;Each epoch, every party deals a fresh &lt;em&gt;zero-sharing&lt;/em&gt; -- a random degree-&lt;code&gt;t-1&lt;/code&gt; polynomial whose constant term is &lt;code&gt;0&lt;/code&gt; -- and everyone adds the new sub-shares into their existing shares. Because every added curve passes through &lt;code&gt;(0, 0)&lt;/code&gt;, the sum still interpolates to the same &lt;code&gt;f(0) = s&lt;/code&gt;; but the new share values are statistically independent of the old ones, so a share stolen last epoch is now noise. The attacker must gather &lt;code&gt;t&lt;/code&gt; shares &lt;em&gt;within a single epoch&lt;/em&gt;, and perpetual slow leakage no longer adds up.&lt;/p&gt;

sequenceDiagram
    participant P1 as Party 1
    participant P2 as Party 2
    participant P3 as Party 3
    Note over P1,P3: Epoch boundary. The secret s must stay fixed
    P1-&amp;gt;&amp;gt;P1: Draw zero-curve d1 with d1(0) equal to 0
    P2-&amp;gt;&amp;gt;P2: Draw zero-curve d2 with d2(0) equal to 0
    P3-&amp;gt;&amp;gt;P3: Draw zero-curve d3 with d3(0) equal to 0
    P1-&amp;gt;&amp;gt;P2: Sub-share d1 of 2
    P2-&amp;gt;&amp;gt;P1: Sub-share d2 of 1
    P3-&amp;gt;&amp;gt;P1: Sub-share d3 of 1
    Note over P1,P3: Each party adds the sub-shares onto its old share
    Note over P1,P3: New shares interpolate to the same s, last epoch&apos;s shares are now noise
&lt;h3&gt;Dealerlessness: must there be a dealer at all?&lt;/h3&gt;

A protocol that produces a shared key with no trusted dealer: each party verifiably shares a random contribution, and the group key is the sum -- a value no single party ever learns.
&lt;p&gt;VSS catches a lying dealer, but a dealer still exists and still knows the secret. Pedersen&apos;s second 1991 paper removed the dealer entirely: each party acts as a sub-dealer, VSS-sharing a random contribution &lt;code&gt;z_i&lt;/code&gt;, and the group secret is the sum &lt;code&gt;s = z_1 + ... + z_n&lt;/code&gt;, with the public key the product of the individual public values [@pedersen1991-dkg]. No one ever knows &lt;code&gt;s&lt;/code&gt;; the key is born distributed.&lt;/p&gt;
&lt;p&gt;The obvious version of this is subtly broken, and the break is instructive. In 1999 Gennaro, Jarecki, Krawczyk, and Rabin proved that the naive Pedersen-DKG is &lt;em&gt;biasable&lt;/em&gt; [@gjkr1999]. A rushing adversary waits until it has seen the honest parties&apos; committed contributions, then selectively completes or aborts its own contribution depending on which choice nudges the resulting public key the way it wants.&lt;/p&gt;
&lt;p&gt;The output key is no longer uniformly random, which is exploitable anywhere the key&apos;s distribution matters. Their fix adds a commit-then-reveal phase that pins every party&apos;s contribution &lt;em&gt;before&lt;/em&gt; any public-key information is revealed, restoring a provably unbiased, resilient key.&lt;/p&gt;

The &quot;obvious&quot; dealerless key generation is subtly broken: a rushing adversary, after watching the honest parties commit, can complete or abort its own contribution to bias the public key away from uniform. &quot;Use GJKR, not naive Pedersen-DKG&quot; has been a standing deployment rule ever since.
&lt;p&gt;Notice what these three generations did and did not do. On the property axis, each &lt;em&gt;added&lt;/em&gt; a layer -- verifiability, longevity, dealerlessness -- to the same point Shamir drew in 1979; none replaced it. On the protocol axis, there were two real supersessions, and they are worth naming precisely: interactive VSS gave way to Feldman&apos;s non-interactive VSS, and naive Pedersen-DKG gave way to GJKR [@feldman1987, @gjkr1999]. Blakley&apos;s geometry and Asmuth-Bloom&apos;s modular scheme are neither -- they are contemporaneous &lt;em&gt;alternatives&lt;/em&gt; to Shamir, not ancestors or descendants of any of this [@blakley1979, @asmuth-bloom1983].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Key idea&lt;/th&gt;
&lt;th&gt;Property added&lt;/th&gt;
&lt;th&gt;What it still leaves open&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Plain Shamir (1979)&lt;/td&gt;
&lt;td&gt;random curve, &lt;code&gt;f(0) = s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;hard threshold, perfect secrecy&lt;/td&gt;
&lt;td&gt;dishonest dealer, longevity, the dealer&apos;s existence, use-without-reassembly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VSS (1985-1991)&lt;/td&gt;
&lt;td&gt;commit to the curve&lt;/td&gt;
&lt;td&gt;catch a cheating dealer&lt;/td&gt;
&lt;td&gt;dealer still exists and knows &lt;code&gt;s&lt;/code&gt;; shares still static&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proactive SS (1995)&lt;/td&gt;
&lt;td&gt;re-share zero each epoch&lt;/td&gt;
&lt;td&gt;survive a mobile adversary&lt;/td&gt;
&lt;td&gt;still needs a dealer at setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKG (1991-1999)&lt;/td&gt;
&lt;td&gt;every party sub-deals; key is the sum&lt;/td&gt;
&lt;td&gt;no trusted dealer&lt;/td&gt;
&lt;td&gt;the key is still only stored, never used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threshold signatures&lt;/td&gt;
&lt;td&gt;Lagrange-to-additive at signing&lt;/td&gt;
&lt;td&gt;use the key without assembling it&lt;/td&gt;
&lt;td&gt;the deployment layer -- Section 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;We can now catch a lying dealer, run with no dealer at all, and keep a key alive for years. But everything so far is still &lt;em&gt;storage&lt;/em&gt;. To actually use a shared key you have had to put it back together in one place -- and that reassembly is the single most dangerous moment in the whole system. The breakthrough is the trick that deletes that moment.&lt;/p&gt;
&lt;h2&gt;5. Threshold Signatures: Using the Point Without Ever Assembling It&lt;/h2&gt;
&lt;p&gt;The eureka here was not a moment; it was a mechanism, and it arrived late. For two decades secret sharing was a storage-and-recovery trick: split the key, keep it safe, put it back together when you need it. Then someone noticed you can &lt;em&gt;use&lt;/em&gt; the key without ever reconstructing it.&lt;/p&gt;
&lt;p&gt;The conceptual leap belongs to Yvo Desmedt, whose 1987 &quot;society and group oriented cryptography&quot; proposed distributing a cryptographic &lt;em&gt;capability&lt;/em&gt; across a group rather than merely storing a shared secret, and to Desmedt and Frankel&apos;s 1989 &quot;Threshold Cryptosystems,&quot; which split a private key so a quorum can sign or decrypt without ever assembling it [@desmedt1987, @desmedt-frankel1989]. For years it stayed largely theoretical. What made it practical is a small, exact piece of algebra worth slowing down for.&lt;/p&gt;
&lt;p&gt;Recall how reconstruction works: the secret is a Lagrange combination of the shares, $s = \sum_{i \in S} \lambda_i, f(i)$, where the coefficient $\lambda_i = \prod_{j \in S,, j \neq i} \frac{j}{j - i}$ depends only on &lt;em&gt;which&lt;/em&gt; signers showed up, the active set &lt;code&gt;S&lt;/code&gt;. The naive reader sums those products and gets &lt;code&gt;s&lt;/code&gt;. The threshold-signature reader does not.&lt;/p&gt;
&lt;p&gt;Instead, each active signer keeps its own term private -- $w_i = \lambda_i, f(i)$ -- and treats &lt;code&gt;w_i&lt;/code&gt; as its personal, additive piece of the key inside the signing computation. The pieces still satisfy $\sum_{i \in S} w_i = s$, so the group signs &lt;em&gt;as if&lt;/em&gt; it held the key, yet &lt;code&gt;s&lt;/code&gt; is never formed anywhere. The reassembly step, the one dangerous moment, simply never happens.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; At signing time each active signer multiplies its &lt;code&gt;(t,n)&lt;/code&gt; Shamir share by a Lagrange coefficient to obtain an &lt;em&gt;additive&lt;/em&gt; share of the key. The additive shares sum to the key -- so a quorum can sign as though it held the key, while the key is never assembled on any machine. There is no reconstruction moment to attack.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;{`
const p = 2087;
const mod = (a) =&amp;gt; ((a % p) + p) % p;
const modpow = (b, e) =&amp;gt; { let r = 1; b = mod(b); while (e &amp;gt; 0) { if (e &amp;amp; 1) r = mod(r * b); b = mod(b * b); e &amp;gt;&amp;gt;= 1; } return r; };
const inv = (a) =&amp;gt; modpow(a, p - 2);
const rand = () =&amp;gt; { const x = new Uint32Array(1); crypto.getRandomValues(x); return mod(x[0]); };&lt;/p&gt;
&lt;p&gt;// Deal a 3-of-5 sharing of a signing key.
const secret = 1234, t = 3;
const coeffs = [secret]; for (let j = 1; j &amp;lt; t; j++) coeffs.push(rand());
const f = (x) =&amp;gt; coeffs.reduce((acc, c, j) =&amp;gt; mod(acc + c * modpow(x, j)), 0);
const shares = [1, 2, 3, 4, 5].map((i) =&amp;gt; [i, f(i)]);&lt;/p&gt;
&lt;p&gt;// A quorum of exactly 3 signers shows up; their indices form the active set S.
const S = [shares[0], shares[2], shares[4]].map((sh) =&amp;gt; sh[0]); // indices 1, 3, 5
const held = Object.fromEntries(shares.map((sh) =&amp;gt; [sh[0], sh[1]]));&lt;/p&gt;
&lt;p&gt;function lambda(i, S) {            // Lagrange coefficient for index i over S, evaluated at 0
  let num = 1, den = 1;
  for (const j of S) if (j !== i) { num = mod(num * (0 - j)); den = mod(den * (i - j)); }
  return mod(num * inv(den));
}&lt;/p&gt;
&lt;p&gt;// Each signer privately turns its Shamir share into an additive share w_i = lambda_i * f(i).
const additive = S.map((i) =&amp;gt; mod(lambda(i, S) * held[i]));
const sum = additive.reduce((a, b) =&amp;gt; mod(a + b), 0);
console.log(&apos;active signer set S    =&apos;, S);
console.log(&apos;private additive shares =&apos;, additive);
console.log(&apos;their sum               =&apos;, sum, &apos;(the key -- yet f was never reassembled)&apos;);
`}&lt;/p&gt;

A signature produced by a quorum of `t` share-holders that verifies as an ordinary single-signer signature, while the signing key is never reconstructed.
&lt;p&gt;The clean, standardized instance of this is &lt;strong&gt;FROST&lt;/strong&gt; -- Flexible Round-Optimized Schnorr Threshold signatures -- introduced by Chelsea Komlo and Ian Goldberg in 2020 and standardized as RFC 9591 by the IRTF in June 2024 [@frost2020, @rfc9591]. FROST signs in two rounds: each signer first publishes a one-time nonce commitment, then, after seeing the commitments and the message, emits a signature share that a coordinator aggregates [@rfc9591]. The first round is message-independent and can be precomputed, giving a one-round online phase.&lt;/p&gt;
&lt;p&gt;The output is an &lt;em&gt;ordinary&lt;/em&gt; &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;Schnorr signature&lt;/a&gt; -- the same object Part 17 covered for a single signer, only now the signer is split -- verifiable by anyone with the standard verifier, on any of five standardized ciphersuites (Ed25519, ristretto255, Ed448, P-256, and secp256k1) [@rfc9591]. Its per-signer cost is a handful of group exponentiations, with no heavy public-key machinery, and it leans on exactly the Schnorr and Fiat-Shamir constructions Part 21 develops.&lt;/p&gt;

sequenceDiagram
    participant C as Coordinator
    participant S1 as Signer 1
    participant S2 as Signer 2
    participant St as Signer t
    Note over S1,St: Setup by DKG. Each signer holds a Shamir share of the key
    S1-&amp;gt;&amp;gt;C: Round 1, nonce commitment
    S2-&amp;gt;&amp;gt;C: Round 1, nonce commitment
    St-&amp;gt;&amp;gt;C: Round 1, nonce commitment
    C-&amp;gt;&amp;gt;S1: Commitments and message to sign
    C-&amp;gt;&amp;gt;S2: Commitments and message to sign
    C-&amp;gt;&amp;gt;St: Commitments and message to sign
    S1-&amp;gt;&amp;gt;C: Round 2, signature share
    S2-&amp;gt;&amp;gt;C: Round 2, signature share
    St-&amp;gt;&amp;gt;C: Round 2, signature share
    Note over C: Aggregate the shares into one ordinary Schnorr signature
&lt;p&gt;The most telling detail is where FROST gets its keys. Its own key generation is Shamir secret sharing plus verifiable secret sharing -- the primitive of Section 1 and the VSS of Section 4, sitting explicitly at the core of the first standardized threshold signature.&lt;/p&gt;

In RFC 9591&apos;s own construction, the group signing key `s` is Shamir secret-shared among the participants: each signer&apos;s key `sk_i` is `f(i)` on a secret polynomial of degree one below the threshold, with `s = f(0)`. The first standardized threshold signature puts secret sharing explicitly at its foundation [@rfc9591].
&lt;p&gt;Schnorr is the easy case because it is linear. ECDSA is the hard cousin, and it matters because Bitcoin&apos;s legacy addresses, Ethereum, and most custody APIs demand an ECDSA signature. ECDSA computes $s = k^{-1}\left(H(m) + r,x\right)$, which multiplies two secret-shared quantities -- the nonce inverse &lt;code&gt;k^{-1}&lt;/code&gt; and the key &lt;code&gt;x&lt;/code&gt; -- and then inverts one of them. Multiplication does not distribute over Shamir shares the way addition does, so threshold ECDSA must wrap the shares in heavier multiparty computation, using either Paillier homomorphic encryption or oblivious transfer.Paillier is an additively homomorphic encryption scheme: you can add two encrypted numbers without decrypting either, which is how GG18 and GG20 multiply secret-shared values.&lt;/p&gt;
&lt;p&gt;Its deployed lineage is the clearest example of genuine protocol supersession in this whole story: Lindell&apos;s 2017 two-party scheme, then GG18 for full multiparty signing with a trustless setup -- alongside Lindell and Nof&apos;s contemporaneous multiparty ECDSA with a practical distributed key generation aimed squarely at cryptocurrency custody -- then GG20 adding identifiable abort and a one-round online phase, then DKLs23 replacing Paillier with oblivious transfer entirely [@lindell2017, @gg18, @lindell-nof2018, @gg20, @dkls23]. This lineage is what makes MPC-wallet custody work on legacy chains -- and, as the next section shows, it is where the money actually leaked.&lt;/p&gt;

Two kinds of product both call themselves &quot;split-key wallets,&quot; and they are opposites. A *Shamir-backup* wallet (SLIP-39, Vault) splits the key for storage and reassembles it at exactly one recovery moment -- you defend that moment. An *MPC* or *threshold-signature* wallet (FROST, GG20, DKLs) never reassembles the key at all -- it signs directly on the shares. Same primitive underneath, opposite threat models. Section 8 turns this into a decision rule; for now, just hold the distinction.
&lt;p&gt;Two more instances round out the family and get only a pointer here, by design: Victor Shoup&apos;s practical threshold RSA in 2000 -- the &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;RSA trapdoor&lt;/a&gt; of Part 14, split -- and Alexandra Boldyreva&apos;s threshold BLS in 2003, whose signatures aggregate trivially [@shoup2000, @boldyreva2003]. The common shape across all of them is the spine made operational: a DKG draws the key with no dealer, the shares are never assembled, and Lagrange-at-signing turns them into a usable capability. It is the same &quot;useful service, held by no one&quot; idea behind the &lt;a href=&quot;https://paragmali.com/blog/the-server-helped-and-never-saw-a-field-guide-to-oblivious-p/&quot; rel=&quot;noopener&quot;&gt;distributed oblivious PRFs&lt;/a&gt; of Part 20.&lt;/p&gt;
&lt;p&gt;So the key never exists in one place; there is no reconstruction moment to steal. And yet MPC wallets and threshold-signing libraries have leaked millions of dollars of private keys. If the point never breaks and the key is never assembled, what exactly failed? The answer is the whole point of this article, and it has a name.&lt;/p&gt;
&lt;h2&gt;6. Every Break, Named -- and Not One of Them Was Shamir&lt;/h2&gt;
&lt;p&gt;Here is the promise this section keeps. The information-theoretic core has never broken and provably cannot, so every entry below is a break in the machinery around the point. Read it that way and a pattern jumps out: the attack surface is always the plumbing, never the split.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Plain Shamir&apos;s information-theoretic secrecy has never been broken, and a counting argument says it cannot be: below the threshold, every candidate secret stays equally possible, against any adversary, forever. Every failure cataloged here lives in the machinery layered around that point -- not in the point.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Construction and implementation.&lt;/strong&gt; The most common real-world break has nothing to do with dealers or protocols; it is a &lt;a href=&quot;https://paragmali.com/blog/predictable-or-repeated-the-only-two-ways-cryptographic-rand/&quot; rel=&quot;noopener&quot;&gt;bad random number generator&lt;/a&gt;. If the coefficients of the secret polynomial come from a predictable source -- &lt;code&gt;rand()&lt;/code&gt;, the clock, a process ID -- then the &quot;random curve&quot; is guessable, and an attacker who can reproduce the pen can reconstruct the secret from too few shares. This is the same failure class Part 2 of this series is entirely about, and it is the single most frequent way real Shamir code leaks.&lt;/p&gt;
&lt;p&gt;Right behind it are two side channels: a non-constant-time Lagrange interpolation whose branch and timing behavior leaks share bytes, exactly the discipline Part 15 insists on for &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;curve code&lt;/a&gt;; and missing share authentication, which lets a Tompa-Woll cheater submit one wrong share, corrupt everyone else&apos;s output, and privately keep the true secret [@tompa-woll1988]. Two more belong here: a secret larger than the field, and a polynomial reused across two secrets -- either one breaks secrecy outright, and neither is a flaw in the scheme, only in its operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dealer and verifiability.&lt;/strong&gt; A dealer with no VSS is invisible when it cheats: a rushing or equivocating dealer hands out shares that do not lie on one curve, reconstructing different secrets for different quorums, and plain Shamir offers no way to notice -- which is the entire reason VSS exists. And a subtler failure is a labeling one: shipping a Feldman-VSS&apos;d or DKG&apos;d system while calling it &quot;information-theoretic.&quot; The commitment &lt;code&gt;g^s&lt;/code&gt; leaks the secret to an unbounded adversary, so the guarantee is computational; selling it as unconditional misstates the very adversary the system can survive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protocol integration -- the flagship.&lt;/strong&gt; In 2023, Verichains (as TSSHOCK) and Fireblocks (as BitForge) disclosed CVE-2023-33241: widely used GG18 and GG20 threshold-ECDSA implementations, in the &lt;code&gt;tss-lib&lt;/code&gt; family, had omitted the zero-knowledge proofs that a co-signer&apos;s Paillier modulus is well-formed, along with the associated range proofs [@cve-2023-33241, @verichains-tsshock, @fireblocks-bitforge]. A malicious co-signer who supplied a malformed Paillier modulus could then extract the victim&apos;s key share over the course of the signing protocol; Fireblocks demonstrated recovery of a full private key from an affected wallet over as few as sixteen signatures [@fireblocks-bitforge].&lt;/p&gt;
&lt;p&gt;Sit with what this was and was not. It was a missing check in the Paillier multiplication machinery that threshold ECDSA bolts around the shares. It was not, in any sense, a break of Shamir -- the secret sharing underneath was never the thing attacked.&lt;/p&gt;
&lt;p&gt;The real-world tail arrived in 2026. THORChain reported that a malicious newly-churned node exploited an unpatched GG20 fork to drain roughly $10.7 million from one of its five vaults [@thorchain]. Here the sourcing discipline matters as much as the fact.THORChain&apos;s own Exploit Report #1 confirms the incident facts -- the date, the roughly $10.7 million, the GG20 fork, the churned node -- but explicitly calls the root-cause analysis &quot;still ongoing,&quot; and does not itself name TSSHOCK [@thorchain]. The attribution to an unpatched, TSSHOCK-class missing-Paillier-proof fork is secondary, from QuillAudits and Cointelegraph [@quillaudits-thorchain, @cointelegraph-thorchain]. Treat it as the likely cause, not a settled one. The incident facts are first-party and clear; the specific root cause is secondary-attributed and, by THORChain&apos;s own account, not yet final [@thorchain, @quillaudits-thorchain, @cointelegraph-thorchain]. Both readings obey the invariant either way: whatever the exact bug, Shamir&apos;s secrecy was never the thing that failed.&lt;/p&gt;

flowchart TD
    subgraph Machinery[&quot;Everything layered around the point -- where every break lived&quot;]
      A[&quot;Weak-RNG coefficients&quot;]
      B[&quot;Non-constant-time Lagrange&quot;]
      C[&quot;Unauthenticated shares (Tompa-Woll)&quot;]
      D[&quot;No-VSS rushing dealer&quot;]
      E[&quot;Information-theoretic mislabel&quot;]
      F[&quot;TSSHOCK missing Paillier proofs&quot;]
      G[&quot;THORChain unpatched GG20 fork&quot;]
    end
    P[&quot;The Shamir point: perfect secrecy, never broken&quot;] --&amp;gt; Machinery
&lt;p&gt;The whole catalog fits in one table, and the pattern is the point of it:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Break&lt;/th&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Root cause&lt;/th&gt;
&lt;th&gt;Lesson&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Weak-RNG coefficients&lt;/td&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;polynomial drawn from &lt;code&gt;rand()&lt;/code&gt;, clock, or PID&lt;/td&gt;
&lt;td&gt;draw coefficients from a CSPRNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-constant-time Lagrange&lt;/td&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;timing and branch leaks during interpolation&lt;/td&gt;
&lt;td&gt;interpolate in constant time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthenticated shares&lt;/td&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;a wrong share corrupts output; cheater keeps the secret&lt;/td&gt;
&lt;td&gt;authenticate every share&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oversized or reused secret&lt;/td&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;secret exceeds the field, or a polynomial is reused&lt;/td&gt;
&lt;td&gt;one fresh polynomial per secret; keep it in-field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-VSS rushing dealer&lt;/td&gt;
&lt;td&gt;Dealer&lt;/td&gt;
&lt;td&gt;inconsistent shares, undetectable without commitments&lt;/td&gt;
&lt;td&gt;add VSS when the dealer is not fully trusted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;Information-theoretic&quot; mislabel&lt;/td&gt;
&lt;td&gt;Labeling&lt;/td&gt;
&lt;td&gt;Feldman or DKG deployment sold as unconditional&lt;/td&gt;
&lt;td&gt;reserve the term for plain Shamir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TSSHOCK / BitForge (CVE-2023-33241)&lt;/td&gt;
&lt;td&gt;Protocol integration&lt;/td&gt;
&lt;td&gt;GG18/GG20 omitted Paillier and range proofs&lt;/td&gt;
&lt;td&gt;ship the post-TSSHOCK checks or do not ship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;THORChain 2026&lt;/td&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;unpatched GG20 fork exploited by a churned node&lt;/td&gt;
&lt;td&gt;patch, and prefer Paillier-free protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Before running any GG18 or GG20 threshold-ECDSA library in production, confirm it verifies that each co-signer&apos;s Paillier modulus is well-formed and that the range proofs are present. The TSSHOCK/BitForge key-extraction class is exactly the absence of those checks. If you cannot verify them, prefer a Paillier-free protocol such as DKLs23, or a Schnorr scheme such as FROST.&lt;/p&gt;
&lt;/blockquote&gt;

Nobody broke Shamir. The perfect-secrecy math has held since 1979 and cannot be broken by any computer that will ever exist. Every deployment that fell, fell in the layers it added -- to make the point verifiable, dealerless, long-lived, and signable.
&lt;p&gt;Read the list once more with an eye on the invariant: a predictable pen, a leaky reconstruction, an unproven curve, a swapped share, a missing Paillier proof. Not one of them touched the secrecy of the split. This is the same lesson as Part 18, one layer deeper: nobody broke the primitive; deployments fell in the layers they added. So where does that machinery actually run today, and how do the pieces fit together in production?&lt;/p&gt;
&lt;h2&gt;7. Where the Substrate Actually Runs (2024-2026)&lt;/h2&gt;
&lt;p&gt;A forty-seven-year-old scheme is quietly load-bearing under a growing stack of custody, escrow, and signing systems -- and, exactly as the invariant predicts, all the recent action is in the layers on top.&lt;/p&gt;
&lt;p&gt;The canonical break-glass deployment is HashiCorp Vault, which splits its master unseal key with Shamir and, by default, hands out five shares and requires three to unseal, configured through &lt;code&gt;vault operator init&lt;/code&gt; with &lt;code&gt;-key-shares&lt;/code&gt; and &lt;code&gt;-key-threshold&lt;/code&gt; [@vault-init, @vault-seal].Vault&apos;s default of five shares with a threshold of three is worth memorizing as the canonical break-glass numbers: no single operator can unseal the server, but any three of five can [@vault-init].&lt;/p&gt;
&lt;p&gt;On the consumer side, SLIP-39 -- SatoshiLabs&apos; &quot;Shamir&apos;s Secret-Sharing for Mnemonic Codes,&quot; used by Trezor -- splits a wallet master secret into human-transcribable mnemonic word-lists, using a two-level group scheme over the byte field &lt;code&gt;GF(256)&lt;/code&gt;&lt;code&gt;GF(256)&lt;/code&gt; is the 256-element byte field, so every share value lands on a byte and maps cleanly onto human-transcribable mnemonic words. with authenticated share words so a mistyped share is caught rather than silently reconstructing garbage [@slip39]. Both are &lt;em&gt;reconstruct-once&lt;/em&gt; systems: the key is reassembled at exactly one recovery moment.&lt;/p&gt;
&lt;p&gt;The opposite philosophy runs at scale in production MPC custody. Exchanges and custodians sign with GG20-, DKLs-, and FROST-based threshold protocols in which the private key is &lt;em&gt;never&lt;/em&gt; reconstructed -- the disclosures around the BitForge class came out of exactly this world, and the DKLs family is maintained specifically for it [@fireblocks-bitforge, @dkls]. Alongside them, FROST is moving from standard to shipping code: RFC 9591 landed in June 2024, reference implementations such as the Zcash Foundation&apos;s &lt;code&gt;frost&lt;/code&gt; and &lt;code&gt;frost-ed25519&lt;/code&gt; crates track it [@zcash-frost], and it is the natural fit for Bitcoin Taproot&apos;s secp256k1 Schnorr signatures [@rfc9591].&lt;/p&gt;
&lt;p&gt;Standardization is itself a state-of-the-art signal. NIST&apos;s Multi-Party Threshold Cryptography project and its First Call for Multi-Party Threshold Schemes are the center of gravity for turning this stack into interoperable standards [@nist-mptc, @nist-8214c].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The First Call (NIST IR 8214C) sorts submissions into two families: &lt;strong&gt;Class N&lt;/strong&gt;, for thresholdizing NIST-specified primitives such as ECDSA, EdDSA, and RSA signing and key generation; and &lt;strong&gt;Class S&lt;/strong&gt;, for special threshold-friendly primitives, including gadgets like zero-knowledge proofs and fully-homomorphic encryption. It is the standardization frontier -- including the post-quantum question -- for the entire threshold stack [@nist-mptc, @nist-8214c].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Where does the &quot;leader&quot; sit in all this? At the primitive level, nowhere is contested: plain Shamir is the settled, ideal, information-theoretic substrate, and there is no race to run there. Leadership is contested only one layer up, along the protocol-supersession axis -- FROST for Schnorr, the DKLs line for Paillier-free ECDSA -- exactly where the two-axis rule of Section 4 said it would be.&lt;/p&gt;
&lt;p&gt;Two of those deployment philosophies now sit side by side, and marketing constantly blurs them: the wallet that reassembles the key exactly once, and the wallet that never assembles it at all. They rest on the same primitive and have opposite threat models.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Reconstruct-once backup&lt;/th&gt;
&lt;th&gt;Never-reconstruct MPC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;SLIP-39, HashiCorp Vault&lt;/td&gt;
&lt;td&gt;FROST, GG20, DKLs23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the key ever assembled?&lt;/td&gt;
&lt;td&gt;Yes, at one recovery moment&lt;/td&gt;
&lt;td&gt;No, never&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary threat to defend&lt;/td&gt;
&lt;td&gt;the reconstruction event&lt;/td&gt;
&lt;td&gt;signer devices and protocol integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does it sign transactions?&lt;/td&gt;
&lt;td&gt;No -- it restores a key&lt;/td&gt;
&lt;td&gt;Yes -- it signs directly on the shares&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Danger if the two are conflated&lt;/td&gt;
&lt;td&gt;a reassembly path smuggled into a &quot;never assemble&quot; design&lt;/td&gt;
&lt;td&gt;relying on a quorum gathering that, by design, never happens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Choosing between these two -- and, underneath them, between FROST and threshold ECDSA, and between Feldman and Pedersen -- is where a practitioner earns their keep. That is a decision problem, so let us make it one.&lt;/p&gt;
&lt;h2&gt;8. The Decision Matrix&lt;/h2&gt;
&lt;p&gt;There is no single winner here, and anyone selling you one is selling you a mismatch. The right scheme falls out of the three diagnostic questions plus one deployment question: do you ever reconstruct the key, or never? Answer those and the rest is lookup.&lt;/p&gt;
&lt;p&gt;The load-bearing distinction is reconstruct-or-never, because it fixes your entire threat model.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A Shamir-backup wallet reassembles the key once, at recovery; an MPC or threshold-signature wallet never reassembles it. These are opposite threat models sharing one primitive. A design that promises &quot;the key is never in one place&quot; while keeping a recovery path that reconstructs it has quietly become a backup with extra steps -- and inherits the very reconstruction moment it claimed to abolish.&lt;/p&gt;
&lt;/blockquote&gt;

flowchart TD
    Q1{&quot;Must the key never exist in one place?&quot;}
    SIG{&quot;Which signature type do you need?&quot;}
    DEAL{&quot;How much do you trust the dealer?&quot;}
    LONG{&quot;Long-lived versus a roaming adversary?&quot;}
    Q1 --&amp;gt;|&quot;Yes, never assemble it&quot;| SIG
    Q1 --&amp;gt;|&quot;No, one-time recovery is fine&quot;| DEAL
    SIG --&amp;gt;|&quot;Schnorr or EdDSA&quot;| FROST[&quot;FROST, RFC 9591&quot;]
    SIG --&amp;gt;|&quot;ECDSA for a legacy chain&quot;| TECDSA[&quot;GG20 or DKLs23, with post-TSSHOCK checks&quot;]
    DEAL --&amp;gt;|&quot;Fully trusted&quot;| BACKUP[&quot;Plain Shamir backup: SLIP-39 or Vault 5/3&quot;]
    DEAL --&amp;gt;|&quot;Trusted but verify&quot;| VSS[&quot;Add VSS: Feldman or Pedersen&quot;]
    DEAL --&amp;gt;|&quot;No dealer at all&quot;| DKG[&quot;DKG, GJKR-style&quot;]
    BACKUP --&amp;gt; LONG
    LONG --&amp;gt;|&quot;Yes&quot;| PRO[&quot;Add proactive refresh&quot;]
    LONG --&amp;gt;|&quot;No&quot;| DONE[&quot;Ship it&quot;]
&lt;p&gt;Once you are in signing territory, the choice is dictated by the signature your chain or API demands. FROST when a Schnorr or EdDSA signature is acceptable -- it is lighter, round-optimal, and standardized. Threshold ECDSA (GG20 or DKLs23) only when you must emit an ECDSA signature for a legacy chain, accepting the extra weight and the Paillier-proof surface that produced the TSSHOCK class.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;FROST&lt;/th&gt;
&lt;th&gt;GG18&lt;/th&gt;
&lt;th&gt;GG20&lt;/th&gt;
&lt;th&gt;DKLs23&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Signature type&lt;/td&gt;
&lt;td&gt;Schnorr&lt;/td&gt;
&lt;td&gt;ECDSA&lt;/td&gt;
&lt;td&gt;ECDSA&lt;/td&gt;
&lt;td&gt;ECDSA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Online rounds&lt;/td&gt;
&lt;td&gt;2 (1 after preprocessing)&lt;/td&gt;
&lt;td&gt;multiple&lt;/td&gt;
&lt;td&gt;1 online (after preprocessing)&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share multiplication&lt;/td&gt;
&lt;td&gt;linear, none needed&lt;/td&gt;
&lt;td&gt;Paillier + range proofs&lt;/td&gt;
&lt;td&gt;Paillier + range proofs&lt;/td&gt;
&lt;td&gt;oblivious transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notable bug class&lt;/td&gt;
&lt;td&gt;nonce reuse, as any Schnorr&lt;/td&gt;
&lt;td&gt;TSSHOCK Paillier checks&lt;/td&gt;
&lt;td&gt;TSSHOCK Paillier checks&lt;/td&gt;
&lt;td&gt;avoids Paillier entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standardized?&lt;/td&gt;
&lt;td&gt;Yes (RFC 9591)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If you are not signing but storing, the choice is about the dealer. A fully trusted dealer with one-time recovery wants plain Shamir. A dealer you must keep honest wants VSS -- Feldman when the committed value becomes a public key anyway, Pedersen when it must stay hidden. No dealer at all means DKG, and a resilient, GJKR-style one, never the biasable naive construction. Layer proactive refresh on top whenever the key must live for years against an adversary that keeps coming back.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scheme&lt;/th&gt;
&lt;th&gt;Hiding&lt;/th&gt;
&lt;th&gt;Binding&lt;/th&gt;
&lt;th&gt;Trusted dealer?&lt;/th&gt;
&lt;th&gt;Quantum-safe?&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Plain Shamir&lt;/td&gt;
&lt;td&gt;perfect (IT)&lt;/td&gt;
&lt;td&gt;not applicable&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes, unconditional&lt;/td&gt;
&lt;td&gt;backups, escrow, the base layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feldman VSS&lt;/td&gt;
&lt;td&gt;computational&lt;/td&gt;
&lt;td&gt;perfect&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no, discrete log&lt;/td&gt;
&lt;td&gt;verifiable shares where &lt;code&gt;g^s&lt;/code&gt; is public anyway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pedersen VSS&lt;/td&gt;
&lt;td&gt;perfect (IT)&lt;/td&gt;
&lt;td&gt;computational&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no, discrete log&lt;/td&gt;
&lt;td&gt;verifiable shares that must stay hidden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proactive SS&lt;/td&gt;
&lt;td&gt;perfect point, computational refresh&lt;/td&gt;
&lt;td&gt;via its VSS&lt;/td&gt;
&lt;td&gt;yes, at setup&lt;/td&gt;
&lt;td&gt;point yes, refresh layer no&lt;/td&gt;
&lt;td&gt;long-lived keys vs a mobile adversary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKG (GJKR)&lt;/td&gt;
&lt;td&gt;computational&lt;/td&gt;
&lt;td&gt;via its VSS&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no, discrete log&lt;/td&gt;
&lt;td&gt;keys with no single point of trust&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two constructions sit outside this decision entirely, and it is worth saying why. Blakley&apos;s geometric scheme and the Asmuth-Bloom Chinese-Remainder scheme are &lt;em&gt;alternatives&lt;/em&gt; to Shamir, not descendants -- different constructions of the same &lt;code&gt;(t,n)&lt;/code&gt; primitive that lost on share size, not security.They are named here, not built, precisely because they are contemporaneous alternatives rather than layers in the evolution [@blakley1979, @asmuth-bloom1983]. Reaching for one over Shamir in 2026 needs a specific reason, and there usually isn&apos;t one.&lt;/p&gt;
&lt;p&gt;And a more basic question deserves an answer: why share a key at all, rather than encrypt it and copy the ciphertext to five people? Because encryption moves the problem instead of splitting it. Whoever holds the decryption key holds everything, and every ciphertext copy is only as safe as that one key and its one computational assumption. Secret sharing has no key and no assumption: the secrecy is unconditional and the trust is genuinely spread across a quorum. That is the whole distance between &quot;one holder, computational&quot; and &quot;no holder, unconditional.&quot;&lt;/p&gt;
&lt;p&gt;Every one of these choices is a trade-off the &lt;em&gt;math&lt;/em&gt; forces on you -- perfect hiding or perfect binding, unconditional secrecy or short shares, reconstruct-once or never. Which raises the deeper question the next section answers: what exactly does the math promise, and what does each promise cost?&lt;/p&gt;
&lt;h2&gt;9. What the Math Guarantees and What It Costs&lt;/h2&gt;
&lt;p&gt;The theory here is bounded, stated cleanly, and worth knowing exactly: it tells you which problems are solved forever and which are still open.&lt;/p&gt;
&lt;p&gt;Start with the positive result, the one everything else rests on. In Shamir&apos;s &lt;code&gt;(t,n)&lt;/code&gt; scheme, any &lt;code&gt;t-1&lt;/code&gt; shares leave the secret&apos;s conditional distribution uniform: leakage is exactly zero, and it is arithmetic -- a Lagrange counting fact -- not a hardness assumption [@shamir1979]. This is the information-theoretic side of the line Part 1 drew, and it is permanent.&lt;/p&gt;

Secrecy that holds against an adversary with unbounded computation and unlimited time, a quantum computer included. Below the threshold, the secret&apos;s conditional distribution given the shares is unchanged: zero information leaks, by a counting argument rather than a hardness assumption.
&lt;p&gt;Perfection has a price, and it is a theorem. In &lt;em&gt;any&lt;/em&gt; perfect secret-sharing scheme, every share must carry at least as much entropy as the secret, $H(\text{share}_i) \ge H(\text{secret})$ [@karnin-greene-hellman1983, @beimel-survey]. Shamir meets it with equality, which is exactly what &quot;ideal&quot; means.Meeting the bound with equality is why Shamir, not Blakley, became the substrate: Shamir&apos;s shares are the size of the secret, Blakley&apos;s are larger [@karnin-greene-hellman1983].&lt;/p&gt;
&lt;p&gt;The consequence is concrete: you cannot perfectly share a gigabyte into sub-gigabyte shares. Hugo Krawczyk&apos;s computational escape hatch buys small shares by dropping to computational security -- encrypt the bulk, Shamir-share only the short key, disperse the ciphertext -- the same instinct as Part 13&apos;s insistence that &lt;a href=&quot;https://paragmali.com/blog/one-secret-is-not-one-key-the-discipline-of-key-derivation-w/&quot; rel=&quot;noopener&quot;&gt;one secret is not one key&lt;/a&gt; [@krawczyk1993].&lt;/p&gt;
&lt;p&gt;Reconstruction in the presence of cheaters has its own bounds, inherited from the Reed-Solomon connection of Section 2. Treating shares as codewords, a decoder corrects up to $\lfloor (n-t)/2 \rfloor$ wrong shares, so &lt;em&gt;reconstructing correctly&lt;/em&gt; against up to &lt;code&gt;t&lt;/code&gt; active cheaters needs $n \ge 3t+1$ [@mceliece-sarwate1981]. The weaker $n \ge 2t+1$ only guarantees an honest majority -- enough to detect tampering, or to decode once shares are authenticated by VSS.&lt;/p&gt;
&lt;p&gt;Move up to verifiable sharing and multiparty computation and Ben-Or, Goldwasser, and Wigderson pinned the same regime: information-theoretic security against a &lt;em&gt;malicious&lt;/em&gt; adversary requires $t \lt n/3$ -- the very $n \ge 3t+1$ again -- while $t \lt n/2$ suffices against a passive one [@bgw1988]. These are tight, and they bound the whole VSS and DKG layer in the unconditional model.&lt;/p&gt;
&lt;p&gt;Threshold &lt;code&gt;t&lt;/code&gt;-of-&lt;code&gt;n&lt;/code&gt; is the happy case. The general problem -- sharing for an arbitrary authorized family of subsets -- costs more.&lt;/p&gt;

The family of share-holder subsets authorized to reconstruct the secret. For a `(t,n)` threshold scheme it is simply &quot;any `t` or more&quot;; general monotone access structures allow arbitrary authorized sets.
&lt;p&gt;Mitsuru Ito, Akira Saito, and Takao Nishizeki showed in 1987 that any monotone access structure can be realized, and Josh Benaloh and Jerry Leichter gave a monotone-formula construction in 1988 [@ito-saito-nishizeki1987, @benaloh-leichter1988]. But for general access structures the best known schemes can have shares &lt;em&gt;super-polynomially&lt;/em&gt; larger than the secret, and closing the gap between constructions and lower bounds is a central open problem of the field -- threshold is the special case where the bound is met exactly [@beimel-survey].&lt;/p&gt;
&lt;p&gt;Publicly verifiable secret sharing (Stadler 1996; Schoenmakers 1999) goes one step beyond VSS: any observer, not just the shareholders, can check that the dealer shared correctly, at the cost of heavier public-key machinery [@stadler1996, @schoenmakers1999].&lt;/p&gt;

&quot;Is secret sharing quantum-safe?&quot; has two answers, and giving only one is the most common precision error in this whole subject.&lt;p&gt;Plain Shamir is already post-quantum, unconditionally. Its secrecy is a counting fact about polynomials over a finite field, with no computational assumption for Shor&apos;s or Grover&apos;s algorithm to attack. A quantum computer the size of a planet learns nothing from &lt;code&gt;t-1&lt;/code&gt; shares [@shamir1979].&lt;/p&gt;
&lt;p&gt;But the defenses layered on top are a different story. Feldman and Pedersen commitments, GJKR key generation, and every deployed threshold Schnorr, ECDSA, and BLS signature rest on the hardness of discrete logarithms -- which Shor&apos;s algorithm breaks. A quantum adversary cannot read the secret out of the shares, but it can forge the signatures those shares were protecting and strip the hiding or binding off the commitments.&lt;/p&gt;
&lt;p&gt;So the precise statement is: the point survives a quantum computer; several of its defenses do not. That is exactly why &lt;em&gt;post-quantum threshold cryptography&lt;/em&gt;, not post-quantum secret sharing, is the live problem.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Step back and the shape is clean. The primitive is at its theoretical optimum -- perfect below threshold, ideal in share size, post-quantum by construction. Every remaining hard problem lives one layer up, in the machinery. That is not a disappointment. It is a precise map of where the field is still moving.&lt;/p&gt;
&lt;h2&gt;10. Where It Is Still Moving&lt;/h2&gt;
&lt;p&gt;Every live frontier in this subject is one layer up from the primitive. Plain Shamir is not on the list, and that absence is the whole story.The asymmetry is the point: plain Shamir is already post-quantum and ideal, so it appears in no open problem below. Everything unsettled is about the discrete-log defenses layered on top of it. Five honest, signpost-level problems, each stated once, none with a build-it walkthrough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post-quantum threshold cryptography.&lt;/strong&gt; Plain Shamir is post-quantum, but every deployed verifiability, dealerless, and signing layer rests on discrete log and falls to Shor. The open problem is to thresholdize lattice signatures like ML-DSA and hash-based schemes without exploding rounds, bandwidth, or share size. No such scheme yet matches FROST&apos;s lightness, and it is the sharpest frontier of NIST&apos;s MPTC First Call, whose two-class structure explicitly invites post-quantum submissions [@nist-8214c, @nist-mptc].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Churn-resilient proactive sharing.&lt;/strong&gt; Classical proactive refresh assumes a fixed committee, but blockchains and validator sets have constant churn -- members join and leave. Keeping a long-lived secret refreshed across a changing committee, without reconstruction and without communication blowing up in committee size, is the goal; CHURP is the current best partial answer, using two-dimensional sharing and polynomial commitments to keep off-chain cost sublinear [@churp2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Constant-size verifiable sharing.&lt;/strong&gt; Feldman and Pedersen broadcast one commitment per coefficient, &lt;code&gt;O(t)&lt;/code&gt; elements, which dominates cost at large committees. KZG polynomial commitments give constant-size commitments and evaluation proofs, enabling constant-broadcast VSS -- at the price of a trusted setup and pairing assumptions, which also makes it non-post-quantum [@kzg2010]. Reconciling constant size, transparency, and quantum resistance at once is open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asynchronous and high-threshold protocols.&lt;/strong&gt; Most deployed DKGs assume synchrony, which is fragile on real adversarial networks, and the honest-majority bounds tighten further under asynchrony. Practical asynchronous and high-threshold VSS and DKG are an active area with no single deployed default the way GJKR became one for the synchronous case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formally verified, constant-time implementations.&lt;/strong&gt; The entire Failure Catalog of Section 6 -- weak-RNG coefficients, non-constant-time interpolation, missing Paillier checks behind TSSHOCK -- is &lt;em&gt;implementation&lt;/em&gt; failure [@cve-2023-33241]. The structural fix is a formally verified, constant-time threshold stack, end to end. Verified efforts exist for individual primitives, but a fully verified threshold-signature system is not yet standard practice. Whether NIST&apos;s MPTC yields plug-compatible, interoperable standards the way RFC 9591 did for threshold Schnorr is the related open question on the standards side [@nist-mptc].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Every open problem here is about the layers -- making them faster, dealerless at scale, churn-proof, quantum-proof, and formally verified. None is about the point. Forty-seven years on, the question is never &quot;can we split a secret,&quot; but &quot;can we defend everything we built around the split.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;None of these frontiers threatens the point -- which is exactly the note to end the theory on and turn to practice. How do you actually deploy this without becoming a Failure Catalog entry?&lt;/p&gt;
&lt;h2&gt;11. The Decision Rules, Made Operational&lt;/h2&gt;
&lt;p&gt;Everything so far collapses into a short operating manual. Each rule is one of the three diagnostic questions answered correctly, or one Failure-Catalog entry pre-empted. The decision tree of Section 8 is the map; here are the turns.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Every rule below is the same four moves in a different order: draw the point safely, prove it if the dealer is not trusted, redraw it if it must live long, and use it without assembling it if you can. Get those four right and you do not appear in anyone&apos;s incident report.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pick the scheme by the questions.&lt;/strong&gt; That answer is Section 8&apos;s decision matrix, now read as an operating rule: the dealer-trust and reconstruct-or-never questions select the scheme, and the lookup table at the end of this section pairs each situation with its exact parameters and its matching never-do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pick the field and parameters.&lt;/strong&gt; The secret must fit the field: byte-wise over &lt;code&gt;GF(256)&lt;/code&gt; the way SLIP-39 does it, or a prime field larger than the secret, or -- for VSS and threshold signing -- the scalar field of the group you are signing in. Draw coefficients and nonces from a CSPRNG, never a statistical PRNG.It is &lt;code&gt;t&lt;/code&gt;, not &lt;code&gt;n&lt;/code&gt;, that sets secrecy: an attacker needs &lt;code&gt;t&lt;/code&gt; shares to learn anything, so raising &lt;code&gt;t&lt;/code&gt; raises the bar. Raising &lt;code&gt;n&lt;/code&gt; only buys availability and, if anything, gives an attacker more shares to chase. &quot;More shares&quot; is not &quot;more secure.&quot;&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;t&lt;/code&gt; for secrecy and &lt;code&gt;n&lt;/code&gt; for availability, and remember that the share &lt;em&gt;count&lt;/em&gt; is not a security parameter. For a large secret -- a file rather than a key -- encrypt it, Shamir-share the short key, and disperse the ciphertext, rather than sharing the megabytes directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Always.&lt;/strong&gt; Source every coefficient and nonce from a CSPRNG. Interpolate in constant time. Authenticate shares, and verify each one against the VSS commitments &lt;em&gt;before&lt;/em&gt; accepting it. Pin and publish a single commitment or verification key so nobody can quietly swap the curve. For any GG18 or GG20 deployment, apply the post-TSSHOCK Paillier-modulus and range-proof checks. And treat a backup&apos;s reconstruction moment as the crown-jewel threat, while treating an MPC wallet&apos;s rule as an absolute: never reconstruct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never.&lt;/strong&gt; Never seed the polynomial from &lt;code&gt;rand()&lt;/code&gt;, the clock, or a PID. Never reuse a polynomial or a share across two secrets. Never accept an unauthenticated share, or trust an un-auditable dealer with no VSS. Never call a Feldman-VSS&apos;d or DKG&apos;d deployment &quot;information-theoretic.&quot; Never ship an unpatched GG18 or GG20 library. Never conflate an MPC wallet with a Shamir backup. And never treat &quot;more shares&quot; as &quot;more secure.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Draw the pen from a CSPRNG, prove the curve if you do not trust the dealer, refresh the shares if the key lives long, and never reassemble the key if you can sign on the shares.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The same guidance as a lookup table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Scheme and key parameters&lt;/th&gt;
&lt;th&gt;Never do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Trusted dealer, one-time recovery is fine&lt;/td&gt;
&lt;td&gt;Plain Shamir backup (SLIP-39, or Vault 5/3); CSPRNG coefficients; secret fits the field; authenticate shares&lt;/td&gt;
&lt;td&gt;seed from &lt;code&gt;rand()&lt;/code&gt;, clock, or PID; reuse a polynomial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dealer must be kept honest&lt;/td&gt;
&lt;td&gt;Add VSS: Feldman if &lt;code&gt;g^s&lt;/code&gt; is public anyway, Pedersen if it must stay hidden; verify shares first&lt;/td&gt;
&lt;td&gt;accept a share that fails its commitment check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No trusted dealer at all&lt;/td&gt;
&lt;td&gt;DKG, GJKR-style, resilient and unbiased&lt;/td&gt;
&lt;td&gt;ship the biasable naive Pedersen-DKG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-lived key vs a roaming adversary&lt;/td&gt;
&lt;td&gt;Add proactive refresh each epoch&lt;/td&gt;
&lt;td&gt;assume last epoch&apos;s stolen share is harmless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key must never exist in one place&lt;/td&gt;
&lt;td&gt;Threshold signatures: FROST for Schnorr, GG20 or DKLs23 for ECDSA with post-TSSHOCK checks&lt;/td&gt;
&lt;td&gt;run unpatched GG18/GG20; conflate with a backup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large secret, a file not a key&lt;/td&gt;
&lt;td&gt;Encrypt, Shamir-share the short key, disperse the ciphertext&lt;/td&gt;
&lt;td&gt;Shamir-share the megabytes directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

HashiCorp Vault&apos;s default Shamir unseal initializes with `vault operator init -key-shares=5 -key-threshold=3`. That prints five unseal keys; any three bring the server back, and no single operator should hold more than one of them [@vault-init]. It is the cleanest real-world instance of the entire primitive: a trusted-dealer, reconstruct-once, 5/3 threshold split.
&lt;p&gt;Internalize the questions and the anti-patterns fall out for free. A handful of misconceptions are common enough to deserve a direct answer, which is where we close.&lt;/p&gt;
&lt;h2&gt;12. The Antipattern Catalog&lt;/h2&gt;
&lt;p&gt;These are the questions engineers actually ask, answered against the one invariant. Each is a misconception named and fixed.&lt;/p&gt;


No -- you have *exactly zero* information about it. For every candidate secret there is precisely one degree-`t-1` curve consistent with the `t-1` points you hold, so every secret remains equally possible. There is no &quot;getting warmer&quot; and nothing to brute-force. This is a counting fact about polynomials, not a difficulty that a faster computer chips away at.


No. There is no key and no hardness assumption. Encryption moves secrecy into a key that some party holds and that some algorithm might someday break; Shamir splits the secret so that no party holds it and no algorithm is involved. Its secrecy survives any future computer, quantum included, because it rests on arithmetic rather than on a problem being hard.


Plain Shamir, yes -- unconditionally, because its secrecy is a counting argument with nothing for Shor&apos;s or Grover&apos;s algorithm to attack. But the discrete-log-based defenses layered on top are not: Feldman and Pedersen commitments, distributed key generation, and every deployed threshold Schnorr, ECDSA, and BLS signature fall to Shor. The point survives a quantum computer; several of its defenses do not.


With plain Shamir, you would not, and that is precisely its limitation. Verifiable secret sharing closes the gap: the dealer publishes commitments to the polynomial, and every holder checks that its share lies on the one committed curve. A dealer who tries to hand out inconsistent shares is caught in public, in one round, without anyone learning the secret.


Feldman is computationally hiding and perfectly binding, and it is simpler -- a fine choice when the committed value `g^s` becomes a public key anyway. Pedersen is perfectly (information-theoretically) hiding and only computationally binding -- the choice when the committed value must stay hidden even from an unbounded adversary. You cannot have both perfect at once; that is a theorem about commitments, so pick the property you actually need.


No -- they have opposite threat models. A Shamir backup, such as SLIP-39 or Vault, reassembles the key at exactly one recovery moment, which is the thing you defend. An MPC or threshold-signature wallet never reconstructs the key at all -- it signs directly on the shares. Same primitive underneath, opposite rules: defend the reconstruction, or guarantee it never happens.


No. TSSHOCK and BitForge were a missing Paillier-modulus and range-proof check in *threshold-ECDSA* code -- the multiplication machinery bolted around the shares, not the shares themselves. A malicious co-signer could extract a key by exploiting that gap, but Shamir&apos;s secrecy was never the thing attacked. It is the cleanest illustration of the invariant: the break lived in the plumbing, not the point.

&lt;p&gt;So here is the whole field guide in one picture. A secret can be a single point on a curve that no one ever fully draws, used by a quorum that never actually gathers, and defended against a thief who never stops coming back. Forty-seven years after Shamir&apos;s two-thirds of a page, the point still holds -- unbroken, ideal, already post-quantum. Every disaster worth the name happened in the machinery around it: a predictable pen, a leaky reconstruction, an unproven curve, a missing Paillier proof.&lt;/p&gt;
&lt;p&gt;So carry the three questions with you into any deployment. Did the dealer cheat? Is the secret ever reassembled? Will the shares outlive a mobile adversary? Answer them honestly and you will build the layers as carefully as Shamir built the point. In Part 23 the field guide moves on to its next primitive -- and it carries this invariant with it, because it is the lesson every part of this series keeps teaching: the math is rarely where you get hurt.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;nobody-broke-shamir&quot; keyTerms={[
  { term: &quot;Threshold secret sharing (t,n)&quot;, definition: &quot;Split a secret into n shares so any t reconstruct it and any t-1 learn nothing, with no key and no computational assumption.&quot; },
  { term: &quot;Verifiable secret sharing (VSS)&quot;, definition: &quot;Machinery that catches a cheating dealer by letting holders check their shares against public commitments to the polynomial.&quot; },
  { term: &quot;Distributed key generation (DKG)&quot;, definition: &quot;Producing a shared key with no trusted dealer: each party contributes verifiably and the key is the sum, known to no one.&quot; },
  { term: &quot;Proactive secret sharing&quot;, definition: &quot;Refreshing shares each epoch by re-sharing zero, so old shares become useless while the secret stays fixed.&quot; },
  { term: &quot;Threshold signature&quot;, definition: &quot;A signature from a quorum of t holders that verifies as an ordinary single-signer signature, with the key never reconstructed.&quot; }
]} questions={[
  { q: &quot;Why do t-1 shares reveal exactly zero information about the secret?&quot;, a: &quot;For every candidate secret there is exactly one degree-(t-1) curve through the held t-1 points, so all secrets stay equally possible -- the conditional distribution is uniform.&quot; },
  { q: &quot;Why is a Feldman-VSS&apos;d deployment not information-theoretically secure?&quot;, a: &quot;Its commitment g^s leaks the secret to an unbounded adversary who can take a discrete log, so hiding is only computational.&quot; },
  { q: &quot;How does a threshold signature use the key without reconstructing it?&quot;, a: &quot;At signing time, Lagrange coefficients convert the active signers&apos; Shamir shares into additive shares that sum to the key, which combine into one signature without the key ever being assembled.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>secret-sharing</category><category>shamir</category><category>threshold-cryptography</category><category>verifiable-secret-sharing</category><category>distributed-key-generation</category><category>threshold-signatures</category><category>frost</category><category>mpc-wallets</category><author>noreply@paragmali.com (Parag Mali)</author></item></channel></rss>