Skip to content

Instantly share code, notes, and snippets.

@sirex
Last active August 29, 2015 14:12
Show Gist options
  • Save sirex/946d19a786892357ce28 to your computer and use it in GitHub Desktop.
Save sirex/946d19a786892357ce28 to your computer and use it in GitHub Desktop.
Balsavimo internetu diskusijos konspektas

Konspektas balsavimo internetu diskusijai

Informaciją apie diskusiją:

http://balsavimasinternetu.lt/konferencija-balsavimas-internetu-techniniai-issukiai-ir-galimi-sprendimai/

Turinys

Diskusijoje dalyvaujantys oponentai

Sven Heiberg

Estijos i-balsavimo sistemos vienas iš kūrėjų.

  • Sven Heiberg Gihub profilis1.
  • Estijos balsavimo internetu sistemos išeities kodas2.
  • Informacija apie tai, kaip veikia Estijos balsavimo internetu sistema3, 4,5,6.

Christian Bull

Norvegijos i-balsavimo sistemos kūrėjas.

  • Norvegijos pilotinės balsavimo internetu sistemos bandymų ataskaita7.
  • Skaidrės iš seminaro apie Norvegijos balsavimo sistemą (tame tarpe ir interneto balsavimo sistemą)8.
  • Norvegijos pilotinio projekto išeities kodas9.
  • Ran Canetti ir Ronald L. Rivest paskaitų medžiagą, konkrečiai 17 ir 18 paskaitose supažindinama su Norvegijos pilotiniame projekte naudojamą Mix-nets pagrindu veikiantį protokolą10.
  • Mano įžvalgos apie Norvegijos pilotinį projektą11.
  • Norvegijos balsavimo internetu studijos santrauka anglų kalba12.
  • Straipsnis apie Norvegijos balsavimo internetu bandymus13.

Kęstutis Matuliauskas

IT ekspertas, Silicio slėnyje dirbęs tris metus, turintis patirties kiberatakų srityje.

Mano argumentai ir pozicija

Nėra konkretaus balsavimo internetu protokolo

Šiuo metu, Lietuvoje, nesu girdėjęs jokių konkrečių, pasiūlymų iš balsavimo internetu šalininkų, koks konkretus protokolas būtų naudojamas. Peršasi išvada, kad niekas konkretaus protokolo ir nežino.

Mano nuomone, svarstymai apie balsavimą internetu turėtų prasidėti ne politiniu lygmeniu, o akademiniu. Tik turint mokslo įrodytą ir pagrįstą protokolą, galima pereiti prie jo taikymo, ne atvirkščiai.

Šiuo metu, siūlomuose teisės aktuose14 nenurodytas joks konkretus protokolas, suteikiama visiškai laisvė VRK realizuoti balsavimą internetu, kaip tik nori.

Kerkhofo aksioma

Kerkhofo aksioma teigia15:

A cryptosystem should be secure even if everything about the system, except the key, is public knowledge.

Šiuo metu, siūlomuose teisės aktuose16 tokia sąlyga neiškelta ir visos įgyvendinimo detalės paliktos VRK, kuri gali pasirinkti paslaptimi grįsto protokolo variantą17.

Balsavimo internetu protokolas turi būti labai paprastas ir visiškai atviras. Visas balsavimo internetu kodas turi būti atviras ir pateiktas viešai.

Turint protokolo aprašymą, kiekvienas norintis galėtų nepasitikėti jokiomis išorinėmis programomis ir galėtų pasirašyti savo programą.

Rezultatus skaičiuoja visi

Garsioji Josifo Stalino citata18:

Those who cast the votes decide nothing. Those who count the votes decide everything.

Pagal siūlomus teisės aktų pakeitimus19, kaip bus skaičiuojami balsai visiškai sprendžia VRK:

811 straipsnis. Balsavusių internetu rinkėjų balsų skaičiavimas

  1. Balsavusių internetu rinkėjų balsavimo kiekvienoje rinkimų apygardoje rezultatai pagal informacinės sistemos duomenis nustatomi Vyriausiosios rinkimų komisijos nustatyta tvarka. Siekiant nustatyti balsavusių internetu rinkėjų balsavimo rezultatus, duomenys pradedami apdoroti tik pasibaigus balsavimo rinkimų apylinkėse laikui. Apdorojant informacinės sistemos duomenis, kai nustatomi balsavusių internetu rinkėjų balsavimo rezultatai, Vyriausioji rinkimų komisija užtikrina balsavusių internetu rinkėjų balsavimo slaptumą.

Visai tikėtina, kad balsų skaičiavimas bus pavestas informacinei sistemai, su kelių žmonių priežiūra.

Įstatymas turi aiškiai apibrėžti, kad balsavimo internetu protokolas, turi suteikti galimybę balsus skaičiuoti visiems. Balsų duomenų bazė turi būti visiškai atvira ir prieinama visiems, kurie nori įsitikinti ar asmeniškai to žmogaus balsas buvo įskaitytas teisingai ir suskaičiuoti balsavimų rezultatą.

Galimybė patikrinti savo balsą ir suskaičiuoti balsavimo rezultatus, neturi pažeisti slapto balsavimo teisės20.

Balso slaptumas

Ištraukos iš Lietuvos Respublikos Konstitucijos21:

55 straipsnis

Seimą sudaro Tautos atstovai - 141 Seimo narys, kurie renkami ketveriems metams remiantis visuotine, lygia, tiesiogine rinkimų teise ir slaptu balsavimu.

78 straipsnis

Respublikos Prezidentą renka Lietuvos Respublikos piliečiai penkeriems metams, remdamiesi visuotine, lygia ir tiesiogine rinkimų teise, slaptu balsavimu.

119 straipsnis

Savivaldybių tarybų nariais Lietuvos Respublikos piliečius ir kitus nuolatinius administracinio vieneto gyventojus pagal įstatymą ketveriems metams renka Lietuvos Respublikos piliečiai ir kiti nuolatiniai administracinio vieneto gyventojai, remdamiesi visuotine, lygia ir tiesiogine rinkimų teise, slaptu balsavimu.

Visuotinai lygi balsavimo teisė

Lietuvos Respublikos konstitucija teikia, kad rinkimai turi būti organizuojami remiantis visuotinai lygia rinkimų teise. Tai reiškia, kad balsavimo internetu protokolas turi būti pakankamai paprastas, kad jį galėtų suprasti visi Lietuvos piliečiai.

Tai reiškia, kad kiekvienas balsavimo teisę turintis Lietuvos pilietis, prieš balsuojant, turėtų galimybę tiksliai suprasti balsavimo internetu protokolą ir turėdamas tas žinias, galėtų susikurti savo balsavimo internetu protokolo realizacija, kuria naudojantis galėtų balsuoti, patikrinti savo balsą ir suskaičiuoti balsavimo rezultatus.

Mokykloje, per informatikos pamokas ir laisvai prieinamuose kursuose, visi norintys, turėtų galimybę išmokti protokolą ir patys įsitikinti ar jis veikia.

„Security through obscurity has never achieved engineering acceptance as an approach to securing a system, as it contradicts the principle of simplicity.“22.

Kaip pavyzdį pateikiu ElGamal algoritmo kodą, kuris pilnai veikia ir užima vos 28 eilutes kodo. Norint suprasti alogritmą, užtenka elementarių matematikos žinių.

Balsuojančiojo kompiuterio saugumas

CERT statistikos ataskaitos duomenimis23,24, 2014 m. III ketvirtį buvo ištirta beveik 10000 incidentų, apie kuriuose buvo pranešta. Lyginant su praeitu ketvirčiu incidentų skaičius išaugo 62%:

Lietuvos Respublikos ryšių reguliavimo tarnybos nacionalinis elektroninių ryšių tinklų ir informacijos saugumo incidentų tyrimo padalinys (CERT-LT) apibendrina 2014 m. III ketvirčio veiklos rezultatus. CERT-LT 2014 m. III ketvirtį ištyrė 9 566 incidentus pagal iš Lietuvos elektroninių ryšių paslaugų teikėjų, užsienio CERT tarnybų, atliekančių tarptautinius incidentų tyrimus, ir iš Lietuvos interneto naudotojų gautus pranešimus apie incidentus elektroninėje erdvėje. Palyginti su tuo pačiu 2013 m. laikotarpiu (5 907 incidentų), incidentų padaugėjo 62 procentais. Šių metų III-ame ketvirtyje CERT-LT atliktų tyrimų metu buvo užregistruoti 3 647 incidentai, susiję su pavojingomis interneto tinkle veikiančių įrenginių saugumo spragomis, kurios gali būti išnaudotos kenkimo veiklai internete.

Šie skaičiai apima tik tuos incidentus, apie kuriuos buvo pranešta. Tikrieji skaičiai gali būti žymiai didesnis.

Viruso pagalba galima visiškai perimti kompiuterio valdymą ir taip vadinamo „The Ken Thompson Hack“25 atakos pagalba, sunkiai įmanoma aptikti ar kontroliuoti virusų keliamus pavojus.

Ken describes how he injected a virus into a compiler. Not only did his compiler know it was compiling the login function and inject a backdoor, but it also knew when it was compiling itself and injected the backdoor generator into the compiler it was creating. The source code for the compiler thereafter contains no evidence of either virus.

Todėl, prieš pereinant prie balsavimo internetu, kažkokiu būdu turi būti užtikrintas kiekvieno balsuojančiojo kompiuterio saugumas. Tol kol egzistuoja teorinė įsilaužimo galimybė, visada gali atsirasti praktiniai taikymai. Šiai dienai egzistuoja ne tik teorinė, bet ir dideli skaičiai praktinių pavyzdžių.

Kol neįmanoma užtikrinti balsuojančiojo kompiuterio saugumo, būtina pasitelkti išorines priemones saugumui užtikrinti, pavyzdžiui paprastu paštu siunčiamus kodus, kaip tai yra daroma Norvegijoje.

Balsavimas paštu

Lyginant balsavimą internetu su balsavimu el. paštu, balsavimui internetu turi būti taikomi žymiai griežtesni saugumo reikalavimai. Balsuojant paštu, vokai patenka į 71 balsavimo apygardą, tuo tarpu balsuojant internetu, vokai patenka į vieną vietą.

Reikalavimai balsavimo internetu protokolui

  • Balsavimo internetu protokolas ir klientinė balsavimo program turi būti atviri ir viešai prieinami visiems dalyviams.
  • Kiekvienas dalyvis gali įsitikinti (kriptografijos metodų pagalba) ar jo ir visų kitų dalyvių balsai buvo įskaityti teisingai ir ar balsai nebuvo pakeisti (skaidrus balsavimas).
  • Visus balsus suskaičiuoti ir sužinoti balsavimo rezultatus gali kiekvienas dalyvis (skaidrus balsų skaičiavimas).
  • Išskyrus patį balsuojantįjį, niekas kitas, įskaitant VRK, negali žinoti, kas už ką balsavo (slaptas balsavimas).
  • Niekas, įskaitant VRK ir sertifikavimo centrus negali balsuoti kito vardu, ar balsuoti neegzistuojančio žmogaus vardu.
  • Nei vienas dalyvis negali įrodyti trečiai šaliai už ką balsavo (slapto balsavimo užtikrinamas virtualioje privačioje kabinoje).

Galimo balsavimo internetu protokolo pavyzdys

Šis pavyzdys teoriškai atitinka visus aukščiau išvardintus reikalavimus, išskyrus paskutinį „nei vienas dalyvis negali įrodyti trečiai šaliai už ką balsavo“.

  1. VRK skelbia savo viešąjį raktą.
  2. Stebėtojai registruoja savo viešuosius raktus.
  3. Balsuotojai identifikuoja save naudodami valdžios vartų infrastruktūrą ir registruoja savo viešuosius raktus, kuriuos generuoja patys.
  4. Kol vyksta registracija balsuotojai formuoja pasitikėjimo tinklą.
  5. VRK skelbia registruotų viešųjų raktų duomenis pasirašytus savo privačiu raktu.
  6. Balsuotojai siunčia savo balsus dvigubame voke:
    1. Balsuotojai generuoja naują raktų porą balsui identifikavimui ir patvirtinimui (identifikatorių).
    2. Vidiniame voke yra balso reikšmė ir identifikatoriaus viešasis raktas.
    3. Vidinis vokas užšifruotas su VRK viešuoju raktu.
    4. Išorinis vokas užkoduojamas atsitiktinai parinktų stebėtojų viešaisiais raktais. Kiekviename užkoduotame sluoksnyje yra sekančio stebėtojo adresas ir vokas užšifruotas adresato viešuoju raktu. Paskutiniame sluoksnyje yra tik vidinis vokas ir tai reiškia, kad jis skirtas VRK.
    5. Taip paruoštas dvigubas vokas siunčiamas VRK, nurodant pirmuosius stebėtojus.
  7. Balsuotojai gali balsuoti daug kartu, tik paskutinis balsas bus įskaitytas.
  8. Pasibaigus balsavimui VRK iššifruoja vidinį voką gautą iš stebėtojų tinklo.
  9. VRK skelbia gautus balsus ir identifikatoriaus viešuosius raktus. Paskelbti duomenis pasirašomi VRK viešuoju raktu.
  10. Balsuotojai atsisiuntę balsų duomenis randa savo identifikatorių, patikrina ir pasirašo balsą savo identifikatoriaus privačiuoju raktu. Parašau siunčiam VRK.
  11. VRK dar kartą skelbia identifikatoriaus viešuosius raktus, balso reikšmę ir parašą.
  12. Visi tikrina ir skaičiuoja balsus. Įskaitomi tik galiojančiu parašu pasirašyti balsai.

Šis protokolas tenkina sekančius reikalavimus:

  • Balsavimo internetu protokolas ir klientinė balsavimo program turi būti atviri ir viešai prieinami visiems dalyviams.
  • Kiekvienas dalyvis gali įsitikinti (kriptografijos metodų pagalba) ar jo ir visų kitų dalyvių balsai buvo įskaityti teisingai ir ar balsai nebuvo pakeisti (skaidrus balsavimas).
  • Visus balsus suskaičiuoti ir sužinoti balsavimo rezultatus gali kiekvienas dalyvis (skaidrus balsų skaičiavimas).
  • Išskyrus patį balsuojantįjį, niekas kitas, įskaitant VRK, negali žinoti, kas už ką balsavo (slaptas balsavimas).

Dalinai tenkina:

  • Niekas, įskaitant VRK ir sertifikavimo centrus negali balsuoti kito vardu, ar balsuoti neegzistuojančio žmogaus vardu.

    Teoriškai, nuo neegzistuojančių balsuotojų kūrimo turėtų padėti pasitikėjimo tinklas, bet praktiškai ši priemonė per daug remiasi žmogiškuoju faktoriumi, todėl praktikoje gali neveikti.

Netenkina:

  • Nei vienas dalyvis negali įrodyti trečiai šaliai už ką balsavo (slapto balsavimo užtikrinamas virtualioje privačioje kabinoje).

    Kadangi kiekvienas dalyvis turi savo UUID, sugeneruotą druską ir privatų raktą, pateikęs šiuos duomenis gali įrodyti trečiai šaliai už ką balsavo. Teoriškai pasibaigus balsavimui, šiuos duomenis jis gali ištrinti, tačiau praktiškai, nekontroliuojamoje aplinkoje to užtikrinti galimybių nėra.

Algorimtų pavyzdžiai

ElGamal algoritmas

def get_keys(p, g, x):
    return (p, x), (p, g, g**x % p)

def encrypt(m, p, g, y):
    return g % p, y * m % p

def decrypt(c, p, x):
    return c[0]**(p - x - 1) % p * c[1] % p

message = 42
private_key, public_key = get_keys(71, 7, 3)
assert decrypt(encrypt(message, *public_key), *private_key) == message

RSA algoritmas

def get_keys(p, q, k):
    n, z = p * q, (p - 1) * (q - 1)
    return (n, k**(z-1) % z), (n, k)

def encrypt(m, n, k):
    return m**k % n

def decrypt(c, n, j):
    return c**j % n

message = 42
private_key, public_key = get_keys(11, 17, 7)
assert decrypt(encrypt(message, *public_key), *private_key) == message

  1. https://github.com/svenheiberg

  2. https://github.com/vvk-ehk/evalimine

  3. http://www.vvk.ee/voting-methods-in-estonia/ Internet Voting in Estonia

  4. https://estoniaevoting.org/wp-content/uploads/2014/05/IVotingReport.pdf Security Analysis of the Estonian Internet Voting System

  5. http://media.ccc.de/... Security Analysis of Estonia's Internet Voting System - J. Alex Halderman

  6. http://www.vvk.ee/public/dok/General_Description_E-Voting_2010.pdf Overview of the technical and organisational aspects of the Estonian e-voting system.

  7. http://www.cartercenter.org/...-2013-study-mission-report2.pdf Expert Study Mission; The Carter Center; Internet Voting Pilot: Norway's 2013 Parliamentary Elections

  8. https://www.regjeringen.no/.../decryption-ceremony-seminar-on-internet Decryption ceremony and seminar on Internet voting - 2013

  9. https://github.com/KRD-KOMM-VL/verifikasjonsprogramvare

  10. http://courses.csail.mit.edu/6.897/spring04/materials.html Selected Topics In Cryptography - Ran Canetti and Ronald L. Rivest Course Materials

  11. https://gist.github.com/sirex/62fba559660d2f2c9cd3#file-05-norvegijos-ataskaita-rst

  12. https://www.regjeringen.no/.../isf_internettvalg_english-summary.pdf

  13. http://www.zdnet.com/article/norway-internet-voting-experiment-fails/ Norway internet voting experiment fails

  14. http://www3.lrs.lt/pls/inter/w5_sale.klaus_stadija?p_svarst_kl_stad_id=-18981

  15. http://en.wikipedia.org/wiki/Kerckhoffs%27s_principle

  16. http://www3.lrs.lt/pls/inter/w5_sale.klaus_stadija?p_svarst_kl_stad_id=-18981

  17. http://en.wikipedia.org/wiki/Security_through_obscurity

  18. http://www.votefraud.org/josef_stalin_vote_fraud_page.htm

  19. http://www3.lrs.lt/pls/inter/w5_sale.klaus_stadija?p_svarst_kl_stad_id=-18981

  20. http://en.wikipedia.org/wiki/Zero-knowledge_proof

  21. http://www3.lrs.lt/home/Konstitucija/Konstitucija.htm

  22. https://www.cert.lt/statistika.html

  23. https://www.cert.lt/statistika.html

  24. https://www.cert.lt/doc/2014_3.pdf

  25. http://c2.com/cgi/wiki?TheKenThompsonHack

import collections
Key = collections.namedtuple('Key', ('private', 'public'))
# Simplified RSA algorithm
def get_keys():
p, q, k = 11, 17, 7
n, z = p * q, (p - 1) * (q - 1)
return Key(private=(n, k**(z-1) % z), public=(n, k))
def encrypt(m, n, k):
return m**k % n
def decrypt(c, n, j):
return c**j % n
# Key pair of central institution
private_key, public_key = get_keys()
# Make sure, that keys work as intended
assert decrypt(encrypt(42, *public_key), *private_key) == 42
# List of candidates to vote for
candidates = [1, 2, 3]
Voter = collections.namedtuple('Voter', (
# Unique voter id, distributed by central institution.
'id',
# Each user generates its own pair of keys.
'keys',
# Vote value provided here is only known to to each voter individually.
'vote',
))
# List of voters
voters = [
Voter(id=1, vote=1, keys=get_keys()),
Voter(id=2, vote=1, keys=get_keys()),
Voter(id=3, vote=3, keys=get_keys()),
Voter(id=4, vote=1, keys=get_keys()),
Voter(id=5, vote=2, keys=get_keys()),
Voter(id=6, vote=2, keys=get_keys()),
]
# All voters claim their id and sends their public key to central institution
claimed_ids = [
(
encrypt(voter.keys.public, *public_key),
encrypt(voter.id, *public_key),
)
for voter in voters
]
# Ballot box, initially empty
ballots = []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment