domenica 19 maggio 2013

Sicurezza nell' uso di carte di credito online



Il rischio maggiore che si corre nell'uso della carta di credito per fare transazioni online è rappresentato dalla presenza inconsapevole nel proprio PC di un keylogger. Abbiamo analizzato in un articolo precedente cosa sono  e la loro pericolosità in quanto spesso non sono rilevati dal programma antivirus. Come soluzione di emergenza è possibile utilizzare la tastiera sullo schermo presente su tutti i maggiori sistemi operativi windows, linux e MAC. Per far fronte a questo nuovo tipo di attacchi i circuiti internazionali Visa e MasterCard hanno introdotto dei nuovi sistemi di sicurezza oltre a quelli classici (codice identificativo,codici di sicurezza e codice pin). Il più importante è il protocollo 3-d Secure (3 domain Secure ). Questo servizio è stato sviluppato da VISA e poi utilizzato anche da MASTERCARD e AMERICANEXPRESS, dal 2008 la registrazione a questo servizio è diventata obbligatoria per poter compiere acquisti online con questi circuiti.

3D-SECURE

Questo protocollo lega il processo di transazione finanziaria con un autenticazione online, e questa autenticazione si basa su un modello a 3 domini:

1.Acquirer Domain (Società che fornisce all'esercente il servizio per l'accettazione dei pagamenti con carta di credito)
2. Issuer Domain (Società che emette la carta di credito )
3. Interoperability Domain (l'infrastruttura fornita per sostenere il protocollo 3-d secure)

Una transazione avviene in questo modo:

a)Il titolare della carta di credito effettua un acquisto su un sito e inserisce i dati della propria carta, dando inizio alla transazione.
b)Il sito dell'esercente si collega, attraverso la componente Merchant Plug-In (MPI), al Directory Server (di Visa o MasterCard), inviando un messaggio di tipo VEReq contenente il PAN della carta.
c)Il Directory Server verifica se il BIN della carta rientra nella lista dei BIN comunicati dai vari Issuer come
aderenti al servizio quindi contatta l'ACS(Access Control Server) dell'Issuer domain che verifica se la singola
carta aderisce al servizio.
d)L'ICS risponde con un messaggio VERes il cui campo PAN Authentication Available indica se un'autenticazione è o non è disponibile per il PAN in questione, assumendo di conseguenza uno di questi valori:
Y se l'autenticazione disponibile
N se il titolare non partecipante al servizio
U se l'autenticazione non è possibile.
Il messaggio VERes è inoltrato al MPI dell'esercente.
e)Se la carta aderisce al servizio, l'MPI invia una richiesta d'autenticazione all'ACS attraverso il messaggio PAReq.
f)l'ACS effettua la fase d'autenticazione secondo le modalità di validazione del pagamento che l'Issuer ha stabilito (tipicamente qui avviene l'inserimento di una password).
g)l'ACS restituisce all'MPI un messaggio PARes i cui campi indicano l'esito dell'autenticazione.
h)Il Merchant Server Plug-in verifica la risposta dell'ACS e decide proseguire o meno con il normale processo autorizzativo.

Utilizzando il 3d-secure l'esercente che aderisce al servizio viene completamente esonerato da qualsiasi responsabilità.Nel caso infatti in cui il cliente dovesse disconoscere una transazione la responsabilità passa dall'Acquirer all'Issuer.

venerdì 17 maggio 2013

Un keylogger per linux



Un keylogger è un software o uno strumento hardware utilizzato per intercettare tutto quello che un utente digita sulla tastiera di un computer. Sono molto spesso utilizzati dagli hacker per recuperare password, codici bancari e altre informazioni sensibili. In internet spesso sono diffusi da worm o trojan, data la facilità con cui è possibile scrivere software di questo tipo ne esistono moltissime varianti, e a causa delle continue modifiche del codice non sempre sono rilevati dagli antivirus. Un modo empirico per rilevare la presenza di un keylogger che comunica via internet è quello di installare un firewall, monitorando le connessioni dei vari processi. Vi sono anche dei keylogger che non comunicano via internet, ma creano semplicemente un file di testo contenente tutto quello che digitiamo fino al momento in cui interrompiamo il processo. Ovviamente in questo caso l'hacker deve avere accesso fisico al vostro PC per recuperare il file e leggerlo. In Ubuntu un keylogger di questo tipo è disponibile nei repository, si chiama "logkeys" , si installa con il comando:

sudo apt-get install logkeys

Se utilizzate altre distribuzioni di linux potete scaricare a questo indirizzo il codice sorgente: https://code.google.com/p/logkeys/downloads/list. Potete utilizzarlo solo da utente root, per lanciarlo da ubuntu aprite un terminale e digitate:

sudo logkeys -s -o nomefile.log 

Tutto quello che da questo momento digitate verrà scritto nel file "nomefile.log", per interrompere il processo digitate:

sudo logkeys -k

mercoledì 15 maggio 2013

I codici delle carte di credito


La carta di credito, è uno strumento di pagamento rilasciato da una banca o da un ente finanziario. Inizialmente erano dotate unicamente di una banda magnetica collocata sul retro, successivamente per motivi di sicurezza venne aggiunto anche un microchip. I 16 numeri presenti sulla parte frontale della carta consentono di identificarla univocamente, ora vediamo cosa questi codici numerici rappresentano.

a)Il primo numero identifica il circuito a cui la carta appartiene (3 per le American Express o le Din-ers, 4 per le Visa, 5 per le MasterCard e 6 per le Discover card).

b)I numeri dalla seconda alla sesta cifra identificano la banca (codice BIN).

c)Le cifre dalla settima alla quindicesima individuano il numero del conto corrente del proprietario.

d)L'ultimo numero è una cifra di controllo

BANDA MAGNETICA
Nella parte posteriore della carta è presente una banda magnetica che contiene 3 tracce, la traccia letta dai POS durante un pagamento è la seconda, che contiene 40 caratteri numerici. Il primo carattere è il segnale di start che precede i valori veri. I successivi sedici caratteri, sono i caratteri identificativi della carta di credito, cui segue il carattere "=". I 4 carateri successivi danno informazioni sulla scadenza della carta(mese ed anno). Segue poi il codice di servizio (101 per le carte di credito e 121 per le carte di debito) e il pin (crittografato), chiudono la serie i caratteri "?" e "=".

CODICI DI SICUREZZA
È posto nella parte posteriore della scheda, composto da 3 cifre (4 cifre nelle American express).Nelle Visa e Mastercard ci sono due codici di sicurezza, uno inserito nella banda magnetica e uno impresso nella carta denominati CVC1 e CVC2.

CODICE PIN
Questo codice, per ovvi motivi, è inserito nella banda magnetica crittografato.

FORMULA LHUN
Per scoprire se i 16 numeri presenti sulla parte frontale  possono essere il codice identificativo di una carta di credito, si può usare la formula di Lhun che funziona nel modo seguente:

a)Partendo da destra e spostandosi verso sinistra si moltiplicano per 2 tutte le cifre poste in posizione pari.
b)In caso una delle moltiplicazioni porti a numeri di due cifre queste vanno sommate per ottenerne una sola.
c)Si sommano le cifre ottenute mediante le moltiplicazioni con quelle dispari. Il numero ottenuto è la cifra di Lhun.
d)Se il resto della divisione della cifra di Lhun per 10 è nullo allora il codice è valido in caso contrario no.

Passare da windows a linux senza problemi


Se avete intenzione di passare da windows a linux nel modo più indolore possibile allora dovete provare la distribuzione ZORIN OS. L'esperienza di utilizzo si avvicina molto a windows 7. Gli utenti che provengono da questo sistema operativo non avranno problemi, in quanto l'utilizzo del terminale e della linea di comando  sono praticamente assenti. Ecco alcune caratteristiche che lo rendono competitivo rispetto a win7:

.Nessun rischio di virus, potete utilizzarlo senza installare antivirus
.Maggiore velocità rispetto a win7
.Familiarità del desktop
.Interfaccia personalizzabile
.Stabilità del SO, basato su ubuntu 12.04
.Vasta scelta di software a costo zero
.Disponibile in 55 lingue
.Sistema operativo a costo zero e sempre aggiornato


ZORIN OS è distribuito con un ampia gamma di software già installato:

Browser, Google Chrome
Office, Libreoffice
Mail, Thunderbird Mail
Social, Gwibber
Music, Rhythmbox Music Player
Image, GIMP Image Editor
Video editor, OpenShot Video Editor


Ovviamente con un click è possibile scegliere ed installare tutti i software disponibili nei repository di Ubuntu. Se avete intenzione di installarlo vi consiglio di metterlo in dual boot con windows. Nell' installazione non dovreste incontrare nessun problema, eseguite il programma di installazione e si occuperà di tutto lui, dalla creazione della partizione alla configurazione. Ricordatevi solo che è consigliabile installare ZORIN OS dopo windows(o comunque con windows già installato) in quanto windows reagisce in modo "stravagante" quando si sente minacciato da linux. Questo è il link per il download http://www.zorin-os.com/free.html

martedì 14 maggio 2013

Basi di calcolo delle probabilità


Il calcolo delle probabilità è nato da umili origini ovvero da problemi riguardanti i giochi d'azzardo, oggi questa disciplina si è sviluppata rigogliosamente a causa del trionfo dei metodi sperimentali. Fisica, matematica, economia e informatica utilizzano frequentemente le sue leggi.
Per esempio, se un hacker vuole craccare una chiave PGP lunga più di 3000 bit con metodo brute-force, tenendo conto dei principi del calcolo delle probabilità si accorge che con tale metodo ci vorrebbe un tempo improponibile, con la capacità di calcolo dei PC attuali, e quindi scarterebbe questo metodo prima di cominciare.Naturalmente per spiegare dettagliatamente questa disciplina un articolo su un blog non basta, mi limiterò a dare qualche definizione e spiegare i principi fondamentali, lasciando al lettore ed alla sua buona volontà il compito di approfondire, cercando in rete oppure leggendo un buon libro.

.DEFINIZIONE
La probabilità è definita come il rapporto fra i casi favorevoli ed i casi possibili:

p=CF/CP

Ovviamente il risultato sarà un numero compreso fra 0 ed 1 , per chiarire il concetto se lanciamo un dado quale sarà la probabilità della sortita del numero "3"? Visto che i casi possibili sono 6 e il caso favorevole è 1 la probabilità sarà 1/6.

PROBABILITÀ TOTALE
Quando un evento si presenta in modalità incompatibili fra loro, la probabilità totale è uguale alla somma delle probabilità:

pt=p1+p2...+pn (ovvio che la somma non potrà mai essere maggiore di 1)

Se ad esempio vogliamo calcolare la probabilità che lanciando un dado esca o il numero 2 o il numero 3(sono due eventi incompatibili in quanto uno esclude l'altro) la probabilità vale pt=2/6.

PROBABILITÀ COMPOSTA
Quando un evento può risultare dal concorso simultaneo o successivo di 2 o più eventi la probabilità composta è uguale al prodotto delle probabilità:

pc=p1.p2.....pn

Se vogliamo calcolare la probabilità che lanciando 2 volte consecutive un dado esca 2 volte il numero uno pc=1/6.1/6=1/36

PROBABILITÀ CONTRARIA
La probabilità contraria di un evento vale 1 meno la probabilità favorevole:

pct=1-p

È logico che se lanciando un dado la probabilità di indovinare il numero vale 1/6, la probabilità di non indovinarlo vale 1-1/6=5/6

VALORE MEDIO DI UNA VARIABILE CASUALE
Se una variabile x può assumere valori diversi e ognuno di questi valori ha una probabilità p1..pn di verificarsi il valore medio di questa variabile vale:

xm=p1.x1 + p2.x2 ....pn.xn

Nel caso del lancio del dado avremo 1/6.1 + 1/6 .2 .....+1/6.6

SCARTO DI UNA VARIABILE CASUALE
Lo scarto è definito come la differenza del valore assunto da una variabile casuale rispetto al suo valore medio:

y=x-xm

DEVIAZIONE STANDARD
La deviazione standard è definita come la radice della media aritmetica del quadrato degli scarti:





PROBABILITÀ IN FUNZIONE DELLA DEVIAZIONE STANDARD
Se le probabilità dei valori che una variabile casuale può assumere sono uguali, è possibile avvalersi del seguente grafico per una stima della probabilità che il valore di una variabile casuale sia compreso entro un certo scarto:



lunedì 13 maggio 2013

Steganografia, nascondere un messaggio dentro un file


La steganografia è un sistema per nascondere un file di un certo tipo, in un altro file di tipo diverso. Ad esempio si potrebbe inserire la propria firma(file di testo) dentro un file immagine(file jpg), salvaguardando così il proprio diritto di autore sulla foto. Per spiegare nella pratica come procedere , nasconderemo un "messaggio segreto" all'interno di un file audio in formato wav.
Per procedere avete bisogno di:

1)un file wav
2)un editor esadecimale (in linux potete installare GHex)
3)un messaggio da scrivere

La struttura dei file wav è semplice, i primi 44 byte sono l'intestazione del file, e contengono alcune informazioni che non dovete modificare. I restanti byte rappresentano i dati, in pratica sono dei valori di tensione da applicare all' altoparlante dopo che sono stati convertiti da valori digitali a valori analogici. Questi dati possiamo modificarli, chiaramente il file audio perderà in qualità, ma in questo caso quello che interessa è il messaggio nascosto, e poco importa se ascoltando il file wav modificato si sentiranno dei disturbi. In questo esempio, per semplificare al massimo la procedura utilizzeremo la tabella ASCII a 8 bit per codificare le lettere del messaggio da steganografare, per cui al posto delle lettere accentate dovrete utilizzare l'apostrofo. Supponiamo che il messaggio segreto sia "questo e' un test" ecco come procedere:

a)aprire il file wav con l'editor esadecimale
b)posizionarsi sul byte 45
c)modificare 3 byte inserendo il valore 0F
d)inserire il codice ASCII della lettera "q"
e)spostarsi di un numero casuale di byte e ripetere la procedura inserendo le altre lettere del messaggio segreto.
f)salvare il file

In fase di decodifica la sequenza 0F 0F 0F è il "punto di inserimento", ogni volta che incontreremo nel file wav questa sequenza sapremo che il byte successivo rappresenta una lettera del "messaggio segreto". Naturalmente potete scrivere dei programmini che fanno tutto in modo automatico eccone un esempio in c++ per linux.


//Steganografa il messaggio del file mex.txt nel file test.wav

#include <wx/init.h>
#include <wx/string.h>

int main( )
{       int let;
FILE *fd; //file wav
FILE *fw; //file testo
fd=fopen("test.wav", "r+");
fw=fopen("mex.txt", "r");
        //calcolo step
        fseek( fd, 0 , SEEK_END);
        int dim=ftell(fd); 
        fseek( fw, 1 , SEEK_END);
        int dim1=ftell(fw); 
        int step=(dim-48)/dim1;

        fseek( fw, 0 , 0);
        fseek( fd, 44 , 0);
        //scrive nel file wav il file testo
        for(int x=0;x<dim1;x++){
let=fgetc(fw);
fputc(15,fd);
fputc(15,fd);
fputc(15,fd);
fputc(let,fd);
fseek( fd, 44+(step*(x+1)) , 0);
}
fclose(fd);
fclose(fw);
return 0;
}



//legge il messaggio steganografato nel file test.wav e lo scrive nel file risultato.txt


#include <wx/init.h>
#include <wx/string.h>

int main()
{
FILE *fd;
        FILE *fw;
        unsigned int x, x1,x2,x3;
        fw=fopen("risultato.txt", "w");
        fd=fopen("test.wav", "r");
        fseek( fd, 0 , SEEK_END);
        int dim=ftell(fd); 
        int ad;
        fseek(fd , 44,0);
 for(;;){
        x=fgetc(fd);
        x1=fgetc(fd);
        x2=fgetc(fd);
   
      if(x==15 and x1==15 and x2==15){
x3=fgetc(fd);
        fputc(x3,fw);
        ad=ftell(fd);
        fseek(fd,ad-1,0);}
ad=ftell(fd);
if((dim-ad-2)>0)
fseek(fd,ad-2,0);
else
break;
}
fclose(fw);
fclose(fd);

return 0;
}

giovedì 9 maggio 2013

Generare numeri random con scheda audio


Se tutti i numeri che vengono generati da un processo sono equamente probabili in ogni istante, allora questi numeri sono casuali. Gli utilizzi dei numeri casuali sono molteplici simulazioni,campionatura,analisi numerica,crittografia, programmazione e ad altri ancora. Generare via software numeri casuali con un algoritmo di lunghezza finita non è possibile, per cui sono nati vari algoritmi per generare sequenze numeriche random "pseudocasuali", uno dei primi è il "midlle square" inventato nel 1946 da John von Neumann. Funziona in questo modo, supponiamo di volere generare un numero casuale di 4 cifre, ossia un numero tra 0000 e 9999. Il metodo middle-square richiede come tutti i generatori di numeri pseudocasuali un valore iniziale, detto "seme" dal quale vengono generati i valori successivi. Ad esempio a partire da 1234, elevando tale numero al quadrato abbiamo le otto cifre 01522756 delle quali teniamo solamente le quattro cifre di mezzo 5227. Da queste ripetendo il procedimento otteniamo 27321529 e quindi 3215 e cosi via. Ovviamente la sequenza inizierà a ripetersi una volta che si riavrà il "seme", la lunghezza totale della sequenza fino a riavere lo stesso seme è chiamata "periodo". Per generare sequenze random senza periodo, si devono sfruttare fenomeni fisici non prevedibili come , ad esempio il "rumore" dei dispositivi elettronici. Questo tipo di segnale  generalmente ha un andamento nel tempo non descrivibile in maniera analitica, è quindi possibile studiarlo solo in termini statistici. L'idea di base era di sfruttare il rumore generato dal microfono del pc per generare sequenze di bit, e sottoporle a qualche test statistico per verificare se effettivamente la sequenze ottenute erano da considerarsi casuali. Prima di procedere, ho fatto qualche considerazione :

1)Il microfono serve per registrare segnali audio, quindi frequenze fra 20Hz e 20kHz, e taglia frequenze più alte e più basse.
2)Campionando a 8000Hz non potrei comunque analizzare frequenze superiori alla frequenza di Nyquist ovvero superiori a 4000Hz.
3)Visto che per una ricostruzione "leggibile" bisogna campionare almeno a 4 volte la frequenza analizzata, il segnale audio "valido" deve avere al massimo la frequenza di 1000Hz, segnali di frequenza superiore o sono segnali ricostruiti con errori notevoli o sono disturbi.
4)Abbassando al minimo la sensibilità del microfono amplificherei il "rumore" rispetto al segnale utile,e scegliendo di considerare frequenze di 1333Hz(con periodo pari a 6 volte il tempo di campionamento a 8000Hz) potrei aspettarmi che i valori letti siano dovuti al "rumore" e quindi casuali.


Fatte le dovute considerazioni ho scritto questo semplice programmino per linux in c++:


#include <wx/init.h>
#include <wx/string.h>
#include<math.h>


float runtest(float n1,float n0){//calcolo valore runs-test
  FILE *fr;
  char x,x1;
  float valoreatteso=1+2*((n1*n0)/(n1+n0));
  float varianzaattesa=((valoreatteso-1)*(valoreatteso-2))/(n1+n0-1);
  varianzaattesa=sqrt(varianzaattesa);
  fr=fopen("rand-mic.txt", "r");
  float contatore=1;
  for(int y=0;y<1023;y++){
    fseek(fr , y ,0);
x=fgetc(fr);
    x1=fgetc(fr);
    if(x1!=x)
contatore++;}
  float scarto= abs(contatore-valoreatteso);
  float diffscarto=2*varianzaattesa-scarto;//con 2 la prob. è 0,95
  fclose(fr);
  return (diffscarto);
}



int main( )
{
  FILE *fd;
  FILE *fw;
  int x, x1,x2;
  int n1=0;
  int n0=0;
  
  //registra 2 secondi a 8bit 8000hz
  system("arecord -d 2 rand-mic.wav");
  //apre il file per il controllo dei bit
  fd=fopen("rand-mic.wav", "r");
  //apre il file che conterrà la stringa casuale 1024 0/1
  fw=fopen("rand-mic.txt", "w");
  fseek(fd , 44,0);//salta i primi 44 byte intestazione file wav
  while(!feof(fd)){
   x=fgetc(fd);
   x1=fgetc(fd);
   x2=fgetc(fd);
   if((x1-x)>0 && (x1-x2)>0){
   fputc('1',fw);
    n1++;}
   if((x1-x)<0 && (x1-x2)<0){
   fputc('0',fw);
   n0++;}
  if(n1+n0==1024)// esce quando la sequenza è lunga 1024
  break;
}

  printf("numero segni 1 %d", n1);
  printf("numero segni 0 %d", n0);

 // monobit test n1+n0>100 e ind>0.05 per passare test
 float ind=abs(n1-n0)/sqrt(n1+n0);
 ind=ind/sqrt(2);
 fclose(fd);
 fclose(fw);
 //chiama funzione controllo run test se ind1>0 prob=0.95
 float ind1=runtest((float)n1,(float)n0); 
 printf("monobit test =  %f", ind);
 printf("runs test =  %f", ind1);
return 0;
}


Il programma scrive in un file di testo una sequenza di 1024 segni 1/0 e poi sottopone l'intera sequenza a 2 test per valutarne la casualità. Il primo test è il monobit-test che valuta il numero di 1/0, questo test da come risultato un valore numerico che se è superiore a 0,05 considera la sequenza casuale. Il secondo è il runs-test che valuta la frequenza delle variazioni 1/0 e 0/1(per approfondire leggere qui http://it.wikipedia.org/wiki/Test_dei_run) questo test da come risultato la differenza fra 2 volte lo scarto atteso e il valore assoluto dello scarto rilevato, se è maggiore di 0 significa che il 95% delle sequenze casuali rientrano in questo range.

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.