Un esquema de firma es la herramienta del banco contra las falsificaciones. El banco guarda una clave secreta y publica una clave de verificación : cualquiera puede verificar, nadie puede falsificar.
El ingrediente que hace posible un buen esquema de firma es el bilinear map.
Un bilinear map es una función que permite mover escalares a través de un pairing:
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.
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 lleva los mensajes a la curva.
La verificación funciona porque la bilinealidad hace que ambos lados colapsen al mismo valor:
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.
El banco firma el cheque con BLS:
Cualquiera con la clave de verificación puede verificarlo:
Tu peor amigo
Con solo ver , tu peor amigo puede cobrar el cheque: el banco le paga a quien presente una firma válida.
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 , porque si no podría cobrarlo él mismo.
Quieres probar “existe un válido”, es decir, que la ecuación de verificación tiene solución, manteniendo oculto.
Eso es exactamente una prueba zero-knowledge sobre una ecuación con bilinear maps. Aquí entra 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):
El prover conoce un witness que satisface la ecuación; el verifier se convence sin llegar a conocerlo.
La misma forma cuadrática, sobre distintos bilinear maps, da cuatro tipos de ecuaciones:
donde cada es uno de los cuatro tipos de ecuaciones de Groth-Sahai sobre las variables:
Variables de grupo
Variables escalares
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.
Escribir una de estas pruebas a mano es intrincado y propenso a errores: hay que hacer un commitment de cada variable, construir los vectores , y la matriz , 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.
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.
@gsfy.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>
G1, G2, ZP)GT)* es la operación bilineal y + combina términosCada 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:
A * YX * Bgamma * X * YVolvamos al cheque. Tú (el prover) conoces ; tu amigo (el verifier) debe convencerse sin verla.
Prover · tú
conoce la firma
Verifier · tu peor amigo
nunca ve
verifica
Idea clave: tu amigo aprende que existe una firma válida, pero nunca ve .
Todo el enunciado “conozco un tal que ” se reduce a unas pocas líneas. El secreto es una variable; todo lo demás es una constante:
variablesconstantssignature * g2 = rhsEl 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
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:
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.
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:
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.
Attribute-Based Signatures with User-Controlled Linkability [EKCGD14, EG17]. Cada mensaje lleva una firma que prueba:
Mismo autor, mismo hilo, mismo : 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.
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.
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.
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 ecuaciones | A mano | GSkit (modular) |
|---|---|---|
Líneas en sign() | 85 | 8 ecuaciones declarativas |
Líneas en verify() | 84 | 0, generado |
| Objetos de ecuación y de pairing construidos a mano | 60 | 0 |
| Veces que se escribe cada ecuación | 2 | 1 |
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.
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
GSkit sobre Charm/PBC, curva BN254. Datos de la evaluación de la tesis.
Lo que mostramos
Trabajo futuro
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.
¿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
Conviene separar tres preguntas:
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.
En Groth-Sahai [GS08] todas las ecuaciones admiten pruebas WI, pero solo son ZK las MSME, las QE y las PPE con .
Para que sea ZK: se compromete también y se prueban dos ecuaciones, una PPE con y una MSME lineal en , ambas ZK:
En el DSL son un witness más y una ecuación MSME; las reglas de tipado de la tesis las cubren.
El linking token es una firma Boneh–Boyen débil del hilo, hecha con la clave del autor:
Supuesto: cada persona tiene una sola clave . La autoridad que emite los atributos debe certificar una clave por persona, por ejemplo una por RUT. Si alguien consigue varias claves, obtiene varios : ABS-UCL no lo impide, porque es un problema de registro y no criptográfico.
[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).