- PVSM.RU - https://www.pvsm.ru -
Наблюдение за выборами в различных странах, осложнёнными различными скандалами вокруг подтасовок, каждый раз заставляет задуматься: почему столь важное событие, легитимность которого столь необходимо защитить, использует механизмы защиты многовековой давности? Особенно это странно, учитывая то, что схему для голосования, пусть и далеко не идеальную, но значительно лучшую, чем текущая, может придумать даже человек, разбирающийся в криптографии на начальном уровне. Так уж совпало, что я отношу себя именно к таким людям, поэтому я подумал: почему бы не попробовать?
На хабре уже публиковался ряд статей о электронных выборах (раз [1], два [2], три [3]), однако я не нашёл проработанного и отвечающего основным требованиям протокола. Так что встречайте: мой вариант протокола электронного голосования.
Что же мы хотим получить на выходе? Я сформулировал следующие требования:
В протоколе я использовал всего 2 криптографических примитива: ассиметричное шифрование [4] и алгоритм слепой подписи [5]. Естественно, операции шифрования и маскировки должны быть коммутативны друг относительно друга.
Примечание: операция хеширования при подписывании, если она требуется, будет опускаться.
$inline$i$inline$ – информация о человеке;
$inline$c$inline$ – выбор;
$inline$K$inline$ – контракт;
$inline$V$inline$ – голос;
$inline$I$inline$ – информация для проверки
$inline$e_{личный}$inline$ — ключ шифрования (закрытый) личной ЭЦП избирателя;
$inline$e_{голосования}$inline$, $inline$d_{голосования}$inline$ — ключи шифрования и дешифрования. Создаются избирателем для конкретного голосования;
$inline$m$inline$ — маскирующий множитель. Создаётся избирателем для конкретного голосования;
$inline$e_{проверочный}$inline$, $inline$d_{проверочный}$inline$ — пара ключей для этапа проверки. Создаётся избирателем для конкретного голосования.
Для каждого гражданина хранится следующая информация:
$inline$i$inline$ — информация об избирателе: ФИО, год рождения, адрес прописка и т. д.;$inline$d_{личный}$inline$ — публичный ключ личной ЭЦП;
$inline$E_{e_{Large государственный}}(i + d_{личный}))$inline$ — государственная подпись, удостоверяющая верность данных.
Так же в репозитории хранятся:
$inline$d_{государственный}$inline$ — публичный ключ государства;
$inline$d_{избиркома}$inline$ — публичный ключ избиркома.
$inline$e_{государственный}$inline$ — приватный ключ государства.
$inline$e_{избиркома}$inline$ — приватный ключ избиркома.
Примечание: я использовал допущение, что на момент начала голосования информация в репозитории верна: каждому человеку взаимно однозначно соответствует ключ ЭЦП, там нет «мёртвых душ». Механизмы проверки этой информации я рассматривать не буду: мне кажется, они должны быть скорее административными, чем математическими. Также информация предполагается неизменяемой в течение всего голосования.
Каждый избиратель предъявляет свои данные избиркому. Он проверяет, что избиратель ещё не зарегистрирован и имеет избирательное право. После проверки комиссия вместе с избирателем создаёт то, что я буду далее называть контрактом.
Контракт содержит следующие данные:
$inline$i$inline$ — идентификационные данные избирателя
$inline$M_m(d_{голосования})$inline$ — замаскированный секретным множителем избирателя ключ дешифрования для голосования
$inline$M_m(e_{проверочный})$inline$ — замаскированный секретным множителем избирателя ключ шифрования для проверки
$inline$E_{е_{Large избиркома}}(M_m(d_{голосования}))$inline$ — замаскированный секретным множителем избирателя ключ дешифрования для голосования, подписанный избиркомом$$display$$K_1 = i + M_m(d_{голосования}) + M_m(e_{проверочный}) + E_{е_{Large избиркома}}(M_m(d_{голосования}))$$display$$
Эта информация подписывается как избиркомом, так и избирателем:
$$display$$K = K_1 + E_{e_{Large личный}}(K_1) + E_{e_{Large избиркома}}(K_1)$$display$$
Все контракты публикуется избиркомом.
На данном этапе предотвращаются следующие атаки:
Избиратель демаскирует подписанный ключ для голосования:
$$display$$N_m(E_{е_{избиркома}}(M_m(d_{голосования}))) = E_{е_{Large избиркома}}(d_{голосования})$$display$$
И создаёт не связанный с его личностью голос:
$$display$$V = d_{голосования} + E_{е_{Large избиркома}}(d_{голосования}) + e_{проверочный} + с + E_{е_{Large голосования}}(с)$$display$$
где $inline$c$inline$ — выбор кандидата.
Избиратель анонимно отправляет голос в избирком. Избирком публикует его в открытом доступе и возвращает в качестве доказательства приёма $inline$E_{е_{Large избиркома}}(V)$inline$.
К сожалению, на прошлом этапе избирком мог создать сколько угодно голосов, не связанных с реальными личностями, поэтому необходима проверка каждого голоса. Кому поручить проверку? Я считаю, что лучше всего обратиться к принципам демархии [6] и поручить проверку случайному избирателю. Можно придумать бесконечное количество схем распределения пар проверяющий-проверяемый на множестве голосов, но мне кажется оптимальным следующий: разбить множество на пары и назначить их проверяющими друг для друга. Таким образом разгласивший информацию проверяющий может быть привлечён к ответственности проверяемым. Какая бы схема не использовалась, алгоритм её формирования должен быть опубликован до начала регистрации, и зависеть от ключа, неизвестного до окончания регистрации. Например, ключ можно генерировать из курсов валют, или публично и совместно кандидатами (например, с помощью лототрона). Если проигнорировать это условие, избирком сможет после окончания регистрации найти и добавить в список такое множество фальшивых голосов, что все они или большинство их будет проверяющими друг для друга.
Итак, ключ сгенерирован и опубликован. Теперь каждый избиратель должен найти своего проверяющего, получить из базы голосов его публичный проверочный ключ $inline$e_{проверочный}$inline$, сгенерировать проверочную информацию
$$display$$I = V + E_{е_{Large проверочный проверяющего}}(i + m + E_{e_{Large личный}}(i + m))$$display$$
и анонимно отправить её в избирком. Избирком публикует её в открытом доступе и возвращает в качестве доказательства приёма $inline$E_{е_{Large избиркома}}(I)$inline$.
Проверяющий находит $inline$I$inline$ проверяемого в базе по $inline$V$inline$, дешифрует $inline$E_{е_{Large проверочный}}(i + m + E_{e_{Large личный}}(i + m))$inline$ с помощью своего $inline$d_{проверочный}$inline$, с помощью $inline$m$inline$ демаскирует $inline$M_m(d_{голосования})$inline$ и $inline$M_m(e_{проверочный})$inline$ и проверяет что:
Предотвращаются следующие атаки:
Недостатки протокола:
Также, возможно, этап проверки можно упростить и сделать более анонимным, используя доказательства с нулевым разглашением [7]. К сожалению, я пока не знаю, как это сделать и можно ли.
Если вы знаете, пишите в комментариях. Также пишите, если знаете, как улучшить протокол, нашли ошибку или уязвимость, и иную конструктивную критику.
Автор: AndrewRo
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vy-bory/262054
Ссылки в тексте:
[1] раз: https://habrahabr.ru/post/156825/
[2] два: https://geektimes.ru/post/156153/
[3] три: https://geektimes.ru/post/156121/
[4] ассиметричное шифрование: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%BC_%D0%BA%D0%BB%D1%8E%D1%87%D0%BE%D0%BC
[5] алгоритм слепой подписи: https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%B5%D0%BF%D0%B0%D1%8F_%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C
[6] демархии: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%B0%D1%80%D1%85%D0%B8%D1%8F
[7] доказательства с нулевым разглашением: https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE_%D1%81_%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D0%BC_%D1%80%D0%B0%D0%B7%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC
[8] Источник: https://habrahabr.ru/post/335398/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.