Как работает криптография в ДЭГ

52624c8fa07497238459a8e5f4708db2.jpg

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

Введение

Представим, что мы участвуем в проекте по разработке системы электронного голосования.

Участники проекта:

  • Заказчик — следит за выполнением требований и выдвигает новые

  • Система — система электронного голосования

  • Избиратель — голосует на выборах, пользователь Системы

  • Наблюдатель — проверяет честность проведения голосования

Разработка системы электронного голосования

Заказчик выдвигает следующие требования к Системе:

  • Голосовать могут только избиратели, имеющие на это право

  • Никто не имеет возможности узнать чужой голос

  • Результат голосования должен подсчитываться честно

  • Необходима возможность проверки подсчёта результатов голосования

Первый вариант

Недолго думая, мы выдаём простой первый вариант:

  1. Избиратель заходит в Систему и ставит галочку

  2. Голос сохраняется в базе данных Системы

  3. В конце голоса суммируются, и выдаётся результат

Заказчик: Система не удовлетворяет ни одному требованию! Голосование не анонимное, бюллетени можно подделать или просто не учитывать, а правильность подсчёта проверить невозможно. Более того, голоса передаются в открытом виде.

Целостность: шифрование и подпись бюллетеня

Получив нагоняй от Заказчика, приступаем к исправлению. Начнём с шифрования и защиты бюллетеней от подделки. Для этого Избиратель и Система используют криптосистему с открытым ключом:

  1. Избиратель и Система генерируют закрытые и публичные ключи

  2. Избиратель заполняет электронный бюллетень

  3. Избиратель шифрует бюллетень, подписывает его и отправляет в Систему

Теперь бюллетень передаётся в зашифрованном виде, а также он подписан ЭЦП Избирателя, поэтому его нельзя подделать.

Заказчик: Уже лучше, но Избиратель не может убедиться, что его голос учтён. Система может без последствий «потерять» голос любого Избирателя.

Учёт бюллетеней: квитанция, блокчейн

Вносим улучшения. Все бюллетени будем хранить в открытом реестре. Когда Избиратель проголосовал, ему выдаётся квитанция с номером бюллетеня в Системе. Теперь Избиратель может проверить, что его бюллетень учтён. Для надёжности (и потому что модно) организуем реестр в виде блокчейна.

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

Анонимность: разделение получения бюллетеня и голосования

Чтобы решить проблему анонимности, разделим Систему на две части: в первой Избиратель будет подтверждать своё право голосовать, а во второй заполнять бюллетень. При этом во вторую часть Избиратель заходит анонимно: аккаунт уже не требуется и можно, например, зайти с другого ip-адреса:

  1. Избиратель генерирует пару ключей

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

  3. Избиратель переходит во вторую часть Системы и предъявляет подписанный ключ

  4. Избиратель голосует

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

Анонимность: слепая подпись

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

Заказчик: Система работоспособна, но у нашего отдела безопасности появилось новое требование: работать с бюллетенями только в зашифрованном виде.

Зашифрованные бюллетени

Новое требование создаёт три принципиальные проблемы. Нужно, не расшифровывая бюллетени:

  1. Проверить корректность бюллетеня

  2. Рассчитать итоговый результат

  3. Доказать, что итоговый результат посчитан честно

Первую проблему решим с помощью доказательства с нулевым разглашением. Этот протокол позволяет убедиться в выбранном свойстве зашифрованного сообщения без раскрытия самого сообщения. Нам нужно убедиться, что Избиратель поставил допустимое количество галочек.

Вторую проблему решим за счёт использования криптографической схемы, позволяющей получать зашифрованную сумму сообщений без их расшифрования (такое шифрование называется гомоморфным по сложению).

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

Итоговый протокол:

  1. Система принимает бюллетень от Избирателя и проверяет доказательство корректности

  2. Система складывает зашифрованные бюллетени

  3. Система расшифровывает результат и генерирует доказательство расшифрования

Заказчик: Неплохо. Но есть ещё одно требование: невозможность подвести промежуточные итоги до окончания голосования.

Невозможность подведения промежуточных итогов

Чтобы запретить подводить промежуточные итоги, Система будет генерировать две пары ключей вместо одной. Для работы с бюллетенями требуется только одна пара, а для подведения итогов — обе пары.
В начале голосования секретный ключ из второй пары будет разделен на несколько частей с помощью схемы разделения секрета. Части раздаются участникам комиссии, изначальный ключ уничтожается. Он будет восстановлен только в конце голосования, что позволит подвести итоги.

Заказчик: Хорошо. Теперь опишите процедуру наблюдения.

Наблюдение

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

Наблюдатель в процессе голосования:

  • Мониторит технические характеристики реестра

  • Мониторит события, которые регистрируются в Системе

  • Периодически сохраняет текущее состояние реестра на своих носителях

Наблюдатель после подведения итогов:

  • Проверяет количество бюллетеней

  • Проверяет уникальность каждого бюллетеня

  • Проверяет корректность слепой подписи Системы на ключах Избирателей

  • Проверяет подпись Избирателя на каждом бюллетене

  • Проверяет доказательство корректности каждого бюллетеня

  • Вычисляет результаты голосования и сравнивает их с опубликованными

  • Проверяет доказательство корректности расшифрования

Заказчик: *Перечисляет деньги*.

Заключение

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

Нет защиты от принуждения к голосованию. У избирателя могут взломать аккаунт и украсть телефон. Избиратель может голосовать под пристальным взглядом начальника или продать доступ к своему аккаунту. Во всех подобных случаях его голос будет учтён наравне с остальными.

Код системы закрыт. Код системы закрыт, поэтому невозможно убедиться, что в нём нет какой-то хитрой закладки. По той же причине нет возможности проверить, что именно этот код исполняется на нодах голосования. Хотя голосование и проверяется криптографическими методами, на мой взгляд, открытый код способствовал бы повышению доверия к системе.

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

Полезные материалы

Официальная документация на портале ДЭГ:
https://vybory.gov.ru/#documents_and_articles

Заседание экспертов по технологиям ДЭГ (19.07.2023):
https://www.youtube.com/watch? v=BsIXmhmrMPU

Мой Телеграм-канал

© Habrahabr.ru