Как организовать голосование, чтобы каждый мог убедиться, что его голос учтён правильно (или не учтён, если не голосовал), что нет вбросов (то есть не голосовали боты) и никто кроме самого избирателя не знал, как проголосовал именно он.
Довольно легко находится много вариантов. Если я правильно помню, простейший протокол примерно такой:
1. Каждый голосующий генерирует приватный
и публичный
ключ, приходит с паспортом в МФЦ, отдает публичный ключ. Получает расписку, что принят его публичный ключ (ну и сам подписывает, что сдал такой публичный ключ).
2. Списки "избиратель - публичный ключ" вывешиваются публично. Еще вывешивается публичный ключ организатора.
3. Избиратель генерирует еще один ключ
.
4. Избиратель отправляет свой голос, зашифрованный ключом
и подписанный ключом
, организатору (вместе со своим номером, чтобы проще было).
5. Организатор проверяет, что голос подписан правильно, подписывает голос
слепой подписью.
6. Организатор отправляет зашифрованный подписаннный голос обратно избирателю, а так же вывешивает на своем сайте "избиратель Вася проголосовал вот так".
7. Избиратель с помощью ключа
получает незашифрованный подписанный организатором голос.
8. Избиратель (уже анонимно) отправляет организатору подписанный голос.
9. Организатор публикует полученные подписанные им голоса. Подсчет осуществляется в конце тривиально.
Для переписки между избирателем и организатором как раз нужно что-то вроде блокчейна (надежный механизм широковещания), иначе возможна ситуация, когда организатор отказывается подписывать голос или принимать подписанный расшифрованный голос, а так же ситуация, когда избиратель не отправляет голос (или не отправляет расшифрованный голос), но обвиняет в этом организатора.
Голоса людей восстановить нельзя, но сам факт голосования - можно (и он даже известен всем). И если Вася отправил зашифрованный голос, но не отправил расшифрованный, то организатор может проголосовать вместо Васи (единственный контроль за отсутствием вбросов - это совпадение числа зашифрованных и расшифрованных голосов).