Por lo general, los sistemas de votación web suelen ser sencillos. Incluso podemos verlos en las redes sociales: los usuarios envían sus preferencias al servidor, el servidor las suma por opción y se computan los resultados de la votación.
En Ucampus, el sistema de votación funciona como un sistema de votación común. Se le pide al usuario que se
loguee al sistema para votar. Los contenidos de ese voto se envían al servidor y en este se registra que el usuario votó. Luego, cuando termina el periodo de votación, se puede sumar el contenido de los votos y mostrar los resultados.
Una vez que el voto llegó al servidor, se toman medidas para que no se pueda hacer la conexión entre el usuario y su voto. Estas medidas incluyen:
Guardar el contenido de los votos y la participación de las personas en tablas separadas en la base de datos, sin una relación explícita entre estas. Además de agregar un delay aleatorio cuando se guardan en la base de datos y que así sea difícil inferir que un voto corresponde a una persona en base a la fecha y hora de los
logs.
Sin embargo, estas medidas para mantener el anonimato del usuario son invisibles para este, ya que, como el servidor puede leer sus preferencias y el hecho que él votó, no tiene ninguna garantía que se está manteniendo su voto en secreto.
Sin embargo, gracias a la criptografía moderna, es posible entregar la seguridad de que nadie podrá saber por quién votamos, ni siquiera las personas con acceso al sistema podrían levantar esta información. En Ucampus, estos últimos meses hemos estado desarrollando una solución de este estilo.
Así fue como nos basamos en el sistema de Votación Helios (que ha sido revisado por varios expertos a lo largo de los años), para resolver la parte criptográfica. Esto es, qué algoritmo de encriptación usar, qué procesos requiere una votación de esta índole, entre otros aspectos.
A continuación, explicaremos cómo se lleva a cabo la votación que implementamos, qué etapas son necesarias para llevarla a cabo y qué procedimientos hay que hacer en la plataforma. Todo esto en simples 7 pasos:
PASO 1: CREAR LA VOTACIÓNComo cualquier otra votación, se deben crear los votos con las opciones disponibles. Además, se debe definir un grupo de personas a las cuales llamaremos verificadores. Los verificadores deberán generar credenciales que serán usadas para los procesos de encriptado y desencriptado de votos.
Una vez se han definido las opciones de la votación y al grupo de verificadores, el sistema los provee con herramientas para que generen sus credenciales criptográficas.
PASO 2: CREDENCIALES DE LOS VERIFICADORESCada verificador genera credenciales utilizando ElGamal, un esquema de encriptación asimétrica para encriptar números enteros positivos. Como cualquier esquema de encriptación asimétrica, crea una llave pública y una llave privada. La llave pública se envía al sistema en formato json, mientras que la llave privada la mantienen los verificadores en secreto por ahora.
La llave pública, que consiste en cuatro números enteros grandes (de los cuales 3 de ellos son iguales para todos los verificadores), se usará para encriptar las preferencias de los votantes. Y la llave privada, que consiste en un único número muy grande, será usada al final para desencriptar los resultados de la votación.
PASO 3: GENERACIÓN DE LA LLAVE PÚBLICA COMBINADAUna vez tenemos todas las llaves públicas de los verificadores, las combinamos para crear una única llave pública. Este proceso se puede hacer gracias a una propiedad de ElGamal que nos dice que al multiplicar el cuarto término de todas las llaves públicas se obtiene una llave pública válida. Esta llave pública combinada, es la que usaremos para encriptar los votos de los votantes.
PASO 4: VOTACIÓN Y VERIFICACIÓN DEL VOTOAl ingresar al sistema, un votante primero marca sus preferencias en un voto (en el cliente). Luego, encripta su preferencia para cada opción usando la llave pública combinada y el algoritmo conocido como ElGamal Aditivo. Cada opción se encripta como un 0 o un 1 (1 si voto por esa opción y 0 en caso contrario).
A continuación, se verifica si el voto entregado por el votante corresponde a un voto válido, es decir, es necesario revisar si es que cada opción del voto está encriptada con un 0 o con un 1, como también si el voto marca exactamente una preferencia. Esto último se hace revisando que la suma de todas las preferencias en el voto sea 1.
Sin embargo, como desde el servidor solo conocemos el texto cifrado de los votos, este proceso se hace a través de ZK-Proofs (Zero-Knowledge Proofs). Como estamos usando ElGamal Aditivo, es posible usar un Protocolo Sigma para verificar Igualdad de Logaritmos Discretos y así realizar los checks mencionados anteriormente.
Al subir un voto, se realizan estos checks (que requieren un breve intercambio de mensajes entre cliente y servidor). Y al corroborar que el voto es válido, este se almacena en la base de datos aún encriptado y el usuario es marcado como que participó.
PASO 5: CONTEOGracias a que estamos usando ElGamal Aditivo, al multiplicar los textos cifrados correspondientes a cada voto por preferencia, obtenemos un texto cifrado correspondiente a la suma de los votos.
En el sistema implementado, cada vez que guardamos un voto encriptado, sumamos sus contenidos al total de los votos. También guardamos los votos correspondientes a la votación, para poder hacer un reconteo en un caso excepcional si es que es necesario.
PASO 6: GENERACIÓN DE FACTORES DE DESENCRIPTACIÓNUna vez finaliza la votación, el sistema provee a los verificadores con una herramienta para generar factores de desencriptación usando sus llaves privadas. Un factor de desencriptación es un número calculado a partir de una llave privada y un texto cifrado. Este número sólo puede ser usado para desencriptar el texto cifrado usado.
En este caso, cada verificador genera un factor de desencriptación para los resultados de la votación y estos factores son enviados al servidor. De esta forma, el servidor sólo puede desencriptar el resultado de la votación, y por lo tanto no puede desencriptar ninguno de los votos guardados.
PASO 7: RESULTADOSAl momento en que se tienen todos los factores de desencriptación, los resultados se desencriptan y los votantes pueden acceder a ellos al entrar a la votación.
APRENDIZAJES AL CIERREImplementar este nuevo sistema de votaciones fue un interesante desafío personal, además, desde el equipo DEV en Ucampus aprendimos bastante sobre criptografía y los protocolos involucrados. Al desarrollar el flujo fuimos especialmente minuciosos en no enviar más información que la que dicta el protocolo en cada paso, sobre todo para las ZK-Proofs.
Estas últimas resultaron ser la parte más compleja de implementar, a pesar de que sólo sirven para corroborar que el contenido de los votos encriptados sea válido y, por lo tanto, los resultados de estas no son guardados en la base de datos.
Esperamos que esta sea una herramienta útil para las instituciones de educación superior, quienes podrán realizar elecciones de autoridades y quieran contar con un sistema robusto, que brinda total confianza en que sus datos estén protegidos y exista una real confidencialidad del voto.