Хочу поделиться готовым решением проблемы анонимного голосования (например, для выбора президента либо в парламент). Прочитав последние статьи на хабре на эту тему, меня заинтриговало: неужели все так сложно? Немного подумав, я написал модель системы голосования, где все просто. Потраченное время на написание кода я оценил в $10 долларов. Система состоит из четырех файлов, которые содержат около 200 строк кода на html, php и javascript. Причем основной функционал (на php) занимает не более 100 строк кода.
Вот ссылка на рабочую модель. Так же жду ваши комментарии (с учетом того, конечно, что это всего лишь модель).
Ну и чтобы не быть малословным напишу несколько абзацев под катом.
Главное, конечно, не сам код. Он настолько прост, что разобраться в нем не составит труда. Вы можете его скачать с github.
Больше интересен сам процесс голосования. Поэтому дальше я расскажу, чем этот вариант хорош и что он дает.
Постановка задачи.
Я согласен с постановкой задачи, которую предложил AlexSky:
«Электронное голосование должно отвечать следующим условиям:
- Анонимность — никто не должен иметь возможность соотнести конкретный голос с конкретным избирателем.
- Открытость — результаты голосования должны быть доступны всем.
- Верифицируемость — каждый избиратель должен иметь возможность проверить свой голос. Любой человек должен иметь возможность посчитать итоговые результаты и проверить на отсутствие «вбросов».
»
На прошедших выборах я обратил внимание, что стандартная система не выполняет ни один из этих пунктов. Даже первый пункт (анонимность) выполняется не до конца, т.к. записывается номер бюллетеня, на котором вы будете голосовать.
Возможно ли выполнить все эти пункты?
На первый взгляд может показаться, что можно:
Варианты решения и проблемы
Человек вводит голос и некий уникальный ключ(код). В итоге после выборов всем предоставляется таблица с парами ключ-голос. И каждый может посчитать за кого проголосовало большинство. Тут у нас и анонимность, и открытость, и верификация.
Но при детальном рассмотрении возникает проблема:
Некоторые хитрые люди могут проголосовать несколько раз, тем самым подтасовать выборы. И за счет полученной анонимности мы не можем проверить, что каждый человек проголосовал только один раз.
Поэтому я решил разделить третий пункт. Теперь:
- Верификация — каждый избиратель должен иметь возможность проверить свой голос.
- И четвертый пункт:
- Идентификация – система должна идентифицировать каждого человека для того, чтобы каждый человек проголосовал не более одного раза.
Стандартная система голосования требование идентификации выполняет, т.к. сидят люди и проверяют паспорта.
Но если система будет проверять личность человека, то уже нет анонимности. И наоборот, если все анонимно, то нельзя идентифицировать человека.
Было предложение, чтобы голосующий генерировал ключ (код) путем одностороннего шифрования исходя из паспортных данных. Но это ничего не дает, так как есть база голосующих, а из нее можно получить список всех кодов для каждого человека, и потом определить личность голосующего, и, следовательно, тоже теряется анонимность.
Мое решение
Итак, стандартная система может идентифицировать человека, но не выполняет первые три задачи. Анонимная система наоборот выполняет поставленные задачи, но за исключением идентификации. Отсюда простой и логичный вывод: нужно совместить два варианта.
Подобно обычному голосованию нужно разделить все на два этапа:
- Регистрация
- Голосование
Причем нужно сделать, чтобы не было прямой связи между этими двумя этапами.
На первом этапе мы должны сообщить системе, что приняли участие в голосовании. Мы указываем свои паспортные данные. За это система дает нам некий код. По аналогии как мы предоставляем паспорт и нам дают бюллетень.
Но чтобы обеспечить анонимность, нужно убрать прямую связь паспортных данных с голосом. Поэтому один и тот же код выдается некоторой группе.
Если количество проголосовавших равно количеству человек в группе, то группа проголосовала корректно. Если проголосовало больше, то всей группе придётся еще раз пройти регистрацию, чтобы получить новый код группы.
Таким образом, выполняются пункты идентификация и анонимность.
Чтобы себя можно было верифицировать, человек может на этапе голосования указать еще один секретный код, который знает только он. Таким образом, он (и никто другой) может проверить свой голос после выборов.
Ну и открытость решается очень просто путем выкладывания таблицы с результатами голосования, где выводятся пары секретный код – голос.
Размер файла при этом может достигать, если все проголосуют, 30байт*40млн=1,2Гб. Такой же приблизительно размер у видео фильма среднего качества.
Главное преимущество в том, что система по сути своей проста (без шифрования и без p2p сетей). Ее устройство будет понятно даже далеким от компьютера людям. Что должно привлечь доверие всех слоев общества.
Единственная сложность – это запомнить два кода. Их предлагается хранить в текстовом файле либо на бумаге, либо распечатать код в виде штрих кода. Этот функционал сейчас вполне доступен и не дорог.
Заключение с намеком на обсуждение
На самом деле я не понимаю, в чем могла быть проблема, что никто до сих пор не предложил подобного варианта? Ведь на разработку системы я потратил не месяцы и не годы, а всего около часа своего времени.
Автор: humblegenius