Как обеспечить тайное голосование в электронной форме, онлайн, со своего компьютера, не выходя из дома? Так, чтобы один человек мог подать только один голос, причём тайно? Как сделать, чтобы он мог верифицировать результаты, то есть проверить, как учтён его голос?



Задачка не из легких, нужно:

  • Убедиться, что человек авторизован и он имеет право голоса,
  • Выдать ему строго один анонимный бюллетень,
  • Заверить факт выбора конкретного кандидата,
  • Анонимно принять его голос, с его личного компьютера,
  • Сделать это удобно для избирателя.



Скажу честно, эту идеальную постановку задачи я не решил. Но получился алгоритм, дающий достаточную анонимность, точность и относительно небольшое неудобство для избирателей.

Сразу отклоним существующий алгоритм онлайн голосования с электронной подписью каждого голоса, как это сделано компанией Votenet в Эстонии – ни о какой анонимности и речи быть не может, все голоса подписаны ЭЦП, что исключает всякую анонимность. Надеяться на то, что «голоса» не вскроют ну… как-то не по политически….

Рассмотрим классическую, «бумажную» модель голосования с позиции ИТшников и сравним, что в ней изменится в онлайне…

  1. Приходит в избирательный участок человек, авторизуется. Это уже решено ЭЦП + биометрия, если нужно – видеоконференция с избирательной комиссией. Человек работает в защищённой среде, в своём кабинете.
  2. По результатам регистрации в общий доступ выкладывается список адресов избирателей. Уже на этом этапе каждый может проверить, что он внесен в списки, в его квартире не прописалось еще 146 человек, а по соседству за ночь не вырос новый микрорайон. (добавлено из поста AlexSky habrahabr.ru/post/156423. Спасибо за эту важную мысль!)
  3. Затем ему даётся один типовой, одинаковый бумажный бюллетень. В электронном виде заменяем его некоей произвольной, случайной и достаточно длинной символьной последовательностью, которую человек может скопировать со специальной страницы. Эти последовательности генерируются сериями, одинаковыми для всех, голосующих в данное время (см. ниже). К этой страничке избиратель получает доступ только 1 раз за голосование. Для повторного доступа ему придётся полностью снова пройти авторизацию, причём повторное голосование «стирает» результаты предыдущего (тут, как раз, опыт Эстонии ценен). Наверно, еще целесообразно давать человеку возможность переголосования не ранее, чем через сутки… Так защита от DDos надёжнее будет.
  4. Избиратель идёт в кабинку, где принимает решение, ставит отметку и опускает бюллетень в урну. А вот тут я предлагаю в электронной версии сделать так:
  5. «кабинка» — страница для голосования – находится в абсолютно свободном доступе. То есть избиратель может подключиться к ней со своего компьютера, используя любые мыслимые и немыслимые анонимайзеры. Это гарантирует анонимность.
  6. На странице – поля для ввода бюллетеней, по числу вариантов голосования. Никакой агитации, естественно…. Хотя смысла в этом ограничении я не вижу – ведь весь Интернет рядом. Система настроена так, что принимает только «бюллетени» — символьные последовательности, из шага 2.
  7. Избиратель копирует бюллетень в поле напротив выбранного варианта и жмет кнопку «Голосовать».
  8. Собственно, в бумажной версии на этом можно и закончить. Но в электронной версии грех не поставить верификацию голоса – некую отметку на бюллетене, подтверждающую что именно этот бюллетень проголосовал именно за этот вариант. Как это сделать анонимно? Добавить свою случайную цепочку символов в дополнительное поле – «Квитанция»! Это можно сделать просто попросив пользователя нажать 30-50 случайных клавиш или же, как это делается в банковских алгоритмах цифровых подписей, – поводить некоторое время мышкой по экрану. Получаем и уникальную подпись, и анонимность. Тогда в ответ избирателю выдаётся хэш от кода бюллетеня и квитанции. По этой квитанции человек всегда сможет узнать, как был учтён его голос. Эту идею я взял у Davidа Bismarkа: www.ted.com/talks/lang/eng/david_bismark_e_voting_without_fraud.html
  9. Ну и конечно, для отпугивания ботов (помним, что страничка –кабинка в свободном доступе) надо поставить ещё и длинную-предлинную CAPTCHу.



На первый взгляд, система, соответствует указанным в начале требованиям. Ура? Не совсем. Ясно, что систему будут ломать. Если «вброс бюллетеней» в «бумажных» выборах не составляет труда, то что же ждать, если можно просто скопировать и вставить строчку символов? Просто арендуем в Китае десяток бараков с «капча-кликерами» и ….profit!

Я предлагаю следующие механизмы защиты от «вбросов». Целых четыре.

Собственно, первое, самое очевидное, — счётчик выданных бюллетеней, поскольку мы точно знаем, сколько человек зашло на страничку получения бюллетеня в каждый момент времени. Так вот, если бюллетень конкретной серии получило N человек (а они могут находиться и в разных городах – анонимность соблюдается), то в «кабинке для голосования» можно организовать и обратный отсчёт. А как только ВНЕЗАПНО кто-то пытается подать N+1 -й бюллетень той же серии (то есть, прошёл «вброс»), вся серия аннулируется, бюллетенями даётся статус «испорченный» и, все голоса, кто голосовал этой серией, аннулируются тоже, людям предлагается проголосовать снова – начинаем с п.1.

Второе – Серии бюллетеней для голосования регулярно, но через случайные промежутки времени (30-60с), меняются. Совсем малым (секунды) это время быть не должно – возникнет угроза анонимности. В городе-миллионнике за одну секунду, при участии в выборах 50% избирателей, при продолжительности выборов 7 дней, как в Эстонии, каждую секунду будут голосовать всего 15-30 человек. Для обеспечения анонимности нужно всё-таки, что бы один бюллетень получили порядка 1000 избирателей, отсюда интервал в 30-60 с.

Третье. Одновременно «выдаётся» несколько «серий» бюллетеней. Зачем это нужно – чуть ниже, какую именно серию показать каждому следующему избирателю, выбирается, опять же, случайно.

Четвертое – каждая серия бюллетеней не вечная, а имеет «время жизни» — срок, когда её «принимает» «страничка-кабинка для голосования». Например, 20-30 минут. После этого бюллетень теряет силу и, при попытке голосовать просроченным бюллетенем, избирателю предлагается снова пройти авторизацию, см. п.1. Это позволит избежать махинаций с «отложенным» голосованием, когда кто-то набирает бюллетеней, чтобы потом вбросить их в конце. Ну а если честный человек не сможет за 30 минут определиться с выбором… то, наверное лучше ему зайти завтра ещё раз…

Модель случайного периода выдачи и смены серий введена для того, чтобы избежать атак вида «синхронного вброса». Например, если бы какие-то манипуляторы знали точный размер серий бюллетеней и эта серия выдавались бы все голосующим последовательно (изначально у меня была такая схема), то можно было бы отследить появление первого бюллетеня новой серии и организовать «вброс» ровно по «количеству» бюллетеней, тем самым не дав никому больше проголосовать в этой серии и количество бюллетеней совпадёт. При случайной смене бюллетеней это становится невозможным: точное количество «выданных» бюллетеней известно только в последний момент «выдачи» этой серии, так как промежуток времени случаен, а количество «выданных» бюллетеней определяется количеством избирателей, голосующих в этот промежуток. Достаточно стохастическая величина, я думаю.

Конечно, такая схема не совсем удобна избирателям, но позволяет исключить вбросы, так как делает их крайне затратными и рискованными – после каждого «вброса» придётся переголосовывать «до посинения». А, например, после 100 переголосований, уже можно будет выявить лиц, которые, почему-то, всегда «оказывались» в каждом переголосовании и начать с ними… индивидуальную работу.

Подтасовки тоже исключаются, по методу Дэвида Бисмарка – квитанциями.
Чтобы избиратели были дополнительно уверены в тайности голосования, надо публиковать все «просроченные» бюллетени, чтобы люди могли убедиться что у них действительно все они были типовыми.

Да, такое голосование может занять не один день, но для него не нужно держать открытой сеть избирательных участков по всей стране. Так что, как показывает опыт Эстонии, электронное голосование вполне может идти несколько дней…