Skip to content

Mis juhtus e-häälte auditeerimisel 2025. aasta KOV valimistel? Selgust toob korduslugemine tegelike andmetega -- laadi alla, käivita ja veendu ise!

License

Notifications You must be signed in to change notification settings

infoaed/korduva-kryptogrammi-juhtum

Repository files navigation

Korduva krüptogrammi juhtum

Mis juhtus e-häälte auditeerimisel 2025. aasta KOV valimistel? Audiitori 20.10.2025 toimingu käigus leidis aset segadus, mille asjaolud vaikib audiitor maha ka oma 22.12.2025 lõpparuandes. Esialgse kokkuvõtte toimunust leiab 3.11.2025 blogipostitusest, mille kohta on ka kokkuvõttev video.

Andmelugu korduvatest krüptogrammidest

Siinne andmehulk1 on 2025. aasta KOV valimiste elektroonilise hääletuse osaline korduslugemine tegelike KOV valimistel antud häältega, mille valijad salvestasid hääletusprotsessi käigus. Vaidlusi põhjustasid korduvad krüptogrammid, mida audiitori raporti väitel oli viis ja mida audiitor oma raportis ekslikult samastab töötlemisrakenduse tuvastataud viie mitte-unikaalse häälekonteineriga:

E-valimiskasti laadimine failist 'conf/../votes.zip'
E-valimiskast on laaditud
E-valimiskasti liigi kontrollimine
E-valimiskasti liik on "Korrastamata e-valimiskast"
Kogumisteenus andis e-valimiskasti koosseisus üle 14 häält
E-valimiskasti andmetervikluse kontrollimine
100% [..................................................] 14 / 14
E-valimiskastis sisalduvad andmed on terviklikud
E-valimiskastis on 14 kvalifitseerimiseks sobivat häält
E-valimiskastis sisalduvate häälte digiallkirja vormingule vastavuse kontrollimine
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************119+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************906+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************845+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************944+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
Viga valija *******2724 hääle **************762+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
E-valimiskastis sisalduvate häälte koguarv: 14
E-valimiskastis sisalduvate korrektse allkirjaga häälte arv: 9
E-valimiskastis sisalduvate vigase allkirjaga häälte arv: 5

Kuna hiljem kuvas auditirakendus audiitorile teadet viiest korduvast krüptogrammist, siis audiitor paistab olevat viis identset häälekonteinerit ja viis korduvat krüptogrammi ekslikult samastanud:

 E-valimiskasti laadimine failist 'conf/../votes.zip'
 E-valimiskast laaditud
 
 Anonüümitud e-valimiskasti laadimine failist 'conf/../out-4/KOV_2025-bb-4.json'
 Anonüümitud e-hääled laaditud
 
 E-valimiskasti verifitseerimise logifail: conf/../out-2/KOV_2025.question-KOV_2025.check.log1
 Korduvhäälte tühistamise logifail: conf/../out-2/KOV_2025.question-KOV_2025.squash.log2
 Topelthäälte tühistamise logifail: conf/../out-4/KOV_2025.question-KOV_2025.revoke.log2
 E-häälte anonüümimise logifail: conf/../out-4/KOV_2025.question-KOV_2025.anonymize.log3
 E-valimiskasti töötlemisvigade raport: conf/../out-2/ballotbox_errors.txt
 
 Vastuvõetud häälte seas on korduvaid krüptogramme
 
 There are 5 ciphertext recurrences among the accepted ballots
 Recurring ballot: G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk=
 Recurring ballot: 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
 
 Ballot '*******2724/**************845+0300' present in both the acceptance and rejection logs
 Ballot '*******2724/**************000+0300' not found in the acceptance/rejection logs
 
 E-valimiskasti verifitseerimise logid on terviklikud: ei
 
 Auditirakendus lõpetas töö ilma vigadeta

Korduslugemine annab tulemuseks, et korduvaid krüptogramme oli valimiskastis vähemalt 11, aga audiitori ja valimiste korraldaja avalike toimingute käigus antud ütluste kohaselt kokku 13, mille hulgas olid:

  1. Kuus identset häälekonteinerit, mis sisaldavad ka identseid krüptogramme, millest häiret anti viie viimase puhul;
  2. Seitse unikaalset häälekonteinerit, millest viis2 sisaldasid kõik ühte korduvat krüptogrammi ja kaks sisaldasid teist korduvat krüptogrammi, millest kummagi puhul anti häiret viimaste puhul, st 5−1 = 4 ja 2−1 = 1 ehk kokku samuti viie korduva krüptogrammi puhul.

Audiitor küll märgib korrektselt, et "töötlemisrakendus tuvastas viis häält, millel oli määrang Registreerimisteenuse päring pole unikaalne", kuid samastab ekslikult identsete häälekonteinerite kohta antud teated hiljem korduvate krüptogrammide kohta antud teavitusega 5 ciphertext recurrences. Siiski puudub viiel identsel häälekonteineril ja viiel korduval krüptogrammil omavaheline seos töötlemis- või auditirakenduse kontekstis ja tegu on täiesti isoleeritud juhtumitega.

Seejuures käivad määrangud "on olemas nii vastuvõetud kui tagasilükatud häälte logis" ja "pole ei vastuvõetud ega tagasilükatud häälte logides" viie töötlusfaasis tuvastatud identse häälekonteineri kohta ja "vastuvõetud häälte hulgas on viis korduvat šifriteksti" auditirakenduse jooksutamise käigus ilmnenud viie korduva krüptogrammi kohta.

Valimiskastis olnud häälekonteineritest ja nende sisust annab ülevaate järgnev tabel, kus krüptogrammid räsi algusega CM on identsetes häälekonteinerites ja ülejäänud korduvad krüptogrammid räside algustega 9W ja G6 on unikaalsetes häälekonteinerites:

Isikukood Kuupäev Kellaaeg Krüptogrammi räsi
*******2724 15.10 08:54:35.000 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 17.10 21:05:45.119 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 17.10 22:26:35.906 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 17.10 22:45:16.845 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 18.10 11:35:36.000 igXUmpzFOYrGwfWy3Npc14zHC11lbiHDH6tNxm+AbV0=
*******2724 18.10 11:59:52.944 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 18.10 12:17:30.762 CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU=
*******2724 18.102 −−:−−:−−.−−− 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
*******2724 18.102 −−:−−:−−.−−− 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
*******2724 18.10 14:17:36.000 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
*******2724 18.10 15:11:44.000 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
*******2724 18.10 15:35:40.000 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
*******2724 18.10 15:46:18.000 BurTcesZloqTOYhekG63m5AwlngAetl8XP6k4FHo0uM=
*******2724 18.10 16:29:15.000 cDALrTckJNolLEQTm15mmZHPfoFuHNalfgIO4wvBJMs=
*******2724 18.10 17:03:46.000 G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk=
*******4710 18.10 17:12:05.000 G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk=

Seetõttu on vale audiitori väide, et "töötlemisrakendus tuvastas viis häält, millel oli määrang Registreerimisteenuse päring pole unikaalne" ja "vea andis audiitorrakendus, kuna selle algoritm ei sisalda kasutusjuhtu, kui isetehtud valijarakendusega saadetakse kogujasse üks ja sama krüptogramm korduvalt".

Auditirakendus eksplitsiitselt arvestas korduvate krüptogrammidega, mille kohta leiab märkuse lähtekoodi kommentaaridest:

// We must use a bag instead of a set since it might happen (statistically unlikely unless intentional)
// that there are ballots with the same ciphertext. Therefore, a set would not correctly represent the
// state of the accepted ballots.

Ka auditirakenduse tegelikul jooksutamisel arvestas algoritm korrektselt just nimelt korduvate krüptogrammidega (räsi algusega 9W ja G6) ja viie korduva krüptogrammi olemasolu valimiskastis ega selle kohta antud teade auditirakenduse käitamisel probleeme ei tekitanud.

Küll aga tekitas probleeme identsete häälekonteinerite (räsi algusega CM) töötlemisel auditirakenduses esinev programmeerimisviga, mille raames ühildati valesti funktsiooni getValidInvalidSums parameetritena edasi antud set ja list andmetüüpe.

Selle tõttu eemaldati IngegrityTooli ridadel 268-278 esimese identse häälekonteinerini jõudes ühekorraga kõik identsed häälekonteinerid, mille tõttu esimesel läbimisel kuvati teadet present in both the acceptance and rejection logs ja teisel läbimisel not found in the acceptance/rejection logs, sest otsitavat räsi enam massiivist ei leitud.

Selle tarkvaravea tagajärjel kuvas auditirakendus poleemikat tekitanud teadet E-valimiskasti verifitseerimise logid on terviklikud: ei, mille kohta audiitori esindaja avalike toimingute käigus ütles, et see on "tegelikult päris paha lause".

Audiitori poolt väidetud korduvate krüptogrammidega mitte arvestamine algoritmi tasemel oli hoopis identsete häälekonteinerite töötlemise programmeerimisviga, mis oli jäänud koodi sisse vaatamata sellele, et programmeerija oli endale kirjutanud lähtekoodi spetsiaalse märkuse sellest veast hoidumise vajaduse kohta.

Ka polnud viga tulnud välja testimise käigus ega 2024. aasta Euroopa Parlamendi valimistel, milleks auditirakendus Kristjan Düüna magistritöö soovitustest lähtuvalt koostati ja kus see ka esimest korda kasutusel oli.

Kuna audiitor avalike toimingute raames luges kokku kümmekond korduvat krüptogrammi, aga aruandes piirdub viie korduva krüptogrammi nimetamisega ega anna adekvaatset hinnangut intsidendi põhjustele, siis võib oletada, et korduvate krüptogrammide juhtumi asjaolude varjamise põhjuseks pole üksnes audiitori tehniliste teadmiste piiratus.

Andmehulga kasutamise juhis

Kui tahad ise sammud läbi teha, siis:

rm -r log out-*

./processor checkAndSquash -c conf/certs.asice -p conf/processor.asice
digidoc-tool create --file=out-2/KOV_2025-bb-2.json.sha256sum out-2/KOV_2025-bb-2.json.sha256sum.asice
./processor revokeAndAnonymize -c conf/certs.asice -p conf/processor.asice
./auditor integrity -c conf/certs.asice -p conf/auditor.asice
./auditor integrity -c conf/certs.asice -p conf/auditor_force.asice

Töötlemisrakenduse ja auditirakenduse töölesaamiseks eelnevalt:

git clone --recurse-submodules https://github.com/infoaed/korduva-kryptogrammi-juhtum.git
cd korduva-kryptogrammi-juhtum
git submodule update --init --recursive

sudo apt update
sudo apt install openjdk-21-jdk

wget https://services.gradle.org/distributions/gradle-8.11-bin.zip
unzip gradle-8.11-bin.zip -d ivxv/common/external
rm gradle-8.11-bin.zip

make -C ivxv processor auditor ONLINE=1

Footnotes

  1. Peale siin failis oleva andmeloo inimkeelse kirjelduse on kogu varamu sisu avalikuks kasutuseks CC0 alusel. Andmeloo autor on Märt Põder ja seda võib levitada CC BY tingimustel autorit viidates.

  2. Kuna valijad isikukoodi lõpuga 2724 ja 4710 ei salvestanud katsetamise käigus kõiki oma häälekonteinereid, siis on toimunu kirjelduse klapitamisel audiitori 20.10.2025 avalike toimingute raames väljendatuga eeldatud, et krüptogrammi 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= sisaldavaid häälekonteinereid oli kahe võrra rohkem, st säilinud kolme konteineri asemel viis. 2 3

About

Mis juhtus e-häälte auditeerimisel 2025. aasta KOV valimistel? Selgust toob korduslugemine tegelike andmetega -- laadi alla, käivita ja veendu ise!

Topics

Resources

License

Stars

Watchers

Forks

Contributors