https://www.secmem.org/blog/2022/05/15/KZG-ASVC/

https://github.com/rkm0959/rkm0959_presents/blob/main/TornadoCash.pdf

https://www.youtube.com/watch?v=8gRkCVy8he8  

https://github.com/rkm0959/rkm0959_presents/blob/main/lattice_survey.pdf  

 

'Cryptography' 카테고리의 다른 글

KZG, ASVC, Stateless Cryptocurrencies  (0) 2022.05.20
Groth16 + Powers of Tau + Tornado Cash  (0) 2022.03.14
Inequality Solving with CVP  (0) 2021.03.26
Sigma Protocol  (0) 2021.02.15
Schnorr's Protocol & Signature  (0) 2021.02.13

www.secmem.org/blog/2021/03/15/Inequality_Solving_with_CVP/

'Cryptography' 카테고리의 다른 글

Groth16 + Powers of Tau + Tornado Cash  (0) 2022.03.14
Lattice Attacks Introductory Survey  (0) 2021.07.22
Sigma Protocol  (0) 2021.02.15
Schnorr's Protocol & Signature  (0) 2021.02.13
Diophantine Argument of Knowledge  (4) 2021.01.20

저번 글에 이어서, 이번에는 19장의 내용을 끝까지 정리한다. 본격적으로 최적화 공부를 하기 위해서 이거 읽는 건 잠시 중단.

 

이번 글에서는 Schnorr's Protocol을 일반화한 Sigma Protocol에 대해서 다룬다. 이전 글을 읽고 왔다고 가정한다.

이 블로그에 있는 글인 Diophantine Argument of Knowledge와 같이 읽으면 좋을 것 같다. 내용이 꽤 많이 겹친다.

이 글에서도 모든 random은 uniform random이다. 이전 글의 앞부분에서 말한 모든 내용이 그대로 적용된다.

 

이 글의 내용은 다음과 같다.

  • Schnorr's Protocol을 일반화하여 Sigma Protocol을 얻고, 비슷하게 Signature Scheme도 얻는다. 이들에 대한 구체적인 정의와 사례들을 살펴보고, 그 안전성을 증명한다. Schnorr's Protocol을 다룰 때 사용되었던 방법들이 거의 그대로 등장하지만, 일반적인 상황을 다루기 위해 준비가 필요하다.
  • Sigma Protocol을 통해서 더욱 강력한 adversary의 공격에도 안전한 Protocol을 만드는 방법을 살펴본다. 우리는 지금까지 adversary가 Eavesdrop 하거나 Malicious Prover가 되는 경우만을 고려하였다. 이번에는 adversary가 Malicious Verifier의 역할을 하더라도 깨지지 않는 Protocol을 만든다.

 

1. Sigma Protcols : A Generalization of Schnorr's Protocol

Definitions

정의 : Effective Relation이란 binary relation $\mathcal{R} \subset \mathcal{X} \times \mathcal{Y}$로, 이때 $\mathcal{X}, \mathcal{Y}, \mathcal{R}$은 모두 efficiently recognizable set이다. (즉, 어떤 값이 집합의 원소인지를 쉽게 판별할 수 있다) $\mathcal{Y}$의 원소를 statement라고 하고, $(x, y) \in \mathcal{R}$이면 $x$를 $y$의 witness라고 정의한다. 

 

 

정의 : Sigma Protocol을 정의하기 위해서는 Effective Relation $\mathcal{R} \subset \mathcal{X} \times \mathcal{Y}$와 Prover, Verifier가 필요하다. 두 사람은 모두 $y \in \mathcal{Y}$를 갖고 있으며, Prover는 $y$에 대한 witness $x \in \mathcal{X}$에 대한 지식을 증명하려고 한다. 이들은 다음 구조를 갖는 대화를 통해서 Prover의 증명을 검토한다.

  • Prover는 commitment라고 불리는 값 $t$를 하나 계산해서 Verifier에게 전달한다.
  • Verifier는 challenge라고 불리는 값 $c$를 challenge space $\mathcal{C}$에서 random하게 골라 Prover에게 전달한다.
  • Prover는 response라고 불리는 값 $z$를 계산하여 Verifier에게 전달한다. 
  • 이제 Verifier는 conversation $(t, c, z)$를 이용하여 증명을 accept/reject 한다. 
  • Accept를 받는 conversation을 accepting conversation이라고 부른다. challenge space는 super-poly임을 가정한다.
  • 이미 Schnorr's Protocol에서 알고 있는 사실이지만, accepting conversation의 집합은 $y$에 dependent 함에 유의하라.

독자들은 Schnorr's Protocol이 Sigma Protocol의 한 경우임을 파악할 수 있을 것이다. 특히, 이 경우 $\mathcal{R}$은 결국 $(x, y)$ such that $g^x = y$이다.

 

 

우리가 이전에 사용했던 표현인 Completeness, Soundness와 HVZK의 정의를 다시 살펴보자. Completeness는 그대로 가져와도 된다.

 

정의 : Knowledge Soundness란, $y \in \mathcal{Y}$에 대한 accepting conversation $(t, c, z)$와 $(t, c', z')$이 주어졌고, $c \neq c'$일 때, $y$에 대한 witness $x$를 효율적으로 계산하는 알고리즘이 존재한다는 것이다. 이러한 알고리즘을 Witness Extractor라고 부르기도 한다.

 

Schnorr's Protocol이 Knowledge Soundness를 가짐은 이미 알고 있는 사실이다. 이는 우리의 기존 Soundness에 대한 정의보다 더욱 강력하다.

이렇게 강력한 조건을 주는 이유는, 역시 Schnorr's Protocol에서 사용했던 증명을 그대로 쓰고 싶기 때문이다.

생각해보면, Witness Extractor가 존재해야 Rewinding Lemma를 사용하는 증명을 할 수 있다. Rewinding Lemma가 해주는 것은 $(t, c, z)$와 $(t, c', z')$를 얻어주는 것이고, 그 뒤의 일은 Witness Extractor의 몫이다. Schnorr's Protocol에서는 "연립일차방정식을 푸는 것"이라고 불렀다. 

 

 

정의 : Special HVZK란, $(y, c) \in \mathcal{Y} \times \mathcal{C}$를 input으로 받아 다음을 output으로 내는 효율적인 Simulator가 존재한다는 것이다.

  • 모든 $(y, c) \in \mathcal{Y} \times \mathcal{C}$에 대하여, Simulator의 output이 $(t, z)$일 때, $(t, c, z)$는 무조건 accepting conversation for $y$이다.
  • $(x, y) \in \mathcal{R}$이라고 하자. 이제 $c$를 $\mathcal{C}$에서 random하게 고른 후, $(t, z)$를 $(y, c)$에 대해 Simulator를 돌려서 얻은 값이라고 하자.
  • 이때, $(t, c, z)$는 $x$를 갖고 있는 Prover와 Verifier 사이의 conversation과 동일한 분포를 갖는다.

여기서 HVZK와 Special HVZK를 비교하면서 강조할 점은 다음 두 가지다.

  • $y$가 witness가 애초에 없는 원소여도, Simulator는 accepting conversation for $y$를 만들어야 한다.
  • Simulator는 $x$를 모르지만, $x$를 갖고 있는 Prover가 만들어내는 증명과 같은 분포를 뽑아내야 한다. 
  • $y$에 대한 witness $x$가 여러 개 있을 수 있음에 주목하라. 이러면 Special HVZK의 의미를 다음과 같이 생각할 수 있다.
  • Accepting Conversation으로는 $x$가 witness인 것 외에는 아무 정보도 얻을 수 없다. 특히, $x$가 witness 중에 어떤 witness인지도 알 수 없다.

 

Sigma Protocol for Pre-Image of a Homomorphism

이제 Sigma Protocol의 큰 family 하나를 소개하고, 그 구체적인 사례를 매우 간단하게만 나열한다.

 

$H_1, H_2$가 finite abelian group of known order라고 하고, $\phi : H_1 \rightarrow H_2$를 group homomorphism이라 하자. Schnorr's Protocol과 notation을 맞추기 위해서, $H_1$에서의 이항연산은 덧셈으로, $H_2$에서의 이항연산은 곱셈으로 표기하도록 한다. 이제, Effective Relation은 $$(\alpha, u) \in H_1 \times H_2 : \quad \phi(\alpha) = u$$이다. 즉, Prover는 $u$에 대한 $\phi$의 preimage를 알고 있음을 Verifier에게 증명하려고 한다. 이때, challenge space 적당한 자연수 $N$에 대하여 $\mathcal{C} = \{0, 1, \cdots, N-1\}$이다. 이제 Prover와 Verifier는 Schnorr's Protocol처럼 다음 과정을 거친다.

  • Prover는 $\alpha_t$를 $H_1$에서 랜덤하게 고르고, $u_t = \phi(\alpha_t)$를 Verifier에게 보낸다.
  • Verifier는 $\mathcal{C}$에서 challenge $c$를 랜덤하게 고르고, Prover에게 보낸다.
  • Prover는 $\alpha_z = \alpha_t + \alpha \cdot c \in H_1$을 계산하고, Verifier에게 보낸다.
  • Verifier는 $\phi(\alpha_z) = u_t \cdot u^c$인지 확인하고, 이를 기반으로 accept/reject.

정리 : 위 Protocol은 Sigma Protocol이며, Special HVZK이다. $|H_1| \times |H_2|$의 최소 소인수가 $|\mathcal{C}|= N$ 이상이면, Knowledge Soundness를 갖는다.

  • Effective Relation이 정말 Effective Relation인 것은 자명하다. 이 Protocol이 Sigma Protocol임도 자명하다.
  • Special HVZK임은 Schnorr's Protocol과 같은 방식으로 Simulator를 만들어주면 된다. 증명은 연습으로 남긴다.
  • Knowledge Soundness로 Schnorr's Protocol과 같은 방식으로 하면 된다. 이때, modular inverse를 취하기 위하여 소인수 조건이 필요하다.

이제 구체적인 사례를 몇 가지 제시한다. 

  • Okamoto's Protocol : $H_1 = \mathbb{Z}_q \times \mathbb{Z}_q$, $H_2 = \mathbb{G}$, $\phi(x, y) = g^x h^y$. 
  • Chaum-Petersen Protocol : $H_1= \mathbb{Z}_q$, $H_2 = \mathbb{G} \times \mathbb{G}$, $\phi(x) = (g^x, u^x)$. (Diffie-Hellman Context)
  • General Linear Protocol : $H_1 = \mathbb{Z}_q^n$, $H_2 = \mathbb{G}^m$, $\displaystyle \phi(x_1, \cdots,  x_n) = \left(\prod_{i=1}^n g_{1i}^{x_i}, \cdots , \prod_{i=1}^n g_{mi}^{x_i} \right)$.
  • GQ Protocol : $H_1 = \mathbb{Z}_n^{*}$, $H_2 = \mathbb{Z}_n^{*}$, $\phi(x) = x^e$. (RSA Context)

GQ Protocol에서는 사실 $H_1, H_2$의 group order를 모른다. 그래서 따로 증명을 해줘야 한다. 여기서 $(n, e)$는 RSA 공개키이며, $e$는 큰 소수라고 가정한다. 또한, challenge space는 $\{0, 1, \cdots, e-1\}$으로 설정한다. 말이 따로 증명이지, 사실 기존 증명 방식을 그대로 적용하면 증명이 된다.

자신있게 말할 수는 없으나, 내 생각에는 아마 $\mathbb{Z}_n^{*}$에서 random한 원소를 뽑는 것이 어렵지 않기 때문에 가능한 증명일 것이다. Simulator를 만들거나 아니면 단순히 Protocol을 따를 때, group의 random element를 뽑는 과정이 필수적이다. 그런데 group order를 모른다면 이걸 하기가 상당히 난감할 것이다.

하지만 $\mathbb{Z}_n^{*}$에서는 단순히 $\mathbb{Z}_n$의 원소를 하나 뽑은 다음 GCD를 계산해, $1$이 나오면 그 값을 그대로 제출하면 되므로 문제가 없다.

 

Sigma Protocol : Security Analysis

이제 다양한 Sigma Protocol들의 안전성을 분석해보자. 이를 위해서는 Schnorr's Protocol의 안전성 증명을 복습할 필요가 있다.

  • HVZK (Special HVZK) : accepting conversation을 엿듣는 것이 의미가 없다는 것을 증명한다. (Eavesdrop = Direct Attack)
  • Soundness (Knowledge Soundness) : 증명을 만들 수 있다면 $sk$를 복원하는 것이 (Schnorr에서는 DL을 해결) 가능함을 증명한다. 

여기서 우리가 바꿔야 할 부분은 "Schnorr에서는 DL을 해결" 부분이다. 그러니, 다음 정의는 자연스럽다.

 

정의 (One-Way KeyGen) : $G$는 $(sk, pk) = (x, y) \in \mathcal{R}$을 생성하는 알고리즘이다. adversary가 $y$를 받았을 때, 효율적인 알고리즘으로 $y$에 대한 witness를 계산하는 게임을 생각하자. 이 게임에 대한 adversary의 advantage가 negligible이라면, 이 KeyGen 알고리즘을 one way라고 부른다. 

 

이제 앞선 Schnorr's Protocol에 대한 증명에서 Discrete Logarithm에 대한 advantage를 위 게임에 대한 advantage로 바꾸면, 모든 증명을 그대로 할 수 있다. 즉, KeyGen 자체가 one way라면 이 Sigma Protocol도 안전함을 증명할 수 있다. 결국 $sk$를 $pk$를 통해서 계산하기 어렵다는 가정만 있으면 된다.

 

다시 한 번 강조하지만 구체적인 advantage에 대한 식들은 이전 글과 동일하므로, 여기서는 생략한다. 

 

Signatures from Sigma Protocol : Security Analysis

Fiat-Shamir Heuristic을 적용하면, Schnorr's Signature와 같은 방식으로 Sigma Protocol에서도 Signature를 만들 수 있다. 

이제 이 Signature의 안전성을 분석해보자. 이를 위해서는, 역시 Schnorr's Signature의 안전성 증명을 복습할 필요가 있다.

  • $r$-impersonation에 대한 분석은 여전히 유효하다. Discrete Logarithm을 위에서 정의한 One-Way KeyGen으로 바꾸면 된다.
  • Signature Scheme에 대한 분석을 보자. 여기서 핵심은 signing query에서 random oracle access가 겹치는 경우를 전부 제거하기 위해 Union Bound + Difference Lemma를 사용한 것이다. 특히, 우리는 random oracle access가 겹치는 확률에 대한 upper bound를 구하기 위해서 $u_{ti}$에 대한 분포를 사용하였다. Schnorr's Signature에서는 $u_{ti}$가 $\mathbb{G}$ 위에서 uniform random이었으므로, 각 원소가 될 확률이 $1/q$라고 결론낼 수 있었다. 그러나 지금의 우리는 commitment $t$의 값이 어떤 분포를 따르는지 강제하지 않았다. 이 부분을 해소해야 한다. 이제 다음 정의는 자연스럽다. 

정의 (Unpredictable Commitments) : conversation $(t, c, z)$가 집합 $\mathcal{T} \times \mathcal{C} \times \mathcal{Z}$에 속한다고 하자. 각 $(x, y) \in \mathcal{R}$과 $\hat{t} \in \mathcal{T}$에 대하여, $y$에 대한 witness $x$를 증명하고자 하는 Prover와 이를 인증하는 Verifier가 conversation $(t, c, z)$를 만들었을 때, $t = \hat{t}$가 성립할 확률이 최대 $\delta$인 경우, 이를 $\delta$-unpredictable commitment를 가지는 Sigma Protocol이라 한다. 특히, $\delta$가 negligible이면 단순히 unpredictable commitment를 가진다고 한다.

 

결국에는 Signature Scheme의 안전성 증명의 context에서 각 원소에서 겹칠 확률이 $\delta$ 이하라는 것이다.

즉, Schnorr's Signature의 안전성 증명에서 $1/q$ 부분을 전부 $\delta$로 바꾸기만 하면 모든 결과가 그대로 적용된다.

 

2. Actively Secure Identification Protocols with Sigma Protocols

Actively Secure하다는 것은, 앞에서 예고했듯이 adversary가 Malicious Verifier의 역할을 할 수 있는 경우까지 고려했을 때도 안전하다는 것이다. 즉, 우리가 상대할 adversary는 Verifier 행세를 하면서 Honest Prover와 대화할 수 있는데, challenge를 자기 마음대로 (즉, uniform random이 아니어도 된다) 고를 수 있다는 것이다. 이러한 Protocol을 만들려면 재료가 필요하다. AND/OR-proofWitness Independence가 그 재료들이다. 

 

AND/OR-proof 

이제부터 두 개의 Efficient Relation $\mathcal{R}_0 \subset \mathcal{X}_0 \times \mathcal{Y}_0$와 $\mathcal{R}_1 \subset \mathcal{X}_1 \times \mathcal{Y}_1$이 있다고 하자. 또한, 각각에 대한 Sigma Protocol이 있다고 가정한다. 특히, 이 Sigma Protocol들이 Special HVZK와 Knowledge Soundness를 보장한다고 가정하겠다. 또한, OR-proof을 위하여 $\mathcal{C} = \{0,1\}^n$ 형태를 가정하겠다. (다르게 표현하면, $\mathcal{C}$는 $2^n$ 미만의 음이 아닌 정수들의 집합이다) 이제 이 Sigma Protocol의 AND/OR을 생각해보자. 

 

AND-proof : 두 Relation에 대한 witness가 전부 있음을 증명한다. 즉, 목표는 $$\mathcal{R}_{AND} = \{ ((x_0, x_1), (y_0, y_1)) : (x_0, y_0) \in \mathcal{R}_0, (x_1, y_1) \in \mathcal{R}_1 \}$$을 생각하고, 이 새로운 Efficient Relation에 대한 Sigma Protocol을 만드는 것이다. 이는 어렵지 않은 게, 그냥 $\mathcal{R}_0$와 $\mathcal{R}_1$에 대한 Sigma Protocol을 동시에 돌리면 된다. 한 가지 차이는 Verifier가 두 Protocol에 대한 challenge를 같은 값 $c$로 준다는 것인데, 그래도 Special HVZK와 Knowledge Soundness는 여전히 가져올 수 있다. 증명은 자명하고 직관적이므로 생략한다. Proof Sketch는 책의 Theorem 19.18에 설명되어 있으니 필요하면 참고하자.

 

OR-proof : 두 Relation 중 적어도 하나에 대한 witness가 있음을 증명한다. 중요한 것은, 어느 것에 대한 witness인지는 밝히면 안된다는 것이다. 목표는 $$ \mathcal{R}_{OR} = \{ ((b,x),(y_0, y_1)) : (x, y_b) \in \mathcal{R}_b \} $$에 대한 Special HVZK, Knowledge Soundness를 갖는 Sigma Protocol이다. 이를 위해서, 다음과 같은 과정을 설계한다.

  • Prover가 $\mathcal{R}_b$에서 $y_b$에 대한 witness $x$를 갖고 있다고 가정하자. $d = 1-b$라 하자.
  • 먼저 Prover는 $c_d$를 $\mathcal{C}$에서 random하게 고르고, $(t_d, z_d)$를 $\mathcal{R}_d$에 대한 Simulator에 $(y_d, c_d)$를 넣어서 계산하자.
  • 또한, $(x, y_b) \in \mathcal{R}_b$를 알고 있으니 $\mathcal{R}_b$에 대한 Sigma Protocol을 돌려서 commitment $t_b$를 구한다. 이제 $(t_0, t_1)$을 Verifier에게 보낸다.
  • Verifier는 역시 challenge $c$를 $\mathcal{C}$에서 random하게 고르고, 이를 Prover에게 전달한다.
  • Prover는 $c_b = c \oplus c_d$를 계산하고, $c_b$를 $\mathcal{R}_b$에 대한 Sigma Protocol의 commitment 값으로 둔다.
  • 이제 $t_b, c_b$를 사용하여 response $z_b$를 계산한다. 그 후, $(c_0, z_0, z_1)$을 Verifier에게 보낸다.
  • Verifier는 $c_1 = c \oplus c_0$를 계산하고, $(t_0, c_0, z_0)$와 $(t_1, c_1, z_1)$이 accepting conversation인지 확인하고 accept/reject.

이제 이 Protocol의 다양한 성질들을 증명하자. Completeness는 자명하다. 

  • Knowledge Soundness : 여기서 중요한 점은 $c$의 값이 $c'$으로 달라지면, $c_0$의 값이 달라지거나 $c_1$의 값이 달라지거나 둘 중 하나는 일어난다는 것이다. 이는 $c_0 \oplus c_1 = c$이기 때문이다. 그러니 결국 $\mathcal{R}_0$ 또는 $\mathcal{R}_1$에서 Witness Extractor를 사용할 수 있고, 증명 끝.
  • Special HVZK : $y_0, y_1, c$를 input으로 받으면 $c_0$를 $\mathcal{C}$에서 random하게 고르고, $c_1$을 $c_0 \oplus c$로 둔 다음, $(y_0, c_0)$와 $(y_1, c_1)$ 각각에 대하여 Simulator를 돌려주면 된다. 분포가 같음은 직관적으로 자명하고 직접 보이기도 어렵지 않다. 이러면 증명 끝.

 

Witness Independence

앞에서 우리는 Special HVZK면 accepting conversation을 보는 것으로는 verifying key/public key에서 얻을 수 있는 정보 외에는 얻을 수 있는 것이 없다고 했고, 특히 Prover가 어떤 witness를 사용하고 있는지에 대한 정보가 없다고 말했다. 이에 대한 엄밀한 설명이 필요하다.

 

정의 : Sigma Protocol을 갖는 Efficient Relation $\mathcal{R}$이 있고, $(x, y) \in \mathcal{R}$이 있다. 우리의 adversary는 $y$의 값을 알고 있으며, [자신이 $y$에 대한 witness $x$를 알고 있음을 증명하려고 하는 Prover 여러 명]과 동시에 대화할 수 있다. 즉, 이들을 상대로 Verifier 행세를 할 수 있으며, 이때 꼭 Verifier의 Protocol을 정직하게 따를 필요는 없다. 이제 adversary는 output space $\mathcal{S}$에 속하는 output $s$를 낸다. $\theta (x, y, s)$를 adversary가 $s$를 output으로 낼 확률이라 하자. 

 

정의 : Witness Independence란, 모든 adversary $\mathcal{A}$에 대해서, 각 $y \in \mathcal{Y}$와 $x, x' \in \mathcal{X}$, $s \in \mathcal{S}$에 대하여, $(x, y), (x', y) \in \mathcal{R}$이라면, $$ \theta (x, y, s) = \theta(x',y,s)$$라는 것이다. 특히, adversary는 efficient 하지 않아도 된다. 결국 output과 witness는 완전히 독립적이라는 뜻.

 

이제 Special HVZK면 Witness Independent함을 보일 수 있다. 증명은 책의 Theorem 19.21에 나와있으나, 여기서는 생략한다. 

핵심은 어쨌든 어떤 witness $x$를 사용했냐와 무관하게 accepting conversation의 분포가 (Simulator의 그것과) 같다는 것이다.

우리의 adversary가 바라보는 정보가 $x$와 아예 독립적인데 그것에서 $x$에 대한 정보를 뽑아낼 수는 없을 것이다.

 

이제 준비가 끝났으니, 우리의 목표인 Actively Secure Identification Protocol에 대하여 알아보자.

 

Actively Secure Identification Protocol

아이디어는 Eavesdrop/Direct에 안전한 Sigma Protocol을 두 개 가져와서 OR-proof를 만드는 것이다.

 

즉, $\mathcal{R} \subset \mathcal{X} \times \mathcal{Y}$가 있고, 이에 대한 Special HVZK, Knowledge Soundness를 가지는 Sigma Protocol이 있다고 가정하자. 또한, 이 $\mathcal{Y}$의 임의의 원소에 대해서 witness를 찾는 것이 어렵다고 가정하자. 즉, one-way임을 가정하자. 이제 $\mathcal{R}$과 $\mathcal{R}$을 가지고 OR-proof에 대응되는 Sigma Protocol을 만들자.

이제부터 이 Protocol이 Actively Secure함을 증명할 것이다. 

 

정리 : 위 context에서, 새로운 Protocol을 Active Attack으로 (즉, Malicious Verifier 행세) advantage $\epsilon$으로 깨는 efficient adversary $\mathcal{A}$가 있다고 가정하자. 이때, $\mathcal{R}$의 one-way 게임을 (즉, witness를 찾는 게임을) advantage $\epsilon'$으로 이기는 efficient adversary $\mathcal{B}$가 있으며, 특히 $$\epsilon' \ge \frac{1}{2} (\epsilon^2 - \epsilon / N)$$

증명을 위해서는 $\mathcal{B}$를 하나 만들어주면 된다. 이제 $y' \in \mathcal{Y}$를 하나 받고, $\mathcal{A}$를 활용하여 $y'$의 witness를 하나 구해주는 알고리즘을 설계해보자.

이를 위해서, 우리는 먼저 $(x, y) \in \mathcal{R}$을 하나 random하게 생성하고, (KeyGen) $b \in \{0, 1\}$을 하나 random하게 고른다.

만약 $b=0$이라면, $Y = (y, y')$를, $b=1$이라면, $Y = (y', y)$를 $\mathcal{A}$가 증명을 시도할 대상으로 선정한다. 이제 $X = (b,x)$라 하자.

이때, $(X, Y)$의 분포가 $\mathcal{R}$ 두 개를 OR해서 얻은 Relation의 원소의 분포와 동일함에 주목하라. 

  • $\mathcal{A}$가 Malicious Verifier 행세를 하기를 원한다면, 우리는 $X = (b, x)$가 witness임을 이미 알고 있으니 이를 이용하여 Sigma Protocol에 따라주면 된다. 물론, $\mathcal{A}$가 어떻게 challenge를 고르는지에 대해서는 신경쓰지 않는다. 알아서 자기 할 일 하게 두면 된다...

이제 $\mathcal{A}$가 $Y$의 witness를 안다는 것을 보이기 위해서 증명을 시도할 것이다. 우리는 이때 정직하게 challenge를 random하게 주면 된다. $\mathcal{A}$가 이 증명에 성공할 확률은 정의상 $\epsilon$이다. 그러니 Rewinding Lemma를 이용하면 우리는 $\epsilon^2 - \epsilon / N$의 확률로 증명에 두 번 성공하는 사례를 찾을 수 있고, Witness Extractor를 이용하여 $Y$의 witness를 하나 얻을 수 있다. 그런데, Witness Independence에 의하여 이 witness가 $y'$의 witness를 포함할 확률은 정확히 $1/2$이다. 그러니 우리가 여기서 $y'$의 witness를 얻을 advantage는 $$\epsilon' \ge \frac{1}{2} (\epsilon^2 - \epsilon / N)$$

 

OR-proof를 꺼내지 않더라도 Active Attack을 막을 수 있다. 주어진 $y$에 대한 witness 2개를 찾기가 힘든 Protocol을 이용하면 된다. 대충 이런 방식.

  • 주어진 $y$에 대한 witness가 정말 많으나, 서로 다른 witness 2개를 찾기가 어렵다고 가정하자.
  • $(x, y) \in \mathcal{R}$을 하나 갖고, adversary에게 Active Attack으로 $y$의 witness를 찾아보라고 하자.
  • 특히, 우리가 이미 $(x, y) \in \mathcal{R}$을 하나 알고 있으니, 마음껏 증명을 제공할 수 있다.
  • adversary가 성공하고 witness $x'$을 찾았다고 가정하자. $x' \neq x$이면 witness 2개를 찾았으니 가정을 깼다.
  • 특히 Witness Independence가 있으니 $x' \neq x$일 확률은 (가능한 witness가 많다면) 매우 높다.

그 예시가 Okamoto's Identification Protocol이다. Finite Abelian Group of (Known) Prime Order $q$인 $\mathbb{G}$를 잡자. 또한, $g, h$를 $\mathbb{G}$의 두 원소라고 하자. Okamoto's Protocol에서는 $u \in \mathbb{G}$가 있을 때, $g^\alpha h^\beta = u$인 $(\alpha, \beta)$를 알고 있는지 물어본다. 이는 앞에서도 언급했듯이 Homomorphism의 Pre-Image를 물어보는 것과 같으며, Special HVZK와 (Witness Independence) Knowledge Soundness를 가진다. 또한, $u$의 서로 다른 witness를 두 개 알고 있다면, 이를 이용해 $h$의 $g$에 대한 이산로그를 계산할 수 있다. 또한, witness의 개수는 항상 ($g, h$가 identitiy인 경우는 제외하자) $q$개다. 이제 준비가 끝났다.

 

정리 : Okamoto's Protocol을 Active Attack으로 advantage $\epsilon$으로 깰 수 있는 efficient adversary $\mathcal{A}$가 있다고 하자. 이때, $\mathbb{G}$ 위에서의 Discrete Logarithm 문제를 advantage $\epsilon'$으로 해결할 수 있는 efficient adversary $\mathcal{B}$가 존재한다. 이때, $$\epsilon' \ge (1-1/q) (\epsilon^2 - \epsilon / N)$$

증명은 위에서 말한대로 하면 된다. $\mathcal{B}$가 $g, h$를 갖고 있고, $h$의 $g$에 대한 이산로그를 구하려고 한다고 하자.

이제 $\alpha, \beta$를 $\mathbb{Z}_q$에서 각각 random하게 고르고, $u = g^{\alpha} h^{\beta}$를 구한다.

그 후, $\mathcal{A}$에게 $g, h, u$를 주면서 witness를 찾아보라고 하자. 증명은 우리가 이미 $(\alpha, \beta)$를 알고 있으니 시키는대로 전달하자.

만약 $\mathcal{A}$가 Verifier에게서 accept를 얻는 것에 성공했다면, Rewinding Lemma를 적용하여 $u$에 대한 witness를 복구하자.

이때, Witness Independence 성질에서 이 witness가 $(\alpha, \beta)$와 다를 확률은 $1-1/q$가 된다.

이 경우, 우리는 서로 다른 두 witness를 얻는 것에 성공하고, 이를 통해 Discrete Logarithm을 계산할 수 있다. 증명 끝.

 

'Cryptography' 카테고리의 다른 글

Lattice Attacks Introductory Survey  (0) 2021.07.22
Inequality Solving with CVP  (0) 2021.03.26
Schnorr's Protocol & Signature  (0) 2021.02.13
Diophantine Argument of Knowledge  (4) 2021.01.20
Leftover Hash Lemma and its Applications  (0) 2020.10.18

Dan Boneh와 Victor Shoup의 암호학 책 toc.cryptobook.us/book.pdf의 19장의 첫 부분을 정리한다. 어느 정도 사전지식을 가정한다.

글을 읽기 전에, 이 블로그에 있는 이 글의 앞부분과 Matthew Green의 이 글을 읽고 오는 것을 추천한다. 

이 글의 목표는 다음 내용들을 어느 정도 완전하게 정리하는 것이다. 직관만으로 넘기지 않고 formal 하게 다 증명하는 것이 목표.

가장 대표적이고 기초적인 zero-knowlege proof 중 하나지만 이 글의 포인트는 ZK와 거리가 있다. 

Schnorr's Protocol의 HVZK는 보이는 것이 어렵지 않기 때문인데, HVZK 대신 아예 ZK로 넘어가면 더욱 난이도가 있을 것 같다.

 

이 글의 모든 random은 uniform random이다. 이 글의 목표는 다음과 같다.

  • Schnorr's Protocol의 안전성과 HVZK, Rewinding Lemma
  • Schnorr's Signature와 그 안전성, Fiat-Shamir Heuristic

 

1. Schnorr's Protocol의 안전성과 HVZK, Rewinding Lemma

기본적인 context를 위하여, Identification Protocol을 생각해보자. 이 Protocol에서는 기본적으로 두 사람, Prover와 Verifier가 있다.

Prover는 자신이 비밀키 $sk$를 가지고 있음을 인증키 $vk$를 소유하고 있는 Verifier에게 증명하려고 한다.

이 둘은 서로 대화를 하면서 정보를 교환하고, 최종적으로는 Verifier가 Prover의 증명을 accept 하거나 reject 한다.

 

이 Protocol이 유용하고 안전하려면, 여러 가지 시나리오를 고려해야 한다.

  • $sk$를 가지고 있는 Honest Prover는 Verifier가 accept 하는 증명을 만들 수 있어야 한다.
  • $sk$를 가지고 있지 않은 Malicious Prover가 Verifier가 accept 하는 증명을 만들 수 있으면 안된다.
  • Prover와 Verifier의 대화를 엿듣는 Eavesdropper가 $sk$에 대한 추가적인 정보를 복원할 수 있으면 안된다.

물론, ~~를 할 수 있다는 것은 모두 효율적인 시간 내에 가능하다는 것이다. 위 성질들을 순서대로 Completeness, Soundness, Zero-Knowledge라고 한다. 특히, 세 번째 성질은 Verifier도 $sk$에 대한 정보를 얻을 수 없다는 것을 의미한다. 이들을 어떻게 formalize 하는지는 Schnorr's Protocol을 보며 설명한다.

 

Schnorr's Protocol

Cyclic Group $\mathbb{G} = \langle g \rangle$ of prime order $q$를 하나 준비한다. Prover의 비밀키는 $sk = \alpha \in \mathbb{Z}_q$, Verifier의 공개 인증키는 $vk = u = g^\alpha \in \mathbb{G}$이다.

이제 증명을 위해서 Prover와 Verifier는 다음과 같은 과정을 거친다. $\mathcal{C}$를 $\mathbb{Z}_q$의 subset이라 하자.

  • 1. Prover는 random $\alpha_t \in \mathbb{Z}_q$를 고르고, $u_t = g^{\alpha_t}$를 계산한다. $u_t$를 Verifier에게 보낸다.
  • 2. Verifier는 random $c \in \mathcal{C}$를 고르고, 이를 Prover에게 보낸다. 이 값을 Challenge라고 한다.
  • 3. Prover는 $\alpha_z = \alpha_t + \alpha c \in \mathbb{Z}_q$를 계산하고, Verifier에게 보낸다.
  • 4. Verifier는 $g^{\alpha_z} = u_t \cdot u^c \in \mathbb{G}$인지 확인하고, 그에 맞춰 accept/reject.

이들이 서로에게 보내는 값인 $(u_t, c, \alpha_z) \in \mathbb{G} \times \mathcal{C} \times \mathbb{Z}_q$를 conversation이라 한다.

특히, 그 중 Verifier가 accept 하도록 하는, 즉 $g^{\alpha_z} = u_t \cdot u^c$인 conversation을 accepting conversation (for $u$)이라 한다.

 

Completeness는 자명하다. 말 그대로 대입만 해서 Honest Prover의 proof가 accept가 되는지만 보면 되기 때문이다.

이제 Soundness와 Zero-Knowledge를 (정확하게는 HVZK를) 보면 된다. 둘 다 상당히 재밌는 아이디어를 사용한다.

 

Soundness 증명 : 직관편

$\alpha$를 모르는 Malicious Prover가 증명을 시도한다고 하자. 그러면 Step 2에서 Verifier가 challenge $c$를 보내면, Malicious Prover는 $\alpha_t + \alpha c$의 값을 정확하게 반환해야 한다. 만약 Malicious Prover의 성공 확률이 높다면, Verifier가 다른 challenge $c'$을 보냈더라도 $\alpha_t + \alpha c'$의 값을 정확하게 반환할 수 있을 것이다. 그런데 애초에 $\alpha_t + \alpha c$와 $\alpha_t + \alpha c'$을 맞춘 시점에서 Malicious Prover는 간단한 연립방정식을 통해서 $\alpha$를 복원할 수 있다.

이는 결국, 직관적으로, "두 번 연속해서 증명에 성공할 수 있다면 Discrete Logarithm을 깰 수 있다"는 의미가 된다.

Discrete Logarithm이 어려운 문제라는 것은 우리의 기본적인 가정이다. 그러니 증명을 한 번 성공할 확률도 낮다는 것이 결론이고 직관적인 증명 끝.

 

Soundness 증명 : formal

빠르게 advantage라는 표현을 정립하고 가자. advantage란, 대강 "문제 효율적인 시간 안에 해결할 확률"이다.

예를 들어서, Discrete Logarithm 문제에 대한 advantage는 효율적인 시간 내에 DL을 구해낼 확률이다.

즉, Discrete Logarithm이 어렵다는 말은 사실 advantage가 negligible 하다는 말과 같다. 이 advantage로 많은 암호학 증명이 이루어진다.

 

정리 : $\mathbb{G}$ 위에서의 Discrete Logarithm이 어렵고, $N = |\mathcal{C}|$가 super-poly라면 이 Protocol은 Soundness를 갖는다.

특히, efficient adversary $\mathcal{A}$가 $sk$ 없이 Verifier가 accept 하는 증명을 만드는 문제에 대한 advantage를 $\epsilon$이라 한다면, $\mathbb{G}$ 위의 Discrete Logarithm을 advantage $\epsilon'$으로 해결하는 efficient adversary $\mathcal{B}$가 존재하여, $\epsilon' \ge \epsilon^2 - \epsilon / N$이 성립한다. 이를 정리하면, $$\epsilon \le \frac{1}{N} + \sqrt{\epsilon'}$$

직관적으로 말하면, [Protocol을 "직접 공격"으로 깰 수 있다면 Discrete Logarithm 문제도 풀 수 있다]는 의미가 되겠다. 

 

증명을 위해서는 위의 직관적인 증명을 엄밀하게 바꿔야 한다. 우리의 궁극적인 목표는 efficient adversary $\mathcal{B}$를 $\mathcal{A}$를 이용해서 만드는 것이다. 

이제부터 $\mathcal{B}$의 입장에서 설명을 한다. 우리는 $\mathcal{A}$의 알고리즘을 모르지만 알고 있다. 이게 무슨 뜻이냐면,

  • 애초에 $\mathcal{A}$의 존재 자체가 증명을 위한 하나의 가정이니, $\mathcal{A}$의 알고리즘은 모른다.
  • 하지만 $\mathcal{B}$를 construct 하는 입장에서, 우리는 $\mathcal{A}$의 알고리즘을 적극적으로 사용할 수 있다.

이제 다음과 같은 과정을 거치자.

  • 우리는 $\mathcal{A}$를 위한 Verifier 행세를 할 것이다. 첫 단계처럼, $\mathcal{A}$에게 $u_t$를 받는다.
  • 이제 우리가 Challenge를 줄 차례다. 그러니 $c_1 \in \mathbb{Z}_q$를 하나 전달하자. $\mathcal{A}$가 $\alpha_{z_1}$을 줄 것이다. 이게 맞는지 판단하자.
  • 이제 $\mathcal{A}$의 내부 상태를 Challenge를 주기 전 상태로 Rewind 하자. 이 부분이 핵심인데, 이게 가능한 이유는 우리가 $\mathcal{A}$의 알고리즘을 알고 있기 때문이다. $\mathcal{B}$와 $\mathcal{A}$가 서로 "싸우고 있는" 두 사람인 게 아니라, Protocol을 깨기 위해서 서로 역할극을 하고 있는 기계임에 집중하자. 이렇게 생각하면 앞선 직관적인 증명에서 우리가 사용한 일종의 시간여행과 what if 형태의 증명이 더욱 이해가 잘 되고 엄밀해진다. 최소한 나한테는 그랬다 ㅋㅋ
  • 다시 Challenge를 줄 차례다. 그러니 $c_2 \in \mathbb{Z}_q$를 하나 전달하자. $\mathcal{A}$가 $\alpha_{z_2}$를 줄 것이다. 이게 맞는지 판단하자.
  • 직관적인 증명에서도 언급했지만, 두 번 연속 accept가 뜨고 $c_1 \neq c_2$면 Discrete Logarithm이 깨진다.

그러니, 우리가 볼 확률은 "두 번 연속 accept가 뜨고 $c_1 \neq c_2$일 확률"이다. 이 확률의 lower bound를 구하면 되겠다.

 

이를 위해서 사용하는 정리가 Rewinding Lemma다. 사실 이거 보고 싶어서 책을 읽기 시작한 것이다 ㅎㅎ..

 

정리 (Rewinding Lemma) : $S, T$는 finite nonempty set이고 $f : S \times T \rightarrow \{0, 1\}$은 random function이다. 즉, $S \times T$의 원소가 input으로 들어오면 $0$ 또는 $1$을 그 원소에 대해 정해진 확률로 뽑아내는 함수이다. 이제 $X, Y, Y'$가 mutually independent random variable이고 $X$는 $S$ 위의 random variable, $Y, Y'$은 $T$ 위의 uniform random variable이라 하자. 이때, $\epsilon = P(f(X, Y) = 1)$이라 하고, $N = |T|$라 하자. 그러면 $$P(f(X, Y) = f(X, Y') = 1, Y \neq Y') \ge \epsilon^2 - \epsilon / N$$

 

첨언하자면, 원래 책에서는 $f$를 random function이 아니라 그냥 function으로 둔다. 하지만 개인적인 생각으로 이 context에서 $f$를 그냥 function으로 두면 안된다고 생각한다. adversary $\mathcal{A}$가 challenge $c$를 받은 뒤에도 확률적인 알고리즘을 사용할 수 있기 때문이다. 하지만 증명은 책처럼 그냥 계산이다.

 

정리 증명 : $p_x$를 $P(X = x)$라고 하고, $p_{xy}$를 $f(x, y) = 1$일 확률이라고 하자. (기존 증명에서는 $p_{xy}$가 0 or 1)

먼저 $s_x = \sum_{y \in T} p_{xy}$라 정의하면, $\epsilon N = \sum_{x \in S} p_x s_x$이 성립함은 정의상 자명하다. 이제 $$ P(f(X, Y) = f(X, Y') = 1, Y \neq Y') \ge \frac{1}{N^2} \sum_{x \in S} p_x (s_x^2 - s_x) \ge \frac{1}{N^2}((\epsilon N)^2 - \epsilon N) = \epsilon^2 - \epsilon / N$$을 얻는다. 첫 부등식은 단순 식 전개와 $0 \le p_{xy} \le 1$이므로 $p_{xy}^2 \le p_{xy}$가 성립함에서 얻어진다. 두 번째 부등식은 Cauchy-Schwarz에서 얻어진다.

 

이제 $S$를 $\alpha, u, u_t$ 등의 선택을 이루는 집합, $T$를 challenge space라고 하고, $f$값이 $1$이 나오는 것을 accept에 대응시키자.

그러면 모든 context가 정확하게 일치하고, 결국 $\epsilon' \ge \epsilon^2 - \epsilon / N$을 얻는다. 여기서 $\epsilon \le 1/N + \sqrt{\epsilon'}$을 얻는 것은 단순 식 조작. 증명 끝.

 

Honest Verifier Zero-Knowledge

정의 : Protocol이 Honest Verifier Zero-Knowledge라는 (HVZK) 것은, $vk$를 input으로 받고 Honest Prover와 Honest Verifier이 만드는 accepting conversation의 분포를 정확히 따르는 output을 뽑아내는 효율적인 Simulator가 존재한다는 것이다. 이는 모든 정당한 $(vk, sk)$ 쌍에 대해 성립해야 한다. 

 

정의 자체가 formal 하니, 이 정의가 우리의 직관과 맞는 이유를 설명해야 한다.

이 정의의 의미는, accepting conversation처럼 보이는 걸 만들기 위해서 $vk$만 알아도 충분하다는 것이다.

이는 역으로 생각하면, accepting conversation을 보는 것으로는 $vk$를 넘어서는 다른 정보를 뽑기가 불가능하다는 것이다.

만약 가능하다면, $vk$로 accepting conversation을 simulate 한 후, 그 결과를 그대로 사용해서 정보를 뽑으면 된다.

그러니 "accepting conversation을 활용해서 뽑을 수 있는 정보는 $vk$로도 그대로 뽑을 수 있다". 우리가 원하는 것이다. 

 

결론 : 공격자 또는 Verifier가 accepting conversation을 듣더라도 $sk$에 대한 추가적인 정보를 얻을 수 없다.

 

결국 Schnorr's Protocol에서 우리가 필요한 것은 $g^{\alpha_z} = u_t \cdot u^c$이다.

Protocol 자체에서는 $u_t$를 고르고, $c$를 받은 다음 $\alpha_z$를 제출해야 했고, 이 순서 때문에 Discrete Logarithm의 지식이 필요했다.

그러나 accepting conversation을 뽑아내기 위해서는, 순서를 바꿔서 $\alpha_z$와 $c$를 고른 다음 $u_t$를 계산하면 된다.

이 두 방법이 뽑아내는 결과가 같은 확률분포를 따름은 자명하고, 결국 Schnorr's Protocol이 HVZK임을 얻는다.

이와 같이, Simulator를 하나 설계하는 방식으로 HVZK를 증명한다. 비슷한 컨셉으로 Statistical ZK도 존재한다.

이 경우는, Simulator가 뽑아내는 분포가 Prover-Verifier가 뽑는 분포와 "가까우면" (Statistical Distance) 된다.

 

 

2. Schnorr's Signature와 그 안전성, 그리고 Fiat-Shamir Heuristic

이제 우리는 Schnorr's Protocol을 Signature Scheme으로 바꾸는 작업을 할 것이다. 이를 위해서, Fiat-Shamir Heuristic을 동원한다.

나중에 보면 알겠지만, 이는 interactive한 Schnorr's Protocol을 non-interactive 하게 바꾸는 역할도 할 수 있다.

 

Schnorr's Signature

그대로 비밀키는 $sk = \alpha$, 공개키는 $pk = u = g^{\alpha} \in \mathbb{G}$다. 해시 함수 $H : \mathcal{M} \times \mathbb{G} \rightarrow \mathcal{C}$를 하나 준비한다.

메시지 $m \in \mathcal{M}$을 서명하고 싶다면, 랜덤한 $\alpha_t \in \mathbb{Z}_q$를 고르고, $u_t = g^{\alpha_t}$를 계산한다.

그 후, $c = H(m, u_t)$를 계산한 다음, $\alpha_z = \alpha_t + \alpha c \in \mathbb{Z}_q$를 계산한다. 최종 서명은 $(u_t, \alpha_z)$가 된다. 

 

이제 이 서명을 Verify하려면, $m$과 그 서명 $(u_t, \alpha_z)$를 받고 $c = H(m, u_t)$을 계산한 다음, $g^{\alpha_z} = u_t \cdot u^c$인지 확인하면 된다.

이 과정은 공개키를 알고 있는 사람이면 할 수 있다. 핵심은 challenge를 해시 함수로 고른다는 것이다. 그리고 이게 Fiat-Shamir Heuristic이다.

 

Schnorr Signature's Security, Fiat-Shamir Heuristic : 직관

직관적으로는 해시 함수가 나오면 "아무것도 못하기 때문에", challenge를 해시로 잡나 완전히 랜덤으로 잡나 별 차이가 없을 것이다.

challenge가 정말 랜덤이면 서명을 만들기가 어렵다는 것을 이미 증명했으니, 해시를 어떻게 잘 비벼먹지 못한다면 이 서명 알고리즘도 안전할 것이다. 

암호학에서는 이처럼 "해시 함수가 나오면 아무것도 못한다"는 말을 formalize 하고, 하나의 model로 만들었다. 이를 Random Oracle Model이라고 한다.

상당히 사기같은 가정을 하나 깔고 가는데, 힘이 굉장히 강력하다. Random Oracle Model에 대한 고찰은 Matthew Green의 이 글 참고.

 

Random Oracle Model이란, 최소한 지금의 context에서는, 해시 함수 $H$를 하나의 Random Oracle로 보자는 것이다.

Random Oracle이란, 각 input에 대해서 output을 uniform random하게 뽑아내는 black-box이다.

단, 동일한 input이 이전에 들어왔다면, 이전에 뱉은 output을 그대로 뱉는다. 함수를 input을 받아가면서 uniform random하게 제작한다고 생각하자.

 

이렇게 생각하면, 해시 함수가 정말 "나오면 아무것도 못하는" 대상이 된다. 이 가정을 깔아야 안전성을 증명할 수 있다.

 

Schnorr Signature's Security, Fiat-Shamir Heuristic  : formal proof

이제 엄밀한 증명을 시작하기 전에, Signature Scheme이 안전하다는 것이 무엇인지를 정의할 필요가 있다.

 

Signature Security Game : 우리의 adversary $\mathcal{A}$는

  • $Q_s$개의 signing query를 보낼 수 있다. 즉, $m \in \mathcal{M}$을 보내서 그에 대한 정당한 서명을 얻는다.
  • $Q_{ro}$개의 random oracle query를 보낼 수 있다. 즉, $H$에 대한 input을 보내서 그에 대한 output을 얻는다.

목표는 메시지 하나에 대한 정당한 서명을 만들어 내는 것이다. 단, signing query에서 보냈던 메시지와 달라야 한다.

이 문제에 대한 advantage가 작다는 것을 보이는 것이 우리의 목표가 되겠다. 증명을 위해서, 하나의 게임을 더 정의해야 한다.

 

$r$-impersonation Game : 다시 Identification Protocol로 돌아오자. 우리의 adversary $\mathcal{A}$는

  • $r$명의 독립적인 Verifier와 동시에 대화할 수 있다. 그 중 아무 한 명에게 accept를 받는 증명을 만들면 성공. 

 

또한, 확률 계산을 편하게 하기 위해서 사용하는 보조정리를 몇 개 소개한다.

 

Difference Lemma : 사건 $W_0$와 $W_1$가 있다. 이때, 사건 $Z$가 있어 $W_0 \cap Z^C$가 발생하는 것이 $W_1 \cap Z^C$가 발생하는 것과 동치라면, $$ |P(W_0) - P(W_1)| \le P(Z)$$가 성립한다. 증명은 간단하다. $P(W_0 \cap Z^C) = P(W_1 \cap Z^C)$이므로, 결국 $$ |P(W_0) - P(W_1)| = |P(W_0 \cap Z) - P(W_1 \cap Z)| \le P(Z)$$

 

Union Bound : $P(A_1 \cup A_2 \cup \cdots \cup A_n) \le \sum_{i=1}^n P(A_i)$. 증명은 자명하므로 생략.

 

이제 본격적으로 증명을 하자. Singature Security => $r$-impersonation => Discrete Logarithm 순으로 증명을 한다.

 

Step 1 : $r$-impersonation에 대한 advantage의 upper bound를 구하자.

정리 (Forking Lemma) : $|\mathcal{C}| = N$이라 하자. efficient adversary $\mathcal{A}$가 $r$-impersonation을 advantage $\epsilon$으로 공격할 수 있다면, efficient adversary $\mathcal{B}$가 있어 $\mathbb{G}$ 위에서의 Discrete Logarithm 문제를 advantage $\epsilon'$으로 해결할 수 있다. 이때, $\epsilon' \ge \epsilon^2 / r - \epsilon / N$이 성립하고, 이를 정리하면 $$\epsilon \le r/N + \sqrt{r \epsilon'}$$

 

증명은 Schnorr's Protocol의 Soundness 증명과 크게 다르지 않다. $\mathcal{A}$가 승리하려면, 결국 $r$개의 Verifier 중 하나에게 accept를 얻어내야 한다.

이제 $i$번째 Verifier에게 accept를 얻어낼 확률을 $\epsilon_i$라 하면, 정의상 $\epsilon = \sum_{i=1}^r \epsilon_i$임이 자명하다. 이제 $\mathcal{A}$를 활용해서, $\mathcal{B}$를 제작해보자.

Soundness를 증명할 때와 같은 마음가짐으로 생각하자. 이제부터 우리는 $\mathcal{B}$의 입장에서 생각한다. 

  • 우리는 우선 $\mathcal{A}$를 위해서 $r$개의 Verifier 역할을 모두 해줘야 한다. 
  • $\mathcal{A}$ 역시 공개키 $u$는 알고 있는 상태다. $\mathcal{A}$에게 $u_t$들을 받자.
  • 이제 $r$개의 challenge $c_1, c_2, \cdots , c_r$을 $\mathcal{A}$에게 순서대로 주자. 
  • 그러면 $\mathcal{A}$가 그 $r$개의 challenge 중 하나에 대한 답을 줄 것이다. 이게 정당한지 확인을 하자.
  • $\mathcal{A}$가 $i$번째 challenge에 대한 답을 줬다고 하자. "$i$번째 challenge $c_i$를 주기 전"으로 $\mathcal{A}$를 Rewind 하자.
  • 우리는 $\mathcal{A}$에게 $i$번째 challenge로 $c_i$ 대신 새로운 random challenge $c'$을 준다.
  • 그 후, $i+1, i+2, \cdots, r$번째 challenge는 기존의 challenge $c_{i+1}, \cdots , c_r$을 그대로 준다.
  • 이제 다시 $\mathcal{A}$에게 $r$개의 challenge 중 하나에 대한 답을 받자. 이게 정당한지 확인을 하자.
  • $\mathcal{A}$가 $i'$번째 challenge에 대한 답을 줬다고 하자. 이제 알고리즘 종료.

만약 $i = i'$이고 $c_i \neq c'$이라면, 연립방정식을 통해서 $\alpha$를 계산할 수 있을 것이다. 

이제 index $i$를 통해서 $\alpha$를 계산하는 것에 성공할 확률을 (얻는 advantage를) $\epsilon'$이라 하자. 그러면 Rewinding Lemma에 의해서 $$\epsilon'_i \ge \epsilon_i^2 - \epsilon_i / N$$이 성립한다. 자세하게 설명하자면, Rewinding Lemma에서 $T$를 $i$번째 challenge로 놓고, $S$를 나머지 선택 모두라고 설정한다.

또한, $f$ 값이 $1$인 것을 "$i$번째 challenge에서 accept가 나왔다"라는 것으로 둔다. 그러면 모든 context가 맞고 Rewinding Lemma를 적용할 수 있다.

 

이제 남은 것은 마무리다. $\epsilon' = \sum_{i=1}^r \epsilon'_i$임은 자명하므로, Cauchy-Schwarz 부등식에서 $$\epsilon' = \sum_{i=1}^r \epsilon'_i \ge \sum_{i=1}^r \epsilon_i^2 - \epsilon_i / N \ge \epsilon^2 / r - \epsilon / N$$이며, 간단한 식 조작으로 $\epsilon \le r/N + \sqrt{r\epsilon'}$을 얻을 수 있다. 증명 끝.

 

Step 2 : Signature Scheme을 깨는 것에 대한 advantage의 upper bound를 구하자.

정리 : $Q_s$개의 signing query와 $Q_{ro}$개의 random oracle query를 날릴 수 있는 efficient adversary $\mathcal{A}$가 Signature Scheme을 advantage $\epsilon$으로 깰 수 있다고 하자. 그러면, efficient adversary $\mathcal{B}$가 존재하여 $Q_{ro}+1$-impersonation을 advantage $\epsilon'$으로 성공할 수 있으며, 이때 $$\epsilon \le Q_s(Q_s + Q_{ro} + 1) / q + \epsilon'$$

 

증명의 핵심 아이디어는 "signing query는 Simulator로 대답해도 된다"와 "Verifier의 challenge를 그냥 random oracle의 결과값으로 넣어도 된다".

 

기본 가정을 하나 가져간다. 만약 adversary $\mathcal{A}$가 최종적으로 제출하는 서명이 $(m, u_t, \alpha_z)$라면, $(m, u_t)$에 대한 random oracle query를 이미 한 것으로 간주한다. random oracle query를 날려서 $\mathcal{A}$가 볼 수 있는 손해는 query 개수가 하나 줄어든다는 것 외에는 없다는 것은 자명하다. 그러니, adversary가 사용할 수 있는 random oracle query의 개수를 $Q_{ro} + 1$로 늘려주는 것으로 이 가정에 대한 보상을 해주도록 한다.

 

notation이 몇 개 필요하다. random oracle의 함수를 저장하기 위한 $Map : \mathcal{M} \times \mathbb{G} \rightarrow \mathcal{C}$와, random oracle query를 저장하기 위한 $Explicit : \mathcal{M} \times \mathbb{G} \rightarrow \mathbb{N}$을 정의한다. 이들의 구체적인 정의는 뒤에서 할 것이다. 이제 본격적으로 증명을 하자.

 

$\mathcal{A}$가 $\epsilon$ 이상의 advantage로 다음 게임을 이길 수 있음은 자명하다.

 

Detail 1 : Signing Query

  • $i$번째 signing query로 메시지 $m_i$를 날리는 경우, 다음과 같은 알고리즘으로 생성된 대답을 받는다.
  • $\alpha_{ti}$를 $\mathbb{Z}_q$에서 랜덤하게 고르고, $u_{ti} = g^{\alpha_{ti}}$를 계산한다. $c_i$ 역시 $\mathcal{C}$에서 랜덤하게 고른다.
  • 만약 $(m_i, u_{ti})$가 Map의 domain에 있다면, $c_i = Map(m_i, u_{ti})$로 교체한다. - (*)
  • $Map(m_i, u_{ti})$의 값을 $c_i$로 설정한다. 이제 $\alpha_{zi} = \alpha_{ti} + \alpha c_i \in \mathbb{Z}_q$를 계산하고, $(u_{ti}, \alpha_{zi})$를 반환.

Detail 2 : Random Oracle Query

  • $j$번째 random oracle query로 $(\hat{m_j}, \hat{u_j})$를 날리는 경우, 다음과 같은 알고리즘으로 생성된 대답을 받는다.
  • 만약 $(\hat{m_j}, \hat{u_j})$가 Map의 domain에 있다면, $Map(\hat{m_j}, \hat{u_j})$를 반환한다.
  • 그렇지 않다면, $Explicit(\hat{m_j}, \hat{u_j}) = j$라고 하고 (받은 random oracle query의 index를 저장한다)
  • $Map(\hat{m_j}, \hat{u_j})$의 값을 $\mathcal{C}$에서 random하게 고른 뒤, 이 값을 반환한다.

$\mathcal{A}$가 서명을 하나 제출한다. 이때 $(m, u_t)$는 Explicit의 domain에 속한다고 가정한다. 이게 정당한 서명이면 승리.

 

$\mathcal{A}$가 제출하는 최종 서명의 $(m, u_t)$ 값이 Explicit 배열의 domain에 속해야 한다는 것에 대한 보충설명을 한다. random oracle query에 $(m, u_t)$를 보내야 함은 이미 가정을 통해서, (그리고 $Q_{ro}$를 $Q_{ro}+1$로 대체하는 것으로) 알고 있는 사실이다. 그런데 이미 이 순서쌍이 Map의 domain에 있다면 문제가 생긴다. 하지만, Map의 domain에 속하려면 애초에 Explicit 배열 안에 들어있거나 (즉, 이전 random oracle query에서 $(m, u_t)$가 이미 들어왔다) signing query에서 Map의 domain에 $(m, u_t)$가 들어와야 한다. 그런데 signing query에서 $(m, u_t)$가 Map의 domain에 들어왔다는 것은 사실 $m$에 대한 signing query가 들어왔다는 것이다. 우리는 이미 signing query를 제출한 메시지들에 대한 서명 제작은 공격으로 간주하지 않으므로, 이 경우는 일어날 수 없다. 

 

이제 굵은 글씨로 쓴 (*) 부분을 생각하자. 여기서 $(m_i, u_{ti})$가 겹칠 확률은, 즉 (*) 부분에 도달할 확률을 얼마일까?

겹치려면 기본적으로 $\alpha_{ti}$의 값이 겹쳐야 한다. random oracle을 access 하는 총 횟수가 최대 $Q_s + Q_{ro} + 1$번이므로, 임의의 signing query에서 겹칠 확률은 $(Q_s+Q_{ro}+1)/q$ 이하이다. 또한, signing query가 총 $Q_s$번 있으니, Union Bound에 의하여 한 번이라도 (*)에 도달할 확률은 최대 $Q_s(Q_s+Q_{ro}+1)/q$가 된다. 여기서 Difference Lemma를 사용하면, (*) 부분의 알고리즘을 지워도 $\mathcal{A}$가 이 게임을 이길 확률이 (advantage) 최소 $$\epsilon - Q_s(Q_s+Q_{ro}+1)/q$$ 이상이 된다는 것을 얻는다. 이제부터 (*) 부분의 알고리즘을 지운 상태에서 생각한다.

 

중간 점검을 하자. $\mathcal{A}$는 다음 게임을 $\epsilon - Q_s(Q_s+Q_{ro}+1)/q$ 이상의 advantage로 이긴다.

 

Detail 1 : Signing Query

  • $i$번째 signing query로 메시지 $m_i$를 날리는 경우, 다음과 같은 알고리즘으로 생성된 대답을 받는다.
  • $\alpha_{ti}$를 $\mathbb{Z}_q$에서 랜덤하게 고르고, $u_{ti} = g^{\alpha_{ti}}$를 계산한다. $c_i$ 역시 $\mathcal{C}$에서 랜덤하게 고른다. 
  • $Map(m_i, u_{ti})$의 값을 $c_i$로 설정한다. 이제 $\alpha_{zi} = \alpha_{ti} + \alpha c_i \in \mathbb{Z}_q$를 계산하고, $(u_{ti}, \alpha_{zi})$를 반환.

Detail 2 : Random Oracle Query

  • $j$번째 random oracle query로 $(\hat{m_j}, \hat{u_j})$를 날리는 경우, 다음과 같은 알고리즘으로 생성된 대답을 받는다.
  • 만약 $(\hat{m_j}, \hat{u_j})$가 Map의 domain에 있다면, $Map(\hat{m_j}, \hat{u_j})$를 반환한다.
  • 그렇지 않다면, $Explicit(\hat{m_j}, \hat{u_j}) = j$라고 하고 (받은 random oracle query의 index를 저장한다)
  • $Map(\hat{m_j}, \hat{u_j})$의 값을 $\mathcal{C}$에서 random하게 고른 뒤, 이 값을 반환한다.

이제 이 $\mathcal{A}$를 이용하여, $Q_{ro}+1$-impersonation을 성공시키는 $\mathcal{B}$를 제작하자.

$\mathcal{B}$는 $\mathcal{A}$를 위하여 두 종류의 쿼리를 답해야 하고, 동시에 $Q_{ro}+1$-impersonation도 진행해야 한다.

이제부터 우리는 $\mathcal{B}$ 입장에서 모든 것을 설명한다. 이제 이러한 사고방식이 익숙해졌을 것이라고 믿는다.

 

Detail 1 : Signing Query 대답하기

  • $i$번째 signing query로 메시지 $m_i$를 받은 경우, 다음과 같은 알고리즘으로 생성된 대답을 보낸다.
  • 이제 $(u_{ti}, c_i, \alpha_{zi})$를 accepting conversation에서 랜덤하게 뽑아도 된다. 이는 HVZK 성질에서 $\alpha$가 없어도 할 수 있다.
  • $Map(m_i, u_{ti})$의 값을 $c_i$로 설정하고, $(u_{ti}, \alpha_{zi})$를 보낸다. 다시 한 번 강조하지만, 우리는 $\alpha$의 값이 필요가 없었다.
  • 이렇게 해도 기존의 Signing Query의 대답 방식과 동일하다. 이것을 위해서 우리가 (*) 부분을 날린 것이다. 

Detail 2 : Random Oracle Query 대답하기

  • $j$번째 random oracle query로 $(\hat{m_j}, \hat{u_j})$를 받은 경우, 다음과 같은 알고리즘으로 생성된 대답을 보낸다.
  • 일단 $(\hat{m_j}, \hat{u_j})$가 이미 Map의 domain에 있다면, $Map(\hat{m_j}, \hat{u_j})$를 보내면 된다.
  • 아이디어는, 여기서 Explicit하게 대답한 결과를 challenge로, (즉 해시 결과로) 하는 서명이 $\mathcal{A}$에게 나온다는 것이다.
  • 그러니 $\mathcal{B}$는 새로운 Verifier $V_j$를 하나 불러서, $\hat{u_j}$를 보내고 challenge 값 $c_j$를 받는다. 
  • 이제 Random Oracle 값을 $c_j$로 돌려준다. 즉, $Map(\hat{m_j}, \hat{u_j}) = c_j$라 한다. $c_j$ 역시 random이니 문제 없다.
  • 만약 $\mathcal{A}$가 이에 대한 대답에 성공하면 그대로 $V_j$에게 제출하면 된다!!

즉, $(m, u_t, \alpha_z)$가 새로운 서명이라면, $(\hat{m_j}, \hat{u_j}) = (m, u_t)$인 $j$가 있을 것이고, $V_j$에 $\alpha_z$를 제출하면 성공.

 

그러니 $\epsilon' \ge \epsilon - Q_s(Q_s + Q_{ro} + 1)/q$로 성공하는 $r$-impersonation adversary를 제작하는 것에 성공했다.

 

즉, Signature를 깨는 adversary => $r$-impersonation을 깨는 adversary => Discrete Logarithm을 깨는 adversary를 차례대로 제작했다.

위 결과들을 전부 합치는 것으로 Discrete Logarithm이 어렵다는 가정 + Random Oracle Model에서 Schnorr's Signature의 안전성을 얻는다.

 

정리 : 이전 정리들의 notation을 그대로 가져온다. Signature Scheme을 $\epsilon$의 advantage로 깨는 efficient adversary $\mathcal{A}$가 있다면, Discrete Logarithm을 $\epsilon'$의 advantage로 해결하는 efficient adversary $\mathcal{B}$가 존재한다. 이때, 다음 식이 성립한다. (즉, DL이 어려우면 Signature를 깨는 것도 어렵다) $$\epsilon \le Q_s(Q_s+Q_{ro}+1)/q + (Q_{ro} + 1)/N + \sqrt{(Q_{ro}+1) \epsilon'}$$

This post attempts to (in a half-mathematical, half-intuitive way)

  • briefly explain zero-knowledge proofs and their definitions
  • show an example with Schnorr's protocol for proving knowledge of discrete log
  • introduce the integer commitment scheme of Damgard and Fujisaki (2001)
  • introduce diophantine sets, and diophantine proof of knowledge (2003)

I'm also attempting to write a demonstration for this paper. (with additional assumptions and simplifications) Here's the link.

 

1. Zero Knowledge Proofs

 

Here's a very well-written introduction for zero-knowledge proofs by Matthew Green

Zero-knowledge proofs are proofs that reveals nothing except for the assertion that the statement one is trying to prove is correct. For example, if I want to prove to a verifier that "I have this secret value $x$ satisfying some property", I want to do so without giving any extra information on $x$. At the same time, we want this proof to have the fundamentals of our intuition of a "proof" - that is, the verifier can be convinced of the proof if the statement is true, and the verifier can reject the proof if the statement is false.

 

To summarize, we want

  • Completeness : If statement is true, the verifier properly following the protocol can verify the proof.
  • Soundness : If statement is false, the verifier properly following the protocol can reject the proof with overwhelming probability.
  • Zero-knowledge : If statement is true, the verifier learns nothing except for the fact that the statement is true.

We call people (prover, verifier) that are properly following a protocol to be honest.

We call people (prover, verifier) that are not properly following a protocol to be malicious.

For example, a malicious prover may want to forge a "proof" for a statement that is not true.

Also, a malicious verifier may want to extract some extra knowledge from the proof by not following the protocol precisely.

 

So we have this "learns nothing except for the fact that the statement is true" thing : how do we formalize it in mathematical terms?

The proofs we will deal in this writeup will be interactive proofs - proofs where the prover and verifier interact with each other to see whether the prover's claim is true of not. Also, the proof protocol will not be deterministic. Therefore the "proof script" - the complete interaction of the honest prover and verifier - will follow some distribution. If we simulate this proof protocol "precisely" by only using the statement that is being asserted, this will intuitively be a good definition of "zero-knowledge". Summarizing, we have two distributions : 

  • The distribution of the actual "proof script" between the honest prover and the verifier
  • The distribution of the simulated "proof script" designed by only using the statement that is being asserted

 

Now we can truly define what it is to be "zero-knowledge" - 

  • Perfect Zero-Knowledge : No matter what verifier does, there's a simulated "proof script" that follows the exact same distribution with the actual "proof script" - so it is impossible to gather any extra knowledge, even with infinite computational resources
  • Statistical Zero-Knowledge : The same as perfect zero-knowledge, but now the two distributions does not need to be the same - only "close". How do we determine if two distributions are close? Check out statistical distance
  • Computational Zero-Knowledge : The same, but the two distributions are computationally hard to distinguish.
  • Honest-Verifier Zero-Knowledge : We now add the assumption that the verifier is honest. 
Dealing with malicious verifier is quite tricky, so we will deal with honest verifiers for the rest of this writeup. 
 
 
2. An example : Schnorr's Protocol
 
Here, we quickly describe Schnorr's Protocol for proving the knowledge of discrete logarithm.
We only consider the honest-verifier version, as it is much easier to understand the reasoning behind.
 
Consider a group $G$ with prime order $p$ - obviously it is a cyclic group. Prover & Verifier both know a generator $g \in G$ and some $y \in G$.
The discrete logarithm of $y$ over base $g$ is $x$ such that $g^x = y$, and it is generally hard to compute.

 

The prover now wants to prove their knowledge of $x$ such that $g^x = y$, without revealing any additional info on $x$.
To do this, Schnorr's protocol works as follows - all randoms are uniform random.
  • Prover generates a random $r \in [0, p)$ and sends $g^r$ to the verifier.
  • Verifier issues a random challenge $c \in [0, p)$ and sends $c$ to the prover.
  • Prover sends $z = (r + cx) \pmod{p}$ to the Verifier. 
  • Verifier checks if $g^z = g^r y^c$ is true. If not, the proof is false.
  • They repeat the process until the probability that a malicious prover got away with a fake proof is small as desired.
 
Now let us check the three properties we need under the honest-verifier assumption.
  • Completeness : If prover does know $x$, we see that $g^z = g^{r+cx} = g^r y^c$ is indeed true, so the verifier accepts it.
  • Soundness : Here's an intuitive explanation that can be outlined to a proof. If some prover can answer the verifier's challenge with a high probability, the prover should know the value of $(r + cx) \pmod{p}$ for many values of $c$. From these values, one can easily recover the value of $x$. Therefore, we have proved that the prover must actually know $x$ in order to answer the challenges well.
  • Zero-Knowledge : The actual proof script is $(g^r, c, (r + cx) \pmod{p})$ for i.i.d. $r, c \in [0, p)$. This is equal to the distribution of $(g^z y^{-c}, c, z)$ for i.i.d. $c, z \in [0, p)$. Therefore, we can perfectly simulate the proof script only using $g, y$ and the statement $g^x = y$. 

This proves that the Schnorr's Protocol is honest-verifier perfect zero knowledge. 

If the challenge is selected in $[0, 1]$ (binary challenge) the protocol can be proved to be perfect zero-knowledge.

 

 

3. Integer Commitment - Damgard & Fujisaki
 
Consider the following situation : you want to make a prediction about the future, but you don't want to reveal it immediately for whatever reason. What you want to do is wait until you know whether you got it correct, and if you did, you want to prove that you predicted the future correctly. How would one do this? One method (for one time use) is to use a cryptographic hash function.

 

Consider a (deterministic) hash function $H$ such that 
  • It is hard to generate a collision pair - i.e. $m \neq m'$ such that $H(m) = H(m')$.
  • It is hard to find a preimage - i.e. given $H(m)$, it is hard to recover $m$.
  • A small change in the message $m$ leads to a huge change in the hash $H(m)$.

Now what we can do is announce to the world that you have made a prediction with hash $H(m)$. 

People who see the value $H(m)$ cannot recover the value $m$ since it is hard to find a preimage. 
After that, you can claim that you predicted $m$, by showing that the hash of $m$ is indeed equal to $H(m)$.
Since it is hard to generate a collision pair, you can't claim that you predicted something different, like $m'$. 
 
This is a very simple scheme with some flaws (for example, you can't use it twice on the same message) but it's still cool since
  • Binding : Once you commit $m$, you cannot go back to another message $m'$.
  • Hiding : No one can recover the value of $m$ from $H(m)$, so it hides the value of $m$.

 

Commitment schemes are of similar nature. Here, we will specifically look at integer commitment.

We want the cool properties of binding and hiding, and we want them to be defined clearly. Here's how we do it.

  • Consider a deterministic commitment function $C$ that takes two integers as input.
  • To commit an integer $x$, we generate a random integer $r$ and use $C(x, r)$ as our commitment value.
  • The constraints on $x$ and the interval of $r$ to be selected from uniformly will be determined later.
  • Binding : It is difficult to find $x, x', r, r'$ such that $x \neq x'$ and $C(x, r) = C(x', r')$.
  • Hiding : For any $x, x'$, the distributions of $C(x, \cdot)$ and $C(x', \cdot)$ are equal/statistically close.
 
Now, what if we want even more out of our integer commitment scheme? Here's an additional property that would be cool if we have it.
  • Summation Protocol : If prover has three integers $a, b, c$ such that $a + b = c$ and their respective commitment $A, B, C$, they can prove that $a + b = c$ in a zero-knowledge way using only the commitment values $A, B, C$. 
  • Multiplication Protocol : If prover has three integers $a, b, c$ such that $ab = c$ and their respective commitment $A, B, C$, they can prove that $ab = c$ in a zero-knowledge way using only the commitment values $A, B, C$. 

In other words, the prover can claim that "these commited values actually have this sum/product relation" in a zero-knowledge way.

 

It turns out that there is such a method, and it was devised by Damgard and Fujisaki in this paper

To make explaining things much easier, we will cover only a part of the results shown in the paper. To be exact,

  • We will only cover a specific case of the originally much, much more general construction of the scheme.
  • We will not discuss the details of the proof of why the schemes are valid, but discuss some intuition & insights.
  • Some protocols outlined below are not from the paper - these are mostly my thoughts & guesses.
  • We will only consider the honest-verifier case - the transformation from honest-verifier case to the general case is dealt in the paper.
  • The paper for Diophantine Argument of Knowledge also deals with extensions of this scheme. We do not deal with them here.

 

Now we discuss the actual scheme by Damgard and Fujisaki. We first need to describe the setup process.

  • Setup - Part 1. The verifier takes two distinct, large safe primes $P, Q$ and let $n = PQ$. From the definition of safe primes, we can write $P = 2p+1$, $Q = 2q+1$ with $p, q$ being a prime. The verifier then constructs an element $h \in \mathbb{Z}_n^{\times}$ such that $h$ has order $pq$. From now on, we will work in the cyclic group $\langle h \rangle \le \mathbb{Z}_n^{\times}$ for our commitments. 
  • Setup - Part 2. Assume that $n$ is a $k$-bit modulus - then anyone who knows $n$ also knows that the cyclic group generated by $h$ has order less than $2^B$ for $B = k$. This is an important piece of information for statistical zero-knowledge.
  • Setup - Part 3. The verifier generates $\alpha$ randomly from $[0, 2^{B+k})$, and sets $g = h^{\alpha}$. The verifier sends $n, g, h$ to the prover, and the verifier proves the knowledge of $\alpha$ such that $g = h^{\alpha}$ in a zero-knowledge way. This can be done with a binary challenge process similar to Schnorr's protocol. It's important to note that since factorizing $n$ is hard, the prover does not know the order of $h$.
  • Note that the prover also knows the values of $B$ and $k$, since they can be easily derived from $n$.
  • Setup - Part 4. We also need an additional parameter $C$ - an higher value of $C$ will result in lower error probability, but at the same time we need $C$ to satisfy one of our assumptions below. Because we are dealing with a specific case of a much general construction in the paper, setting $C$ as high as $pq$ is not an issue. For more insight on selecting $C$, it is recommended to refer to the original paper.

 

Now that we know what we are working with - integers modulo $n$ as commitment, we can outline some assumptions.

While there are actually more assumptions involved, using the safe prime construction only leaves us with two - 

  • Strong Root Assumption : Basically, if one is given a random $y \in \langle h \rangle$, then it is hard to find $x \in \langle h \rangle$ and $t \ge 2$ such that $y = x^t$.
  • Small Order Assumption : Basically, it is hard to find a $\sigma$ and $b \in \langle h \rangle$ such that $0 < \sigma < C$ and $b \neq 1$ and $b^\sigma = 1$. 

In the safe prime construction, we can just replace the two with the Strong RSA assumption, alongside with a suitable value of $C$.

 

 

Now we discuss how to commit integers. To commit an integer $x$, the prover selects some $r \in [0, 2^{B+k})$ and makes a commitment as $C(x, r) = g^x h^r$. It can be proved that this commitment scheme has the (statistical) hiding property and the binding property. 

 

Also, from now on, we assume that the integers being commited are in some finite interval $[-T, T]$. This is a required assumption for proofs to be zero-knowledge. Of course, a malicious prover can try to commit integers that are not in this interval - therefore, the verifier must also ask for a proof that the integer is indeed in this interval. The method for this "range proof" will be outlined in the next section.

 

 

Now we discuss the proofs between the prover and the verifier. There are many things we want to prove, these include

  • Proving you know how to open : Assume the prover has some integer $x$ and its commitment $C$. The prover now wants to prove the knowledge of $x, r$ such that $C = C(x, r)$ - can it be done without leaking information on $x, r$?
  • Summation Protocol : If prover has three integers $a, b, c$ such that $a + b = c$ and their respective commitment $A, B, C$, they can prove that $a + b = c$ in a zero-knowledge way using only the commitment values $A, B, C$. 
  • Multiplication Protocol : If prover has three integers $a, b, c$ such that $ab = c$ and their respective commitment $A, B, C$, they can prove that $ab = c$ in a zero-knowledge way using only the commitment values $A, B, C$. 

 

Proving you know how to open

  • Keynotes : We imitate Schnorr's protocol - but the range we choose our parameters from needs to be selected carefully.
  • Step 0. Prover has some commitment $C = C(x, r)$ and would like to prove they know how to open.
  • Step 1. Prover chooses some random $y \in [0, TC 2^k)$ and $s \in [C 2^{B+2k})$, sends $d = g^y h^s$.
  • Step 2. The verifier issues a challenge $e \in [0, C)$ and sends it to the prover.
  • Step 3. Prover sends $u = y + ex$ and $v = s + er$ - verifier checks $g^u h^v = dc^e$

 

Summation Protocol

  • Keynotes : The key is that if $A = g^a h^{r_1}$, $B = g^b h^{r_2}$, $C = g^c h^{r_3}$ with $a + b = c$, we know the discrete logarithm of $C(AB)^{-1} = h^{r_3-r_1-r_2}$ over base $h$. Since the prover cannot calculate the discrete logarithm of $g$ over $h$, this can be a proof.
  • Step 0. Prover has three commitments $A, B, C$ of $a, b, c$ and would like to prove $a + b = c$.
  • Step 1. Prover first proves that they can open the commitments $A, B, C$ in a zero-knowledge way.
  • Step 2. Prover then proves the knowledge of discrete logarithm of $C(AB)^{-1}$ over base $h$ in a zero-knowledge way. Since we have assumed honest-verifier setting, it can be done in a way similar to Schnorr's protocol. Of course, we have to be careful about the range we choose our parameters from. The same applies for the Setup stage, where the verifier proves the knowledge of $\alpha$ to the prover. For details, refer to the original paper, page 5. This completes the proof of $a + b = c$, in a zero-knowledge way.

 

Multiplication Protocol

  • Keynotes : The key is that if $A = g^a h^{r_1}$, $B = g^b h^{r_2}$, $C = g^c h^{r_3}$ with $ab = c$, we have $C = A^b h^{r_3 - br_1}$.
  • Step 0. Prover has three commitments $A, B, C$ of $a, b, c$ and would like to prove $ab = c$.
  • Step 1. Prover chooses random $y \in [0, TC2^k)$, $s_2 \in [0, C 2^{B+2k})$, $s_3 \in [0, TC2^{B+2k})$.
  • Step 2. Prover sends $d_2 = g^y h^{s_2}$, $d_3 =  A^y h^{s_3}$ to the verifier.
  • Step 3. Verifier issues challenge $e \in [0, C)$ and sends it to the prover.
  • Step 4. Prover sends $u = y + eb$, $v_2 = s_2 + er_2$, $v_3 = s_3 + e(r_3 - br_1)$ to the verifier.
  • Step 5. Verifier checks if $g^u h^{v_2} = d_2 B^e$, $A^u h^{v_3} = d_3 C^e$ holds.

 

We will now (very) briefly sketch how the each protocols are proved to be zero-knowledge. The stuff going on is basically

  • Proving Completeness : Trivial - just substitute all values in and check if the equation is true.
  • Proving Soundness : "Standard proof techniques for soundness" + Assumptions (Strong Root, Small Order, Strong RSA, etc)
  • Proving Zero-Knowledge : Done by simulation - the choice of the intervals in which we select our parameters comes into play here.
  • Additional Notes : It's very important that the prover does not know the order of $h$ - for example, if the prover knew the order $pq$, they can forge a commitment of $x$ into a commitment of $x + pq$ easily. However, this condition makes it hard for the prover to truly generate a "uniform random distribution" (for example, in Schnorr's protocol, the prover generates the integer in $[0, p)$, where $p$ is the group order) - and this is why we need statistical zero-knowledge instead of the "perfect" variant. It's quite tricky...

 

 

4. Diophantine Sets and Diophantine Argument of Knowledge

 

Now let's think about what we can do with our integer commitment scheme. Working with integers in $[-T, T]$, we can 

  • Prove $a + b = c$ with only commitments, in a zero-knowledge way. 
  • Prove $ab = c$ with only commitments, in a zero-knowledge way.

It's clear that by using addition and multiplication protocols we can actually prove that we have computed an integer coefficient multivariable polynomial on some input. In other words, we can prove that $y = f(x_1, x_2, \cdots , x_n)$, for some integer coefficient polynomial that both prover & verifier know using only the commitment values for $x_i$'s and $y$ in a zero-knowledge way. Here's an easy example.

  • Prover has some values $x_1, x_2, x_3, x_4$ that satisfies $x_4 = x_1x_2 + x_3$. How to prove it?
  • Prover calculates $x_5 = x_1x_2$ and commits $x_1, x_2, x_3, x_4, x_5$.
  • Prover can now prove $x_5 = x_1x_2$ and $x_4 = x_3 + x_5$ in a zero-knowledge proof, only using commitments.

 

While that's cool and already has quite a lot of applications, it's quite limited. There are plenty of prepositions that one would like to prove that does not have the form of "I evaluated a integer coefficient polynomial"... - or are there?

 

To dig deeper here, we need the notion of Diophantine Sets. 

  • Diophantine Sets : A set $S \subset \mathbb{Z}^k$ is called Diophantine if and only if there exists a integer coefficient multivariate polynomial $P$ such that $v \in S \iff \exists w \in \mathbb{Z}^{k'} \text{  s.t.  } P(v, w) = 0$, i.e. if $v \in S$ iff $v$ is a part of a solution for a fixed Diophantine equation.
  • In the above definition, we call $P$ as a representing polynomial of $S$, and $w$ as a witness.

This notion leads us to a much more versatile approaches for a proof. If $S$ is Diophantine and I want to prove $v \in S$, I can

  • Find a representing polynomial $P$ of $S$ and publicize it along with the full formula & proof for $P$.
  • To prove $v \in S$, find a witness $w$. Prove $P(v, w) = 0$ using integer commitment scheme.

This is the fundamental idea of Diophantine Argument of Knowledge, abbreviated as DARK.

The obvious question is "what sets are Diophantine?" : after all, it should cover a lot of different sets for this to have practical meaning.

 

Here's one of the more surprising results in mathematics - 

  • Computably Enumerable Sets : A set $S$ is computably enumerable if and only if there is an algorithm that halts if the input is a member of $S$, and runs forever if otherwise. Equivalently, a set $S$ is computably enumerable if there is an algorithm (not necessarily halts) that enumerates the members of $S$. Obviously, a lot of sets we deal with are computably enumerable.
  • Matiyasevich's Theorem (MRDP Theorem) : [Diophantine Sets] = [Computably Enumerable Sets]

so a metric ton of sets are Diophantine. However, to put into practical use, more questions must be asked.

  • How do we even find the suitable representing polynomial $P$? How do we prove it?
  • If we found $P$, how do we find the witness $w$? Is the size (number of bits) of $w$ reasonable/practical?

Therefore, we deal with special Diophantine sets that 

  • have representing polynomial $P$ (we can actually construct)
  • has a polynomial time algorithm to compute the witness $w$, which has polynomial length.

In this paper, we narrow down our choices even further, by adding the constraint

  • the length of our witness has to be subquadratic to the length of the input

which is important for practical uses. Now our question is "what can we prove under these constraints?".

 

 

5. Tricks, Range Proofs, Exponential Relations, and Bounded Arithmetic

 

Tricks

Here we outline some tips and tricks that we will use later on. Suppose we have two Diophantine sets $S_1$ and $S_2$, with respective representing polynomials $P_1, P_2$. How do we deal with $S_1 \cap S_2$ or $S_1 \cup S_2$? These will be our way to deal with and/or operations on prepositions. 

  • $S_1 \cap S_2$ : We use $P_{\cap}(v, w_1, w_2) = P_1(v, w_1)^2 + P_2(v, w_2)^2$ as our polynomial.
  • $S_1 \cup S_2$ : We use $P_{\cup}(v, w_1, w_2) = P_1(v, w_1) \cdot P_2(v, w_2)$ as our polynomial.

It's relatively clear that these two work as desired, and witnesses can be transported over as well.

 

Range Proofs

We have a homework from chapter 3 - we have to prove a value is in some range for the scheme to work.

To prove $-T \le x \le T$, it suffices to prove $T-x \ge 0$ and $T+x \ge 0$. Therefore, it suffices to have a scheme that proves an integer is nonnegative. To do this, it suffices to have a nice representing polynomial $P$ for nonnegative integers, with witness easy to find.

  • Construction : We use the polynomial $P(x, a, b, c, d) = x - a^2 - b^2 - c^2 - d^2$.
  • Proof (representation) : Obviously, if $P(x, a, b, c, d) = 0$, we have $x = a^2 + b^2 + c^2 + d^2 \ge 0$. On the other hand, if we have $x \ge 0$, we can write it as $a^2 + b^2 + c^2 + d^2$ by Lagrange's Four Square Theorem.
  • Proof (efficiency) : It is clear that the witness size is not an issue here. We show that it's feasible to find $a, b, c, d$ such that $a^2 + b^2 + c^2 + d^2 = x$. A quick outline of an (probabilistic) algorithm is as follows - 
  • Algorithm : If $x$ is small, we can simply brute force over $a, b, c, d \in [0, \sqrt{x}]$. If $x$ is large, take $c$ as a random value in $[0, \sqrt{x}]$ and $d$ as a random value in $[0, \sqrt{x-c^2}]$. Now, we pray that $x - c^2 - d^2$ is actually a prime of the form $4k+1$. Heuristically, with Prime Number Theorem, we can see that there exists a good probability that this holds. Now all we need to do is write $x-c^2-d^2$ as a sum of two squares. There exists a few fast algorithms that writes a $4k+1$ prime as a sum of two squares - check out this cool thread.

Now we can argue stuff like $a \ge b$ in our proofs, and it gives us much more versatility! 

 

Exponential Relations

Here, our goal is to prove $c =  a^b$. Our views on representation polynomial are a bit different since we now have a view that is focused on practical applications - we will change it as follows. This turns out to be important for proving $c = a^b$ zero-knowledge.

  • If $v \in S$, we should be able to efficiently find a polynomial length $w$ such that $P(v, w) = 0$.
  • If $v \notin S$, we should not be able to efficiently find a polynomial length $w$ such that $P(v, w) = 0$ - one way to prove this "not able to efficiently find" thing, is to prove that all the fake "witness" $w$ with $P(v, w) = 0$ has very large length.

We can now enjoy the following theorem, and I will not even try to type this out or code this.

Let's decipher this. Since the expressions (E1-E10) are all prepositions that can be written as a polynomial equation, we can combine them as a one big integer coefficient multivariate polynomial $P$ with our "trick". Basically, if $\mu_1^{\mu_2} = \mu_3$, we can efficiently find our witness for $P$ that has subquadratic length. If $\mu_1^{\mu_2} \neq \mu_3$, either the witness for $P$ does not exist, or the witness has a large length, $\Omega(\mu_3 \log \mu_3)$ - which makes it impractical to use as a fake "proof" that $\mu_1^{\mu_2} = \mu_3$. We can also take care of edge cases like $\mu_1=0, 1$, $\mu_2 = 0, 1, 2$, $\mu_3=0$ easily with our "trick" as well. This shows that we can completely prove $a^b = c$ with DARK, zero-knowledge. 

 

Bounded Arithmetic

Now that we have a lot of tools at hand, we can take a look at what we can do.

  • Bounded Arithmetic : We work over the nonnegative integers, and only use the following operations
  • $0$, $\sigma$, $+$, $\cdot$, $\le$, $-$, $|x|$, $\lfloor x/2 \rfloor$, $\lfloor x/2^k \rfloor$, $\sharp$
  • $0, +, \cdot , \le , \lfloor x/2 \rfloor , \lfloor x/2^k \rfloor$ have usual definitions.
  • $\sigma(x)$ is simply $x$'s next integer, $x + 1$. 
  • $-$ is a bit different because we are working over nonnegative integers, $x-y$ is actually $\max(x-y, 0)$.
  • $|x|$ is the bitwise length of $x$, i.e. $\lfloor \log_2 (x) \rfloor + 1$, excluding the case $x = 0$. $x \sharp y$ is defined as $2^{|x| \cdot |y|}$

Since we now have and/or of prepositions, addition, multiplication, exponentiation ready to be proved in a zero-knowledge way, we can combine these with relative ease to show that all of those operations can be used, and proved in a zero-knowledge way. It seems that bounded arithmetic is quite researched, and a lot of useful prepositions can be written using the bounded arithmetic language.

 

Here's an outline of proof - 

  • $0, +, \cdot$ : We already know how to prove these by our integer commitment scheme.
  • $ \le $ : We studied how to do range proofs - simply proof $b - a \ge 0$ to show $a \le b$. 
  • $ - $ : $a - b = c$ is either ($a = b+ c$ and $c \ge 0$) or ($a \le b$ and $c = 0$), so combine.
  • $|x|$ : Deal with the case $x=0$ separately, and write $y = |x|$ as $2^{y-1} \le x \le 2^y-1$. Now do range proofs & exponentiation.
  • $\lfloor x/2 \rfloor$ : $y = \lfloor x/2 \rfloor$ is simply $x = 2y$ or $x = 2y + 1$, so combine them.
  • $\lfloor x/2^k \rfloor$ : $y = \lfloor x/2^k \rfloor$ is simply $x = 2^ky + z$ and $0 \le z \le 2^k-1$, so combine them.
  • $\sharp$ : Since we can do proofs for $|x|$ and proofs for exponentiation, combining is quite trivial.

There are definitely more content in this paper, including some practical applications and reduction of proof size.

There's also a relatively new paper in 2019 that is much harder and very interesting. Might try to read this one...

main.pdf