Here is the protocol worklow. Let us define g as the generator of the multiplicative cyclic group G of order q. Let us define p = 2q + 1 (a safe prime). The values p, g, a1, b1, c1 are publicly available to the prover and the verifier. a1 = g^a mod q b1 = g^b mod q c1 = g^ab mod q where a and b are cryptographically secure randomly generated numbers. prover wants to prove he knows a secret x. the prover computes y1 = g^x mod q and y2 = b1^x mod q. the prover sends y1 and y2 to the verifier. The verifier then computes a challenge value s and sends it to the prover. the prover then computes z = (x + as) mod q. the prover sends z to the verifier. The verifier then does two checks, g^z mod q = a1^s * y1 mod q and b1^z mod q = c1^s * y2 mod q. If the checks are satisfied that means the prover has proved that he indeed knows x. It can be mathematically proven that these checks are indeed true if and only if the prover knows a valid x.