🔥

Тред (Николай Пасынков)


Доброе утро, бедолаги! Готовьте свои помидоры и тухлые яйца. Сегодня рассказываю как работает дистанционное электронное голосование

Сразу оговорюсь, на всякий случай. Сегодня в РФ есть несколько систем ДЭГа, от разных организаций. Подход сам по себе новый, неизведанный, все действуют с осторожностью. Много решений принимается не столько с технической, сколько с политической точки зрения.

Вчера звучал вопрос: как ДЭГ взаимодействует с оффлайн выборами. Отвечаю: никак. Для того чтобы проголосовать на ДЭГе избиратель заранее подает заявление через ЕПГУ, и его вычеркивают из амбарной книги на его участке -- эту кампанию он будет голосовать в энторнетах

Основной задачей ДЭГ является обеспечение тайны голосования, и неизменность результатов. Количество остроумных шутеек про UPDATE ... WHERE name = 'edro' сегодня увеличится вдвое =)

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

Итак, более менее определились с понятиями. Едем дальше. Избиратель загнал свое заявление на ЕПГУ, и он попал в список избирателей ДЭГа. Этот сформированный, подписанный, список к нам и придет. И из него мы сформируем собственно голосование.

В день голосования, юзер зайдет собственно на портал, который мы для него сваяли. Мы его авторизуем через ЕСИА, вытащим оттуда его персуху и покажем ему список голосований, на которые у него есть активное избирательное право. Пока все просто.

Когда пользователь ознакомится со списком доступных бюллетеней, и примет решение голосовать мы должны обеспечить аутентификацию. Сейчас доступны два варианта: это смс код, и аутентификация в системе ЕБС. Это биометрия, когда на камеру говоришь циферки, и сверяется твой слепок

И вот тут начинается самая магия. Для начала мы сгенерируем личную ключевую пару для пользователя на каждый бюллетень -- публичный и приватный ключики.

Публичный ключик мы должны подписать на бэке, причем в слепую. Здесь нам как раз помогает гомоморфное шифрование, конкретно - слепая подпись. ru.wikipedia.org/wiki/Слепая_по…

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

Когда бэкенд выдает нам слепую подпись на ключик он еще раз проверяет наше активное избирательное право (естественно).

После этой операции у нас на руках ключевая пара, с подписью ее публичного ключа. Теперь мы можем перейти в "анонимную зону". Анонимная зона в нашем случае это другой сервер, между порталом и анонимной зоной нет сетевой связности. И там другой домен.

Перед переходом мы можем включить ВПН, прокси, и тому подобное. Чтобы максимально анонимизироваться, а то придет ваш начальник и скажет что вы не туда куда следует голосуете

В анонимной зоне выбирая кандидата юзер формирует модель голоса. Она выглядит просто: [0, 0, 1, 0, 0]. Где длинна массива - количество кандидатов, и единичка - наш голос.

Эта моделька шифруется публичным ключом голосования (подробнее об этом позже). И укладывается в транзакцию для блокчейна. Фактически это просто объект

В транзакцию так же добавляется публичный ключик. Слепая подпись, выданная нам на портале. Парой пользовательских ключей эта транзакция подписывается.

На выходе у нас транзакция с публичным ключом, зашифрованным голосом, подписью и пруфами. Они нам нужны чтобы убедиться что по дороге никто не изменил данные в транзакции

Закидываем транзакцию на бэк. Там мы провалидируем что к нам еще не поступило транзакций с таким же публичным ключом, чтобы не было повторных голосований

А так же проверим что приложенная подпись была выдана именно на этот ключ. Так мы убеждаемся в том что каких-то левых неавторизованных транзакций к нам не залетит.

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

При завершении голосования, мы загрузим приватный ключик в БЧ, начнет расшифровка голосов. При этом мы не расшифровываем каждый голос по отдельности, мы снова применяем гомоморфное шифрование.

Гомоморфное шифрование - это такая штука, когда мы проводим манипуляции с зашифрованными данными, не видя их истинного значения: ru.wikipedia.org/wiki/Гомоморфн…

В смарт-контракте БЧ мы берем всю нашу пачку голосов. Складываем их, и расшифровываем уже непосредственно результат, еще раз, так сказать обеспечим анонимность голоса