# Compromisos
Si estamos con una amiga jugando a adivinar un número entre el $0$ y $100$ pero me quiero asegurar que no cambie el valor a medida que trato de adivinarlo y así también poder chequear que adiviné correctamente el número sin que lo revele. Podemos utilizar un esquema de compromiso para asegurarnos estas condiciones que estamos pidiendo. Para ello podemos introducir el Compromiso de Pedersen
### **Esquema:**
1. El agente que desea mandar un mensaje $m$ se lo llama emisor del compromiso, elige un elemento random $r$ y genera $commit=C(m,r).$ Donde $C$, es un algoritmo que toma el mensaje como el número random y los convierte en el $commit$ que tiene de cierta manera el mensaje condensado.
2. El emisor revela el $commit.$
3. Se revelan tanto $m'$ y $r'$. (podrian no ser los $m$ y $r$ originales)
4. Otro agente, llamado verificador, recibe el $commit$, y puede chequear que efectivamente que el mesaje $m'$ efectivamente era el del paso 1 pues realiza $C(m',r')$ y verifica que es igual a commit.
Podemos observar que el verificador no puede inferir el valor del mensaje ni del elemento random sabiendo solo $commit$ como el algoritmo $C$. Se le pide al algoritmo $C$ que la probabilidad de encontrar dos pares $(m,r)$ y $(m',r')$ tal que $C(m,r)=C(m',r')$ es muy baja. Esto nos garantiza que el emisor no puede mentir y pasarnos otros valores de $m$ y $r$ en el paso 3. Es decir no puede modificar el mensaje original.
Podemos tener el esquema de una manera más funcional utilizando funciones hash de la siguiente manera:
### **Esquema usando funciones hash:**
Tomamos a $H$ como una función hash, por ejemplo SHA-256.
1. El emisor elige un elemento random $r$ y calcula $commit=H(m,r)$.
2. El emisor revela $commit$.
3. Se revelan tanto $m$ y $r$.
4. Otro agente,llamado verificador, recibe el $commit$ , puede chequear que efectivamente el mensaje $m$ proviene del $commit$ calculando $H(m,r)$.
Si vamos más a la práctica podemos tener este esquema de una forma más algebraica.
### **Esquema usando Grupos:**
1. Parámetros Públicos: 2 primos $p,q$ tal que $p=2q+1$, y dos elementos $g_1,g_2 \in \mathbb{Z}_p^{*}$ de orden $q$. Es decir que la mínima potencia a la cual $g_1, g_2$ son iguales a $1$ es $q$.
2. Calcular $m$ en $\mathbb{Z}_q^{*}$.
3. El emisor elige un elemento random $r$ en $\mathbb{Z}_q$ y calcula $commit=g_1^mg_2^r (\text{mod } p)$.
4. El emisor revela $commit.$
5. Se revelan tanto $m'$ como $r'$.
6. Otro agente,llamado verificador, recibe el $commit$, puede chequear que efectivamente el mensaje $m'$ proviene de $commit$ calculando $g_1^{m'}g_2^{r'} (\text{mod } p)$.
Podemos utilizar este último para modelar nuestro juego.
Elijamos $q=131 \text{ y } p=263$. Observar que asi $m$ no lo tenemos que comprimir o modificar.
Supongamos que nuestra amiga elige como $g_1=43$ y $g_2=27$, como número secreto $m=75$ y numero random $r=13$ entonces calcula
$$
commit=43^{75}27^{13}=249 \text{ }(\text{mod } 263).
$$
Le preguntamos a nuestra amiga qué número random $r$ utilizó en el compromiso y elegimos un número $x \in [0,100]$. Luego chequeamos si se cumple que
$$
249 = 43^x27^{13} \text{ }(\text{mod } 263).
$$
Si se cumple nuestro $x=75.$ Caso contrario pedimos a nuestra amiga que realice un nuevo compromiso con otro numero random es decir
$$
commit_2=43^{75}27^{r_1} \text{ }(\text{mod } 263).
$$
y procedemos a realizar la misma cuenta, conociendo $r_1$.
$$
commit_2 = 43^{x_{2}}27^{r_1} \text{ }(\text{mod } 263).
$$
hasta poder adivinar el número.
### Conclusión
En resumen los compromismos (*commitments)* permiten de cierta manera garantizar la integridad y veracidad de la información. También así es utilizada la idea de poder fijar ciertos datos dentro de otros esquemas criptograficos mas complejos y ser chequeados en pasos siguientes del mismos garantizando que el emisor no haya cambiado datos a lo largo del esquema.
### Referencias
https://crypto.stackexchange.com/questions/64437/what-is-a-pedersen-commitment
https://kyle-crypto.medium.com/cryptographic-commitments-55ccc4f297c9
https://crypto.stackexchange.com/questions/54439/why-is-the-pedersen-commitment-perfectly-hiding