El proyecto
Ágora Ciudadana trata de desarrollar un sistema criptográfico de votaciones que permita el voto seguro a través de Internet, soporte delegación de voto y escale masivamente. Ágora es software libre. Con esos ambiciosos requisitos cualquiera diría que este proyecto es una quimera. Y sin embargo eso es lo que perseguimos su equipo de desarrollo, del cual un servidor (Eduardo Robles, Ingeniero Informático) forma parte, y estamos razonablemente seguros de que es posible.
Los requisitos del proyecto son los mencionados anteriormente, son claros y vienen dados de la idea detrás del
Partido de Internet (PDI), partido del cual nació el desarrollo de Ágora. El PDI es un partido político
no partidista que no tienen
ni jamás tendrá ideología política puesto que su único y radical propuesta es que sus parlamentarios electos votarán en las cámaras de representantes proporcionalmente a lo que la gente vote previamente por Internet mediante Ágora.
Esquema de Seguridad
El esquema de seguridad del sistema de votaciones de Ágora se basa en la autenticación y firmado de los votos mediante
DNIe y un sistema criptográfico de votaciones basado en
Mixnets, cifrando el voto mediante
claves ElGamal y con la novedad del soporte de delegación del voto. En cuanto a criptografía, no se inventa nada nuevo sino que por lo contrario se utiliza estándares conocidos y aceptados por la comunidad criptográfica.
Poca gente conoce los esquemas de votaciones criptográficos, pero estos proveen varias características que un sistema de votaciones físicos no tienen, tal como que cualquiera pueda verificar matemáticamente las votaciones de forma universal. Además el secreto del voto reside en un conjunto de autoridades, de manera que mientras al menos una autoridad se mantenga honesta (o no haya sido comprometida), el voto seguirá siendo secreto.
Cómo funciona una votación
1. Generación de claves
En un sistema de votaciones basado en mixnets, lo primero que ocurre para crear una votación es que se establecen una serie de autoridades de las cuales dependerá el secreto del voto. Cada autoridad genera un par ElGamal de claves pública/privada y comparte la clave pública. Se reúnen todas las claves públicas y se combinan mediante un simple proceso matemático formando una clave pública conjunta de la votación. Con esta clave pública cifrarán los votantes los votos. Dicha clave pública aparecerá en el tablón público de la votación, lugar donde se publican todos los datos públicos que va generando dicha votación.
Además las autoridades deberán por su cuenta de forma independiente proveer su clave pública para que cualquier votante pueda cerciorarse de que la clave pública compartida es la correcta.
Cuanto más autoridades haya mejor, dará más seguridad al sistema, aunque por otra parte hará que la votación sea más costosa de procesar computacionalmente.
2. Recogida de los votos
En una votación, una vez se establece la clave pública de la votación, se establece el texto a votar y el periodo de votación. Cuando abre el periodo de votación, los votantes pueden empezar a emitir su voto mediante la web o la API pública del sistema de votaciones.
En un principio Ágora está concebido para que cualquier español mayor de 18 años pueda votar. Para evitar que personas no autorizadas voten y para evitar votos duplicados, se utiliza la autenticación del voto mediante DNIe. El votante mediante bien un programa que descarga para su ordenador o mediante un applet Java emite su voto, lo cifra, y una vez cifrado lo firma con el DNIe. Mediante la firma se puede autenticar los datos del votante (a modo de censo y como prueba de no repudio) y que el voto no es duplicado.
Los votos cifrados (y por tanto secretos) y firmados se publicarán en el tablón para cualquier pueda ver y certificar, incluido el propio votante, quien ha votado y quien no y comprobar que su voto cifrado se corresponde al que él emitió.
3. Recuento de votos
Una vez finaliza el periodo de votación, comienza el recuento de los votos. En sistema de votaciones con Mixnets, se hace en dos pasos: primero se anonimizan los votos de tal manera que no se pueda saber qué voto es de qué persona, y luego una vez anonimizados, se descifran y finalmente se recuentan los votos en claro. Todo este procesado lo llevan acabo las autoridades de la votación.
Se llama a este sistema "basado en mixnets" precisamente porque se utiliza una mixnet para anonimizar los votos: cada autoridad recifra y rebaraja los votos. Cada autoridad recifra los votos de tal manera que si por ejemplo un votante eligió "opción 1" y lo cifró como cifrado("opción 1", claveVotación) = A (siendo A un texto cifrado), el recifrado parcial que realiza la autoridad 1 sería cifradoParcial(A, claveAutoridad1) = A' = cifradoParcial(cifrado("opción 1", claveVotación), claveAutoridad1), de manera que A y A' son dos textos cifrados que no parecen en nada asociados pero contienen el mismo texto en claro. Este proceso lo hacen todas las autoridades, de tal manera que al final tenemos algo equivalente a cifrado(cifrado("opción 1", claveVotación), claveVotación) = A''.
Aunque parezca mentira, este proceso
SÍ anonimiza el voto, puesto que una propiedad de ElGamal es que por muchas veces que cifres y recifres, el descifrado se hace en un sólo paso, es decir que descifrado(cifrado("opción 1")) = descifrado(cifrado(cifrado("opción 1")), y por tanto no se puede obtener mediante el descifrado que A = A' = A'', puesto que
al descifrar no se obtienen los recifrados parciales sino el texto en claro inicial. Por supuesto para que no se pueda averiguar la equivalencia entre votos cifrados y recifrados y así conseguir la anonimización de los votos, también hay que rebarajar los votos recifrados.
Esquema de una mixnet (Wikipedia)
Una vez se han anonimizado los votos cifrados, las autoridades se ponen de acuerdo para descifrarlos, y una vez descifrados el recuento es trivial, y se publican los resultados en el tablón público de la votación. Como véis, los votos que emitieron los votantes realmente nunca son descifrados, por lo que son realmente secretos, ni siquiera las autoridades saben qué voto quién. Sólo si todas las autoridades se compinchasen podrían descifrar un voto de un votante concreto (o varios), de ahí que cuanto más autoridades y más heterogéneas mejor.
Como dije antes, las votaciones son universalmente verificables. Esto significa que incluso si todas las autoridades fuesen corruptas, se podría verificar si han amañado la votación. Esto es así porque para cada uno de los pasos que he mencionado del recuento (recifrado, barajado y descifrado), las autoridades deben aportar y subir al tablón público de la votación una prueba matemáticamente incontestable de que lo hicieron correctamente. Esto se hace mediante
pruebas de cero conocimiento, que básicamente permiten verificar que algo es cierto sin revelar ninguna información adicional. Para saber más sobre cómo funcionan las pruebas de cero conocimiento recomiendo encarecidamente que leáis el
ejemplo abstracto que se proporciona en la wikipedia, que a su vez sacaron del Paper "Cómo explicar las pruebas de cero conocimiento a tus hijos", pues es muy instructivo.
Esquema de voto delegado
Según los calculos que estuve haciendo, hay unas 6600 votaciones al año tan sólo en el congreso de los diputados, lo cual se acerca a una votación por hora de media. My poca gente podrá ejercer su derecho a voto en Ágora de forma informada votando con un torrente tan inmenso de votaciones, y ni que decir tiene que la mayoría de la votaciones son sobre temas de menor relevancia. De ahí que soportar el voto delegado sea un requisito indispensable para Ágora, de manera que los votantes puedan delegar su voto en alguien en quien confíen y que le pueda dedicar maś tiempo a esto, sin perjuicio de que pueda cambiar su delegación de voto en cualquier momento o pueda emitir un voto directo en votaciones concretas.
Cualquiera puede crear un delegado en Ágora, sólo tiene que registrarse como tal. Ejemplos de posibles delegados: "David Bravo", "Greenpeace", "Izquierda Unida", "Plataforma de pensionistas". El voto de los delegados es público, y siempre antes de que comience una votación se cierra el periodo que tienen los delegados para emitir su intención de voto para esa votación concreta: de esa manera se asegura que los delegados no puedan engañar a aquellos que vayan a delegar en ellos.
No obstante que el voto de los delegados sea público no impide que el voto de los votantes siga siendo secreto: si delegas tu voto en un delegado, nadie sabrá en quien hiciste tal delegación. De hecho si por ejemplo "David Bravo" el votante crea un delegado llamado "David Bravo" con el cual emite intenciones de voto, él como votante puede delegar su voto en su propio delegado, o delegar en otra persona, o incluso emitir un voto directo. Si delega su voto, nadie sabrá realmente si delegó o no en su propio delegado, puesto que el voto delegado es secreto.
Y ya me estoy adelantando un poco al hablar del voto delegado; El sistema para delegar el voto que hemos ideado (el mérito aquí sin duda es de David Ruescas, un Físico que ha estado desde el principio estudiando toda la morralla matemática y desarrollando el esquema de seguridad de Ágora) es utilizar una votación paralela y contínua para los votos delegados.
Como en cualquier otra votación hace falta tener una serie de autoridades, que crearán la clave pública de la votación y también procesarán los votos cuando sea necesario. Normalmente en las votaciones del congreso las opciones a responder son "SÍ", "NO", "ABSTENCIÓN". No obstante la votación de los delegados hay una opción por delegado.
En esta peculiar votación, denominada votación de delegados, se hacen múltiples recuentos, no se cierra nunca la votación y además las opciones de la votación (que equivalen a los delegados) cambian a lo largo del tiempo.
Por ejemplo pongamos que a día de hoy yo, Eduardo Robles delego mi voto en David Bravo. Lo que hago realmente es cifrar mi voto que pone como opción elegida "delego en David Bravo" con la clave de la votación de delegados, firmarlo con mi DNIe y enviarlo a Ágora que autenticará y recogerá mi voto.
En la siguiente votación que haya en el congreso, por ejemplo una reforma de la Ley de Propiedad Intelectual (LPI), el delegado David Bravo emitiría una intención de voto, por ejemplo "SÍ". Esto sería público, y cuando comience la votación en Ágora de los votos directos, David Bravo ya habrá tenido que fijar su intención de voto, de manera que si no estoy de acuerdo yo podría cambiar de delegado o votar directamente.
Una vez termina el periodo de votación, se hace un recuento de ambas votaciones: de la votación concreta sobre la reforma de la LPI, y de la votación de delegados. A lo mejor en la primera salen 100.000 SÍs, 30.000 NOs y 1.000 ABSTENCIÓN. Por otra parte, en la votación de delegados, podría resultar que la opción "David Bravo" obtiene 1.000.000 de votos delegados. Pues como David Bravo publicó que su intención de voto era "SÍ", ese millón de votos se sumaría a la opción "Sí", resultado en 1.100.000 votos a favor. si hubiese más delegados el proceso a seguir sería el mismo que con David Bravo: se contarían cuantos votos delegados tiene cada delegado y en el recuento final se sumarían dichos votos a la opción correspondiente a la intención de voto de dicho delegado.
Nótese que
Ágora es el primer sistema criptográfico de votación que permite la delegación de voto, ahí sí que hemos innovado, y tenemos un paper pendiente de publicación donde describiremos en detalle sobre esta novedad.
Tecnología
El proyecto Ágora consta de dos partes a nivel de código: el backend y el frontend. El backend es
Verificatum, una librería cuyo principal autor es el criptógrafo sueco Douglas Wikström y en la que estamos trabajando para que sea más rápida y escale masivamente, como hablaremos más adelante. Para la parte gráfica utilizaremos
Ágora On Rails, desarrollado por miembros del PDI y que necesita ser reprogramado para introducirle todo el esquema de seguridad.
Voto Masivo
Como ya hemos dicho antes, , hay unas 6600 votaciones al año tan sólo en el congreso de los diputados, lo cual se acerca a una votación por hora de media. En las últimas elecciones generales había 35 millones de electores, por lo cual se sigue que de media debemos de poder llegar a procesar una tasa de hasta 35 millones de votos por hora para poder dar cabida a todos los posibles electores en Ágora; de lo contrario podríamos morir de éxito.
Un sistema criptográfico de votaciones donde hay que presentar pruebas de que el recuento de las votaciones se realizaron como es debido, donde hay que comprobar esas pruebas, y donde hay que comprobar que los votos son válidos tiene un coste computacional por voto relativamente alto. Por eso usamos verificatum que es una librería para administrar votaciones basadas en mixnets más rápida que tenemos conocimiento, y aun así estamos trabajando en adaptar verificatum para que pueda repartir la carga del procesado de los votos en múltiples máquinas mediante hadoop.
Las
pruebas que hemos realizado con verificatum muestran que con 3 autoridades, claves de 2048 bits y cada autoridad utilizando una máquina potente pueden procesarse unos 300.000 votos por hora. No obstante estamos trabajando con los desarrolladores de verificatum en una versión más optimizada que permitirá un mayor rendimiento, además de la distribución del trabajo en varias máquinas, y tampoco descartamos en un futuro próximo
procesar los votos con tarjetas gráficas OpenCL.
¿Votar por internet? ¡estás loco!
El voto por internet tiene peligros, eso no hay duda. Si el ordenador del votante está infectado, podría votar a la opción incorrecta sin saberlo, o no votar, o revelar el sentido de su voto. Si tiene un keylogger o un troyano, el secreto de su voto será más difícil de preservar. Con el fin de salvar en lo posible este problema, crearemos una distribución Linux LiveCD/LiveUSB para que los votantes pueda generar el voto en un entorno seguro y sin Internet, y luego emitir el voto una vez haya sido cifrado y firmado, desde dicho entorno seguro. Además se intentará hacer una campaña de información acerca del sistema, donde se explique como funciona el sistema, los posibles peligros, cómo funciona el DNIe y cómo ir a las oficinas de la policía para obtener el PIN, etc.
También por supuesto está el problema de la coacción: nada impide que tengas detrás a tu jefe mientras votas coaccionándote para que votes lo que él quiere. Aunque eso mismo ya ocurre con el voto por correo y no parece preocupar a la población.
A mí personalmente el voto por Internet no me entusiasma por los problemas de seguridad que pueden surgir, me gustaría poder tener una cabina de voto custodiada por un par de agentes con una máquina de voto certificada y revisada periódicamente por terceros en cada pueblo y cada ciudad, y no depender del policía como única autoridad certificadora de la validez de la firma y certificados del DNIe. No obstante creo que pese a las desventajas que pueda tener este sistema, el hecho de poder brindar a la ciudadanía la posibilidad de tener una democracia líquida mediante el Partido de Internet superan con creces las desventajas que pudieran surgir, y por tanto como mínimo vale la pena intentarlo.
Si realmente conseguimos tener tirón, podremos dedicarle muchos más recursos para fortalecer el sistema de votaciones con las medidas que he propuesto anteriormente, pero es algo costoso que no podemos permitirnos incialmente.
Ágora para todos y todos para Ágora
El proyecto nació como una necesidad del PDI, pero nos dimos cuenta que era una herramienta que podría ser útil a mucha más gente y por eso recientemente desligamos el proyecto del PDI, de manera que si bien es un proyecto que cumple nuestros objetivos, otros con intereses comunes son totalmente bienvenidos a colaborar en el desarrollo, que desde el principio ha sido software libre.
Actualmente estamos trabajando sin ánimo de lucro en nuestro tiempo libre unos pocos entusiastas. Tras las elecciones municipales y el 15M ha venido sangre nueva al proyecto y hay mucho más movimiento. Tenemos como colabores a gente del 15M, gente del Referéndum del 15 de Octubre que quieren AgoraOnRails+Verificatum para dicho referéndum, desarrolladores de PIRATA.CAT, puesto que es un partido que también busca la democracia líquida para los temas que queden fuera de su ideario y ya han conseguido dos regidores en Cataluña.
Ágora es un proyecto de software desarrollado con un fin eminentemente social, bastante ambicioso en lo que a seguridad se refiere y que no está terminado, así que todos los entusiastas de la seguridad
estáis invitados a colaborar en el desarrollo de un software que a poco que dé sus frutos será muy gratificante verlo ser usado por miles de personas para hacer más democrático el sistema político en el que vivimos.