Zero Knowledge Proofs

Shared
Secret

Typical Proofs

reveal knowledge

in proving 26781 is not a prime

we reveal its factorization

Alice will convince Bob that an assertion is true
without revealing
anything in the process

Desired

Completeness
Soundness
Zero Knowledge

For all valid assertions, Verifier says "yes"

For all invalid assertions, Verifier says "no"

Verifier is convinced, but gains "zero knowledge"

Reality

Completeness
Soundness
Zero Knowledge

For all valid assertions, Verifier says "yes"

For all invalid assertions, Verifier says "no"

( with a very high probability )

Verifier is convinced, but gains "zero knowledge"

Colour blindness

analogy

Example uses

Proving
you have a preimage to a hash function

Discrete Logarithm Problem

ZkP \{(\color{red}a) : \color{blue}A = \color{blue}g^\color{red}a \}

\(\color{blue}g\) is the generator of cyclic group \(\color{blue}G\) of prime order \(\color{blue}p\)

\(\color{blue}A \in \color{blue}G \) is an arbitrary group element having discrete logarithm $$ \color{red}a = \log_\color{blue}g(\color{blue}A) $$

Interactive Protocol

ZkP \{(\color{red}a) : \color{blue}A = \color{blue}g^\color{red}a \}
\begin{matrix} \text{Prover} && \text{Verifier} \\ \color{red}k \leftarrow \mathbb{Z}_\color{blue}p \\ \color{blue}r = \color{blue}g^\color{red}k & \longrightarrow & \\ \\ & \longleftarrow & \color{blue}e \leftarrow \mathbb{Z}_\color{blue}p \\ \\ \color{blue}s = \color{red}k + \color{red}a\color{blue}e & \longrightarrow & \text{accept if } \\ && \color{blue}r = \color{blue}g^\color{blue}s \times \color{blue}A^{-\color{blue}e} \end{matrix}

Non Interactive Protocol

\begin{matrix} \text{Prover} && \text{Verifier} \\ \color{red}k \leftarrow \mathbb{Z}_\color{blue}p \\ \color{blue}r = \color{blue}g^\color{red}k \\ \color{blue}e \leftarrow \mathcal{H}(\color{blue}r) \\ \color{blue}s = \color{red}k + \color{red}a\color{blue}e & \longrightarrow & \text{accept if } \\ && \color{blue}r = \color{blue}g^\color{blue}s \times \color{blue}A^{-\color{blue}e} \end{matrix}

\( \mathcal{H} \) is function where every input is mapped to a unique output

learn more!

3 step process (NIP)

testNonInteractiveProof :: IO Bool
testNonInteractiveProof = do
  let secret = 42
  let a' = pointBaseMul secp256k1 secret
  
  -- Prover
  (r, k) <- commmitment

  -- Prover
  let e = oracle (show r)

  -- Prover
  let s = response k e secret

  -- Verifer 
  pure (verify a' r e s)

3 step process (IP)

testInteractiveProof :: IO Bool
testInteractiveProof = do
  let secret = 42
  let a' = pointBaseMul secp256k1 secret
  
  -- Prover
  (r, k) <- commmitment

  -- Verifier
  e <- challange

  -- Prover
  let s = response k e secret

  -- Verifer 
  pure (verify a' r e s)


Haskell or GTFO

\begin{matrix} \color{red}k \leftarrow \mathbb{Z}_\color{blue}p \\ \color{blue}r = \color{blue}g^\color{red}k \end{matrix}
commmitment :: MonadRandom m => m (Point, Integer)
commmitment = do
  k <- generateBetween 0 p
  pure (pointBaseMul secp256k1 k, k)
\text{Prover}
\color{blue}e \leftarrow \mathbb{Z}_\color{blue}p
challange :: MonadRandom m => m Integer
challange = generateBetween 0 p
\color{blue}s = \color{red}k + \color{red}a\color{blue}e
response :: Integer -> Integer -> Integer -> Integer
response k chal secret = (k + chal*secret)

Haskell or GTFO

\begin{matrix} \text{accept if } \\ \color{blue}r = \color{blue}g^\color{blue}s \times \color{blue}A^{\color{blue}e} \end{matrix}
verify :: Point -> Point -> Integer -> Integer -> Bool
verify a' r e s = lhs == rhs 
  where
    lhs = pointBaseMul secp256k1 s
    rhs = pointAdd secp256k1 r (pointMul secp256k1 e a')

\text{Verifier}

Completeness

\begin{matrix} \text{accept if } \\ \color{blue}r & = & \color{blue}g^\color{blue}s \times \color{blue}A^{\color{blue}e} \\ \color{blue}r & = & \color{blue}g^{\color{red}k+\color{red}a\color{blue}e} \times ( \color{blue}g^\color{red}k)^{\color{blue}e} \\ \color{blue}r & = & \color{blue}g^{\color{red}k} \end{matrix}

And

Not Optimal

testAndProof :: IO (Bool, Bool)
testAndProof= do
  a <- testNonInteractiveProof
  b <- testNonInteractiveProof
  pure (a, b)

Common
Challenge And Response

Single commitment


testAndProof' :: IO Bool
testAndProof' = do
  
  let secretA = 42
  let a' = pointBaseMul secp256k1 secretA
  let secretB = 43
  let b' = pointBaseMul secp256k1 secretB
  
  -- Prover
  (r, k) <- commmitment

  -- Prover
  let e = oracle (show r)

  -- Prover
  let s = (response k e secretA) + e * secretB

  -- Verifer 
  pure (verifyAnd a' b' r e s)

verifyAnd a' b' r e s = lhs == rhs
  where
    lhs = pointBaseMul secp256k1 s
    rhs = pointAdd secp256k1 r (pointAdd secp256k1 a b)
    a = pointMul secp256k1 e a'  
    b = pointMul secp256k1 e b'

Equality

Title Text

testEqProof :: IO Bool
testEqProof = do
  
  let secret = 42
  let a' = pointBaseMul secp256k1 secret
  let b' = pointBaseMul secp192r1 secret
  
  -- Prover
  k <- generateBetween 0 p
  let rA = pointBaseMul secp256k1 k
  let rB = pointBaseMul secp192r1 k

  -- Prover
  let e = oracle (show [rA,rB])

  -- Prover
  let s = (response k e secret)

  -- Verifer 
  pure (verifyEq secp256k1 a' rA e s && verifyEq secp192r1 b' rB e s)
verifyEq :: Curve -> Point -> Point -> Integer -> Integer -> Bool
verifyEq curve a' r e s = lhs == rhs 
  where
    lhs = pointBaseMul curve s
    rhs = pointAdd curve r (pointMul curve e a')

Or

Fin.

I hope this was a

"talk about zero-knowledge” and not a

"zero-knowledge talk."

deck

By ..

deck

  • 1,835