domenica 5 maggio 2013

Sicurezza nelle votazioni online


Qualche giorno fa mi chiedevo se è possibile effettuare delle votazioni online simulando esattamente le stesse condizioni di privacy e sicurezza che offrono le votazioni fatte in maniera classica, e se è possibile mettere a punto un protocollo che garantisce:

. Anonimato riguardo al voto dell' elettore.
. Verifica dei risultati da parte di chiunque.
. Verifica del proprio voto.

Ho pensato ad un protocollo che prevede l'utilizzo di 2 server separati, il primo conosce l'identità del votante ma non il suo voto, il secondo  conosce il voto ma non l'identità del votante, inoltre il primo server ,anche se non conosce il voto del singolo utente, deve essere in grado di computare i voti totali.
Sembra tutto molto complicato , ma in realtà è semplicissimo per spiegarlo facciamo un esempio, vediamo come dovrebbe avvenire la votazione di 1.000.000 di persone in un referendum che prevede le scelte SI, NO, BIANCA. Prima dei dare inizio alla procedura di voto vero e proprio il server "generatore di stringhe casuali" dovrebbe generare 1.000.000 di stringhe casuali(1.000.000 per ogni opzione di voto) con queste caratteristiche:

. Ogni stringa è composta da 32 numeri a 8 bit.
. Considerando i numeri come PARI e DISPARI (e non per il loro valore), 16.000.000 di numeri a 8 bit dovranno essere PARI e 16.000.000 DISPARI. Per ottenere una sequenza del genere si potrebbe utilizzare un algoritmo che opera come segue:

a)Genera 16.000.000 di numeri casuali PARI a 8 bit
b)Genera 16.000.000 di numeri casuali DISPARI a 8 bit
c)Mischia i numeri in modo casuale
d)Forma 1.000.000 di stringhe , prendendo i numeri in sequenza a gruppi di 32.

Finita questa operazione preliminare è possibile iniziare la votazione, riferendoci allo schema di fig .1  la votazione avviene in questo modo:

1)Il client si autentica col server "scrutinatore" e invia la "richiesta di voto".
2)Il server scrutinatore invia al server gen. num. casuali la richiesta di invio al client delle stringhe casuali e riceve come risposta 3 hash.

Prima di procedere oltre , cerchiamo di capire da cosa si originano questi 3 hash e cosa rappresentano, il server gen.num casuali ha calcolato in precedenza le 3 tabelle da 1.000.000 di stringhe da 8 bit e le considera associate una all' altra  in 1.000.000 di sequenze di 96 numeri a 8 bit,ad ogni elettore corrisponde una di queste sequenze. Gli hash inviati come risposta al server scrutinatore sono ottenuti in questo modo(per illustrare il procedimento userò stringhe da 3 numeri, in realtà sono lunghe 32 numeri):

          voto SI                    voto NO                   voto BIANCA

      12-256-23                23-243-2                      81-2-246                
      ................                ..............                      .............
      ...............                  ..............                     .............

.Si considerano le sequenze come PARI/ DISPARI    p-p-d   d-d-p    d-p-p
.Si aggiunge un PARI alla stringa abbinata al voto "SI"(ovviamente si toglie un dispari)   3p0d  1p2d  2p1d
.Si origina una sequenza casuale con le caratteristiche PARI/DISPARI calcolate 4-120-8  27-12-41  6-83-244
.Si calcola il primo hash con la funzione sha512
.Si procede in modo simile per calcolare gli altri 2 hash, cambiando la sequenza del voto "NO" e successivamente la sequenza "BIANCA".

In pratica, aggiungere un PARI significa votare per quella opzione, visto che nelle sequenze originali la somma totale dei PARI e DISPARI è uguale a zero, aggiungere un PARI togliendo un DISPARI significa che il totale, non darà più "0" ma "2"(ovvio che a quel 2 bisognerà aggiungere gli eventuali voti degli altri 999.999 elettori). Questi hash devono essere inviati come risposta al server scrutinatore in modo casuale.Adesso continuiamo la procedura riferendoci sempre alla fig.1.

3)Il server gen. num. casuali invia le 3 sequenze corrispondenti agli hash inviati al server scrutinatore al client del votante.
4)Il client del votante invia la scelta di voto al server scrutinatore, inviando una delle sequenze.
5)Il server scrutinatore calcola l'hash della sequenza e se corrisponde ad uno degli hash ricevuti dal server gen.num.casuali accetta il voto.
6)Il procedimento viene ripetuto per tutti i votanti.
7)Terminato il tempo utile per la votazione , il server scrutinatore fa richiesta al server gen.num.casuali delle sequenze casuali degli elettori astenuti dal voto, quindi può computare il risultato tenendo conto anche di queste sequenze. Se avete compreso tutto il ragionamento non avrete difficoltà a capire che  :

voti SI = (quantità dei PARI - quantità dei DISPARI)/2        nei primi 32 numeri della sequenza
voti NO = (quantità dei PARI - quantità dei DISPARI)/2        nei secondi 32 numeri della sequenza
voti BIANCA = (quantità dei PARI - quantità dei DISPARI)/2       nei terzi 32 numeri della sequenza

Al termine dalla votazione le tabelle contenute nel server gen. num. casuali DOVRANNO ESSERE DISTRUTTE, per impedire che il voto di chiunque possa essere identificato, fatto questo le tabelle dei voti nel server scrutinatore potranno essere pubblicate nella forma seguente:
                                                                                                                            VOTO SI (32 numeri da 8 bit)VOTO NO(32 numeri da 8 bit)VOTO BIANCA(32 numeri da 8 bit)(hash sha512)
                           
In questo modo l'utente che ha votato può controllare il proprio voto(in quanto ha memorizzato nel client l'hash e la sequenza inviata come voto) e computare anche l'esito della votazione contando i PARI/DISPARI. Nessuno oltre a lui potrà sapere cosa effettivamente ha votato, in quanto la sequenza di 96 numeri da 8 bit presa singolarmente non dà informazioni sul voto.
Per completare il discorso vi dico che ci sono 2 casi particolari in questo protocollo il primo si verifica quando una sequenza di 32 numeri è composta di soli numeri PARI. In questo caso sarebbe impossibile aggiungerne 1 , e il voto non sarebbe conteggiato, questo è uno dei motivi per cui ho scelto sequenze da 32 numeri infatti in questo caso sequenze tutte PARI hanno una probabilità di 1 caso ogni 4294967296 voti. Sicuramente un errore minore degli errori che si verificano nello spoglio manuale. Il secondo caso caso particolare sono le sequenze da 32 numeri tutti dispari, qui il conteggio sarebbe corretto, ma sarebbe palese il fatto che il voto NON È STATO DATO a quell' opzione, ad ogni modo anche qui si dovrebbe verificare 1 caso ogni 4294967296 voti.

Nessun commento:

Posta un commento