Votos anónimos

5

Fondo

Buscando crear un sistema de votación anónimo. El sistema debe rastrear si un usuario votó o no sobre un elemento (información pública), pero solo ese usuario puede saber si votó a favor o en contra de un elemento (información privada).

Los usuarios deben iniciar sesión con un identificador único y una contraseña.

Problema

Todos los datos y todo el software están abiertos al público para su inspección.

Pregunta

¿Cómo evitaría que las personas minen la base de datos pública para descubrir cómo votaron los electores, y al mismo tiempo permitirles ver cómo votaron?

Idea # 1

Encriptar:

  1. El lado del cliente encripta el voto (arriba / abajo) usando AES ( JSAES ) en contra de su contraseña con hash.
  2. El cliente envía el voto (para el recuento) y el voto cifrado AES al servidor.
  3. El servidor registra la cuenta (pública) y el voto encriptado AES (a favor / en contra) por separado.

Descifrar:

  1. El cliente solicita el registro de votos.
  2. El servidor transfiere el voto cifrado AES.
  3. El cliente decodifica el voto cifrado AES utilizando una contraseña con hash.

Imagino dos instancias de contraseña con hash: una para la contraseña encriptada AES aplicada a los votos y otra para la contraseña real del usuario.

Para fines de autenticación, el cliente puede enviar un hash de la contraseña repetida dos veces para usarla en el hash de la contraseña real. No sé si eso agregaría información que los atacantes podrían usar para dirigirse a la votación encriptada AES.

Restricciones

El sistema tiene las siguientes restricciones:

  • Todos los datos se transfieren a través de un protocolo seguro (por ejemplo, HTTPS).
  • La gente usa el sistema en privado (es decir, no se asoma a las pantallas).
  • Sistema basado en la web (no se puede almacenar información de forma permanente en las computadoras de los usuarios).

Reducir las pérdidas de compra

El sistema implica votar por las políticas. Las políticas se envían de forma anónima, están sujetas a moderación y requieren una reputación suficiente (como StackExchanges) antes de "estar activas". Puede cambiar su voto en cualquier momento, por lo que incluso si recibió (de alguna manera) un pago, el pagador no tiene garantía de que no cambie la votación después del pago. Una vez que se promulgue la política, ya no podrá ver cómo votó.

Enlaces relacionados

Relacionados:

pregunta Dave Jarvis 18.03.2013 - 17:19
fuente

4 respuestas

6

La forma más fácil en la que puedo pensar es asignar a cada usuario una clave pública y privada. Protege la clave privada con su contraseña. Al iniciar una votación, genere un token y un par de claves para cada token. Emita un token a cada usuario cifrando el token y la clave privada con su clave pública para que solo ellos sepan que es su token. Almacenar la clave pública y el token como un registro público. Cuando el usuario va a votar, puede descifrar la clave privada de su token, emitir su voto y firmarla con la clave privada de su token.

Ya que nadie más que el usuario puede determinar que el token les pertenece y ningún usuario puede usar el token sin tener la clave privada para ese token (que solo tiene el usuario válido), el sistema permitirá al votante cambiar su vote en cualquier momento manteniendo el anonimato.

El quid del sistema es la emisión del token, que debe asegurarse de que solo emita un token único por elector y que no se mantenga ningún registro de la clave privada o el token emitido al usuario. Alternativamente, los tokens podrían generarse a petición del usuario, pero esto permitiría un ataque por el cual las personas podrían ver el orden en que se crearon y asociaron a los usuarios para intentar adivinar qué token pertenece a qué usuario, ya que el sistema tendría que realizar un seguimiento de los votos que un usuario ha solicitado un token para.

Expresado en términos de registros que tiene: (Cifrado descrito como Cifrado (clave, datos))

Registro de usuario: userId, userPubKey, Encrypt (passwordDerivedKey, userPrivKey)

Registro de votos: eventId

Registro de votación: eventId, tokenId, tokenPublicKey, Encrypt (tokenPrivKey, voteChoice)

UserTokenAssignment: userId, Encrypt (userPubKey, tokenId), Encrypt (userPubKey, tokenPrivKey)

Por lo tanto, cuando se inicia una votación, el servidor conoce la UserPubKey para cada usuario y puede crear un token (boleta) para cada usuario. Dado que se requiere el userPrivKey para que cada usuario determine cuál es su voto, se mantiene el anonimato. Como solo el usuario puede firmar la boleta, se mantiene la integridad. El usuario puede cambiar su elección en cualquier momento ya que conoce su número de boleta (token).

La única debilidad es que si los datos están siendo observados activamente, entonces el cambio es visible en los datos y el token puede ser identificado. Sin embargo, poner retrasos de tiempo aleatorios podría evitar este problema siempre y cuando el servidor esté controlado de forma privada y solo los datos y el código sean públicos.

    
respondido por el AJ Henderson 18.03.2013 - 18:01
fuente
4

Mi respuesta favorita a este tipo de problema es el cifrado homomórfico aditivo.

Esto es, en términos simples, una función criptográfica E (m), tal que E (a) + E (b) = E (a + b).

Puede implementar un Criptosistema de Paillier para sumar los votos. Esto permite una votación totalmente anónima que se puede verificar individualmente (mi voto es correcto y se contó) y públicamente (todos los votos se contaron correctamente).

No tengo conocimiento de ninguna implementación preparada de esto, por lo que lo estarías implementando desde cero, lo que es complicado por decir lo menos.

    
respondido por el pdubs 18.03.2013 - 19:09
fuente
4

Los sistemas de votación electrónica son complejos y requieren muchas características: anonimato (uno no puede vincular los votos a los votantes), verificabilidad (la imparcialidad de la cuenta debe ser verificable por todos los participantes), prevención de votos dobles, imposibilidad de "vender su voto" , y otros. Los criptógrafos han encontrado algunas formas de realizar sistemas de votación:

  • Mezclar redes : una secuencia de nodos de retransmisión que permutan los votos al azar. Esto da el anonimato fuera de la caja, siempre y cuando al menos uno de los nodos sea honesto. Pero luego, verificar que la votación no se haya jugado es difícil (en particular, verificar que nadie haya votado dos veces).

  • Encriptación homomórfica : los votos son un valor encriptado y el recuento se realiza bajo la protección de las matemáticas. El resultado final se descifra con un descifrado de grupo (la clave de descifrado se divide entre varios titulares de claves, que cooperan para este descifrado único).

Helios Voting es una implementación bien conocida de un protocolo de cifrado homomórfico (con ElGamal). Consulte su documentación . La Asociación Internacional para la Investigación Criptológica elige regularmente su directores utilizando Helios Voting.

Lea esta introducción .

    
respondido por el Tom Leek 18.03.2013 - 20:30
fuente
3

UProve le permite aprovisionar un token criptográfico para cada usuario y tenerlo de forma anónima publicar una respuesta en un sitio web.

La criptografía y la transferencia de datos no están integradas en los navegadores web, por lo que para que sea un sistema basado en la web, necesitará un intermediario para alojar el token UProve en nombre del usuario.

Esta tecnología no se adopta ampliamente y la información es escasa, pero si lees la tecnología La información general verá que aborda muchas de sus inquietudes.

Ya que parece que le gusta especular sobre AES y los protocolos, este video describe el funcionamiento interno técnico de UProve. Recomiendo que lo escuches.

También en esa página hay un enlace a Java y C # SDK

    
respondido por el random65537 18.03.2013 - 17:30
fuente

Lea otras preguntas en las etiquetas