Skip to content
OR Proofs (Disjunctions)
step 1/5

Reading — step 1 of 5

Read

~1 min readSigma Protocols

OR Proofs (Disjunctions)

What if you want to prove: "I know x for y = g^x OR I know x' for y' = g^x'"?

A naive approach reveals which side you know. We want to hide it.

OR composition (Cramer, Damgård, Schoenmakers 1994):

Prover knows x for y. Wants to claim "I know x or x'" without revealing which.

For the side they DON'T know (say y'): SIMULATE the proof.
  Pick random c', z'. Compute r' = g^z' * y'^(-c').
For the side they DO know (y):
  Pick random k. Compute r = g^k.
Compute the global challenge c = hash(r, r', m).
Compute c_known = c XOR c'  (or: c = c_known + c_simulated mod something).
Compute z = k + c_known * x.

Send: (r, r', c_simulated, z, z_simulated).

Verifier:

c = hash(r, r', m)
c_known = c XOR c_simulated  (or c_known = c - c_simulated)
Check: g^z == r * y^c_known   AND   g^z' == r' * y'^c_simulated

Both branches verify, but verifier can't tell which one used the real witness.

This generalizes: ring signatures (1-of-N), threshold signatures, anonymous credentials.

Example use:

  • "I'm a member of this group of 100" — without revealing which member you are.
  • Monero (the privacy coin) uses ring signatures based on this idea.

Many ZK applications boil down to: "I know SOMETHING such that..." — and OR proofs are how you prove it without revealing what.

Discussion

Ask a question, share an insight, or help someone who’s stuck.

Sign in to post a comment or reply.

Loading…