dilluns, 22 d’octubre de 2012

Vot electrònic (I)

IMPORTANT: L'algoritme aquí explicat crec que no va bé. De fet, crec que el vot no és secret, o com a mínim no ho és si el que emet la papereta i el que la reb són el mateix. Com que en el cas d'un gobern, crec que seríen el mateix o tindríen incentius per "conxorxar-se", no me'n fiaría massa. Si es vol fer vot electrònic, es pot fer pseudo-presencial: vas a l'ajuntament/ambaixada/consolat més proper i allà tenen una pila de sobres tancats amb contrasenyes "úniques", tu agafes un sobre a canvi del DNI que te'l registren a la base de dades per no "repetir-te" i fas servir aquesta contrasenya per votar per internet. Fàcil, senzill, tothom ho pot entendre, i es pot implementar sense masses dificultats.

EDIT II: Crec que he trobat una manera de fer que això funcioni, però la revisaré una mica abans de publicar-la.

Fa molt de temps que no publico res, i sento haver de fer una entrada técnica i poc "agraïda", però em vui apuntar el següent algorisme.

Primer les referències:


@article{DBLP:journals/cacm/Chaum85,
  author    = {David Chaum},
  title     = {Security Without Identification: Transaction Systems to
               Make Big Brother Obsolete},
  journal   = {Commun. ACM},
  volume    = {28},
  number    = {10},
  year      = {1985},
  pages     = {1030-1044},
  ee        = {http://doi.acm.org/10.1145/4372.4373},
  bibsource = {DBLP, http://dblp.uni-trier.de}
}


BibTex == lol

I també els apunts del DEIC que baixen i pugen i mai se sap si es mantindràn per gaire temps:
http://www.deic.uab.es/material/20375-9-protocols.pdf

De què es tracta? De votar per internet.
Queda pendent fer una implementació de la democràcia líquida. Es pot fer. I el vot és secret. Bàsicament és ampliant la mateixa idea.

La inspiració bé d'un dia de classe, a Seguretat Computacional, on ens van explicar un algoritme per fer transaccions (de $) sense que el banc sapigués qui les feia. Com és que no he sentit a parlar d'això? Doncs per que funcionava tant bé que blanquejar diners seria perillosament fàcil, així que no s'usa. Aquí crec que no tenim el mateix problema.

Què necessitem? Un algoritme que compleixi nosequina propietat (distributiva, diria). El cas és que RSA la compleix, així que no ens hi ficarem gaire més, ja que podem fer servir el DNIe.

-1. La propietat distributiva és que Ei(x)*Ei(y) == Ei(x * y) && Di(x) * Di(y) == Di(x * y), on Ei(x) és xifrar "x" amb la clau pública de "I" i Di(x) amb la clau privada (signar).
0. Tenim al ciutadà (A) i el parlament (B)
1. El ciutadà tria un nombre aleatòri de 128 bits, que anomenarem "m".
2. El ciutadà tria un segon nombre aleatòri, el "factor de ceguesa" "k".
3. El ciutadà calcula mEb(k). Eb(k) == "k" xifrat amb la clau pública del parlament. mEb(k) == m * Eb(k).
4. El ciutadà s'identifica amb el DNIe al parlament i li envia mEb(k).
5. El parlament signa mEb(k), obtenint Db(mEb(k)). Fem una mica de matex amb la propietat distributiva: Db(m * Eb(k)) == Db(m) * Db(Eb(k)) == Db(m) * k == kDb(m)
6. El parlament li retorna al ciutadà kDb(m). S'anota que ja li ha enviat la "butlleta" a aquest ciutadà per no enviar-li una altra.
7. El ciutadà obtè Db(m) gràcies a Db(m) == kDb(m) / k
8. En un moment diferent, el ciutadà envia al parlament el seu vot juntament amb Db(m) i "m". El parlament comprova que la firma és correcte i accepta el vot si "m" no ha estat utilitzat prèviament.

Amb això tenim que el parlament entre els passos 4 i 6 el parlament no pot obtenir "m" i, per tant, no sap què firma i, si el pas 8 es fa amb prou diferència de temps, no es pot lligar el ciutadà amb el seu vot.
Per a la gent que no sàpiguen criptografía, però si que tinguin una idea de mates, crec que amb els següents apunts breus ho podràn copsar tot (en cas contrari, comentaris i responc):

Les funcions criptogràfiques són 2: Eb(x) i Db(x); la gràcia està en que TOTHOM pot realitzar Eb(x) però només "B" pot fer Db(x). També tenen la particularitat de que Eb(Db(x)) == Db(Eb(x)) == x.
En RSA (algorisme més utilitzat) explicat de forma ràpida: tens 3 números: "d", "e" i "N". "e" i "N" es fan públics, aleshores:
Eb(x) = x ^ e (mod N)
Db(x) = x ^ d (mod N)
Per a que funcioni, d = e (mod phi(N)), diria; però és igual...

P.S.: No me'n recordava. El nombre "m" és de 128 bits per "evitar" que es repeteixi. He fet càlculs ràpids seguint la paradoxa de l'aniversari i m'ha donat que les probabilitats a España (47M de persones, menys de 2^26) 2 persones triin el mateix nombre és de 2^(-120), que seria de 1 entre un nombre de 37 xifres. Difícil.

P.P.S.: Ja li he trobat un error a l'algoritme. Aquesta tarda reviso els apunts, que he de tornar al curro.

P.P.P.S.: No, l'algoritme és correcte. Em pensava que l'administració podría trobar la "transacció" amb la cual va crear una butlleta un cop veia la butlleta fent un seguit d'operacions matemàtiques i comprovacions, segons els meus càlculs aquestes comprovacions resultaven certes en la "transacció" que va crear la butlleta. Ara bé, resulta que també són certes en totes les transaccions, així que m'he estat rallant 2 dies amb el tema per al final descobrir que tot era correcte. Próximament, democràcia líquida.