A graph
In the following we describe the Blum protocol. Let the graph
- The prover samples a random permutation
$\phi$ over$n$ vertices. Then it uses$\phi$ to construct$\phi(G)$ which is a permuted version of the adjacency matrix of~$G$. Next,$P$ commits to each edge in the permuted adjacency matrix. Let$C_\phi(i,j)$ denote a commitment resulting from running the \textit{Commit} algorithm on the$\phi(G)(i,j)$ , so$C_\phi$ is a matrix of commitments. The opening keys of these commitments are stored in a matrix$D_\phi$ . Additionally,$P$ commits to the permutation$\phi$ that was used to permute the adjacency matrix; denote this commitment by$p_\phi$ and its respective opening key by$q_\phi$ . Finally, the prover proceeds by sending$p_\phi$ and$C_\phi$ to the verifier. - The verifer replies with a challenge bit
$b \in {0,1}$ sampled uniformly at random. - The prover receives the bit
$b$ . If$b = 0$ then prover sends the permutation$\phi$ and opening keys$D_\phi$ and$q_\phi$ to the verifier. That is, it opens commitments to the permuted graph and to the permutation. Otherwise, if$b = 1$ then prover uses the permutation$\phi$ on$w$ which translates it to the Hamiltonian cycle in$\phi(G)$ . Finally, the prover sends$\phi(w)$ and the opening keys from$D_\phi$ for only those entries whose edges appear in~$\phi(w)$. - If the challenge bit was zero (i.e.,
$b=0$ ) then verifier receives a permutation$\phi$ , opening keys$D_\phi$ and$q_\phi$ . It uses the commitment verification algorithm \emph{Verify} to check that$q_\phi$ is a correct opening for$\phi$ and that$D_\phi$ is a correct opening for$\phi(G)$ . However, if$b = 1$ , then verifier receives a cycle$\phi(w)$ and openings for its edges. It checks that the received cycle is Hamiltonian and that the openings corresponding to the edges of$\phi(G)$ are all 1. (That is, that$\phi(G)$ is indeed a subgraph of the committed graph.)
Commitment Scheme. The security properties of the Blum protocol depend on the hiding and binding properties of the underlying commitment scheme. More specifically, special soundness, extractability, and soundness depend on the binding property, and zero-knowledge depends on the hiding property of the commitment scheme. In our formalization we assumed that the commitment scheme is statistically hiding and computationally binding.\footnote{We choose this direction because in the context of this paper, computational soundness is more interesting that computational ZK: Analyzing computational soundness showcases the use of rewinding in the computational setting (i.e., in a setting involving reductions).} As a result we proved that our variant of Blum protocol has computational special soundness, extractability, and soundness. At the same time zero-knowledge is statistical.
Completeness. The completeness of the Blum protocol relies on the correct operation of the commitment scheme. In our formalization we assumed that the commitment scheme always produces functional commitment-opening pairs. In this case the Blum protocol has perfect completeness.
Special Soundness. The special soundness of the Blum protocol depends on the binding property of the used commitment scheme. Let
Based on this idea we implemented a function |special_soundness_extract| which returns
To sum up, the probability of unsuccesfull witness extraction from two valid transcripts is bounded from above by the probability of a successfull attack on the binding of a commitment scheme:
lemma blum_spec_soundness: forall &m,
Pr[Extractor(P).extract(s)@&m:
valid_transcript_pair s r.1 r.2 /\
!soundness_relation s
(special_soundness_extract s r.1 r.2) ]
<= Pr[r <- BindingExperiment(
BlumBinder(Extractor(P))).main()@&m: r].
In our formalization, the \textbf{proof of knowledge} and \textbf{soundness} of Blum protocol are automatically derived by our generic lemmas from |blum_spec_soundness|.
Zero-Knowledge. In our formalization we derived zero-knowledge from a "one-shot'' simulator. Similarly to the Fiat-Shamir protocol, in the Blum protocol we define a "one-shot'' simulator which starts by trying to guess the challenge of the verifier. Next, assuming that the guess is correct, the simulator prepares a commitment to which it is going to be able to provide a response which will verify correctly. More specifically, if the ``one-shot'' simulator guesses that the verifier sends a
The proof of the properties for the described ``one-shot'' simulator are not trivial. In our formalization, we give a sequence of cryptographic games which establish that if malicious verifier acts differently in the simulation and the real interaction with the honest prover then this verifier can be reduced to an attacker which breaks the hiding property of the commitment scheme.
- Blum_Basics.ec
module HP- honest prover.op verify_transcript- verification function of honest verifier.
- Blum_Completeness.ec
lemma hc_completeness- direct proof of one-round completeness.lemma hc_completeness_iter- automatic conclusion of iterated completeness from one-round completeness.
- Blum_SpecialSoundness.ec - direct proof of perfect special soundness.
op special_soundness_extract- function for witness extraction from two valid transcripts.module SpecialSoundnessAdvReduction- adversary who breaks binding of a commitment scheme if functionspecial_soundness_extractfails to return a valid witness.lemma hc_computational_special_soundness_binding- proof thatSpecialSoundnessAdvReductionsucceeds in breaking binding if witness extraction fails.
- Blum_Extractability.ec
lemma hc_computational_PoK- automatic conclusion of computational extractability from special soundness.
- Blum_Soundness.ec
lemma hc_computational_soundness- automatic conclusion of computational soundness from extractability.
- Blum_Sim1Property.ec
module Sim1- one-time simulatorlemma sim1_rew_ph- Sim1 rewinds itself in case of bad-eventlemma sim1_succ- probability of success-eventlemma sim1_error- conditional indistinguishability
- Blum_ZeroKnowledge.ec
lemma hc_statistical_zk- automatic one-round zero-knowledge from Sim1 propertieslemma hc_statistical_zk_iter- automatic iterated zero-knowledge from one-round zero-knowledge