По просьбе @sociumR, (извиняюсь за недельное опоздание) спроектировал решение по следующему ТЗ:
Нужна надёжная избирательная система соответствующая критериям:
1. Работает в он-лайн формате.
2. Позволяет голосовать из любой точки Земли.
3. Позволяет в любой момент отозвать свой голос.
4. Голосование и отзыв голоса полностью анонимные.
5. Система должна работать в изначально скомпрометированном окружении (находящемуся под контролем лиц желающих повлиять на результаты).
Итак, ИТ - полностью управляемая среда. Это означает, что с той или иной степенью сложности всё, что было занесено в реестры информационных систем может быть отслежено. Следовательно для решения п. 4 часть операций (анонимизация) должна быть вынесена оффлайн. Задача состоит в том, чтобы во-первых выдать некоторый идентификатор человеку, во-вторых выданный идентификатор невозможно было бы привязать к конкретному лицу. При этом все участники должны иметь возможность гарантировано проверить идентификатор не раскрывая анонимность.
Алгоритм работы:
1. Раз в установленный период проводится день выдачи ключей голосования. Он состоит из:
1.1. Генерирования асимметричных ключей ЭЦП.
1.2. Открытые ключи и их отпечатки вносятся в БД подтверждения голоса.
1.3. Закрытые ключи в виде QR-кодов записываются на защищённый бумажный носитель в форме конверта (как пин-код банковской карты)
1.4. Изберком за неделю до дня голосования, выдаёт ключи избирателям с обязательной ежедневной фиксацией количества выданных ключей.
2. День голосования. Процесс голосования:
2.1. С использованием мобильного приложения или стационарного считывателя считывается QR-код ключа голосования.
2.2. Пользователь выбирает за кого он голосует (идентификатор).
2.3. Формируется строка из прошлой подписи по участку + отпечаток ключа + выбор пользователя
2.4. Генерируется подпись строки
2.5. Запись передаётся на голосование. Сервер возвращает коды операции:
НЕТ СВЯЗИ - нет доступа к серверу голосования. Система ждёт несколько секунд и возвращается на п. 2.5
ОШИБКА ЛОГА [новая подпись] - пока шла обработка кто-то внёс свой голос и нужно заменить прошлую подпись.
ОШИБКА КЛЮЧА - ключ не зарегистрирован в системе: ключ проверяется Изберкомом => носитель передаётся на уничтожение => человеку выделяется новый носитель => человек переходит к п. 2.1
ПОДТВЕРЖДЕНО - человек проголосовал, всё хорошо.
3. Отзыв голоса и отзывные даты:
3.1. Для отзыва ключа производится процедура п. 2.1-2.5, при этом человек отдаёт свой голос за другого кандидата.
3.2. Каждый период (например 3 месяца) изберком смотрит на текущее число голосов, если оно меньше проходного то кандидат снимается, на его место назначается новый кандидат.
4. Нарушения
4.1. При голосовании большим числом голосов, чем было выдано ключей - сажаем комиссию и начинаем с п. 1.1.
4.2. При обнаружении избирателем голосования, которое он не проводил:
4.2.1. Избиратель обращается с заявлением в изберком.
4.2.2. Ключ подписи аннулируется.
4.2.3. Избиратель начинает с п. 1.4.
Подобная система в полной мере организует анонимное отзывное голосование, при этом даже полностью скомпрометированная система не может повлиять на результаты голосования. Данные защищены блокчейном на уровне единичной записи. Отпечаток ключа позволяет найти все записи привязанные к конкретному ключу и проверить результаты в системе.