

Во время голосования департамент информационных технологий мэрии Москвы каждые полчаса выкладывал на специальном сайте сводные анонимные данные с зашифрованными голосами избирателей. Для каждого голоса там были указаны:

После окончания голосования и публикации итогового CSV-файла с 9810 голосами избирателей приватный ключ был восстановлен из нескольких частей, заранее переданных доверенным лицам. Этот приватный ключ был записан в блокчейн. «Медуза» сумела найти нужный блок и транзакцию с приватным ключом через веб-интерфейс и скопировать данные до тех пор, пока доступ к блокчейну не был закрыт.
Обновление. В мэрии утверждают, что специально опубликовали приватный ключ. Но, если они намеренно предоставили наблюдателям доступ к приватному ключу, непонятно зачем через несколько часов нужно было закрывать доступ к веб-интерфейсу блокчейна.
Для успешной расшифровки сообщений, зашифрованных по схеме Эль-Гамаля, кроме секретного ключа нам нужно было узнать один из компонентов открытого ключа — его модуль.
Чтобы его узнать, мы попросили научного редактора «Медузы» Александра Ершова, который голосовал через интернет, предоставить HTML-страницу своего бюллетеня. Там прописан публичный ключ, с помощью которого шифровался голос избирателя (в том числе необходимый нам модуль).

Если вы попытаетесь самостоятельно расшифровать голоса, учтите, что каждому кандидату на выборах был присвоен свой номер. Перед шифрованием в браузере пользователя этот номер возводился в квадрат. Поэтому, чтобы получить оригинальное значение, надо извлечь из расшифрованного числа квадратный корень.
Александр Ершов записал процесс интернет-голосования в HAR-файл. Он позволяет сохранить весь входящий и исходящий трафик при посещении веб-сайта или взаимодействии пользователя с веб-приложением. Мы нашли в этом архиве зашифрованный голос — дальше все было просто.

Записать процесс своего интернет-голосования совсем не сложно — не нужно даже ставить специальные программы. Встроенные инструменты для записи веб-трафика в HAR-файлы есть в браузерах Google Chrome, Mozilla Firefox, Safari и даже Microsoft Edge.
Если временная публикация приватного ключа была организована преднамеренно, то теоретически руководители, заставлявшие своих работников проголосовать определенным образом, могли выяснить, как распорядились своим голосом их сотрудники.
Официальные результаты эксперимента, подведенные участковыми избирательными комиссиями № 5001, № 5002 и № 5003, полностью совпадают с расшифрованными нами голосами избирателей. Без доступа к блокчейну мы, правда, не можем проверить число выданных избирателям бюллетеней.
Но чтобы заметить странности, можно даже ничего не расшифровывать. Достаточно разбить весь день голосования на отрезки по 5 минут и сгруппировать попавшие туда блоки с голосами избирателей.

Двенадцать часов, отведенные на интернет-голосование, оказались разбиты на неравные диапазоны. Там были и три часа, в течение которых голоса избирателей вообще не записывались в блокчейн, и час, когда была сгенерирована половина всех блоков с голосами (правда очень мелких — в 1-3 транзакции), и 5 минут, за которые в блокчейне оказались почти 1400 голосов (14% от общего числа).
А вот это мы можем показать только благодаря расшифрованным голосам. Продемонстрируем распределение голосов у трех принципиальных соперников — независимого кандидата Романа Юнемана, провластного кандидата Маргариты Русецкой, а также кандидата от «Умного голосования» и КПРФ Владислава Жуковского.



Избиратели, выбиравшие провластных кандидатов, во всех трех округах заметно чаще голосовали утром (в первые полтора часа, до первого сбоя), чем избиратели независимых кандидатов.

Мы не знаем, можно ли с помощью этих данных зафиксировать принудительное голосование и определить его вклад.
Это оказалось возможным благодаря использованию блокчейна. Мы точно знаем, что каждый голос, оказавшийся в определенном блоке не мог быть отдан позже времени записи этого блока в блокчейн. Разработчики московской системы интернет-выборов обещали случайным образом генерировать задержку для каждого бюллетеня перед записью в блокчейн. Возможно, она помогает только перемешивать голоса внутри блоков: голос Александра Ершова оказался в первом же блоке, сформированном после заполнения бюллетеня.
Посмотрите на реконструкцию противостояния Романа Юнемана и Маргариты Русецкой. Если допустить, что нам заранее известны результаты обычного «бумажного» голосования, то можно пошагово увидеть, как постепенно тает преимущество Юнемана в 581 голос.

Вы можете скачать:
Не забудьте написать нам, если вы найдете в этих данных что-нибудь интересное.
Денис Дмитриев, Султан Сулейманов