Criptografía · Bilinear maps · NIZK

GSkit

Un lenguaje de dominio específico y un framework para pruebas de Groth-Sahai

Profesores guía: Matías Toro Ipinza · Federico Olmedo Berón

Departamento de Ciencias de la Computación · Universidad de Chile

Magíster en Ciencias, mención Computación · Ingeniería Civil en Computación

Martes 13 de octubre de 2026

benjamin.hurta.do/gskit

Agenda

1Pruebas zero-knowledge
2Firmas y bilinear maps
3Pruebas de Groth-Sahai
4GSkit: el DSL y el framework
5Caso de estudio: ABS-UCL
6Evaluación y conclusiones
1 · Pruebas zero-knowledge

¿Por qué probar sin revelar?

Todos los días tenemos que convencer a alguien de un hecho, y normalmente lo hacemos entregando la evidencia: el carnet para probar nuestra edad, una contraseña para probar que somos nosotros.

Pero muchas veces esa evidencia es un secreto que preferiríamos no entregar. ¿Podemos probar que el enunciado es verdadero sin revelar el secreto?

Esa es la pregunta que responden las pruebas zero-knowledge.

1 · Pruebas zero-knowledge

Zero-knowledge, con un ejemplo

Peggy (prover) afirma que conoce la palabra secreta que abre la puerta dentro de la cueva de Alí Babá. Victor (verifier) quiere convencerse sin aprender la palabra.

  • 1 · CommitPeggy entra por A o por B al azar, mientras Victor espera afuera
  • 2 · ChallengeVictor grita el lado por el que debe salir
  • 3 · ResponsePeggy sale por ese lado, cruzando la puerta si es necesario

Ilustraciones: Dake, Wikimedia Commons (CC BY 2.5)

1 · Pruebas zero-knowledge

Tres propiedades

Repetir el juego de la cueva hace concretas las tres propiedades de una prueba zero-knowledge:

  • CompletenessUn prover honesto con un witness válido siempre convence al verifierSi Peggy conoce la palabra, siempre sale por donde Victor pide
  • SoundnessUn prover tramposo no puede convencer al verifier de un enunciado falsoSin la palabra la descubren la mitad de las veces: tras kk rondas engaña a Victor con probabilidad 2−k2^{-k}
  • Zero-knowledgeEl verifier no aprende nada más allá de que el enunciado es verdaderoVictor solo la ve salir por donde pidió, una escena que podría haber montado él mismo
1 · Pruebas zero-knowledge

Formalmente — NIZK

Sea R\mathcal{R} una relación NP y el lenguaje que define:

L:={ x ∣ ∃ w t.q. (x,w)∈R }\mathcal{L} := \{\ x \ \mid\ \exists\, \wit{w} \text{ t.q. } (x, \wit{w}) \in \mathcal{R}\ \}

donde xx es el enunciado (público) y w\wit{w} el witness (secreto). Una prueba non-interactive zero-knowledge (NIZK) es un único mensaje π\pi, que se verifica contra un common reference string:

  • Setup — CRS←Setup(1λ)\mathsf{CRS} \leftarrow \mathsf{Setup}(1^\lambda)
  • Prove — π←Prove(CRS, x, w)\pi \leftarrow \mathsf{Prove}(\mathsf{CRS},\, x,\, \wit{w})
  • Verify — b←Verify(CRS, x, π)b \leftarrow \mathsf{Verify}(\mathsf{CRS},\, x,\, \pi)

valores secretos: este color los marca en toda la presentación

2 · Firmas y bilinear maps

El peor banco del mundo

Para hacerlo concreto, les presento al peor banco del mundo. Emite cheques, y todos a su alrededor necesitan una forma de distinguir uno auténtico de una falsificación.

Banco

Tú

EL PEOR BANCO DEL MUNDO Vale por 1_000_000 σ

KeyGen→ clave secreta sk, clave pública vk

Sign(m, sk) → firma σ

Verify(m, σ, vk) → ✓ / ✗

Tu peor amigo

mirando…
2 · Firmas y bilinear maps

Firmas, en una idea

Un esquema de firma es la herramienta del banco contra las falsificaciones. El banco guarda una clave secreta sk\wit{sk} y publica una clave de verificación vkvk: cualquiera puede verificar, nadie puede falsificar.

  • KeyGen — genera el par de claves (sk,vk)(\wit{sk}, vk). El secreto se queda en el banco; vkvk se hace pública.
  • Sign — solo quien tiene sk\wit{sk} puede convertir un mensaje mm en una firma σ\sigma.
  • Verify — cualquiera con vkvk puede confirmar que σ\sigma corresponde a mm.

El ingrediente que hace posible un buen esquema de firma es el bilinear map.

2 · Firmas y bilinear maps

Bilinear maps

Un bilinear map es una función e:G1×G2→GTe: \mathbb{G}_1 \times \mathbb{G}_2 \to \mathbb{G}_T que permite mover escalares a través de un pairing:

e(a g1, b g2)=e(g1,g2)abe(a \, g_1,\ b \, g_2) = e(g_1, g_2)^{ab}

  • G1,G2\mathbb{G}_1, \mathbb{G}_2 y GT\mathbb{G}_T son grupos finitos de orden primo pp, definidos sobre curvas elípticas
  • g1,g2g_1, g_2 generan G1\mathbb{G}_1 y G2\mathbb{G}_2 respectivamente, y a,b∈Zpa, b \in \mathbb{Z}_p

Esta única propiedad, sacar los exponentes de un pairing, es la palanca detrás de las firmas BLS y de las pruebas de Groth-Sahai.

2 · Firmas y bilinear maps

Firma BLS

Boneh–Lynn–Shacham [BLS04] convierten esa palanca en un esquema de firma: la clave secreta se esconde como exponente, y el pairing permite que cualquiera la verifique sin verla nunca. Una función hash-to-curve H:{0,1}∗→G1\mathcal{H}:\{0,1\}^* \to \mathbb{G}_1 lleva los mensajes a la curva.

  • KeyGen — sk←RZp\wit{sk} \xleftarrow{R} \mathbb{Z}_p   vk←[sk] g2vk \leftarrow [\wit{sk}]\, g_2
  • Sign — h←H(m)h \leftarrow \mathcal{H}(m)   σ←[sk] h\sigma \leftarrow [\wit{sk}]\, h
  • Verify — h←H(m)h \leftarrow \mathcal{H}(m)   e(σ,g2)=?e(h,vk)e(\sigma, g_2) \stackrel{?}{=} e(h, vk)

La verificación funciona porque la bilinealidad hace que ambos lados colapsen al mismo valor:

e([sk]h, g2)=e(h,g2)sk=e(h, [sk]g2)e([\wit{sk}]h,\ g_2) = e(h, g_2)^{\wit{sk}} = e(h,\ [\wit{sk}]g_2)

2 · Firmas y bilinear maps

El peor banco del mundo usa BLS

Así que el banco adopta BLS: emite un cheque y lo firma con su clave secreta. Cualquiera puede verificarlo; solo el banco pudo haberlo producido.

Vale por 1_000_000 σ

El banco firma el cheque con BLS:

σ←[sk] H(“Vale por 1_000_000”)\sigma \leftarrow [\wit{sk}]\, \mathcal{H}(\text{``Vale por 1\_000\_000''})

Cualquiera con la clave de verificación vkvk puede verificarlo:

e(σ,g2)=?e ⁣(H(“Vale por 1_000_000”), vk)e(\sigma, g_2) \stackrel{?}{=} e\!\left(\mathcal{H}(\text{``Vale por 1\_000\_000''}),\, vk\right)

mirando…

Tu peor amigo

Con solo ver σ\sigma, tu peor amigo puede cobrar el cheque: el banco le paga a quien presente una firma válida.

2 · Firmas y bilinear maps

Un nuevo problema

El cheque está firmado y es verificable. Ahora tienes un cheque válido y quieres probarle a un amigo que el banco realmente lo firmó, sin entregarle σ\wit{\sigma}, porque si no podría cobrarlo él mismo.

Quieres probar “existe un σ\wit{\sigma} válido”, es decir, que la ecuación de verificación tiene solución, manteniendo σ\wit{\sigma} oculto.

Eso es exactamente una prueba zero-knowledge sobre una ecuación con bilinear maps. Aquí entra Groth-Sahai.

3 · Pruebas de Groth-Sahai

Pruebas de Groth-Sahai

Las pruebas de Groth-Sahai [GS08] son pruebas non-interactive zero-knowledge eficientes para enunciados escritos como ecuaciones sobre un bilinear group. El tipo más expresivo es la pairing-product equation (PPE):

∏i=1ne(Ai,Yi)⋅∏i=1me(Xi,Bi)⋅∏i=1m∏j=1ne(Xi,Yj)γij=tT\prod_{i=1}^n e(\mathcal{A}_i, \wit{\mathcal{Y}_i}) \cdot \prod_{i=1}^m e(\wit{\mathcal{X}_i}, \mathcal{B}_i) \cdot \prod_{i=1}^m\prod_{j=1}^n e(\wit{\mathcal{X}_i}, \wit{\mathcal{Y}_j})^{\gamma_{ij}} = t_T

  • Constantes · públicas Ai∈G1\mathcal{A}_i \in \mathbb{G}_1, Bi∈G2\mathcal{B}_i \in \mathbb{G}_2, tT∈GTt_T \in \mathbb{G}_T, γij∈Zp\gamma_{ij} \in \mathbb{Z}_p
  • Witness · secreto X1,…,Xm∈G1\wit{\mathcal{X}_1, \ldots, \mathcal{X}_m} \in \mathbb{G}_1, Y1,…,Yn∈G2\wit{\mathcal{Y}_1, \ldots, \mathcal{Y}_n} \in \mathbb{G}_2

El prover conoce un witness que satisface la ecuación; el verifier se convence sin llegar a conocerlo.

3 · Pruebas de Groth-Sahai

Cuatro tipos de ecuaciones

La misma forma cuadrática, sobre distintos bilinear maps, da cuatro tipos de ecuaciones:

  • PPE · pairing product∏ie(Ai,Yi)⋅∏ie(Xi,Bi)⋅∏i,je(Xi,Yj)γij=tT\displaystyle\prod_i e(\mathcal{A}_i,\wit{\mathcal{Y}_i})\cdot\prod_i e(\wit{\mathcal{X}_i},\mathcal{B}_i)\cdot\prod_{i,j} e(\wit{\mathcal{X}_i},\wit{\mathcal{Y}_j})^{\gamma_{ij}}=t_TWitness: Xi∈G1\wit{\mathcal{X}_i}\in\mathbb{G}_1, Yj∈G2\wit{\mathcal{Y}_j}\in\mathbb{G}_2
  • MSME · multi-scalar en G1∑iyiAi+∑ibiXi+∑i,jγij yj Xi=T1\displaystyle\sum_i \wit{y_i}\mathcal{A}_i+\sum_i b_i\wit{\mathcal{X}_i}+\sum_{i,j}\gamma_{ij}\,\wit{y_j}\,\wit{\mathcal{X}_i}=\mathcal{T}_1Witness: Xi∈G1\wit{\mathcal{X}_i}\in\mathbb{G}_1, yj∈Zp\wit{y_j}\in\mathbb{Z}_p
  • MSME · multi-scalar en G2∑iaiYi+∑ixiBi+∑i,jγij xi Yj=T2\displaystyle\sum_i a_i\wit{\mathcal{Y}_i}+\sum_i \wit{x_i}\mathcal{B}_i+\sum_{i,j}\gamma_{ij}\,\wit{x_i}\,\wit{\mathcal{Y}_j}=\mathcal{T}_2Witness: xi∈Zp\wit{x_i}\in\mathbb{Z}_p, Yj∈G2\wit{\mathcal{Y}_j}\in\mathbb{G}_2
  • QE · quadratic en Zp∑iaiyi+∑ixibi+∑i,jγij xi yj≡t(modp)\displaystyle\sum_i a_i \wit{y_i}+\sum_i \wit{x_i} b_i+\sum_{i,j}\gamma_{ij}\,\wit{x_i}\,\wit{y_j}\equiv t\pmod{p}Witness: xi,yj∈Zp\wit{x_i},\wit{y_j}\in\mathbb{Z}_p
3 · Pruebas de Groth-Sahai

Formalmente — el lenguaje de Groth-Sahai

L:={ x ∣ ∃ w: E1(x,w), …, En(x,w) se cumplen }\mathcal{L} := \Big\{\ x \ \Big|\ \exists\, \wit{w} :\ \mathcal{E}_1(x, \wit{w}),\ \ldots,\ \mathcal{E}_n(x, \wit{w})\ \text{se cumplen}\ \Big\}

donde cada Ei\mathcal{E}_i es uno de los cuatro tipos de ecuaciones de Groth-Sahai sobre las variables:

Variables de grupo

X1,…,Xm∈G1\wit{\mathcal{X}_1, \ldots, \mathcal{X}_m} \in \mathbb{G}_1

Y1,…,Yn∈G2\wit{\mathcal{Y}_1, \ldots, \mathcal{Y}_n} \in \mathbb{G}_2

Variables escalares

x1,…,xm′∈Zp\wit{x_1, \ldots, x_{m'}} \in \mathbb{Z}_p

y1,…,yn′∈Zp\wit{y_1, \ldots, y_{n'}} \in \mathbb{Z}_p

Una sola prueba muestra que todas las ecuaciones se cumplen para un mismo witness. El DSL de GSkit, que viene a continuación, es una sintaxis para exactamente este lenguaje: declaras el witness y las ecuaciones, y el framework construye la prueba.

4 · GSkit: el DSL y el framework

El problema que queremos resolver

Escribir una de estas pruebas a mano es intrincado y propenso a errores: hay que hacer un commitment de cada variable, construir los vectores aa, bb y la matriz γ\gamma, y mantener perfectamente sincronizadas las vistas del prover y del verifier.

La dificultad

Commitments de bajo nivel, fáciles de equivocar y difíciles de leer; prover y verifier pueden desincronizarse.

La idea

Describir qué es la ecuación, de forma declarativa, y dejar que un compilador genere el resto.

Por eso diseñamos un pequeño DSL: declaras la ecuación una vez, y el framework compila tanto la prueba como la verificación.

4 · GSkit: el DSL y el framework

Trabajo relacionado — y el vacío

DSLs zero-knowledge

Circom · ZoKrates · Noir · Cairo · Leo

Compilan programas a circuitos (R1CS, ACIR, AIR) para back-ends SNARK y STARK. Ninguno soporta de forma nativa ecuaciones sobre bilinear groups.

Bibliotecas de Groth-Sahai

groth-sahai-rs · groth-sahai-python · un prototipo en Java

APIs programáticas: el desarrollador todavía clasifica los witnesses, elige los tipos de ecuación, construye los commitments y nombra las variables entre subpruebas.

GSkit llena ese vacío: enunciados de Groth-Sahai escritos como ecuaciones declarativas, no como circuitos ni llamadas a una API.

4 · GSkit: el DSL y el framework

Esta tesis

  1. Un DSL para enunciados de Groth-Sahai. Se declaran variables, constantes y ecuaciones; un sistema de tipos infiere el tipo de cada ecuación (PPE, MSME, QE) y rechaza especificaciones mal formadas antes de construir cualquier prueba.
  2. GSkit, un framework en Python sobre Charm/PBC que compila una especificación en ambos, el prover y el verifier, desde la línea de comandos o desde código Python con @gsfy.
  3. Dos casos de estudio, BLS y ABS-UCL; el segundo, comparado con una implementación anterior escrita a mano.
4 · GSkit: el DSL y el framework

Un DSL para Groth-Sahai

Una especificación tiene solo tres bloques: qué nombres están ocultos (variables), cuáles son públicos (constantes) y las ecuaciones:

variables:
    <nombres ocultos> : G1 | G2 | ZP

constants:
    <nombres públicos> : G1 | G2 | ZP | GT

equations:
    <término> + <término> + ... = <nombre>
  • variables — el witness, lo que se mantiene secreto (solo G1, G2, ZP)
  • constants — valores públicos, incluido el lado derecho (aquí se permite GT)
  • equations — sumas de términos producto; * es la operación bilineal y + combina términos
4 · GSkit: el DSL y el framework

Cómo se lee un término

Cada término es un producto de nombres. En qué grupos viven los nombres decide el tipo de ecuación, y el compilador lo infiere por ti:

∏i=1ne(Ai,Yi)⋅∏i=1me(Xi,Bi)⋅∏i,je(Xi,Yj)γij=tT\prod_{i=1}^n e(\mathcal{A}_i, \wit{\mathcal{Y}_i}) \cdot \prod_{i=1}^m e(\wit{\mathcal{X}_i}, \mathcal{B}_i) \cdot \prod_{i,j} e(\wit{\mathcal{X}_i}, \wit{\mathcal{Y}_j})^{\gamma_{ij}} = t_T

  • const · var   e(Ai,Yi)e(\mathcal{A}_i, \wit{\mathcal{Y}_i})  →  se escribe A * Y
  • var · const   e(Xi,Bi)e(\wit{\mathcal{X}_i}, \mathcal{B}_i)  →  se escribe X * B
  • var · var, escalado   e(Xi,Yj)γije(\wit{\mathcal{X}_i}, \wit{\mathcal{Y}_j})^{\gamma_{ij}}  →  se escribe gamma * X * Y
4 · GSkit: el DSL y el framework

Prueba BLS para mi peor amigo

Volvamos al cheque. Tú (el prover) conoces σ\wit{\sigma}; tu amigo (el verifier) debe convencerse sin verla.

Prover · tú

conoce la firma σ\wit{\sigma}

e(σ, g2)=tTe(\wit{\sigma},\, g_2) = t_T

Verifier · tu peor amigo

nunca ve σ\wit{\sigma}

verifica e( ? , g2)=tTe(\,?\,,\, g_2) = t_T

Idea clave: tu amigo aprende que existe una firma válida, pero nunca ve σ\wit{\sigma}.

tT←e ⁣(H(“Vale por 1_000_000”), vk)e(σ, g2)=tTt_T \leftarrow e\!\left(\mathcal{H}(\text{``Vale por 1\_000\_000''}),\, vk\right) \qquad e(\wit{\sigma},\, g_2) = t_T

4 · GSkit: el DSL y el framework

La prueba BLS, en el DSL

Todo el enunciado “conozco un σ\wit{\sigma} tal que e(σ,g2)=tTe(\wit{\sigma}, g_2) = t_T” se reduce a unas pocas líneas. El secreto σ\wit{\sigma} es una variable; todo lo demás es una constante:

  • σ\wit{\sigma} es el witness → se declara en variables
  • g2g_2 y el objetivo tTt_T son públicos → constants
  • una sola PPE: signature * g2 = rhs

El compilador lee los tipos y reconoce una pairing-product equation, sin configuración manual.

variables:
    signature: G1

constants:
    g2:  G2
    rhs: GT

equations:
    signature * g2 = rhs
4 · GSkit: el DSL y el framework

Una especificación, ambos lados

La misma especificación tipada se compila en dos programas, así que las vistas de las ecuaciones del prover y del verifier nunca pueden desincronizarse:

witness spec.gs la única fuente Parser Type checker PPE · MSME · QE detectado al especificar error de tipos Prover proof.py Verifier verify.py prueba π commitments + pruebas ✓ / ✗

Dentro de Python, el decorador @gsfy lee la misma especificación desde un GS_STRING en la función y conecta sus variables automáticamente.

5 · Caso de estudio: ABS-UCL

Donde todo empezó: un foro anónimo

BLS fue el calentamiento. Esta tesis partió de un objetivo concreto: un foro anónimo, donde los miembros prueban que pertenecen sin revelar quiénes son. Pero el anonimato por sí solo tiene un problema:

Foro anónimo · #parque4 mensajes
anon_4821En mi opinión, deberíamos patear cachorros en el parque.
anon_1337Totalmente de acuerdo. Por fin alguien lo dice.
anon_0042+1. Esos cachorros se lo buscaron.
amo_los_perrosComo amante de los perros, apoyo esto totalmente.
▲ 4 a favor · 0 en contra

Un payaso, cuatro cuentas

Ataque Sybil
una persona, muchas identidades falsas:
un consenso salido de la nada.

No es solo un problema de foros: las cuentas títere y las granjas de bots fabrican consenso en el debate público y en las elecciones de hoy, una amenaza real para la democracia.

5 · Caso de estudio: ABS-UCL

La solución: ABS-UCL

Attribute-Based Signatures with User-Controlled Linkability [EKCGD14, EG17]. Cada mensaje lleva una firma que prueba:

  • “mis atributos cumplen la política” (por ejemplo, estudiante de la UChile), sin revelar quién firmó ni qué atributos usó;
  • un linking token τ\tau bien formado, derivado de la clave secreta del autor usk\wit{usk} y del hilo.
#parquefirmado con ABS-UCL
τ 9c4e…a1En mi opinión, deberíamos patear cachorros en el parque.
τ 9c4e…a1Totalmente de acuerdo. Por fin alguien lo dice.
τ 9c4e…a1+1. Esos cachorros se lo buscaron.
τ 9c4e…a1Como amante de los perros, apoyo esto totalmente.
4 mensajes · 1 autor

Mismo autor, mismo hilo, mismo τ\tau: los cuatro “partidarios” cuentan como una sola voz. Entre hilos distintos los tokens no se pueden relacionar, así que los autores siguen siendo anónimos. Privacidad y rendición de cuentas, en una sola firma.

5 · Caso de estudio: ABS-UCL

Una firma, cuatro subprotocolos

Una sola firma ABS-UCL es una conjunción de enunciados zero-knowledge, cada uno de un subprotocolo independiente: muchas ecuaciones de Groth-Sahai probadas como una sola.

  • RPSPSLas claves de atributos del usuario fueron realmente emitidas por las autoridades.Re-randomizable structure-preserving signatures
  • MSPEsos atributos cumplen la política de acceso.Monotone span program
  • LITEl linking token está bien formado: la clave de la linkability controlada.Linking token
  • FBB · PSDOUn pseudoatributo aporta una rama distinguida, así que la política siempre se puede satisfacer.Firma Full Boneh–Boyen [BB04]
5 · Caso de estudio: ABS-UCL

La recompensa: componer, no duplicar

Cada subprotocolo declara su lógica de Groth-Sahai una sola vez con @gsfy; el esquema compone esas especificaciones sobre un contexto compartido, y tanto el prover como el verifier salen de esa única fuente.

Antes · a mano sign() 85 líneas ≈ verify() 84 líneas cada ecuación se escribe dos veces, y las copias pueden divergir GSkit · modular RPSPS MSP LIT FBB GSContext contexto común Prover una sola prueba Verifier generado cada ecuación se escribe una vez, dentro de su subprotocolo
5 · Caso de estudio: ABS-UCL

El resultado

La evidencia decisiva no es tener menos líneas en total, sino la eliminación del código de ecuaciones duplicado y mantenido a mano:

Esfuerzo para construir las ecuacionesA manoGSkit (modular)
Líneas en sign()858 ecuaciones declarativas
Líneas en verify()840, generado
Objetos de ecuación y de pairing construidos a mano600
Veces que se escribe cada ecuación21

El código total escrito por el desarrollador no es menor (420 → 540 líneas): cada subprotocolo ahora trae su propia especificación.

La contribución: llevar las ecuaciones a una única fuente declarativa es lo que reduce la superficie de error, y lo que hace práctico construir y mantener un esquema tan complejo como ABS-UCL.

6 · Evaluación y conclusiones

Rendimiento

Generar y verificar una prueba de pairing-product equations toma tiempo lineal en el número de variables y en el número de ecuaciones.

VerifierProver

Aumentando el número de variables 0 1 2 3 4 s 10 50 100 variables Verifier · 10 variables: 774 ms Verifier · 20 variables: 1112 ms Verifier · 30 variables: 1467 ms Verifier · 40 variables: 1764 ms Verifier · 50 variables: 2100 ms Verifier · 60 variables: 2466 ms Verifier · 70 variables: 2795 ms Verifier · 80 variables: 3105 ms Verifier · 90 variables: 3467 ms Verifier · 100 variables: 3778 ms Verifier 3,8 s Prover · 10 variables: 231 ms Prover · 20 variables: 303 ms Prover · 30 variables: 344 ms Prover · 40 variables: 411 ms Prover · 50 variables: 442 ms Prover · 60 variables: 501 ms Prover · 70 variables: 563 ms Prover · 80 variables: 627 ms Prover · 90 variables: 684 ms Prover · 100 variables: 737 ms Prover 0,7 s Aumentando el número de ecuaciones 0 4 8 12 s 1 5 10 ecuaciones Verifier · 1 ecuación: 1446 ms Verifier · 2 ecuaciones: 2806 ms Verifier · 3 ecuaciones: 4049 ms Verifier · 4 ecuaciones: 5469 ms Verifier · 5 ecuaciones: 6613 ms Verifier · 6 ecuaciones: 8066 ms Verifier · 7 ecuaciones: 9047 ms Verifier · 8 ecuaciones: 10 496 ms Verifier · 9 ecuaciones: 11 382 ms Verifier · 10 ecuaciones: 12 614 ms Verifier 12,6 s Prover · 1 ecuación: 345 ms Prover · 2 ecuaciones: 406 ms Prover · 3 ecuaciones: 480 ms Prover · 4 ecuaciones: 556 ms Prover · 5 ecuaciones: 643 ms Prover · 6 ecuaciones: 736 ms Prover · 7 ecuaciones: 795 ms Prover · 8 ecuaciones: 858 ms Prover · 9 ecuaciones: 921 ms Prover · 10 ecuaciones: 967 ms Prover 1,0 s

GSkit sobre Charm/PBC, curva BN254. Datos de la evaluación de la tesis.

6 · Evaluación y conclusiones

Conclusiones

Lo que mostramos

  • Una especificación declarativa por enunciado: el prover y el verifier se generan a partir de ella, así que no pueden desincronizarse.
  • El chequeo de tipos mueve una clase de errores del tiempo de ejecución al tiempo de especificación.
  • En ABS-UCL, 169 líneas escritas a mano y 60 objetos de ecuación se convierten en 8 ecuaciones declarativas, escritas una sola vez.

Trabajo futuro

  • Verificación en lote y optimizaciones del tamaño de la prueba
  • Más casos de estudio, además de BLS y ABS-UCL
  • De punta a punta: el foro anónimo basado en atributos que motivó este trabajo

Hipótesis confirmada: un lenguaje de dominio específico baja la barrera para construir pruebas de Groth-Sahai, y reduce el esfuerzo y la superficie de error sin renunciar a sus garantías de seguridad.

Gracias

¿Preguntas?

GSkit: un lenguaje de dominio específico y un framework para pruebas de Groth-Sahai

Más información en benjamin.hurta.do/gskit

Respaldo

¿Es sound GSkit?

Conviene separar tres preguntas:

  • Las pruebasGSkit genera pruebas estándar de Groth-Sahai [GS08] sobre BN254 (SXDH): no agrega criptografía nuevaCon el CRS de soundness, las pruebas son perfectamente sound; con el CRS WI, son sound bajo SXDH
  • El lenguajeGramática y reglas de tipado formales: una especificación bien tipada se elabora en una ecuación de Groth-Sahai del tipo inferidoEsa propiedad no está demostrada formalmente: mecanizarla es trabajo futuro
  • La implementaciónEl prover y el verifier salen de la misma elaboración, así que no pueden discrepar entre síBLS de punta a punta: la firma válida verifica y una falsificada se rechaza, con ambos tipos de CRS

GSkit prueba exactamente la ecuación que escribes. Que esa ecuación sea la correcta para el protocolo sigue siendo responsabilidad de quien la escribe.

Respaldo

¿WI o zero-knowledge?

En Groth-Sahai [GS08] todas las ecuaciones admiten pruebas WI, pero solo son ZK las MSME, las QE y las PPE con tT=1t_T = 1.

  • La prueba BLS que mostramos es una PPE con tT=e(H(m),vk)≠1t_T = e(\mathcal{H}(m), vk) \neq 1: solo es WI.
  • Además, la firma BLS es única: con un solo witness posible, WI no garantiza ocultarlo.

Para que sea ZK: se compromete también Y=H(m)\wit{Y} = \mathcal{H}(m) y se prueban dos ecuaciones, una PPE con tT=1t_T = 1 y una MSME lineal en G1\mathbb{G}_1, ambas ZK:

e(σ,g2)⋅e(Y,vk)−1=1TY=H(m)e(\wit{\sigma}, g_2) \cdot e(\wit{Y}, vk)^{-1} = 1_T \qquad\qquad \wit{Y} = \mathcal{H}(m)

En el DSL son un witness más y una ecuación MSME; las reglas de tipado de la tesis las cubren.

Respaldo

¿Qué supone ABS-UCL contra el ataque Sybil?

El linking token es una firma Boneh–Boyen débil del hilo, hecha con la clave del autor:

τ=[1usk+hilo]g\tau = \left[\dfrac{1}{\wit{usk} + \text{hilo}}\right] g

  • Es determinista: el mismo autor en el mismo hilo obtiene el mismo τ\tau, así que cada persona tiene una voz por hilo.
  • Entre hilos distintos los τ\tau no se pueden relacionar: el autor sigue siendo anónimo.

Supuesto: cada persona tiene una sola clave usk\wit{usk}. La autoridad que emite los atributos debe certificar una clave por persona, por ejemplo una por RUT. Si alguien consigue varias claves, obtiene varios τ\tau: ABS-UCL no lo impide, porque es un problema de registro y no criptográfico.

Referencias

[GS08]J. Groth, A. Sahai. Efficient Non-interactive Proof Systems for Bilinear Groups. EUROCRYPT 2008, LNCS 4965, pp. 415–432.

[BLS04]D. Boneh, B. Lynn, H. Shacham. Short Signatures from the Weil Pairing. Journal of Cryptology 17(4), pp. 297–319, 2004.

[BB04]D. Boneh, X. Boyen. Short Signatures Without Random Oracles. EUROCRYPT 2004, pp. 56–73.

[EKCGD14]A. El Kaafarani, L. Chen, E. Ghadafi, J. Davenport. Attribute-Based Signatures with User-Controlled Linkability. CANS 2014, pp. 256–269.

[EG17]A. El Kaafarani, E. Ghadafi. Attribute-Based Signatures with User-Controlled Linkability Without Random Oracles. IMACC 2017, pp. 161–184.

FigurasIlustraciones de la cueva de Alí Babá: Dake, Wikimedia Commons, CC BY 2.5.

Presentarse y agradecer a la comisión. La tesis presenta GSkit, un lenguaje de dominio específico y un framework para construir pruebas de Groth-Sahai. El hilo de la charla va de pruebas de conocimiento cero, a firmas BLS, a Groth-Sahai, y termina con GSkit aplicado a ABS-UCL.

Las tres primeras secciones son el contexto necesario para entender el problema. La contribución está en las secciones 4 a 6.

Partir con la intuición, sin fórmulas. Ejemplos cotidianos: mostrar el carnet para probar la edad entrega mucha más información que la edad.

La cueva tiene dos caminos, A y B, unidos por una puerta que solo se abre con la palabra secreta. Una ronda tiene tres pasos: Peggy se compromete con un camino, Victor la desafía y Peggy responde. Si Peggy no conoce la palabra, solo puede responder bien si adivinó el lado.

Cada propiedad tiene una lectura directa en la cueva. Para zero-knowledge, la idea clave es el simulador: Victor podría fabricar un video idéntico sin la ayuda de Peggy, así que el video no le enseña nada.

La cueva es interactiva; las pruebas que nos interesan son no interactivas: un solo mensaje π. Notar que Verify nunca recibe el witness w. Desde aquí, el color ámbar marca siempre lo secreto.

La historia que recorre la charla. El banco emite cheques firmados; tú recibes uno; tu "peor amigo" lo está mirando y le encantaría cobrarlo o falsificarlo. La tarjeta resume las tres operaciones de un esquema de firma.

Unforgeability: sin sk nadie puede producir una firma válida para un mensaje nuevo. Con eso, pasamos a la herramienta matemática que hace funcionar BLS.

GSkit usa la curva BN254 a través de Charm/PBC. Si preguntan: el emparejamiento además es no degenerado y eficientemente computable.

Lo importante para lo que viene: la verificación de BLS es una sola ecuación de emparejamientos.

Aquí la firma σ es pública: va escrita en el cheque, y cualquiera con vk puede verificarla. Click: vuelve tu peor amigo. Para verificar el cheque tiene que ver σ, y con solo verla ya puede cobrarlo: el banco le paga a quien presente una firma válida. En la siguiente slide cambia el escenario y σ pasa a ser el secreto.

Desde aquí σ se marca en ámbar: es el witness. El enunciado es "existe una firma válida", no "esta es la firma".

El prover se compromete a cada variable y entrega elementos de prueba; el verificador revisa ecuaciones sobre los compromisos. Ojo con la terminología: en general GS da pruebas NIWI; son zero-knowledge para MSME y QE, y para PPE cuando t_T = 1.

Los cuatro tipos son la misma forma cuadrática instanciada con distintos mapas bilineales: e, multiplicación escalar en G1 o en G2, y producto en Zp. Lo único que cambia es dónde viven las variables, y eso es exactamente lo que el type checker de GSkit infiere.

Este es el lenguaje que GSkit sabe probar: conjunciones de ecuaciones de los cuatro tipos sobre un witness compartido.

Hipótesis de la tesis: un DSL específico para Groth-Sahai reduce la complejidad y los errores de implementar estas pruebas.

Los DSL de ZK conocidos apuntan a circuitos de propósito general; traducir ecuaciones de pairings a circuitos pierde claridad. Las bibliotecas de Groth-Sahai existentes obligan a hacer a mano lo que GSkit automatiza.

Las tres contribuciones; el resto de la charla las recorre en este orden.

La gramática está escrita en Lark. El type checker clasifica cada variable y arma los vectores a, b y la matriz γ de cada ecuación.

Los tres tipos de término de una PPE corresponden a tres formas sintácticas en el DSL. El desarrollador nunca escribe los vectores ni la matriz γ: salen de los tipos.

El prover eres tú, que tienes el cheque; el verificador es el amigo. t_T se calcula con datos públicos: el mensaje y la clave del banco. Posible pregunta: con t_T distinto de 1, GS08 da WI y no ZK. La forma estándar de obtener ZK es comprometer también H(m) con una ecuación lineal y dejar la PPE con lado derecho 1.

Comparar con lo que habría que escribir a mano: compromisos, vectores, matriz γ, y la verificación por separado.

El parser y el type checker son comunes a ambos lados; un error de tipos se detecta antes de construir cualquier prueba. Solo el prover recibe el witness. El verificador recibe π: compromisos y elementos de prueba.

Esta fue la motivación original de la tesis: un foro anónimo donde los miembros prueban que pertenecen (por ejemplo, ser estudiantes de la Universidad de Chile) sin revelar quiénes son. El problema es que con anonimato total nada impide que una misma persona cree muchas identidades. Click: las cuatro cuentas son la misma persona, un solo payaso detrás de todas. Eso es un ataque Sybil: una persona se hace pasar por muchas para fabricar un consenso. Click: no es solo un problema de foros. Las cuentas falsas y las granjas de bots fabrican consenso en el debate público y en elecciones, y eso daña la democracia.

ABS-UCL resuelve justamente eso. Cada post lleva una firma que prueba que los atributos del autor cumplen la política, sin revelar quién firma ni qué atributos usó. Además lleva un linking token τ, calculado con la clave secreta del autor y el hilo (en el paper el hilo es el "recipient"). Mismo autor y mismo hilo dan el mismo τ: las cuatro cuentas cuentan como una sola voz. En hilos distintos los τ no se pueden relacionar, así que el autor sigue siendo anónimo. Ejemplo de la tesis: en un foro médico, un doctor mantiene una identidad consistente dentro de un hilo sin ser vinculable entre discusiones distintas. Si preguntan: esto supone que las autoridades entregan atributos a una sola clave por persona; si alguien pudiera registrar muchas claves, el ataque Sybil volvería.

Cada subprotocolo aporta su propio conjunto de ecuaciones Groth-Sahai al enunciado completo. Esa estructura es justamente lo que motiva un tratamiento modular.

A la izquierda, la implementación manual previa: las mismas ecuaciones armadas en sign() y otra vez en verify(). A la derecha, cada subprotocolo trae su spec con @gsfy; sign() agrega cada spec al contexto con una sola llamada por atributo, y la verificación se genera.

Ser honesto con las líneas totales: el código modular es algo más largo porque cada subprotocolo trae su especificación. Lo que importa es que cada ecuación se escribe una sola vez y la verificación se deriva de ella.

Ambas curvas crecen linealmente, tanto con el número de variables como con el de ecuaciones. Verificar cuesta más que probar porque la verificación evalúa emparejamientos por cada ecuación, y probar usa principalmente operaciones de grupo.

Volver a la hipótesis: un DSL de alto nivel baja la barrera para construir pruebas de Groth-Sahai, y los casos de estudio lo respaldan.

Todo el material queda en benjamin.hurta.do/gskit: la tesis, el póster, el repositorio y estas slides.

Respuesta corta: la soundness criptográfica es la de Groth-Sahai, y GSkit no la modifica. Lo que aporta el lenguaje es que lo que escribes es lo que se prueba: el sistema de tipos asegura que cada ecuación es una ecuación de Groth-Sahai bien formada del tipo correcto, y el prover y el verifier se derivan de esa misma ecuación. Ser honesto: no hay una demostración formal de que la elaboración preserve el significado. Está descrita con reglas de inferencia en la tesis y validada con los casos de estudio. Mecanizarla, por ejemplo conectando con EasyCrypt como dice la tesis, es trabajo futuro. Si preguntan por ABS-UCL: la evaluación fue a nivel de especificación (líneas y ecuaciones). En la implementación actual falta el chequeo de tipos de las ecuaciones MSME, así que la prueba compuesta de ABS-UCL todavía no se ejecuta de punta a punta. BLS sí: verificado con ambos tipos de CRS.

Si preguntan: la PPE de BLS tiene lado derecho distinto de 1, y para esas ecuaciones GS08 solo da WI. Además la firma BLS es única para cada mensaje, así que WI por sí sola no oculta nada: hace falta ZK. La solución estándar de GS08: comprometer también H(m) como una variable Y, probar con una ecuación lineal que Y = H(m), y reescribir la PPE con lado derecho 1. Ambas ecuaciones son ZK. Ojo: en la implementación actual el chequeo de tipos de las ecuaciones MSME no está terminado, así que esta versión no corre hoy en GSkit. No prometer una demostración en vivo.

Si preguntan cómo evita ABS-UCL el ataque Sybil: el token τ es determinista para cada par (autor, hilo), así que las cuatro cuentas del payaso tendrían el mismo τ. Pero eso supone una clave por persona: la protección real contra Sybil está en el registro, cuando la autoridad entrega los atributos. ABS-UCL hace que esa garantía sobreviva al anonimato. En el código de GSkit, τ es la firma WBB del recipient (el hilo) con usk: lit.sign(usk, recip).