Доброе утро, бедолаги! Готовьте свои помидоры и тухлые яйца. Сегодня рассказываю как работает дистанционное электронное голосование
Сразу оговорюсь, на всякий случай. Сегодня в РФ есть несколько систем ДЭГа, от разных организаций. Подход сам по себе новый, неизведанный, все действуют с осторожностью. Много решений принимается не столько с технической, сколько с политической точки зрения.
Вчера звучал вопрос: как ДЭГ взаимодействует с оффлайн выборами. Отвечаю: никак. Для того чтобы проголосовать на ДЭГе избиратель заранее подает заявление через ЕПГУ, и его вычеркивают из амбарной книги на его участке -- эту кампанию он будет голосовать в энторнетах
Основной задачей ДЭГ является обеспечение тайны голосования, и неизменность результатов. Количество остроумных шутеек про
UPDATE ... WHERE name = 'edro'
сегодня увеличится вдвое =)Таким образом с точки зрения системы мы перестаем доверять серверу, и основным доверительным устройством становится браузер. Если вы не понимаете о чем я - подумайте, мы каждый запрос от браузера перепроверяете на бэке, потому что мало ли какое он говно туда занесет.
Итак, более менее определились с понятиями. Едем дальше. Избиратель загнал свое заявление на ЕПГУ, и он попал в список избирателей ДЭГа. Этот сформированный, подписанный, список к нам и придет. И из него мы сформируем собственно голосование.
В день голосования, юзер зайдет собственно на портал, который мы для него сваяли. Мы его авторизуем через ЕСИА, вытащим оттуда его персуху и покажем ему список голосований, на которые у него есть активное избирательное право. Пока все просто.
Когда пользователь ознакомится со списком доступных бюллетеней, и примет решение голосовать мы должны обеспечить аутентификацию. Сейчас доступны два варианта: это смс код, и аутентификация в системе ЕБС. Это биометрия, когда на камеру говоришь циферки, и сверяется твой слепок
И вот тут начинается самая магия. Для начала мы сгенерируем личную ключевую пару для пользователя на каждый бюллетень -- публичный и приватный ключики.
Публичный ключик мы должны подписать на бэке, причем в слепую. Здесь нам как раз помогает гомоморфное шифрование, конкретно - слепая подпись. ru.wikipedia.org/wiki/Слепая_по…
На вики приведен хороший пример: типа когда я ставлю печать на конверте, и чернила промакивают сам документ, при это документ я не вижу.
Когда бэкенд выдает нам слепую подпись на ключик он еще раз проверяет наше активное избирательное право (естественно).
После этой операции у нас на руках ключевая пара, с подписью ее публичного ключа. Теперь мы можем перейти в "анонимную зону". Анонимная зона в нашем случае это другой сервер, между порталом и анонимной зоной нет сетевой связности. И там другой домен.
Перед переходом мы можем включить ВПН, прокси, и тому подобное. Чтобы максимально анонимизироваться, а то придет ваш начальник и скажет что вы не туда куда следует голосуете
В анонимной зоне выбирая кандидата юзер формирует модель голоса. Она выглядит просто: [0, 0, 1, 0, 0]. Где длинна массива - количество кандидатов, и единичка - наш голос.
Эта моделька шифруется публичным ключом голосования (подробнее об этом позже). И укладывается в транзакцию для блокчейна. Фактически это просто объект
В транзакцию так же добавляется публичный ключик. Слепая подпись, выданная нам на портале. Парой пользовательских ключей эта транзакция подписывается.
На выходе у нас транзакция с публичным ключом, зашифрованным голосом, подписью и пруфами. Они нам нужны чтобы убедиться что по дороге никто не изменил данные в транзакции
Закидываем транзакцию на бэк. Там мы провалидируем что к нам еще не поступило транзакций с таким же публичным ключом, чтобы не было повторных голосований
А так же проверим что приложенная подпись была выдана именно на этот ключ. Так мы убеждаемся в том что каких-то левых неавторизованных транзакций к нам не залетит.
Транзакция отправляется в блокчейн, и там потихоньку майнится. Чтобы избежать повторного голосования с одним и тем же ключом на бэке есть распределенные локи, перед БЧ стоит кафка.
При завершении голосования, мы загрузим приватный ключик в БЧ, начнет расшифровка голосов. При этом мы не расшифровываем каждый голос по отдельности, мы снова применяем гомоморфное шифрование.
Гомоморфное шифрование - это такая штука, когда мы проводим манипуляции с зашифрованными данными, не видя их истинного значения: ru.wikipedia.org/wiki/Гомоморфн…
В смарт-контракте БЧ мы берем всю нашу пачку голосов. Складываем их, и расшифровываем уже непосредственно результат, еще раз, так сказать обеспечим анонимность голоса