Voti anonimi

5

Sfondo

In cerca di creare un sistema di voto anonimo. Il sistema deve monitorare se un utente ha votato o meno su un oggetto (informazioni pubbliche), ma solo a quell'utente è consentito sapere se ha votato a favore o contro un oggetto (informazioni private).

Gli utenti devono accedere con un identificativo univoco e una password.

Problema

Tutti i dati e tutti i software sono aperti al pubblico per l'ispezione.

Domanda

Come impedirebbe alle persone di estrarre il database pubblico per scoprire come hanno votato i componenti, e tuttavia consentire agli elettori di vedere come hanno votato?

Idea n. 1

Encrypt:

  1. Voto crittografico lato client (su / giù) utilizzando AES ( JSAES ) contro la password con hash.
  2. Il client invia il voto (per il conteggio) e il voto crittografato con AES al server.
  3. Il server registra il conteggio (pubblico) e il voto crittografato con AES (per / contro) separatamente.

Decrypt:

  1. Il cliente richiede il record di voto.
  2. Il server trasferisce il voto crittografato con AES.
  3. Il client decodifica il voto crittografato con AES utilizzando la password con hash.

Immagino due istanze di password con hash: una per la password crittografata con AES applicata ai voti e una per la password effettiva dell'utente.

Ai fini dell'autenticazione, il client potrebbe inviare un hash della password ripetuta due volte da utilizzare per l'hash della password effettiva. Non so se ciò aggiungerebbe qualsiasi informazione che gli aggressori potrebbero utilizzare per scegliere il voto crittografato con AES.

Vincoli

Il sistema ha i seguenti vincoli:

  • Tutti i dati vengono trasferiti su un protocollo sicuro (ad es. HTTPS).
  • Le persone usano il sistema in privato (cioè senza sbirciare alle schermate).
  • Sistema basato sul Web (nessuna informazione può essere archiviata in modo permanente sui computer degli utenti).

Attenuazione dei buy off

Il sistema comporta il voto per le politiche. Le politiche sono inviate in forma anonima, soggette a moderazione e richiedono una reputazione sufficiente (come StackExchanges) prima di passare alla modalità "live". Puoi cambiare il tuo voto in qualsiasi momento, quindi anche se ti è stato (in qualche modo) assegnato un pagamento, il pagatore non ha alcuna garanzia che tu non cambi il voto dopo il pagamento. Dopo l'approvazione della norma, non puoi più vedere come hai votato.

Collegamenti correlati

Related:

posta Dave Jarvis 18.03.2013 - 17:19
fonte

4 risposte

6

Il modo più semplice a cui posso pensare sarebbe assegnare a ciascun utente una chiave pubblica e privata. Proteggi la chiave privata con la loro password. All'inizio del voto, genera un token e una coppia di chiavi per ogni token. Emettere un token a ciascun utente crittografando il token e la chiave privata con la propria chiave pubblica in modo che solo loro sappiano che è il loro token. Archivia la chiave pubblica e il token come record pubblico. Quando l'utente va al voto, può decodificare la chiave privata per il proprio token, eseguire il proprio voto e firmarlo con la chiave privata del proprio token.

Poiché nessun altro oltre all'utente può determinare che il token appartiene a loro e nessun utente può utilizzare il token senza tenere la chiave privata per quel token (che solo l'utente valido ha), il sistema consentirà all'elettore di cambiare la propria votare in qualsiasi momento mantenendo l'anonimato.

Il punto cruciale del sistema è l'emissione di token che deve assicurarsi che emetta solo un singolo token per elettore e che non venga conservato alcun record della chiave privata o del token rilasciato all'utente. In alternativa, i token possono essere generati su richiesta dell'utente, ma ciò consentirebbe un attacco in cui le persone potrebbero guardare all'ordine in cui i token sono stati creati e associati agli utenti per cercare di indovinare quale token appartiene a quale utente dal momento che il sistema dovrebbe tenere traccia di quale voto un utente ha richiesto un token per.

Espresso in termini di record che hai: (Crittografia descritta come Encrypt (chiave, dati))

Record utente: userId, userPubKey, Encrypt (passwordDerivedKey, userPrivKey)

Vota record: eventId

Record di voto: eventId, tokenId, tokenPublicKey, Encrypt (tokenPrivKey, voteChoice)

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

Quindi, quando viene avviato un voto, il server conosce userPubKey per ogni utente e può creare un token (scrutinio) per ogni utente. Poiché userPrivKey è richiesto per ogni utente per determinare quale scheda è la loro, viene mantenuto l'anonimato. Poiché solo l'utente può firmare la scheda, viene mantenuta l'integrità. L'utente può cambiare la propria scelta in qualsiasi momento dal momento che conosce il proprio numero di ballot (token).

L'unico punto debole è che se i dati vengono guardati attivamente, la modifica è visibile nei dati e il token può essere identificato. L'impostazione di ritardi casuali potrebbe impedire questo problema, purché il server sia controllato in modo indipendente e solo i dati e il codice siano pubblici.

    
risposta data 18.03.2013 - 18:01
fonte
4

La mia risposta preferita a questo tipo di problema è la crittografia omomorfica additiva.

Questa è, in termini semplici, una funzione crittografica E (m), tale che E (a) + E (b) = E (a + b).

Potresti implementare un Paillier cryptosystem per votare. Ciò consente il voto completamente anonimo che è verificabile individualmente (il mio voto è corretto ed è stato conteggiato) e pubblicamente (tutti i voti sono stati conteggiati correttamente).

Non sono a conoscenza di eventuali implementazioni preconfigurate di questo, quindi dovresti implementarlo da zero, il che è a dir poco complicato.

    
risposta data 18.03.2013 - 19:09
fonte
4

I sistemi di votazione elettronica sono complessi e richiedono molte caratteristiche: anonimato (non si possono collegare voti agli elettori), verificabilità (l'equità del conteggio deve essere verificabile da tutti i partecipanti), prevenzione del doppio voto, impossibilità di "vendere il proprio voto" , e altri. I crittografi hanno trovato alcuni modi per realizzare sistemi di voto:

  • Mescolare le reti : una sequenza di nodi di inoltro che permangono a caso i voti. Questo dà l'anonimato fuori dalla scatola, purché almeno uno dei nodi sia onesto. Ma poi, controllare che il voto non sia stato giocato è difficile (in particolare, verificando che nessuno abbia votato due volte).

  • Crittografia omomorfica : i voti sono un valore crittografato e il conteggio viene eseguito sotto la protezione della matematica. Il risultato finale viene decrittografato con una decrittazione di gruppo (la chiave di decrittazione viene divisa tra diversi detentori di chiavi, che collaborano per questa singola decrittazione).

Helios Voting è un'implementazione ben nota di un protocollo di crittografia omomorfico (con ElGamal). Vedi la sua documentazione . L' International Association for Cryptologic Research elegge regolarmente il suo registi utilizzando Helios Voting.

Leggi questa introduzione .

    
risposta data 18.03.2013 - 20:30
fonte
3

UProve ti consente di fornire un token crittografico a ciascun utente e di renderlo anonimo pubblicare una risposta su un sito Web.

La crittografia e il trasferimento dei dati non sono integrati nei browser Web, quindi per renderli un sistema basato sul web è necessario un intermediario per ospitare il token UProve per conto dell'utente.

Questa tecnologia non è ampiamente adottata e le informazioni sono scarse, ma se leggi la tecnologia Panoramica vedrai che sono indirizzi molti dei tuoi dubbi.

Dal momento che sembra che ti piaccia speculare su AES e protocolli, questo video descrive il funzionamento interno tecnico di UProve. Consiglio vivamente di dargli un ascolto.

Anche in quella pagina c'è un collegamento a Java e C # SDK

    
risposta data 18.03.2013 - 17:30
fonte