Protocolo de Cramer-Damgard-Schoenmakers
# Protocolo de Cramer-Damgard-Schoenmakers

El protocolo de Cramer-Damgard-Schoenmakers o protocolo CDS, también conocido por los nombres protocolo de testigo indistinguible o técnica k-de-n ZKP (del inglés 1-out-of-n ZKP technique) permite probar que se conoce la solución de k problemas de un conjunto de n problemas (k<n) sin revelar para cuales de los problemas se tiene la solución.

## Descripción

Supongamos que:

* Existen n diferentes cuestiones $Q_{1},Q_{2},...,Q_{n}$
* El probador P quiere probar a un verificador V que conoce la solución de una de las cuestiones
* P no quiere que V encuentre a qué problema él conoce la solución.

Establecemos el siguiente protocolo:

* Supongamos que P conoce la solución $d_{i}$ de la cuestión $Q_{i}$, entonces P elige aleatoriamente un $r_{i}$ y calcula un genuino testigo $t_{i}$. A continuación desafíos falsos $c_{j}$, y respuestas falsas $s_{j}$ y los usa para fabricar testigo $t_{j},j\neq i$. P envía $(t_{1},t_{2},...,t_{n})$ a V.
* V aleatoriamente elige un desafío $c^{*}$ y lo envía a P.
* P calcula $c_{i}=c^{*}-\sum _{j\neq i}c_{j}$ y calcula la respuesta real $s_{i}$, usando $r_{i}$, $c_{i}$ y su conocimiento $d_{i}$. Después de esto P, envía $(c_{1},c_{2},...,c_{n})$ y $(s_{1},s_{2},...,s_{n})$ a V.
* V verifica que $c^{*}=\sum _{k=1}^{n}c_{k}$ y para todas las cuestiones, cada una de sus pruebas se cumplen. Sin embargo, V no podrá distinguir la prueba real entre las pruebas falsas.

## Aplicaciones

Este protocolo se usa en esquemas de voto verificables para probar que un texto cifrado es consecuencia de cifrar alguno de los elementos de un conjunto de valores diferentes.

### Ejemplo

Por ejemplo, el protocolo CDS se ha usado para demostrar que un voto cifrado con ElGamal es uno de dos posibles votos que se pueden realizar en un referéndum ("SÍ" o "NO") sin revelar cual es lo cual es un problema 1-de-2 ZKP.

Para llegar a un problema donde aplicar el protocolo CDS codifica con $g^{0}$ al "NO" y con $g^{1}$ al "SI". Formalizando se tiene que $m=g^{v_{i}}$ con $v_{i}=\{0,1\}$. Por tanto los votos cifrados tienen la forma $(g^{x_{i}},K^{x_{i}}{\dot {g}}^{v_{i}})$ con K perteneciente a la clave pública y x_i aleatorio.

Por tanto dado un voto cifrado con ElGamal $(x,y)=(g^{x_{i}},m\cdot h^{x_{i}})$ se tiene que poder demostrar que m puede ser $m_{0}=g^{0}$ o $m_{1}=g^{1}$ sin revelar cual es. El objetivo a demostrar es probar la siguiente sentencia OR demostrable por el protocolo CDS (al que previamente se le ha convertido en un protocolo no interactivo usando la heurística de Fiat-Shamir):

$\log _{g}x=\log _{h}(y/m_{0})\lor \log _{g}x=\log _{h}(y/m_{1})$

    Demostración: Partiendo de $(x,y)=(g^{x_{i}},m\cdot h^{x_{i}})$ tenemos:
   * Despejando $x_{i}$ en $x=g^{x_{i}}$ tenemos $x_{i}=\log _{g}x$

   * Despejando $x_{i}$ en $y=m\cdot h^{x_{i}}$ tenemos $x_{i}=\log _{h}(y/m)$

   * Uniendo las dos igualdades tenemos $x_{i}=\log _{g}x=\log _{h}(y/m)$
