El voto electrónico, que utilizan sistemas para enviar y contar votos en una elección, ha sido un tema de interés en la criptografía en la última década. En comparación con el voto tradicional en papel, el voto electrónico es amigable con el ambiente, puede procesar, contar en tiempo real y es menos propenso a errores. A medida que el esfuerzo y tiempo necesario para participar en una elección disminuya, la cantidad de votantes puede aumentar.
Actualmente los únicos países que utilizan el voto electrónico con validez legal son Bélgica, Estonia, EEUU, Brasil, Filipinas, India y Venezuela. En países como Alemania, Finlandia, Holanda y Irlanda fue prohibido el uso de voto electrónico luego de encontrar severos problemas de seguridad y usabilidad. (Leer más)
Los protocolos de votos electrónicos actuales se basan en un registro público para guardar los votos y pruebas criptográficas como la Prueba de Conocimiento Cero ZKP por su siglas en inglés (Zero Knowledge Proof) establece un método para que algunas de las partes prueben a otra que una declaración es cierta, sin revelar nada más que la veracidad de la declaración. El registro público comúnmente es implementado como una base de datos relacional, que no provee integridad e inmutabilidad de los datos, esto implica para los protocolos actuales de votos electrónicos donde los sistemas son centralizados, se tendría que confiar ciegamente en la entidad que organiza la votación.
Los problemas de centralización e inmutabilidad de los datos de los sistemas actuales pudieran ser solucionados con la tecnología Blockchain utilizándose como el registro público de los votos emitidos, logrando integridad de los datos, transparencia y tolerancia a fallas.
Estado del arte
Los protocolos de votación electrónica basada en tecnología Blockchain la utilizan únicamente para registrar el voto individual y el conteo de votos con la ayuda de un contrato inteligente. Además, estas soluciones son prácticas y escalables mientras la tecnología Blockchain lo sea, además permite el voto secreto, una propiedad esencial declarada como un derecho humano.¹
El protocolo de Open Vote Network (OVN), fue implementado en un contrato inteligente en la Blockchain de Ethereum por Patrick McCorry², logra la confidencialidad del voto. La desventaja principalmente de este protocolo es que el costo computacional de emitir un voto es O(n) donde n es el número de votantes, esto hace que la implementación sea inadecuada para conducir elecciones con más de 50 personas, ya que no sería posible contar los votos.
La red de Ethereum solo se puede ejecutar un número limitado de instrucciones computacionales por bloque, esto en las redes públicas de Ethereum donde el límite es de 4.3 millones de gas, en redes privadas ese límite pudiera incrementarse, sin embargo sigue siendo computacionalmente inviable debido al costo computacional de ello. Otro inconveniente del protocolo es que el último votante puede calcular el conteo final y pudiera actuar en consecuencia, aprobar o rechazar alguna votación debido a que su voto pudiera ser el decisivo.
Las firmas ciegas fueron sugeridas por David Chaum, el voto electrónico ha sido uno de los principales casos de uso de firmas ciegas. Esta es una solución sólida para obtener la autorización de los votantes mientras se mantiene el anonimato. El primer protocolo utilizando tecnología Blockchain que usa firmas ciegas fue sugerido en 2017 ³ . Como resultado de la aplicación de firmas ciegas, el protocolo proporciona al votante pseudo-anonimato (pseudo por la naturaleza de la Blockchain), aun cuando la complejidad de emitir un voto es O(1), en la Blockchain de Ethereum antes del hard fork de octubre de 2017, no era práctico verificar firmas ciegas, luego del hard fork es posible realizar operaciones de curvas elípticas on-chain.
![Video preview](https://i.ytimg.com/vi/2-sLbNHKhz8/hqdefault.jpg)
El protocolo de firma ciega permite que un esquema de votación disocie el voto del votante, mientras se mantiene la autenticación, una breve recapitulación del protocolo de votación electrónica seria:
- Votantes: la lista de los votantes
- Organizadores: el conjunto de organizadores de las elecciones, cuya tarea es registrar votantes elegibles e interactuar con ellos (firmar ciegamente los votos) durante el transcurso de la votación
Supongamos que Alice es una votante y Bob un organizador.
Asumimos que ambos bandos han aceptado en utilizar criptografía de curvas elíptica con una séxtupla de parámetros predefinidos por la curva Barreto-Naehrig (altbn128)
Donde la séxtupla de parámetros se definen como:
- p = número entero que especifica el campo finito de la función Fp
- a,b = números enteros ∈ Fp que especifican una curva elíptica E(Fp) que se define con la ecuación
- G = un punto generador
- n = un número primo
- h = un número entero
Donde los valores para la curva Barreto-Naehrig (altbn128) son :
p= 30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a,b= (0,3)G= (0,1)n= 30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001h= 1
La implementación tiene las siguientes fases:
- Alice obtiene la clave pública de Bob definida por P = Pkey* G y genera dos números enteros aleatorios γ δ ∈ Z.
- Bob genera un número entero aleatorio r ∈ Z y calcula el punto R = r * G y envía R a Alice.
- Alice calcula el punto A = R + γ * G + δ * P , selecciona la coordenada x de A y calcula t= x mod(n) (si t = 0 mod n Alice tiene que generar nuevamente los números γ δ ∈ Z del paso 1)
- Alice calcula c = H ( m || t) mod n (el mensaje sin cesgar) y c’ = c — δ mod n (el mensaje ciego) y envía c’ a Bob.
- Bob calcula s’ = r-c’ * d mod n (la firma del mensaje ciego) y la se la envía a Alice
- Alice calcula s = s’ + γ mod n (la firma del mensaje sin cegar)
- La firma del mensaje m es (s,c)
Diseño
La Blockchain de Ethereum fue elegida para la implementación del protocolo de firmas ciegas, debido a que, en contraste con Bitcoin, no solo es capaz de almacenar datos, sino que también es capaz de aplicar la correcta ejecución del protocolo debido a su naturaleza programable mediante el desarrollo de un contrato inteligente.
La emisión de firmas ciegas no puede ser realizada dentro del contrato inteligente de Ethereum, ya que, para el cálculo de firmas ciegas, el organizador debe proporcionar su clave privada. Debido a la naturaleza del entorno de ejecución de máquina virtual de Ethereum (EVM), el organizador no puede firmar los votos sin revelar su clave privada, por lo tanto, sólo la verificación de las firmas puede llevarse a cabo dentro del contrato inteligente.
Verificación de firmas ciegas en Ethereum
Varios algoritmos podrían haber sido utilizados para implementar firmas ciegas. La primera opción habría sido utilizar firmas ciegas RSA, pero dado que el máximo tamaño de cadenas en la EVM es de 256 bits, utilizar este método sería inseguro ya que en pocas horas con una computadora personal pudiera ser factorizada la firma.
Las firmas ciegas que usan Criptografía de Curvas Elípticas (ECC) utilizan cadenas de claves más compactas, por lo tanto, pueden proporcionar un nivel de seguridad incluso en un entorno tan limitado como la EVM. Sin embargo, antes de la actualización de la red de Ethereum, la verificación de firmas ciegas ECC no era posible, lo que significaba que se necesitaba utilizar librerías externas para realizar operaciones sobre curvas elípticas,ya que incluso verificar una firma ciega costaria mas del limite de gas disponible en un bloque, es decir nunca habría dejado algún cambio en la Blockchain.
Como resultado del hard fork Byzantium, la adición de un punto sobre una curva elíptica y la multiplicación de un punto por un escalar son compatibles de forma nativa en la EVM, lo que también significa que tales operaciones consumen significativamente menos gas que antes del hard fork. Este cambio permite una implementación práctica de firmas ciegas sobre ECC en Ethereum.
function ecmul(uint256 x, uint256 y, uint256 scalar) public constant returns(uint256[2] p) { // With a public key (x, y), this computes p = scalar * (x, y). uint256[3] memory input; input[0] = x; input[1] = y; input[2] = scalar; assembly { // call ecmul precompile if iszero(call(not(0), 0x07, 0, input, 0x60, p, 0x40)) { revert(0, 0) } } }
function ecadd(uint256 x1, uint256 y1, uint256 x2, uint256 y2) public constant returns (uint256[2] p) { uint256[4] memory input; input[0] = x1; input[1] = y1; input[2] = x2; input[3] = y2; assembly { if iszero(call(not(0), 0x06, 0, input, 0x80, p, 0x40)) { revert(0, 0) } } }
/* @dev Funcion para verificar firmas ciegas @param m mensaje sin cesgar @param c mensaje ciego @param s firma del mensaje ciego */ function verifyBlindSig(uint256 m, uint256 c, uint256 s) internal constant { uint[2] memory cP = eccPrecompiles.ecmul(pubKeyOfOrganizer[0], pubKeyOfOrganizer[1], c); uint[2] memory sG = eccPrecompiles.ecmul(generatorPoint[0], generatorPoint[1], s); uint[2] memory sum = eccPrecompiles.ecadd(cP[0], cP[1], sG[0], sG[1]); uint projection = sum[0] % n; require(c == uint(keccak256(abi.encodePacked(uintToString(m),uintToString(projection))))); }
Conclusiones
En la implantación de este protocolo se supone la existencia de un canal de comunicación seguro entre el organizador y los votantes. Además, también supone la existencia un cliente seguro.
Algunas fallas de seguridad en este protocolo pudiera ser:
- El organizador podría negarse a cegar algunos votos o incluso generar una firma invalida
- La seguridad del esquema de firma ciega depende de la dificultad de resolver el problema discreto en el grupo de curvas elípticas altBN128.
- En caso de robo de la clave privada del organizador se podrían generar votos dobles o falsos.
- El anonimato del voto puede ser vulnerado utilizando ataques de tiempo, se podría conectar los votos a la identidad del votante si entre la generación de la firma y la emisión del voto hay solo unos pocos o ningún voto emitido.
Actualmente no es posible implementar un protocolo de votaciones en Blockchain (al menos utilizando la plataforma Ethereum) que pueda cumplir con todos los requisitos de seguridad. Sin embargo, con el avance de la tecnología e investigación, en un futuro a corto plazo se pueda tener una solución más segura basada 100% en Blockchain.
Referencias
- Declaración de los Derechos Humanos de 1948 | Naciones Unidas.
- A Smart Contract for Boardroom Voting with Maximum Voter Privacy. Patrick McCorry. https://fc17.ifca.ai/preproceedings/paper_80.pdf
- An E-voting Protocol Based on Blockchain. Yi Liu y Qi Wang. https://eprint.iacr.org/2017/1043.pdf