All articles
CryptographyZKPZero-Knowledgezk-SNARKsPrivacyResearch

#Zero-Knowledge Proofs: How to Convince Someone Without Saying Anything

ZKPs let you convince a verifier that a statement is true while revealing zero information beyond that fact. Not an approximation, a strict mathematical guarantee. Here is how it actually works.

14 min read 2,667 words

I ran into zero-knowledge proofs sideways, the way you usually find the things that end up mattering.

I was working through the security proofs for ML-KEM and kept hitting citations to sigma protocols and honest-verifier zero-knowledge. I kept skipping them because the main argument seemed complete without them. Then I hit a construction where the ZK guarantee was actually load-bearing, not decorative, and I had to go back.

The core claim sounded wrong when I first read it. You can prove you know a secret without revealing the secret. Not “provide enough evidence to make someone confident” but a strict guarantee: the verifier learns exactly zero additional information from the interaction beyond the bare fact that the statement is true.

That seemed like it could not work. I checked. It works.


What “Zero-Knowledge” Actually Means

The definition has three parts. A proof system for a statement S is zero-knowledge if it satisfies:

Completeness. If S is true and both parties are honest, the verifier accepts.

Soundness. If S is false, no cheating prover can convince an honest verifier to accept, except with negligible probability.

Zero-knowledge. Whatever the verifier observes during the interaction, they could have generated themselves, without interacting with the prover and without knowing the secret.

That third property is the sharp one. The verifier learns nothing because everything they saw during the proof is simulatable without the secret. The transcript adds no information to what the verifier already had before the proof began.

This is a precise mathematical statement, not a vague security goal.


The Cave That Made Everyone Understand This

There is a 1990 paper by Quisquater and Guillou titled “How to Explain Zero-Knowledge Protocols to Your Children.” It introduced a cave metaphor that is still the best intuition pump I know for this, thirty-five years later.

A left path B right path secret door entrance P V "Come out via B!"
Peggy entered via A. Victor calls for B. She uses the secret door to comply. Victor learns she can do it. He learns nothing about how.

The setup: a circular cave with a single entrance and a magic door inside connecting two paths, A and B. Peggy knows the secret word to open the door. Victor wants to verify this without learning the word.

The protocol runs like this:

  1. Peggy walks in and takes either path at random. Victor does not see which one she chose.
  2. Victor stands at the entrance and shouts: “Come out via path A” or “Come out via path B.”
  3. If Peggy knows the secret, she can always comply (using the door to switch sides when needed).
  4. They repeat this 20 or 30 times.

A Peggy who does not know the word has to guess the correct path every single time. After 20 rounds the probability of pulling that off is 1 in 2^20, about one in a million. After 30 rounds it is negligible.

Here is the zero-knowledge part: Victor learns nothing about the secret word. Every transcript of this interaction (the sequence of choices and exits) is indistinguishable from what a lucky guesser would produce. A simulator who has no knowledge of the word can generate perfectly valid-looking transcripts just by picking random combinations that match. The transcript is simulatable without the secret.

Victor ends the interaction with arbitrarily high confidence that Peggy knows the word. The information he holds about the word itself is exactly what he held before: zero.


Getting Concrete: The Schnorr Protocol

The cave is good intuition but you cannot ship a cave. Let me show you a real protocol.

The Schnorr identification protocol proves knowledge of a discrete logarithm. Given a group G with generator g and public key Y = g^x, Peggy wants to prove she knows x without revealing it.

PROVER knows x (secret) VERIFIER knows Y = g^x R = g^r 1. commit challenge c 2. random c s = r + c·x 3. respond check: g^s = R · Y^c
Three messages, one round. The prover reveals nothing about x except the fact that they possess it.

Why does verification work? If Peggy knows x, she can always produce a valid s. The equation holds by construction:

g^s = g^(r + cx) = g^r · (g^x)^c = R · Y^c

Why is it zero-knowledge? A simulator can generate transcripts that are indistinguishable from real proofs without knowing x. Pick a random s and c first, then compute R = g^s / Y^c. This triple (R, c, s) passes the verification check. The simulator works backwards from the answer.

That is the simulation argument. Zero-knowledge follows because anything in a real transcript could have been generated by a simulator that has no secret.


Non-Interactive: The Fiat-Shamir Transform

The protocols above require Peggy and Victor to talk to each other in real time. That is not practical for most applications.

The Fiat-Shamir heuristic, from 1986, converts interactive proofs into non-interactive ones. Instead of asking Victor for a random challenge, Peggy computes the challenge herself using a hash function: c = H(R, message). In the random oracle model, this hash is indistinguishable from a truly random value issued by Victor.

The result is a signature scheme. One message, no round-trip, verifiable by anyone. This is literally how Schnorr signatures work, and it is the bridge between interactive proofs and the cryptographic primitives we deploy in practice.

Non-interactive ZKP is what makes the idea usable.


ZK-SNARKs: The Part That Gets Strange

Schnorr and similar sigma protocols are elegant but narrow. They prove statements about specific algebraic relations: discrete logs, hash preimages, Pedersen openings. What modern applications want is general: “I know a private input that causes this arbitrary computation to output this value.”

ZK-SNARKs (Succinct Non-interactive Arguments of Knowledge) do exactly that.

Witness private input Circuit R1CS gates QAP polynomials Prover + proving key Proof ~200 bytes secret x constraint system verify in ms
Private inputs go in. A small constant-size proof comes out. Verifying the proof does not require rerunning the computation.

The pipeline works roughly like this. The computation is expressed as an arithmetic circuit (think: addition and multiplication gates over a finite field). That circuit gets converted into a system of polynomial constraints called a Rank-1 Constraint System (R1CS) and then into a Quadratic Arithmetic Program (QAP). The prover uses these polynomials, plus a proving key generated during a trusted setup ceremony, to produce the proof.

The “succinct” part means the proof is tiny (a few hundred bytes) and fast to verify regardless of how large the original computation was. A SNARK proof for a million-gate circuit verifies in the same time as one for a hundred-gate circuit. Verification cost is decoupled from computation cost.

The trade-off is the trusted setup. Most SNARK constructions (Groth16, PLONK) require a ceremony where participants jointly generate public parameters. If every participant in the ceremony destroys their randomness, the parameters are safe. Zcash ran a multi-party ceremony for exactly this reason. If at least one participant was honest and deleted their randomness, nobody can forge proofs.

STARKs remove this requirement. They use hash functions instead of elliptic curve pairings, making the setup transparent and the cryptographic assumptions weaker (and post-quantum resistant). The proof size is larger, but there is no ceremony to trust.


Applications That Actually Matter

I want to separate two categories: applications where ZKP does something genuinely irreplaceable, and applications where it is attached mainly as a marketing signal.

Actually irreplaceable:

zkRollups. Layer-2 Ethereum scaling that batches thousands of transactions off-chain and posts a single validity proof on-chain. The proof certifies that every transaction followed the rules. Verifying the proof is cheap. Deployed in production at zkSync, StarkNet, and Polygon zkEVM. This is not a research prototype.

Anonymous credentials. Prove your age satisfies a threshold without revealing your birthdate. Prove you hold a valid government credential without revealing its number. The verifier learns whether a predicate holds. Nothing else. The W3C Verifiable Credentials spec has hooks for ZKP-based presentations. Microsoft’s Entra Verified ID supports selective disclosure today.

Private smart contracts. Aztec’s protocol lets you run computations where inputs and outputs are hidden from everyone except the participants, while being provably correct on a public ledger. You can prove a transfer follows the rules without revealing who is sending what.

Proof of solvency. An exchange can prove it holds enough assets to cover all liabilities without revealing individual balances or the full asset breakdown. This became practically relevant after FTX.

Where it is mostly hype:

ZKP gets attached to things where simpler cryptography would work fine, or where the ZK properties do not actually address the stated problem. If your threat is that a server sees your input, a ZKP does not help if that server runs the computation and sees the witness. If your concern is user privacy, ZKP only helps if the verifier is the entity you are hiding things from. A lot of “privacy with ZKP” pitches do not clarify this.

There is also a meaningful gap between mathematical soundness and implementation correctness. Faulty circuit constraints are a real class of bug. If the R1CS does not correctly encode the intended logic, the proof might verify for inputs that should not pass. The underlying cryptography can be sound while the circuit is wrong. Several deployed ZK systems have had this class of vulnerability.


A Few Things I Keep Coming Back To

The simulation argument still surprises me when I think about it carefully. Defining “zero-knowledge” as “the transcript is perfectly simulatable without the secret” is not the definition you would reach intuitively. It is the right definition precisely because it captures what “no information leaked” means in a mathematically precise way you can actually prove.

The Fiat-Shamir transform is another one. Using a hash function to replace an interactive challenge oracle is a small trick that underlies an enormous portion of deployed cryptography. Schnorr signatures, EdDSA, many SNARK proof systems. The same idea, reused everywhere.

And recursive proofs remain wild to me. You can prove that a previous proof is valid inside a new proof, accumulating correctness incrementally. Mina Protocol uses this to keep its entire blockchain history compressed into a proof the size of a few kilobytes. The whole chain compresses to a constant. The fact that this is mathematically possible is not obvious. The fact that it runs in production is genuinely impressive engineering.


Where Research Is Going

Lattice-based ZKP. Current ZK constructions rely mostly on discrete log or pairing-based assumptions, which Shor’s algorithm breaks. Building ZK proofs on lattice assumptions is an active research area. The constructions are less efficient than pairing-based ones right now, but they are post-quantum secure and the efficiency gap is closing. Frameworks like Labrador and recent work from the ZKProof standardization community are making progress here. This matters directly to me because ML-KEM and ML-DSA give you post-quantum primitives, but you still need a way to prove statements about them in a ZK setting.

zkML. Proving that a neural network inference ran correctly on a specific input without revealing the model weights. This matters for auditing AI decisions in regulated industries without exposing proprietary models. The circuits are enormous by current SNARK standards, but hardware acceleration for proof generation and better arithmetization for ML operations are both active areas.

Proof aggregation. Combining many proofs into one. Instead of posting one proof per transaction, you post one proof for a million transactions. This is where recursive SNARKs become practically important, not just theoretically interesting. The systems being built here will change what “blockchain throughput” means.

The tooling has matured fast. Circom, Noir, Halo2, RISC Zero are frameworks that let you write ZK circuits without deriving everything from scratch. The gap between understanding the math and shipping something real has shrunk considerably in the past three years.

If you are working on cryptographic protocols, privacy systems, or compliance infrastructure, ZKP is worth understanding at depth. Not just the applications but the actual simulation argument, the way soundness works, the trusted setup problem and its implications. The systems being built on these primitives are getting more ambitious, and the attack surface grows with them.

The fundamentals are worth having before you need them.