Русский
Русский
English
Статистика
Реклама

Голосование

Подведение итогов конкурса самых странных заданий на собеседованиях

03.10.2020 12:04:36 | Автор: admin


Настало время подвести итоги конкурса, который был в статье "Программисты, ходите на собеседования". Условия конкурса были следующие: привести пример самого необычного задания, которое было на вашем собеседовании. Пришло время подвести итоги конкурса и провести финальное голосование! Поехали!

Задание, которое прислали читатели


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

1. Пользователь с ником jakushev привёл два задания (первое и второе).
Первое задание:
Ну, не знаю, на сколько интересное, но абсолютно глупое задание:Написать Hellow, World! без единой ';' . На Си.

Второе задание:
На бареметалл еще такое любят: Есть очень простой контроллер, с минимальным ОЗУ, допустим, PIC16F873, он нюхает RS-485. По интерфейсу передается пакет, состоящий из 32х битных чисел. Формат, начало и конец пакета известны, известно, что каждое число передается четное количество раз. Так же известно, что канал 100% надежен. А поток может быть ОЧЕНЬ длинный. Но 1 число из выборки передается нечетное количество раз. Как его найти?

2. Пользователь с ником nick758 привёл следующую задачу:
Задачка с собеседования. Что выведет программа? Решить без запуска. В тексте незначительные ошибки, чтобы сразу не скомпилировалось.
Самая наркоманская задачка такого рода из тех, что я видел :)
float bon_jovi[4][4]= { {0,   2,    0.5,   2},   {1,   3,    3 ,    0},   {2,   0.5,  0,     1},   {0,   0,    0,     0} }#define FIRST_SONG 3#define LAST_SONG 1#define CD 0#define ARTIST 1void f(float *p, int jazz, int hiphop){  int high_rating=0;  int low_rating=high_rating  int music;  float sum=0.0;  for (music = jazz; music <= hiphop; music++)  {      sum += *(p++)      if ( p[music])        high_rating++;      else        ++low_rating  }  p--;  sum += *(--p)  printf("%d %d %f", high_rating, low_rating, sum)}int main(){  f(&bon_jovi[CD][ARTIST], LAST_SONG, FIRST_SONG)  return 0;}

3. Пример с собеседования от пользователя vladshulkevich:

  • интерпретатор простого ЯП (подмножество паскаль кажется): переменные, арифметика,
  • задача на выявление рассинхронизации тактовых генераторов двух компьютеров с вымышленными(?) архитектурой и ассемблером с простейший одноранговой сеткой, скорее даже прямым соединением
  • удалённый лайвкодинг: написать и поднять простой CRUD на symfony без генераторов в докере (не помню Докер условием был или сам решил)
  • нарисовать грубую модель предметной области jira, нарисовать схему сервисов: серверы, сторы, очереди, СУБД и т. п.

4. Пользователь iamdev95 привёл занимательную задачку:
Есть два регистра: R1 и R2
Есть две команды:
C1: R1 := K*R2 R1
C2: R2 := K*R1 + R2
Есть целевое число N
На входе: K, N, R1, R2
Нужно: распечатать минимальную последовательность из команд, позволяющую получить N в R1 или в R2 (в любом из двух регистров)
Либо напечатать ничего
Известно, что K != 0, R1 != R2, K, R1, R2 натуральные, N целое.

5. Шуточная (но вполне реальная) задача от vadim_bv
Задача из физтеховской шутки решала вся кафедра, но к экзамену решила: Отсортировать 8-терабайтный массив байтов.

В ваших силах определить победителя! Голосуем за самое интересное задание на интервью. По результатам голосования победитель получит интересный приз! Результаты голосования подведём в воскресенье 11 октября.
Подробнее..

Обсуждение системы голосования, разработанной ДИТ Москвы

22.06.2020 10:10:48 | Автор: admin

Открытые исходники


Недавно в открытый доступ были выложены исходники системы голосования, которая по всей видимости, и будет применяться на электронном голосовании по Конституции в Москве и Нижнем Новгороде.


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


Введение и просьба о помощи


Эта разработка Департамента информационных технологий (ДИТ) г.Москвы, предыдущая версия которой вероятно, уже знакома некоторым из читателей: как я понимаю, именно она применялась на выборах муниципальных депутатов в прошлом году.


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


Мои заметки


Что мне удалось понять к данному моменту из этих исходников, а также из других источников.


Платформа


Lumen PHP-Framework веб-оболочка
Exonium разновидность блокчейна


Как работает


Вот как я понимаю работу системы.


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


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


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


Ключ шифрования формируется перед началом голосования, делится на части и раздается лицам из числа наблюдателей.


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


Возможные уязвимости


Доверяя использованным инструментам, я бы указал на следующие вероятные уязвимости, вытекающие из архитектуры системы и особенностей ее развертывания.


Уязвимость 51%


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


Регистрация голосующих


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


Подтверждение личности на сайте mos.ru


Данная уязвимость имеет более обширный контекст, нежели рассматриваемая система голосования.


Сайт mos.ru, используемый в качестве источника аутентификации московского избирателя, позволяет три степени подтверждения личности: отсутствие, сверка личных данных, личный визит клиента в центр авторизации. При этом, согласно сообщениям в социальных сетях и проговорке разработчика на рабочей группе, для предстоящего голосования достаточно второй степени подтверждения личности: сверки личных данных, которая должна была быть совершена до 5го июня. Таким образом, располагая до этого момента базой личных данных, фрагмент которой обнаружил корреспондент т/к Дождь, сайт mos.ru можно было скомпрометировать.


Заключение


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

Подробнее..

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

25.06.2020 00:10:20 | Автор: admin

Конституция, и далее везде


Приветствую всех, недавно я предложил вам обсудить систему голосования, разработанную Департаментом информационных технологий (ДИТ) г.Москвы.


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


Введение


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


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


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


Выработанные рекомендации


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


Регистрация участников


Верификация регистрационных записей на mos.ru личным визитом


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


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


Формирование и проверка списка зарегистрированных


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


Использование систем суверенной идентификации Self Sovereign Identity


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


Голосование


Поддержка анкоринга и узлов аудита


Существенным условием, обеспечивающим безопасность и доверие к любой системе, основанной на блокчейне (а рассматриваемая система использует одну из разновидностей блокчейна под названием Exonum), является доступность цепочки транзакций этого блокчейна для проверки независимыми наблюдателями. Такая доступность позволяет любому независимому наблюдателю удостовериться в том, что вся цепочка остается целостной в течение всего голосования, так что подмена голоса невозможна.


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


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


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


Контроль развертывания


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


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


Доступ ко всем исходным кодам


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


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


Разрыв связи голоса и голосующего


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


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


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


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


Возможность пересмотра собственного голосования


В настоящий момент, система не позволяет голосующему изменить единожды поданный голос. Это делает систему беззащитной перед недобровольным голосованием.


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


Открытый API


В настоящий момент, система жестко привязана к разработанному пользовательскому интерфейсу на основе браузера.


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


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


Заключение


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

Подробнее..

Григорий Бакунов об электронном голосовании

06.07.2020 02:17:13 | Автор: admin

Григорий Бакунов


Директор по распространению технологий Яндекса Григорий bobuk Бакунов в эфире Точки на Эхе Москвы поделился мнением о системе голосования, которая использовалась на выборах в городскую думу в 2019 году и на голосовании по вопросу изменения конституции в 2020. Получился любопытный разбор технических деталей для неспециалистов. На Хабре уже была хорошая публикация на эту тему.


Ниже приведена стенограмма эфира, который провёл Александр plushev Плющев. Его реплики выделены полужирным.


Я не делал этого сам, но я помог другому человеку поучаствовать в этом онлайн, поэтому весь процесс я всё-таки посмотрел, и теперь я его знаю.


То есть он голосовал не тайно? Была нарушена тайна голосования? Я прошу обратить на это внимание центризбирком.


Безусловно. И это тоже хороший показатель, как мне кажется, потому что, обратите внимание, ничто не мешает при онлайн-голосовании детям помогать родителям, и родителям помогать детям.


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


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


Так, что ты имеешь в виду? Прежде всего?


Что это тот же самый, по большому счёту, блокчейн, который, на самом деле, довольно фиктивный. Что это процесс, в котором большая часть того, что относится к нашей безопасности, сделано, на самом деле, на совершенно фиктивном уровне. И очень жаль, что технических специалистов здесь никто не послушал. Я специально пошёл в интернет посмотреть, а были ли умные люди, которые до этого писали: Ребята, а вот как надо. И таких статей, которые рассказывают, как надо, как можно было сделать, чтобы технические специалисты во всё это поверили, очень много. Но, разумеется, это, по честному если, никому не нужно. Можно прямо разбор провести. Вот давайте с самого начала начнём. Смотрите, нам много раз в разных источниках говорили про то, что это блокчейн. А значит ничего подделать нельзя. Но это, на самом деле, чудовищный обман. В данном случае используется вообще-то хорошая, качественная реализация блокчейна. Этот блокчейн называется Exonum. Это довольно крутая разработка, очень качественная, в которую люди вложили много усилий, чтобы в ней действительно ничего нельзя было подделать. Если бы не одно но. Там такая структура, в которой есть узлы, которые записывают данные в блокчейн, а есть валидаторы. Такая система, которая каждый раз подтверждает, что то, что записано в блокчейн, записано верно. И там невероятно сложная конструкция, которая всё это валидирует. Она продумана так, что для того, чтобы убедить систему записать поддельные данные, или сказать, что какая-то часть данных поддельная, тебе нужно завладеть более, чем двумя третями плюс одним узлом. То есть если у тебя их десять, то тебе нужно, чтобы у тебя в этой системе было семь узлов, чтобы сказать, что запись, которая проведена в блокчейн, она неправильная. Но тут есть один тонкий момент. Я специально пошёл и специально проверил. Все валидаторы, на самом деле, принадлежат государству. Все до одного.


Поясни, что это значит. Чем это чревато?


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


То есть ты сейчас как эксперт заявляешь, что электронное голосование может подвергаться последующему изменению записей о нём, верно?


Оно может подвергаться изменению в процессе. Как это выглядит. Вот смотрите, в чём идея блокчейна. В том, что в каждой последующей записи есть информация о предыдущих записях. Таким образом, если ты хочешь изменить какую-то запись, например, на пять от текущего момента назад, тебе придётся изменить не только её, но и пять последующих. Так вот в текущей ситуации с текущим блокчейном сделать это довольно легко, это несложная история. Мы об этом говорили ещё и во время московских выборов. С тех пор ничего глобально не поменялось, к сожалению. При этом, смотрите, в основе этого оригинального блокчейна, который называется Exonum, в нём была даже для этого предусмотрена специальная фишка, которая называлась Anchoring. Ну, как сказать, якорение. Идея была такая: раз в какое-то время записывать контрольную сумму, то есть записывать информацию о транзакциях, которые через этот блокчейн прошли, в другой блокчейн, не зависящий от этого. Например, в блокчейн биткойна. В систему, которая показательно независима, и поэтому ты там ничего поделать не можешь. Разумеется, эта фича была выключена, выпилена и никак не использовалась. В Exonum была отдельная такая сущность, которая называлась узлы аудита. Которые не могут ничего писать, но которые могут только проверять информацию. И которые можно было выдать, не знаю, мне, например, или тебе, чтобы ты был руководителем этого узла и мог смотреть, что там происходит. Но они тоже не были предоставлены. Не было классической истории про новый блокчейн, которая называется контроль развёртывания. Это такая практика, при которой, когда разворачивается новый блокчейн на серверах, туда пускаются специальные люди, которые контролируют, что в блокчейне на момент разворачивания нет никакой подделки, нет никаких непонятных действий внутри. Вы понимаете, сейчас единственное, что мы знаем про текущий блокчейн, это текущие транзакции, которые прямо сейчас по нему проходят. Но мы не знаем, не было ли туда доложено предварительно большое количество других транзакций. Мы ничего про это не знаем. Большое количество дополнительной информации Блин, прости, что я монологом говорю.


Давай-давай, интересно.


Я покопал большое количество дополнительной информации. И вот статья, которую ты мне скинул Спасибо тебе большое за неё, потому что я бы, конечно, сам не взялся, а так я просто проверил. Действительно, выяснилось, что довольно простым набором действий можно подтвердить, что голосование было устроено Вот как сейчас, смотрите. Вы заходите на сайт. Для простоты, mos.ru. Вы получаете там, грубо говоря, разрешение или бюллетень на голосование. Там генерируется особенная строчка в вашем собственном браузере, и после этого, внимание, эта строчка отправляется на сервер, который называется elec.moscow. Я пошёл специально посмотреть по адресам, где находятся эти замечательные сервера, которые называются elec.moscow. И там, внезапно, знаете, такие странные штуки: московский минздрав, штука, которая, вот я до сих пор не знаю, что такое Moscow District Council. Ты мне можешь сказать? Я не знаю.


Районный совет?


Ну, вероятно Я не знаю, что это такое. Тем не менее, это всё московские государственные организации. То есть когда нам говорили, что вот этот сайт голосования, который будет эту промежуточную страницу выдавать, он будет на независимых узлах Ну, вот настолько они независимые. То есть они принадлежат московскому правительству. Это те узлы, по которым смог пройти я. В чём здесь фокус. В том, что вы получаете действительно уникальный идентификатор, который вроде как mos.ru не знает. Но этот промежуточный сайт, который назвается elec.moscow, он его всё равно получает. И этого в принципе достаточно по времени для того, чтобы идентифицировать и связать вас как человека, пользующегося mos.ru...


Смотри, в результате ты выяснил уже две вещи: первая вещь, что голосование можно подменить, верно?


В процессе его можно подмешивать, да. И изменять, как тебе хочется, всё так.


И второе, что его можно проконтролировать.


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


У главного редактора, ты имеешь в виду.


У главного редактора, прости пожалуйста, а почему я сказал у генерального директора?


Не знаю.


Наверное, заволновался. Ну, ты понял меня.


Да.


Мне кажется, все поняли. И в этой конструкции есть штука, про которую мы должны исключительно верить: что разделение этого ключа не было сопровождено никакой предварительной записью этого ключа. То есть ключ раздали, но нигде его предварительно не склеили. Грубо говоря, мы должны на слово поверить, что этого ключа прямо сейчас не существует, и существовать он будет только в тот момент, когда вот эти N представителей, я не помню, по-моему, их пять человек, соберутся вместе, сложат вместе этот ключ, и тогда будет общий ключ, для того чтобы проверять информацию в блокчейне, как она записана. Я думаю, что, на самом деле, конечно же, как минимум, для надёжности, для того, чтобы быть уверенным, что всё работает, этот ключ где-нибудь сохранён. И это значит, что даже сам по себе голос с очень высокой степенью вероятности можно увидеть. И увидеть, как именно, за кого ты проголосовал. Мне кажется очень странной вся конструкция, которая была построена вокруг сайта наблюдателя, на котором можно было видеть блоки. Во-первых, произошло довольно большое количество поломок на этом сайте. Я не знаю, как у вас, а у меня много всегда вопросов, когда начинает ломаться сайт, который показывает мне информацию о том, что происходит в системе. Если ломается даже он, это значит, что в системе происходит полный хаос. Обычно так.


Подожди, что за сайт ты имеешь в виду?


Был такой сайт, который назывался observer что-то там. Я уже не очень помню. Это такой сайт формально для наблюдателей, на котором можно было посмотреть, как в блокчейн записываются транзакции. Он до сих пор работает, я могу прямо сейчас его открыть из интереса, где-то он у меня даже был записан Ну, в общем, такой сайт есть. Он публично доступен. И если вы на него посмотрите, прямо сейчас вы увидите, что транзакции, которые в нём идут Это такая традиционная история, там проходят транзакции, транзакции блокчейна. Постоянно происходят очень странные флуктуации. Вот блок блокчейна, в котором одна запись, вот ноль записей, вот одна запись, вот ноль записей, вот тридцать пять записей на ровном месте.


Ты имеешь в виду constitution.observer?


Да-да. Что-то такое там было. Я, к сожалению, не очень запоминаю...


Нет, боюсь, не то. Я, правда, не знал даже о таком.


Ты можешь посмотреть, у нас с тобой где-то в новостях была ссылка на этот сайт. Нет: observer2020.mos.ru. Я тебе сейчас пришлю ссылку, чтобы ты посмотрел на неё. Так вот, на самом деле, на этом сайте очень интересно смотреть за происходящим. Я не очень понимаю, по какой причине там возникают такие флуктуации, когда иногда ноль, иногда одна, а иногда пятьдесят записей в один блок попадает, но, допустим, что это нормально. Но когда выяснилось, что этот сайт по какой-то причине периодически падает, ломается, при том, что заходит на него пять инвалидов Это я сейчас не про конкретных людей, а в смысле пять людей, которые изредка что-то нажимают. Пять, десять, пятнадцать, несколько сотен человек. Это, в общем-то, всё мелочи для вебсайта, конечно. У меня возникает вопрос о квалификации тех людей, которые этот сайт запустили. И, конечно, когда выяснилось, что в работе этого сайта были прямо конкретные проблемы. Например, было несколько часов, когда данные по этим самым закрытым блокам вообще не показывались, то есть создавались нулевые файлы, и историю их было совершенно не посмотреть. И, насколько я знаю, эта история до сих пор не исправлена. Нам остаётся только верить в то, что в блокчейне в этот момент не происходило никаких изменений, потому что нас же не допускают к самому блокчейну, нам предоставляют только вот такой веб-интерфейс, в котором мы можем посмотреть, что в блоке номер 1452184 ноль транзакций. Или одна транзакция.


Да-да-да, есть такое дело.


В общем, всё это в целом вызывает ощущение дичайшего хаоса и Давай я тебе так скажу. Если бы кто-то из айтишников в айти-компаниях внезапно начал бы делать такой интерфейс с таким качеством, он бы недолго проработал на этой работе. Это просто ощущение сделанного левой задней ногой без какого-то желания сделать хорошо. Я, если честно, несколько удивлён.


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


Ну, я же часто говорил, что не надо пытаться объяснить злым умыслом то, что можно объяснить банальным патриотизмом. И в данном конкретном случае я думаю ровно это же. Я не уверен в том, что там был большой заговор. Но то, что там оставлен потенциал для того, чтобы иметь возможность изменять текущие записи это совершенно точно. Он там есть. Просто по структуре того, как устроен сам проект. Означает ли это, что подделки, какие-то вбросы голосов были? Я, к сожалению, этого сказать не могу. Так же как и не могу сказать противоположного, потому что, повторюсь, у нас нет возможности посмотреть в этот блокчейн.


Да, но ты говоришь, что возможность того, чтобы эти фальсификации были, оставлена.


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


Понятно. Слушай, ещё хотел несколько штук Для меня очень комичная ситуация, что сайт, который нам очень долго рекламировали, 2020og.ru, вот он упал утром первого дня голосования и до сих пор, главное, не вставал. Там, по сути, есть информационный сайт, и есть на его поддомене сайт, на котором проходит голосование. Вот информационный сайт упал и лежит. И не встаёт. То есть формально, если бы это было единственное место, где можно узнать о поправках в конституцию, то вы бы больше нигде не узнали, потому что всё, он лежит. Что они сделали. Они просто сделали переадресацию на голосование. Если вы заходите на 2020og.ru, то вы уходите на голосование. И вам говорят, можете вы проголосовать или нет. Всё. Всё остальное закончилось. Это ЦИКовский проект, это уже не ДИТ, это ЦИК делал, центризбирком России. И вот, видимо, это из того же ряда, о котором говорил Григорий Бакунов, насчёт высочайшей квалификации, с которой всё это сделано. Ну, потому что, что тут можно сказать. Это что, не рассчитали нагрузку и поняли, что даже если его поднимут, то лучше и не надо? Или что, объясни.


Ну, у меня нет никакого объяснения. Я думаю, что причина здесь в том, что сайт просто откровенно не выдерживал нагрузку. У программистов, вообще у технарей, которые делают сайты, есть такая традиция: мы, прежде чем запускать какой-нибудь сервис, его, есть такое хорошее слово, обстреливаем. Мы прогоняем через него большой поток ненастоящего, как будто пользовательского, трафика, проверяя, что сайт выдерживает нагрузку. В данном случае, судя по всему, этим никто не озаботился. Вот мы получили этот результат. А то, что на этом сайте с обзёрвером блоков происходило с ошибками, тебя совершенно не удивляет, да? То есть, когда выяснилось, например, что не формируются отчёты, которые вроде бы нам обещали. Что там будут прямо настоящие наблюдатели за голосованием, которые должны по отчётам смотреть...


Отчёты это то, что ты можешь скачать оттуда?


Да. Когда оно просто не формировалось. То есть, нет, не так, вру. Оно формировалось. Видимость того, что отчёты есть, была. Просто отчёты были нулевой длины.


А, это вот то, о чём писали Открытые Медиа насчёт сбоя, который Слушай, а почему произошёл этот сбой, о которых писали Открытые Медиа? Давай я просто напомню, в чём там было дело. Главное, что ДИТ Москвы признал, что сбой произошёл. Организаторы плебисцита не рассчитали размер файлов и забыли, что при многодневном голосовании следует обозначать не только время, но и дату. С вечера первого дня голосования по поправкам к конституции департамент информационных технологий Москвы больше 12 часов публиковал пустые выписки из блокчейн-системы для наблюдения за ходом электронного голосования, обнаружили Открытые медиа. Как удалось выяснить изданию, неполадка произошла из-за проблем, связанных с размером файла. Но не объясняется, почему, собственно, размер файла таковым оказался, непредсказуемым.


Я не знаю, а какой размер-то был непредсказуемым? Нечётный или что? Что такое непредсказуемый размер? Вы заранее знали, какое количество людей придёт голосовать. Было заранее известно, что больше миллиона человек. Какие там могут быть размеры файла? По утверждениям специалистов и по редким замечаниям человека, который всем этим руководил, я не знаю, можно назвать его специалистом или нет, вся проблема была в том, что...


Ты про начальника управления смарт-проектов правительства Москвы Артёма Костырко?


Да-да. В смысле, что у него была прямая речь о том, что они не успевали из блокчейна забирать все данные, которые нужно было выкладывать в отчёт. Но, прошу прощения, а проверить вы это не могли заранее? Вот опять же Я не знаю Вот была такая же история с голосованием в мосгордуму. Это уже второе такое голосование, и в нём по-прежнему просто детские ошибки. И вот, повторюсь ещё раз. У нас, у технарей, есть простое правило. Ну, давайте я на автомобильный лад что ли переведу. Если вы сидите в машине, которая должна вас провезти, я не знаю, там, тысячу километров, а у вас на приборной панели кнопочки отваливаются. Вы будете на такой машине ехать? Не знаю, как вы, а я нет, потому что я думаю, что в двигателе то же самое. Кнопочки тоже не работают. В смысле, в двигателе не работает ничего. Не дай бог взорвётся. И такая же логика у меня в отношении этого проекта. Я на него смотрю, я вижу, как он работает по внешним признакам, и думаю, что внутри там всё настолько же ужасно.


Понятно. Я хочу скзать, что Артёма Костырко мы звали сегодня. Мы подумали, что хватит уже с Ильёй Массухом при всём уважении говорить. До голосования поговорили, а теперь, когда система заработала, мы хотели бы поговорить с Артёмом Костырко. Но он не смог посетить сегодня нашу программу, в том числе и удалённо. Так что, может быть, вы опосредованно услышите его либо в других наших передачах, либо в других средствах массовой информации.


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


Кто-то один из нас издевается над московскими властями.


Ты знаешь, удивительно, что это сегодня не ты, да? Но просто у меня подпригорает Простите, подгорает. Я не знаю У меня довольно тёплое сидение сейчас, на котором я сижу, потому что, ну, действительно, я не ожидал, что всё настолько плохо.

Подробнее..

Обзор криптографического протокола системы дистанционного электронного голосования

15.09.2020 12:21:41 | Автор: admin
В этой статье мы разберем детали реализации криптографического протокола системы дистанционного электронного голосования.

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

Инициализация системы. На этапе инициализации голосования выполняются следующие криптографические операции:

  • Выработка ключевой пары валидатора для выдачи и проверки слепой подписи, как наиболее стойкий и рекомендуемый академическим сообществом для процедуры анонимизации в системах электронного голосования. В настоящий момент системой поддерживается алгоритмы слепой подписи на эллиптических кривых и на базе алгоритма шифрования RSA. В проводимом голосовании использовался алгоритм выдачи и проверки слепой подписи на базе алгоритма шифрования RSA с длиной ключа 4096 бит.
  • Выработка общего открытого ключа шифрования. Для большей безопасности в процессе выработки ключа используется сразу два криптографических алгоритма: протокол DKG Pedersen 91 распределенной выработки ключа и протокол разделения ключа Шамира. Выработка ключа осуществляется как участниками, обладающими техническими средствами, позволяющими контролировать непосредственно ноды сети и сервера подсчета, так и участниками, которые являются хранителями ключей, записанных на внешние носители. Итогом работы двух этих алгоритмов является общий открытый ключ шифрования бюллетеней. Далее мы более подробно рассмотрим процедуру выработки этого ключа.

Предоставление доступа к бюллетеню. На данном этапе работают следующие механизмы:

  • Выработка ключевой пары электронной подписи на устройстве избирателя по ГОСТ Р 34.10-2012
  • Выработка слепой подписи для маскированного открытого ключа избирателя для удостоверения и последующей проверки его права принять участие в голосовании. В настоящий момент механизм базируется на алгоритме шифрования RSA. Подробно механизм анонимизации рассматривается в отдельной статье.

Заполнение и отправка бюллетеня. На данном этапе используется следующий набор криптографических алгоритмов:

  • Шифрование бюллетеня по схеме Эль-Гамаля на эллиптических кривых. Данная схема используется в протоколе, поскольку обладает свойством гомоморфности по сложению, что позволяет получить результаты голосования без расшифрования каждого бюллетеня.
  • Доказательство с нулевым разглашением Disjunctive Chaum-Pedersen range proof используется для доказательства корректности содержимого бюллетеня без его расшифрования. Данный механизм мы разберем подробно в следующей статье.
  • Электронная подпись зашифрованного бюллетеня по ГОСТ Р 34.10-2012.

Подсчет итогов. На этапе подведения итогов выполняется:

  • Гомоморфное сложение зашифрованных бюллетеней.
  • Предварительное частичное расшифрование итогового суммированного бюллетеня частями закрытого ключа участниками, контролирующими отдельные ноды и серверы подсчета с получением шифротекстов от каждого участника;
  • Сборка закрытого ключа в Избирательной комиссии и частичное расшифрование итогового суммированного бюллетеня собранным ключом.
  • Окончательное суммирование шифротекстов и получение итогов подсчета.
  • Выработка и проверка доказательства с нулевым разглашением Chaum-Pedersen proof. Используется для доказательства корректности расшифрования итогового суммированного бюллетеня. Данный механизм мы разберем подробно в следующей статье.

Аудит. На данном этапе могут быть выполнены проверки корректности всех этапов протокола, и в этой статье мы подробнее рассмотрим возможные проверки.

Давайте разберем криптографические механизмы подробнее.

Блокчейн-платформа


Перед тем, как говорить о процедуре выработки ключей, нужно дать вводные о реализации блокчейн-платформы.

Ниже на рисунке приведена упрощенная целевая схема размещения блокчейн-платформы.



Размещение и резервирование узлов блокчейна происходит в географически распределенных ЦОД ПАО Ростелеком. При этом ответственность за атомарный набор компонентов, участвующий в хранении всех данных голосования, может быть возложена на избирательную комиссию или различные институты общественного наблюдения.

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

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

В качестве блокчейн-платформы используется отечественное решение Waves Enterprise. Транзакции и блоки подписываются по ГОСТ Р 34.10-2012.

Выработка ключей шифрования


Общий открытый ключ шифрования бюллетеней вырабатывается с применением двух криптографических алгоритмов: протокол DKG Pedersen 91 распределенной выработки ключа и протокол разделения ключа Шамира. На базе каждого из этих алгоритмов вырабатывается промежуточный открытый ключ. Затем эти два ключа комбинируются в один общий.

Схема сборки ключа приведена ниже на рисунке.



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

Но если нет возможности собрать кворум независимых участников блокчейн-сети, запускается процедура разделения ключа между независимыми участниками, которые являются хранителями отдельных частей ключа, записываемых на внешние носители (ключ Комиссии)

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

Затем инициализируется создание голосования в блокчейн сети. После создания голосования на серверах подсчета автоматически запускается процедура выработки открытого ключа DKG.

Участниками процедуры распределенной выработки ключей являются n серверов подсчета голосов, о которых мы писали ранее в обзорной статье. Все операции взаимодействия серверов подсчета, как промежуточные, так и конечные фиксируются в блокчейне, а, следовательно, прозрачны и проверяемы. В системе реализована пороговая схема k из n, то есть при расшифровании данных не требуется участие всех n сторон, формировавших открытый ключ DKG, достаточно меньшего числа участников k. Это позволяет расшифровать результаты голосования, даже если n-k серверов подсчета недоступно, либо их закрытые ключи утрачены.

Для формирования открытого ключа используется алгоритм DKG (Distributed Key Generation), описанный в статье A threshold cryptosystem without a trusted party автора Torben Pryds Pedersen, перенесенный на эллиптические кривые. Предполагается, что каждый сервер обладает постоянной (фиксируются регистратором в учетчике) ключевой парой Диффи-Хеллмана, используемой для защищенной передачи данных этому серверу (экспорт/импорт долей ключа).

Параметры протокола


  • Эллиптическая кривая E и генератор P подгруппы этой кривой большого простого порядка q. В текущей реализации используется кривая secp256k1.
  • Другой генератор Q той же подгруппы, для которого значение $x: Q=xP$ неизвестно никому.
  • (k,n), где n общее число участников, сгенерировавших пары ключей, а k минимальное число участников, которое необходимо для восстановления общего секрета, при этом $k(n+1)/2$. То есть, если k-1 участников скомпрометированы или у них украли ключи, то это никак не повлияет на безопасность общего секрета.


В общем виде алгоритм получения точки Q выглядит следующим образом: берется любая последовательность байт, например строка Hello, World!, и от нее считается хэш h = Hash(Hello, World!) после чего преобразуем последовательность байт h в число и считаем $x0=h mod p$, где p модуль кривой, подставляем $x0$ в уравнение кривой: $y^2= x0^3+ a*x0+b mod p$ и пытаемся его решить относительно y. При отсутствии решения мы инкрементируем x0 и снова пытаемся решить уравнение для нового значения x0 и т.д.

Шаг 0.
Каждому из n серверов присваивается уникальный порядковый номер от 1 до n. Это необходимо, поскольку коэффициент Лагранжа зависит от порядкового номера сервера.

Шаг 1 создание открытого ключа DKG.

Каждый j -й сервер, j=1,,n:
1. Генерирует пару закрытый ключ priv_j и открытый ключ $Pub_j=priv_jP.$
2. Делает Pedersen commitment для открытого ключа:
Генерируется случайное число r_j
Вычисляется точка $C_j=r_jQ+Pub_j$
$C_j$ публикуется с помощью учетчика
3. После того как все серверы опубликовали свои значения C_i, публикуется скаляр r_j.

Используя скаляры, каждый может восстановить открытые ключи каждого сервера $Pub_j=C_j-r_jQ$ и вычислить открытый ключ DKG $Pub=_(j=1)^n Pub_j $.
Отрытый ключ DKG записывается в блокчейн.

Шаг 2 генерация полиномов и раздача теней.

Каждый j -й сервер, j=1,,n:

1. Генерирует случайным образом полином степени k-1:
$f_j (x)=f_(j,0)+f_(j,1)x++f_(j,k-1)x^(k-1),$
где коэффициент $f_(j,0)=priv_j$, а остальные случайные элементы поля GF(q).

2. Считает значения полинома $f_j (i),i=1,,n,ij.$

3. Зашифровывает значение $ f_j (i)$ при помощи открытого ключа экспорта/импорта i -го сервер для каждого i и публикует с помощью учетчика результаты шифрования.

Шаг 3 проверка коэффициентов полиномов.

Каждый j -й сервер, j=1,,n:

1. Публикует каждый коэффициент своего полинома, умноженный на генератор P.
$F_(j,0)=f_(j,0)P,F_(j,1)=f_(j,1)P,,F_(j,k-1)=f_(j,k-1)P$
2. Расшифровывает все значения $f_i (j),i=1,..,n,ij$ и проверяет их корректность:
Вычисляет $A=f_i (j)P$
Вычисляет сумму
Если A=B, то результат принимается, иначе публикуется жалоба на сервер i, и протокол запускается с самого начала переход к шагу 0.
3. Если ни у кого нет жалоб, то вычисляет свой секретный ключ



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

Далее на основании открытого ключа комиссии, который загружается в систему, и открытых ключей серверов подсчета вырабатывается общий открытый ключ шифрования по следующей формуле:

MainPubKey = Hash(PubDKG, PubCommission)*PubDKG + Hash(PubCommission,PubDKG)*PubCommission

Все открытые ключи записываются в блокчейн вместе с промежуточными вычислениями для упрощения проверки наблюдателями. Общий открытый ключ шифрования считывается из блокчейна и передается на устройства пользователей при отображении бюллетеня.

Описание схемы шифрования бюллетеней


Ниже приведем описание процедуры шифрования бюллетеней по схеме Эль-Гамаля на эллиптических кривых.

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

Encrypted (A) + Encrypted (B) = Encrypted (A+B).

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

Длина закрытого ключа при использовании алгоритма Эль-Гамаля на эллиптических кривых выбирается равной 256 бит, открытый ключ при этом представляет из себя точку эллиптической кривой. Это соответствует уровню безопасности в 128 бит (для взлома необходима 2^128 операций с точками кривой). Такой уровень считается оптимальным для большинства современных промышленных и финансовых систем, в том числе для российского стандарта ГОСТ 34.10-2018 Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи (вариант 256 бит).

В качестве эллиптической кривой используется secp256k1.

Допустим, мы имеем ключевую пару priv, Pub:
Число priv: 0 < priv < q
Точка Pub = priv*Base

Зашифрование:

  • Есть сообщение m, небольшое число, которое мы хотим зашифровать на ключе Pub.
  • Вычисляем точку M = m*Base
  • Генерируем случайное число r: 0 < r < q
  • Вычисляем точку R = r*Base и точку C = M + r*Pub
  • Шифротекст: (R, C)

Расшифрование:

  • Имеется закрытый ключ priv и шифротекст (R, C)
  • Вычисляем точку M = C priv*Base
  • Восстанавливаем m: решаем перебором ECDLP для соотношения M = m*Base

Гомоморфность схемы.

Мы видим, что если зашифровать два сообщения $M1 = m1*Base$ и $M2 = m2*Base$ на ключе Pub:
$(R1, C1) = (r1*Base, M1 + r1*Pub)$
$(R2, C2) = (r2*Base, M2 + r2*Pub)$

То их сумма $(R1 + R2, C1 + C2)$ соответствует зашифрованному сообщению $M1 + M2$.

Таким образом, можно шифровать и складывать покандидатно все бюллетени. К примеру, пусть открытый бюллетень выглядит так:

Иванов Петров Сидоров

0 1 0


Тогда, преобразовав его в точки, получим:

Иванов Петров Сидоров

ZeroPoint Base ZeroPoint

где ZeroPoint это точка на бесконечности.

И, наконец, шифруем бюллетень на ключе Pub:

Иванов Петров Сидоров

$(r1*Base, r1*Pub)$$(r2*Base, Base + r2*Pub)$$(r3*Base, r3*Pub)$

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

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



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

Описание процедуры расшифрования


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

Для того, чтобы расшифровать шифротекст (R,C) необходимо, чтобы любые k из n серверов вычислили и опубликовали значение $s_jR$ и доказательство корректности расшифрования Chaum-Pedersen (доказательство, что посчитанный $s_jR$ это именно точка R, умноженная на $s_j$, не раскрывая значения $s_j$). Также для этого необходимо собрать закрытый ключ комиссии из не менее чем k1 из т1 частей и с его помощью также выполнить вычисление $s_jR$ с публикацией в блокчейн.



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

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

Результаты операции публикуется в блокчейн.

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

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

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

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

Доказательства с нулевым разглашением


Хотя система ДЭГ защищена от злоумышленников и ошибок пользователей на уровне программного обеспечения и инфраструктуры, на уровне криптографического протокола были предусмотрены дополнительные математические доказательства и проверки, которые не позволяют передавать в систему ложную информацию. Для этого было разработано несколько механизмов, основанных на неинтерактивных доказательствах с нулевым разглашением (NIZK).

Первый тип ZKP (zero-knowledge proof), применяемых в cистеме доказательства диапазона. Данные ZKP используются при публикации зашифрованного бюллетеня, чтобы в отсутствие информации о том, как проголосовал участник голосования, можно было убедиться, что участник не испортил бюллетень на своем устройстве одним из следующим способов:

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

Более подробное описание реализации NIZK, а также их проверки, будет рассмотрено в отдельной статье.

Структура записей в блокчейне


Вся информация в блокчейне записывается тремя типами транзакций:

  • CreateContract для создания смарт-контракта под конкретное голосование. Далее в этом смарт-контракте будет агрегироваться вся информация по голосованию. Если одновременно проводится два (и более) голосования, то создается, соответственно, два (и более) экземпляра контракта.
  • CallContract для взаимодействия со смарт-контрактом по различным операциям, перечень которых приведем далее.
  • Data transaction для записи списка избирателей после создания экземпляра смарт-контракта голосования и перед началом непосредственно голосования.

Взаимодействие со смарт-контрактом производится по следующим операциям:

  • Запись базовых данных в смарт-контракт. Здесь сохраняются публичные ключи северов подсчета, которые будут участвовать в криптографическом протоколе, threshold схема, ключи проверки слепой подписи и другие данные, необходимые для организации работы протокола и голосования в целом.
  • dkgScalar, dkgCommit, dkgShadows данные, необходимые для сборки публичного ключа шифрования бюллетеней и реализации пороговой k из n схемы. Подробнее об этом поговорим далее в статье.
  • addMainKey запись набора публичных ключей и общего публичного ключа шифрования бюллетеней.
  • blindSigIssue запись факта выдачи слепой подписи.
  • vote запись непосредственно зашифрованного голоса избирателя.
  • finishVoting команда завершения голосования. После нее новые бюллетени не принимаются.
  • Decryption запись частичного расшифрования результатов голосования. Отправляется каждым сервером подсчета.
  • ComissionDecryption запись частичного расшифрования результатов голосования на закрытом ключе комиссии.
  • Results запись расшифрованных итогов голосования. О расшифровании, подведении итогов и записи результатов подробнее далее в статье.

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

Ниже на рисунках представлено отображение транзакции с голосом в блокчейн-клиенте.





Вся информация о голосовании агрегируется на смарт-контракте и будет доступна через блокчейн-клиент наблюдателям или в виде csv-файла любому желающему.

Ниже на рисунке представлено отображение агрегированной информации в смарт-контракте.


*Данные с тестового сервера.

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

Проверки криптографического протокола и процесса голосования


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

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

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

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

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

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

Из песочницы Как не выбрасывать свой голос в урну? Надежное голосование используем банковские технологии

30.09.2020 18:23:32 | Автор: admin

image


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


Ниже описывается, как сделать процесс голосования:


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

а также, с минимальными финансовыми и временными затратами на внедрение.


Варианты использования


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


Вставляете или прикладываете карту, вводите пин-код, и в главном меню видете пункт ГОЛОСОВАНИЕ.


В подменю выбираете из активных пунктов (например):


  • 1 Дополнительные выборы
  • 2 Региональные выборы
  • 2.1 Главы субъектов
  • 2.2 Парламенты субъектов
  • 3 Муниципальные выборы
  • 3.1 Главы крупных и средних городов
  • 3.2 Муниципальные парламенты

Затем выбираете кандидата, за которого вы голосуете, подтверждаете транзакцию повторным введением пин-кода, или прикладыванием телефона.


Получаете чек (возможно по смс) с данными голосования, в том числе с номером транзакции (он пригодится для проверки учета вашего голоса).


Поздравляем! Вы успешно проголосовали.


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


Тут на кухню заходит ваша жена. По ней видно, что она недавно проснулась
Ты пойдешь сегодня голосовать? спрашиваете вы её.
А я уже проголосовала! отвечает она.
Когда это? недоверчево спрашиваете вы, разглядывая немного всклокоченные волосы и отсутствие макияжа.
Только, что. Из банковского приложения для телефона ты разве не слышал, теперь можно не ходить до банкомата. и она протягивает вам свой телефон, где вы видете меню, похожее на меню в банкомате.
А вот маме, в деревне, пришлось идти в пункт голосования правда голосовала она с платежного терминала с с большим экраном, похожего на такой, какие стоят во многих магазинах.
А как же сын? Ведь ему на прошлой неделе исполнилось 18, но карты у него нет спрашиваете вы.
Он еще вчера сходил в банк, за пол часа открыл моментальную карту и сразу проголосовал досрочно. объясняет жена.


Немножко непривычно, да? Но такую систему можно создать уже сейчас!


Возможный алгоритм


  1. Банковский терминал подписывает транзакцию с данными вашего выбора и отправляет в платежную систему (представьте, что каждый кандитат имеет свой счет и вы, голосуя, просто переводите ему на этот специальный счет 1 руб. На этот счет можно зачислять суммы только в 1 руб, и нельзя зачислять дважды с одного счета)
  2. Банковский сервер, сразу передает данные на сервер голосования. Если голосование тайное, то без ФИО, а например, с хешем уникального идентификатора пользователя и номером транзакции для предотвращения повторных голосов от одного человека.
  3. Пользователи, заходя на сайт портала выборов видят данные с сервера голосования в реальном времени.

Какие плюсы в такой системе?


  1. Цифровая подпись транзакции намного надежнее закорючки на бюллетене
  2. Более 80% населения имеют банковские карты, а кто не имеет, могут их открыть в течении часа
  3. Инфраструктура практически готова нужно немного доработать терминальное ПО (добавить меню голосования) и разработать серверную часть.
  4. Невозможен массовый вброс.

Кто-то скажет: Отдать банкам еще и систему голосования? Вы в своем уме?

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


А какой резон банкам заниматься этим? спросите вы.

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


А почему не блокчейн/смарт контракты?

Считаю, что здесь более интересна авторизация (которой банки уделяют повышенное внимание) и наличие терминалов.


Заключение


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

Подробнее..

Парсинг сайта Умного Голосования и новый API на сайте ЦИК

20.09.2020 20:22:28 | Автор: admin
image

13 сентября 2020 года в России прошёл единый день голосования. В некоторых регионах оппозицией была применена стратегия Умного Голосования, заключающаяся в том, что оппозиционно настроенные избиратели голосуют за единого кандидата, имеющего наивысшие шансы победить представителя от властей.

Процесс отбора кандидатов для Умного Голосования уже второй год вызывает дискуссии на тему своей прозрачности. Кроме того, лично меня смущают сложности с подведением итогов стратегии, с которыми могут столкнуться независимые аналитики. Организаторы УмГ не публикуют подробные итоги стратегии, а лишь диаграммы, демонстрирующие сколько оппозиционных кандидатов прошло в региональный парламент.

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

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

В итоге получилась вот такая сводная таблица. В данной статье я расскажу, как был получен приведённый набор данных, как собиралась информация с сайтов Умного Голосования и нового веб-сервиса ЦИК.

image


Сайт Умного Голосования



Для начала посмотрим, какие данные мы можем извлечь с сайта Умного Голосования. На главной странице сайта есть поле для ввода адреса регистрации пользователя. При вводе строки появляется список предложенных адресов в следующем формате:

image


При выборе одного из предложенных адресов, мы перемещаемся на страницу избирательного участка, к которому прикреплён выбранный адрес:

image


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

image


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

Заглянем в код страницы и обнаружим, что все описанные данные, собраны в удобном JSON-формате. В элементе с id="__NEXT_DATA__", который используется для отрисовки страницы, есть информация об избирательном участке, о соответствующих выборных кампаниях и кандидатах:

Содержимое __NEXT_DATA__ элемента
{   "props":{      "pageProps":{         "id":"440384",         "settings":{            "id":1,            "share_photo":"/ganimed-media/share_photo/smartvote_sharepic_1200x628.jpg",            "video_on_main_page":"https://youtu.be/w8gapDGwWMY",            "fake_mode":false,            "title_share":"Объединяемся, чтобы победить Единую Россию",            "text_share":"Мы разные, но у нас одна политика  мы против монополии Единой России. Всё остальное  математика.",            "telegram_bot_link":"https://tlinks.run/smartvotebot",            "viber_bot_link":"viber://public?id=smartvote",            "facebook_bot_link":"https://facebook.com/umnoegolosovanie/",            "alice_link":null,            "vk_bot_link":null         },         "serverData":{            "commission":{               "id":440384,               "number":"4317",               "address":"354340, Краснодарский край, город Сочи, Адлерский район, улица Богдана Хмельницкого, 24",               "descr":"здание средней школы  49 им. Н.И. Кондратенко",               "lat":"43.425923",               "lon":"39.920152",               "region_id":26,               "region_intid":"135637827259064320000372513"            },            "campaigns":[               {                  "id":26,                  "code":"krasnodar-gub-2020",                  "title":"Выборы губернатора Краснодарского края",                  "is_regional":true,                  "ready_date":null,                  "district":{                     "id":458,                     "code":"oik-0",                     "name":"0",                     "leaflet":""                  },                  "candidates":[                     {                        "id":998,                        "name":"Кондратьева Вениамина Ивановича",                        "share_image":"/elections-api-media/share/26/998.png",                        "anticandidate":true,                        "self_nominated":false,                        "has_won":false,                        "has_second_round":false,                        "party":{                           "title":"Единая Россия",                           "antiparty":true                        }                     }                  ]               },               {                  "id":28,                  "code":"krasnodar-sochi-gorduma-2020",                  "title":"Выборы в городское собрание Сочи",                  "is_regional":false,                  "ready_date":null,                  "district":{                     "id":526,                     "code":"oik-2",                     "name":"2",                     "leaflet":"/elections-api-media/28/526-1334-1335-5385.pdf"                  },                  "candidates":[                     {                        "id":1334,                        "name":"Киров Сабир Рафаилович",                        "share_image":"/elections-api-media/share/28/1334.png",                        "anticandidate":false,                        "self_nominated":true,                        "has_won":false,                        "has_second_round":false,                        "party":null                     },                     {                        "id":1335,                        "name":"Мукаелян Марине Айковна",                        "share_image":"/elections-api-media/share/28/1335.png",                        "anticandidate":false,                        "self_nominated":true,                        "has_won":false,                        "has_second_round":false,                        "party":null                     },                     {                        "id":5385,                        "name":"Рябцев Виктор Александрович",                        "share_image":"/elections-api-media/share/28/5385.png",                        "anticandidate":false,                        "self_nominated":false,                        "has_won":false,                        "has_second_round":false,                        "party":{                           "title":"КПРФ",                           "antiparty":false                        }                     }                  ]               }            ]         },         "error":null,         "currentUrl":"https://votesmart.appspot.com/candidates/440384"      }   },   "page":"/candidates/[id]",   "query":{      "id":"440384"   },   "buildId":"U8hjaoxZw8TINu-DU_Ixw",   "runtimeConfig":{      "HOST":"https://votesmart.appspot.com"   },   "isFallback":false,   "customServer":true,   "gip":true}



Для избирательного участка указан номер (number) соответствующей УИК и её идентификатор в базе данных сайта УмГ. Id = 440834 соответствует номеру, который содержится в URL-адресе страницы (/candidates/440834).

Можем ли мы, зная номер УИК и регион, вычислить идентификатор комиссии на сайте УмГ? Я не смог найти очевидную зависимость, так как идентификаторы распределены достаточно хаотично:
Сочи, УИК 4512 -> id = 440834
Сочи, УИК 4513 -> id = 441403
Сочи, УИК 4514 -> id = 1781216

Каким образом собрать список отражений номеров УИК в id страниц? Перебирать и проверять всевозможные идентификаторы от 1 до 2000000 звучит крайне неэффективно, большинство из этих идентификаторов нерабочие.

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

Поиск участка по адресу
https://votesmart.appspot.com/api/v1/cik/addresses?query=ADDRESS

  • ADDRESS адрес, желательно в формате Субъект, город, улица, дом. Также желательно без сокращений ул., д., так как парсер на сервере плохо с ними справляется

Пример запроса:
https://votesmart.appspot.com/api/v1/cik/addresses?query=Смоленск ленина

Результат запроса
{   "suggestions":[      {         "value":"Смоленская область, город Смоленск, Промышленный район, Ленина улица",         "data":{            "fullname":"Смоленская область, город Смоленск, Промышленный район, Ленина улица",            "level":"7",            "region_id":69,            "commission_id":null,            "intid":"138474570115456000000347353",            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359820,138474570115456000000347353",            "snippet":"Смоленская область, город <em>Смоленск</em>, Промышленный район, <em>Ленина</em> улица",            "score":118.84238         }      },      {         "value":"Смоленская область, город Смоленск, Ленинский район, Ленина улица, 12А",         "data":{            "fullname":"Смоленская область, город Смоленск, Ленинский район, Ленина улица, 12А",            "level":"8",            "region_id":69,            "commission_id":1124357,            "intid":"135659820348349440000359937",            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359822,135659820348349440000359708,135659820348349440000359937",            "snippet":"Смоленская область, город <em>Смоленск</em>, Ленинский район, <em>Ленина</em> улица, 12А",            "score":115.14931         }      },...   ]}



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

На каждый избирательный округ приходится в среднем от 2 до 8 участков. Даже не смотря на то, что адрес избирательного участка, в редких случаях, может не соответствовать округу к которому он принадлежит, я выдвинул следующую гипотезу: перебрав адреса УИК на сайте УмГ, можно собрать информацию о каждом округе.

В дальнейшем, при помощи данной гипотезы мне удалось собралось информацию почти по всем избирательным округам. Из-за неоднородности формата адресов в базе данных избирательных комиссий, лишь адреса 10 округов из 1100 мне пришлось подбирать вручную.

В интернете можно найти регулярно обновляющуюся базу данных избирательных комиссий РФ, содержащую информацию об адресах и даже составах УИК. Но для большей актуальности и надежности данных (а также по причине того, что меня не устраивал формат определенного поля) я решил собрать список адресов сам, ведь, как оказалось, на сайте ЦИК имеется весь нужный для этого функционал.

Новый веб-сервиса ЦИК. Методы API


ГАС Выборы автоматизированная система, разработанная в 1995 году, предназначенная для подготовки и проведения выборов и референдумов в РФ.

Если вы когда-либо интересовались ходом выборной кампании, то наверняка сталкивались с данным сайтом, на котором публикуется основная информация из системы ГАС Выборы, в том числе ход подсчёта голосов, ещё до утверждения результатов выборов:

image

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

image


Как вы сами можете визуально оценить, капча конечно очень простая, и наверняка кто-то уже нашел способы её обходить. Я же, вместо того чтобы заняться машинным обучением, обратился к новому разделу на сайте ЦИК, о котором пока мало кто знает: Цифровые сервисы

image

Данный раздел появился как раз во время Голосования по поправкам и содержит в себе несколько веб-сервисов, которые через POST-запросы общаются с внутренним API для получения данных из системы ГАС Выборы. Пользователь Хабра уже обратил внимание на данный функционал. Рассмотрим же его подробнее.

Далее приведено описание основных запросов нового API, которые использовались в данном проекте:

Каждая структура данных в системе содержит ключ VRN уникальный идентификатор объекта, будь то участок, кампания, округ или кандидат.


Информация об УИК
http://cikrf.ru/iservices/voter-services/committee/subjcode/SUBJECT_CODE/num/COMMITTEE_NUM


Пример запроса:
http://cikrf.ru/iservices/voter-services/committee/subjcode/01/num/2

Результат запроса
{   "vrn":"4014001117979",   "name":"Участковая избирательная комиссия 2",   "subjCode":"01",   "numKsa":"01T001",   "vid":"5",   "address":{      "address":"385200, Республика Адыгея, городской округ Адыгейск, город Адыгейск, проспект имени В.И.Ленина, 16",      "descr":"здание МБОУ СОШ1",      "phone":"8-87772-9-23-72",      "lat":"44.882893",      "lon":"39.187187"   },   "votingAddress":{      "address":"385200, Республика Адыгея, городской округ Адыгейск, город Адыгейск, проспект имени В.И.Ленина, 16",      "descr":"здание МБОУ СОШ1",      "phone":"8-87772-9-23-72",      "lat":"44.882893",      "lon":"39.187187"   }}




Информация о выборных кампаниях на участке
http://cikrf.ru/iservices/voter-services/vibory/committee/COMMITTEE_VRN

  • COMMITTEE_VRN идентификатор УИК

Пример запроса:
http://cikrf.ru/iservices/voter-services/vibory/committee/4544028162533

Результат запроса
[   {      "vrn":"100100163596966",      "date":"2020-07-01",      "name":"Общероссийское голосование по вопросу одобрения изменений в Конституцию Российской Федерации",      "subjCode":"0",      "pronetvd":null,      "vidvibref":"0"   },   {      "vrn":"25420001876696",      "date":"2020-09-13",      "name":"Выборы депутатов Законодательного Собрания Новосибирской области седьмого созыва",      "subjCode":"54",      "pronetvd":"0",      "vidvibref":"2"   },   {      "vrn":"4544220183446",      "date":"2020-09-13",      "name":"Выборы депутатов Совета депутатов города Новосибирска седьмого созыва ",      "subjCode":"54",      "pronetvd":null,      "vidvibref":"2"   }]




Перечень округов выборной кампании
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/tvd

  • CAMPAIGN_VRN идентификатор выборной кампании

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/tvd

Результат запроса
{   "_embedded":{      "tvdDtoList":[         {            "vrn":457422069601,            "namtvd":"Муниципальная избирательная комиссия города Орла",            "namik":"Муниципальная избирательная комиссия города Орла",            "numtvd":"0",            "vidtvd":"ROOT",            "_links":{               "results":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069601/proportion"               }            }         },         {            "vrn":457422069602,            "namik":"Окружная избирательная комиссия  1",            "numtvd":"1",            "vidtvd":"OIK",            "_links":{               "results":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069602/major"               }            }         },         ...      ]   },   "_links":{      "self":{         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/tvd"      }   }}


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

Как видите, структура данных содержит и ссылку, по которой можно будет узнать результаты выборов. Ссылка генерируется ещё до публикации итогов голосования.



Список кандидатов, участвующих в выборной кампании
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/candidates/?page=PAGE_NUM&numokr=NUMTVD

  • CAMPAIGN_VRN идентификатор выборной кампании
  • PAGE_NUM номер страницы списка
  • NUMTVD номер округа (необязательный параметр)

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/?page=1&numokr=11

Результат запроса
{   "_embedded":{      "candidateDtoList":[         ...         {            "index":50,            "vrn":4674020270868,            "fio":"Трофименко Владимир Карпович",            "datroj":"23.04.1964 00:00:00",            "vidvig":"выдвинут",            "registr":"зарегистрирован",            "vrnio":4674220132098,            "namio":"Региональное отделение Политической партии \"Российская партия пенсионеров за социальную справедливость\" в Смоленской области",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020270868"               }            }         },         {            "index":56,            "vrn":4674020269642,            "fio":"Божедомов Евгений Эдуардович",            "datroj":"15.02.1986 00:00:00",            "vidvig":"выдвинут",            "registr":"отказ в регистрации",            "namio":"Самовыдвижение",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020269642"               }            }         },         {            "index":105,            "vrn":4674020271181,            "fio":"Трифоненко Владислав Андреевич",            "datroj":"15.07.1994 00:00:00",            "vidvig":"выдвинут",            "registr":"зарегистрирован",            "vrnio":4674220134054,            "namio":"Смоленское городское отделение политической партии \"КОММУНИСТИЧЕСКАЯ ПАРТИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\"",            "numokr":11,            "tekstat2":"1",            "_links":{               "self":{                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020271181"               }            }         },         ...               ]   },   "_links":{      "self":{         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates?page=1&numokr=11"      }   },   "page":{      "size":20,      "totalElements":9,      "totalPages":1,      "number":1   }}


Структура page содержит общее количество страниц, по ней можно определить когда вы достигните последней страницы (либо по пустому списку, вернувшемуся с сервера).



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

Выгрузка данных с сайта ЦИК


Прежде чем приступить к скачиванию нужных данных, нужно было составить список выборных кампаний, которые мы задействуем в проекте. Дело в том, что Умное Голосование проходило не везде, а именно на выборах:
в законодательные собрания регионов,
в городские советы региональных центров,
в городские советы крупных городов (с населением больше 200 тысяч человек)
(А также довыборы в Госдуму по 4 округам).
// Леонид Волков

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

Обратившись к товарищу, я попросил его вручную составить список URL-адресов для соответствующих выборных кампаний, взяв их с главной страницы классической системы ЦИК. Дело в том, что в URL-адресе содержится идентификаторы региона и кампании, которые как раз понадобятся нам для дальнейшего парсинга.

vybory.izbirkom.ru/region/izbirkom?action=show&vrn=21120001136916&
region=11&prver=1&pronetvd=1


В итоге, список состоял из 43 выборных кампаний. Всего в Единый день голосования прошло более 9000 отдельных выборных кампаний в органы разного уровня.

Теперь, имея на руках список выборов и перечисленные ранее методы API, скачать данные не составило никакого труда. Написав скрипт на python, делая обычные запросы про помощи requests модуля, я сохранил данные о кандидатах и избирательных участках в исходном JSON-формате.

Главное, что стоит учесть при скачивании информации об избирательных участках: недостаточно перебирать всевозможные номера начиная с 1, до тех пор пока сервер не вернет пустое значение. Дело в том, что нумерация УИК в регионе может прерываться, и идти, например, в таком виде:
...1001 1016, 1101 1136, 1138 ...
либо:
0 700, 900 1002, 1004...
Чтобы определить максимальный номер УИК в регионе и не делать лишние запросы, я собирал данные следующим образом: пробовал выгрузить данные по первым 1000 номерам, а затем проверял если i+1,i+5,i+100,i+500,i+1000 номера соответствуют какому-либо УИКу (в случае чего продолжал скачивание).

Также, рекомендую сохранять номер УИК, по которому вы скачали данные об участке. Дело в том, что возвращаемые данные не содержат номер УИК, а только название в виде: Участковая Избирательная Комиссия 100. Процесс получения исходного номера УИК, с которым мне позже пришлось столкнуться, привёл к кратковременным багам и фрустрации. Как оказалось, нумерация в названии УИК в некоторых регионах имеет разный формат.

К примеру, в Удмуртии в названии УИК была следующая нумерация: 1/01, 1/02, 1/03, в Липецкой области: 01-01, 01-02, 01-03. В Оренбургской области я столкнулся с настоящей экзотикой: это был единственный регион, где ряд избирательных комиссий были названы в честь кого-то. Например Участковая избирательная комиссия 1696 имени Братьев Пустовитовых

Выгрузка данных с сайта Умного Голосования


Теперь, по каждому собранному адресу УИК мы собираемся скачать данные о голосовании с сайта УмГ. Перед этим стоит учесть несколько особенностей (о которых я узнал уже в процессе):

Во первых, надо учесть что адреса в базе данных ЦИК имеют различный формат, порой даже в отдельных областях регионов. Мне пришлось убирать сокращения д., г. и ул., так как сайт Умного Голосования совсем не справлялся с поиском адресов по таким запросам. Ещё рекомендую убирать почтовый индекс из адреса, а также, встречающийся иногда префикс Российская Федерация.

Во вторых, сайт УмГ имеет жёсткую защиту от DDoS атак, и даже если вы сделаете сотню запросов с интервалом в 0.3 секунды ваш IP получит бан. Можно было бы использовать набор из платных прокси, но лично я просто воспользовался бесплатными прокси и чередовал запросы со своего и стороннего IP. Чтоб уж точно не получить бан, между запросами был интервал примерно в 0.7 секунд. В итоге, скачивание всех данных заняло примерно сутки.

С использованием запросов из первой главы, алгоритм получился следующим:
  1. Форматируем адрес УИК
  2. Делаем запрос на список подходящих адресов
  3. Получаем список, содержащий идентификаторы страниц сайта
  4. Проверяем если уже скачали данные об участке по данному идентификатору
  5. Загружаем HTML-страницу сайта по данному идентификатором
  6. Извлекаем элемент __NEXT_DATA__ и сохраняем данные в JSON-формате


Парсинг страницы происходил при помощи библиотеки beautifulsoup4.

Данный процесс не безупречен: обычно скрипт не находит на сайте десяток избирательных участков в регионе, либо по адресу одного УИК вы находите информацию о совершенно другом УИК.

Это не беда, ведь для каждого округа, нам достаточно найти хоть одну соответствующую страницу на сайте.

Для валидации полноты данных мы пишем простой скрипт, который проверяет если в скачанном с сайта УмГ набора данных содержится информация о каждом избирательном округе. Если чего-то не хватает пополняем набор вручную. Опять же, таких исключительных ситуаций было менее 10 на 1100 округов.

Объединение данных с сайтов УмГ и ЦИК


На данном этапе, мы собираем удобную структуру данных, с информацией о каждом кандидате по округам: идентификатор кандидата, ФИО, партия, метка с информацией о том, подержан ли он УмГ.

Пример собранного набора данных о кандидатах
{    "33": [        {            "name": "Бекенева Любовь Александровна",            "vrn": 4444032121758,            "birthdate": "05.05.1958 00:00:00",            "party": "ЕР",            "smart_vote": 0        },        {            "name": "Крохичев Павел Александрович",            "vrn": 4444032122449,            "birthdate": "16.11.1977 00:00:00",            "party": "КПРФ",            "smart_vote": 0        },        {            "name": "Ростовцев Михаил Павлович",            "vrn": 4444032122782,            "birthdate": "27.02.1996 00:00:00",            "party": "ЛДПР",            "smart_vote": 0        },        {            "name": "Морозов Максим Сергеевич",            "vrn": 4444032123815,            "birthdate": "20.11.1991 00:00:00",            "party": "Яблоко",            "smart_vote": 1        },        {            "name": "Захарова Алина Сергеевна",            "vrn": 4444032124060,            "birthdate": "21.07.1996 00:00:00",            "party": "КПКР",            "smart_vote": 0        },        {            "name": "Афанасов Александр Николаевич",            "vrn": 4444032123597,            "birthdate": "21.05.1974 00:00:00",            "party": "СР",            "smart_vote": 0        }    ],    ...}



Алгоритм достаточно прямолинейный:
  1. По массиву данных с сайта УмГ создаем список поддержанных кандидатов для каждого округа
  2. По массиву данных с сайта ЦИК создаем отфильтрованный список допущенных кандидатов для каждого округа
  3. В каждом округе по ФИО вычисляем соответствие Кандидат-УмГКандидат-ЦИК

Конечно, такой простой алгоритм должен учесть множество потенциальных проблемных ситуаций.

Во первых, есть шанс что в одном округе будут кандидаты с полностью совпадающими ФИО. Благо, среди 5000 кандидатов, такая ситуация была лишь в одном случае, причём ни один из кандидатов не был поддержан УмГ.

Во вторых, надо учесть, что в базе данных сайта ЦИКа могут быть ошибки. Самая частая ошибка: переносы строк и лишние пробелы в ФИО. Также, при сборе данных об итогах голосования попадалась ситуация, при которых буква ё в фамилии заменялась на е.

В третьих, надо учитывать актуальность данных. Данные на сайте ЦИКа и УмГ изменялись и обновлялись вплоть до субботы: каких-то кандидатов снимали/восстанавливали, в каких-то округах менялась поддержка УмГ.
Для валидации списков УмГ был написан простой скрипт, который делает по одному запросу на округ (ведь собранный нами набор данных теперь позволяет однозначно определить страницу, посвященную каждому округу) и проверяет соответствуют ли имена тем, что мы получали ранее.

Интересной задачей была идентификация партий по названию их отделений. Данный пункт можно было бы пропустить, но я решил заняться этим для унификации информации. Проблема заключается в том, что у кандидатов от одной партии может различаться её название в базе ЦИК. Например, в случае КПРФ встречалось более 40 вариантов:

Ивановское городское (местное) отделение Политической партии "Коммунистическая партия Российской Федерации"
Ямало-Ненецкое ОО ПП "КПРФ"
ЧОО ПП КПРФ
КАЛУЖСКОЕ РЕГИОНАЛЬНОЕ ОТДЕЛЕНИЕ политической партии "КОММУНИСТИЧЕСКАЯ ПАРТИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ"
...


Ситуация превращается в интересную задачу по синтаксическому анализу, когда партий 25 штук и почти у каждой разное написание каждом регионе. Благо, про помощи моего товарища, который помогал мне со всей ручной работой, мы составили список ключевых слов, по которым однозначно определяется партия кандидата.

Выгрузка результатов выборов с сайта ЦИК


Собранного набора данных хватило для достижения первоначальной цели проекта мы составили списки кандидатов УМГ-2020 для каждого избирательного округа. Но если есть техническая возможность получить результаты выборов, почему бы не воспользоваться ею?


Результаты выборов в округе
http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/results/DISTRICT_VRN/major

  • CAMPAIGN_VRN идентификатор выборной кампании
  • DISTRICT_VRN идентификатор округа

Пример запроса:
http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069602/major

Результат запроса
{   "report":{      "tvd":"",      "date_sign":"none",      "vrnvibref":"457422069597",      "line":[         {            "txt":"число избирателей на момент окончания голосования",            "kolza":"8488",            "index":"1"         },         {            "txt":"число бюллетеней, полученных участковой комиссией",            "kolza":"6700",            "index":"2"         },         ...         {            "txt":"число недействительных бюллетеней",            "kolza":"65",            "index":"9"         },         {            "txt":"число действительных бюллетеней",            "kolza":"1948",            "index":"10"         },         ...         {            "delimetr":"1"         },         {            "txt":"Авдеев Максим Юрьевич",            "numsved":"1",            "kolza":"112",            "index":"11",            "namio":"ПАРТИЯ ПЕНСИОНЕРОВ в Орловской области",            "perza":"5.56",            "numsvreestr":"4574030258379"         },         {            "txt":"Жуков Александр Александрович",            "numsved":"2",            "kolza":"186",            "index":"12",            "namio":"Орловское региональное отделение Партии СПРАВЕДЛИВАЯ РОССИЯ",            "perza":"9.24",            "numsvreestr":"4574030258723"         },         {            "txt":"Жуков Родион Вячеславович",            "numsved":"3",            "kolza":"54",            "index":"13",            "namio":"Самовыдвижение",            "perza":"2.68",            "numsvreestr":"4574030258555"         },         ...      ],      "data_gol":"13.09.2020 00:00:00",      "is_uik":"0",      "type":"423",      "version":"0",      "sgo_version":"5.6.0",      "isplann":"0",      "podpisano":"1",      "versions":{         "ver":{            "current":"true",            "content":"0"         }      },      "vibory":"Выборы депутатов Орловского городского Совета народных депутатов шестого созыва",      "repforms":"1",      "generation_time":"14.09.2020 07:59:21",      "nazv":"Результаты выборов по одномандатному (многомандатному) округу",      "datepodp":"14.09.2020 05:44:00"   }}


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



Когда в ГАС Выборы начали публиковать предварительные результаты, я столкнулся с небольшим разочарованием. Оказалось, что через API можно получить данные только по тем результатам, которые официально утвердили. С предварительными результатами всё ещё можно ознакомиться на старом сайте избиркома, но нельзя через новые веб-сервисы.

Спустя сутки были известны результаты по 50%, а к концу недели были подведены итоги почти всех выборов, некоторые регионы всё ещё отказывались утверждать результаты. На момент написания статьи, прошло уже 7 дней, а результаты выборов в Тамбове всё ещё не утверждены. К тому же, в некоторых округах происходит пересчёт голосов, из-за чего эти результаты также недоступны через API.

Вывод: методы API на данный момент не подходят для оперативного получения результатов голосования. Вам либо придётся ждать более недели, когда же утвердят результаты, либо придётся парсить старый сайт избиркома, найдя способ обойти капчи.

Мне же надоело ждать когда в ~30 округах из 1100 утвердят выборы, поэтому я написал скрипт, при помощи selenium библиотеки, который выгружает данные с классического сайта избиркома и просит меня вручную решить капчу при каждом запросе. С таким небольшим числом запросов, вручную решать капчу не занимает много времени.

В результате, данные об итогах голосования я собрал в следующую структуру:

Пример результатов голосования в округе
{..."33": {        "candidate_total": {            "4444032121758": 880,            "4444032122449": 236,            "4444032122782": 143,            "4444032123597": 152,            "4444032123815": 149,            "4444032124060": 72        },        "is_final": 1,        "non_valid_votes": 132,        "registered_voters": 6928,        "valid_votes": 1632    },...}



Для каждого округа я сохранил суммарное число избирателей в списках (для подсчёта явки), число действительных и недействительных бюллетеней. В структуре содержится словарь: Идентификатор кандидата -> Набранное им число голосов.

Публикация итогов УмГ-2020


Во первых, собранные данные в JSON-формате я опубликовал на GitHub. Данные будут обновляться, пока результаты не утвердят во всех округах.

Во вторых, для привлечения внимания к проекту, я решил сгенерировать Google Таблицу, в которой, в удобном для визуального анализа виде, приведены все собранные данные.

Вдаваться в подробности не буду, никаких сложностей (кроме изучения Google Sheets API) возникнуть не должно. Очень помогла данная статья, в которой подробно рассказано взаимодействие с Google Sheets API на Python.

image

В итоге получилась такая таблица, в которой собраны:



Послесловие


Идея данного мини-проекта возникла за 3 дня до дня голосования и лично я доволен тем, как успел изучить и реализовать всё в кратчайшие сроки (хотя код получился ужасным).

Я не собираюсь делать какие-либо выводы об итогах стратегии Умного Голосования, я лишь предоставил инструменты для любителей электоральной статистики. Уверен, среди вас найдутся таковые и скоро мы увидим замечательные исследования, с интересными графиками и диаграммами :)

Подробнее..

Идеальная избирательная система

02.05.2021 16:16:26 | Автор: admin

На днях мне пришло сообщение от портала Госуслуги с предложением поучаствовать в тестировании дистанционного электронного голосования (ДЭГ). Стало интересно, начал гуглить и поисковик сразу же выдал ссылку на хабровскую статью Обзор системы дистанционного электронного голосования ЦИК РФ. Ознакомилсяипосле прочтения, испытал противоречивые чувства, которые вылились в эту статью, созданную на базе идеи, описанной мной еще в 2018 году на сайте change.org.

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

Ведь, очевидно, что в процессе проведения выборов возникает конфликт интересов между

  • власть имущими, не желающими уступать дорогу другим

  • теми, кто власти пока не имеет, но желает её получить

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

  • простыми гражданами, радеющих за принципы сменяемости власти и соблюдения своих избирательных прав.

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

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

Например, ничто не мешает государству посадить за компьютеры бригаду троллей и начать вбивать данные мертвых душ, формируя проправительственный рой бюллетеней. Да собственно, вполне возможно армия виртуальных людей, уже затаилась в базе данных ЕСИА и лишь ждёт своего часа? А ввиду того, что задача регистрации голосов распараллеливается простым увеличением количества троллей, а также учитывая тот факт, что у троллей есть целых три дня, - приходим к выводу, что с помощью этой выдающейся системы, можно изменить результаты любых выборов...

Причем сделать это можно тайно, без возможности дальнейшего расследования и проверки

И лично у меня создается ощущение, что циковская система специально для этого и создана :)

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

Но довольно критики, друзья, давайте перейдём к конструктивуи подумаем над тем какая она должна быть, рыба нашей мечты

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

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

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

Для начала давайте пойдем от проблемы, и перечислим типы фальсификаций на классических выборах, от которых новая избирательная система должна защищать:

  1. Внесение фиктивных имен в списки избирателей или Мертвые души (F)

  2. Фальсификация итоговых цифр голосования. Это когда глава избирательной комиссии УИК No 666, приезжает с итоговым протоколом в ТИК No 777, там его встречают, отводят в сторонку, и перед внесением протокола в систему ГАС-выборы немного правят протокол (T)

  3. Вбросы (в урну закидывают пачку бюллетеней) (F)

  4. Хитрый палец - порча бюллетеней, заполненных в пользу нежелательного кандидата (M)

  5. Перестановка результатов голосования, - это когда кандидата, занявшего последнее место, меняют с первым (T)

  6. Неправильный подсчет бюллетеней сотрудниками избирательной комиссии (M-T)

  7. Подмена сейф пакетов и избирательных урн темной безлунной ночью (M)

  8. Приезд пожарных, с последующим досрочным закрытием участка (T)

  9. Забор сейф пакетов сотрудниками МВД на ночное хранение. С целью препятствования подмене бюллетеней и фальсификации выборного процесса. Наша доблестная всегда на страже наших интересов (M-T)

  10. Голосование по паспортным данным. Если избирательным комиссиям будут известны не только ФИО и адреса избирателей, но и их паспортные данные, то не исключено, что недобросовестные члены комиссий смогут внести в журнал за непрошедших на участок избирателей их данные, взять бюллетень и проголосовать (F)

  11. Изъятие или признание недействительными бюллетеней, заполненных в пользу нежелательного кандидата (M)

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

  13. Волшебная урна или выездное голосование на дому (F)

  14. Пустышка - члены избирательных комиссий могут специально выдавать недействительные бюллетени, не имеющие подписей двух членов избирательной комиссии или печати (M)

Все эти проблемы можно разбить по трем классам:

  1. Изменение существующего бюллетеня (M)

  2. Вброс фантомных бюллетеней (F)

  3. Фальсификация итоговых цифр (T)

И подобно требованиям ACID к базам данных, давайте озвучим минимальные требования к избирательной системе:

  • Immutability. Неизменяемость голоса сразу после того как человек проголосовал. Защита от проблемы (1)(M)

  • Accuracy. Точное соответствие проголосовавших людей количеству бюллетеней в базе данных. Защита от проблемы (2)(F)

  • Countability. Возможность избирателя, самостоятельно подсчитать итоговые цифры. Защита от проблемы (3)(T)

Итого, если избирательная система удовлетворяет требованиям IAC то это значит, что можно её обсуждать в сообществе. Ну а так как система предложенная ЦИК, удовлетворяет только первому требованию IAC (Immutability)*, то и тратить время на её дальнейшее полоскание смысла не вижу.

Теперь настало время привести пример избирательной системы, удовлетворяющей требованиям IAC.

Сценарии взаимодействия с iac-системой

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

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

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

Получается за счет требования присутствия вашего тела на участке, мы нехило прокачиваем принцип Accuracy у нашей избирательной системы.

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

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

И публичная и приватная базы данных находится на носителях, которые на хардварном уровне позволяют только писать информацию, без возможности перезаписи. За счет невозможности перезаписи носителей, мы достигаем выполнения принципа Immutability. Далее наблюдатели могут проверить подключение провода терминала к серверу, также убедится, что к серверу не идут левые провода неизвестно откуда. Как уже сказал, локальная сеть на участке является автономной, без подключения к интернету. Immutability в этот момент достигает значения 100%.

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

Когда голосование по всей стране завершилось, на центральном сервере, единый агрегирующий механизм, собирает всю информацию вместе и после проводит ряд операций:

  1. Анализирует данные об избирателях с целью выявления нарушений. В качестве примера можно привести модуль обнаружения каруселей, который выискивает одно и тоже лицо, мелькавшее сразу на нескольких участках одного населенного пункта. После выявления нарушителя, подключается оператор, который принимает решение о том нужно ли исключить подозрительные бюллетени из общей выборки. Данная процедура само-собой подотчетна и полностью публична.

  2. Подсчитывает и публикует итоговые результаты выборов

  3. Выкладывает в открытый доступ базу данных агрегирующую публичные данные всех избирательных участков по всей стране. Как упоминал ранее эта база, не содержит конфиденциальных данных, ибо в ней обезличенная информация о бюллетенях без привязки к людям. Каждый может скачать эту базу данных и пописать запросы, чтоб проверить правильность итоговых цифр. Также предоставляется программа-интерфейс, доступа к БД, на случай, если человек не знаком с языком запросов к базам данных. Таким образом у каждого гражданина появляется возможность проверить свой голос и голоса своих родных, по квитку, который распечатал для них терминал в момент голосования (тут мы достигаем выполнения принципа Countability)

  4. Открывает доступ к публичной базе данных, участка, где проживает зарегистрированный на госуслугах человек. Каждый избиратель может скачать базу своего участка и точно также проверить свой голос.

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

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

Немного о защите программного кода

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

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

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

В итоге мы имеем систему, удовлетворяющую требования IAC, для которой характерны:

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

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

  3. Количество людей, необходимых для сопровождения системы, сведено к минимуму. Следовательно, получаем удешевление обслуживания системы. А также имеем повышенную надежность системы, ввиду уменьшения роли человека.

  4. Каждый может проверить результаты голосов самостоятельно в домашних условиях, проверив свой голос на соответствие полученному на участке бумажному квитку, а также сравнив общее количество голосов в базе с опубликованными данными о количестве проголосовавших на веб портале, либо на участке.

В описанной выше избирательной системе не используется блокчейн, слепая подпись ключа избирателя или схема шифрования Эль-Гамаля на эллиптических кривых. Но это не мешает ей быть простой, понятной и надежной.

На этом у меня всё, друзья. Надеюсь не сильно загрузил деталями и вы всё-таки читаете эти строчки.

Примечания:

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

Материалы использованные для написания статьи:

1) Статья Способы фальсификаций на выборах

Подробнее..

Обзор системы дистанционного электронного голосования ЦИК РФ

07.09.2020 14:15:25 | Автор: admin
31 августа 2020 состоялся публичный тест системы дистанционного электронного голосования (далее ДЭГ) с применением технологии блокчейн, разрабатываемой по заказу ЦИК РФ.

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

Требования к системе


Основные требования, которые предъявляются к любой системе для голосования, в целом одинаковы и для традиционного очного голосования, и для дистанционного электронного голосования, и определены Федеральным законом от 12.06.2002 N 67-ФЗ (ред. от 31.07.2020) Об основных гарантиях избирательных прав и права на участие в референдуме граждан Российской Федерации.

  1. Голосование на выборах и референдуме является тайным, исключающим возможность какого-либо контроля за волеизъявлением гражданина (ст.7).
  2. Возможность голосования должна быть предоставлена только лицам, обладающим активным избирательным правом на этом голосовании.
  3. Один избиратель один голос, не допускается двойное голосование.
  4. Процесс голосования должен быть открытым и гласным для избирателей и наблюдателей.
  5. Должна обеспечиваться неизменность поданного голоса.
  6. Должна отсутствовать возможность подсчитать промежуточные итоги голосования до его завершения.

Итак, у нас три участника: избиратель, избирательная комиссия и наблюдатель, между которыми определен порядок взаимодействия. Еще можно выделить четвертого участника органы, осуществляющие регистрационный учет граждан на территории (прежде всего, органы МВД, а также другие органы исполнительной власти), поскольку активное избирательное право связано с гражданством и местом регистрации.

Все эти участники взаимодействуют друг с другом.

Протокол взаимодействия


Рассмотрим процесс голосования на традиционном участке, с урной и бумажными бюллетенями. В общем упрощенном виде он выглядит так: избиратель приходит на участок и предъявляет документ, удостоверяющий личность (паспорт). На участке работает участковая избирательная комиссия, член которой проверяет личность избирателя и наличие его в списке избирателей, который был составлен ранее. Если избиратель найден, член комиссии выдает избирателю бюллетень, а избиратель расписывается в получении бюллетеня. После этого избиратель отправляется в кабинку для голосования, заполняет бюллетень, и опускает его в урну. Чтобы все процедуры соблюдались строго по закону, за всем этим следят наблюдатели (представители кандидатов, общественных институтов наблюдения). После завершения голосования избирательная комиссия в присутствии наблюдателей производит подсчет голосов и устанавливает итоги голосования.

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

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

Цифровое взаимодействие накладывает определенные требования к реализуемым алгоритмам. Давайте рассмотрим действия, выполняемые на традиционном участке, в терминах информационных систем и то, как это реализовано в рассматриваемой нами системе ДЭГ.

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

Компоненты системы


С технической точки зрения система ДЭГ представляет из себя программно-технический комплекс (далее ПТК), объединяющий набор компонентов для обеспечения взаимодействия участников избирательного процесса в единой информационной среде.

Схема взаимодействия компонентов и участников системы ПТК ДЭГ приведена ниже на рисунке.


Кликабельно

Процесс дистанционного голосования


Теперь подробно рассмотрим процесс дистанционного электронного голосования и его реализацию компонентами ПТК ДЭГ.

Согласно Порядку дистанционного электронного голосования, для включения в список участников дистанционного электронного голосования избирателю необходимо подать заявление на портале Госуслуг. При этом подать такое заявление могут только те пользователи, которые имеют подтвержденную учетную запись и успешно сопоставлены с регистром избирателей, участников референдума системы ГАС Выборы. После получения заявления данные избирателя еще раз проходят проверку в ЦИК России и загружаются в компонент Список избирателей ПТК ДЭГ. Процесс загрузки сопровождается записью уникальных идентификаторов в блокчейн. Доступ к просмотру списка имеют члены избирательной комиссии и наблюдатели с помощью специального АРМ, размещенного в помещении избирательной комиссии.

При визите избирателя на участок происходит его аутентификация (сопоставление с данными паспорта) и идентификация в списке избирателей, а также проверка того, что этот избиратель ранее еще не получал бюллетень. Здесь важный момент невозможно установить, опустил ли избиратель полученный бюллетень в урну или нет, только факт того, что бюллетень уже выдавался ранее. В случае ПТК ДЭГ визит избирателя представляет собой обращение пользователя на Портал ДЭГ это сайт, расположенный по адресу vybory.gov.ru Как и на традиционном участке, на сайте размещены информационные материалы о проводимых избирательных кампаниях, сведения о кандидатах и другая информация. Для проведения идентификации и аутентификации используется ЕСИА Портала Госуслуг. Таким образом, сохраняется общая схема идентификации как при подаче заявления, так и при участии в голосовании.

После этого начинается процедура анонимизации избирателю выдается бюллетень, который не содержит никаких идентификационных отметок: у него нет номера, он никак не связан с избирателем, которому он был выдан. Интересно рассмотреть вариант, когда участок оборудован комплексами электронного голосования в этом случае анонимизация выполняется следующим образом: вместо бумажного бюллетеня избирателю предлагается выбрать из стопки любую карточку со штрих-кодом, с которой он подойдет к устройству для голосования. На карточке нет никаких данных об избирателе, только код, определяющий, какой бюллетень должен быть предоставлен устройством при предъявлении такой карточки. При полностью цифровом взаимодействии основная задача реализовать такой алгоритм анонимизации, чтобы, с одной стороны, невозможно было установить никакие идентификационные данные пользователя, а с другой стороны предоставить возможность голосования только тем пользователем, кто ранее был идентифицирован в списке. Для ее решения в ПТК ДЭГ применяется криптографический алгоритм, известный в профессиональной среде как слепая электронная подпись. Мы подробно расскажем о нем в следующих публикациях, а также опубликуем исходный код, вы тоже можете собрать дополнительную информацию из публикаций в интернете по ключевым словам криптографические протоколы тайного голосования или слепая подпись

Затем избиратель заполняет бюллетень в месте, где невозможно увидеть сделанный выбор (закрытая кабинка) если в нашей информационной системе избиратель голосует дистанционно, то единственное такое место это личное устройство пользователя. Для этого пользователь сначала переводится на другой домен в анонимную зону. Перед переходом можно поднять VPN-соединение и сменить IP-адрес. На этом домене и происходит отображение бюллетеня и обработка выбора пользователя. Исходный код, который исполняется на устройстве пользователя, изначально открыт его можно увидеть в браузере.

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

Одна из важнейших характеристик протокола это невозможность узнать итоги голосования до его завершения. На традиционном участке это обеспечивается опечатыванием избирательной урны и контролем со стороны наблюдателей. В цифровом взаимодействии лучшим решением является шифрование выбора избирателя. Используемый алгоритм шифрования исключает возможность раскрытия результатов до завершения голосования. Для этого используется схема с двумя ключами: одним (открытым) ключом, который известен всем участникам, производится шифрование голоса. Расшифровать его этим же ключом нельзя, нужен второй (закрытый) ключ. Закрытый же ключ разделен между участниками избирательного процесса (членами избирательных комиссий, общественной палаты, операторами серверов подсчета, и так далее) таким образом, что каждая отдельная часть ключа бесполезна. Приступить к расшифровке можно только после того, как закрытый ключ будет собран. В рассматриваемой системе процедура разделения ключей включает в себя несколько этапов: разделение части ключа внутри системы, разделение ключа вне системы и формирование общего публичного ключа. Мы подробно покажем процесс шифрования и работы с криптографическими ключами в следующих публикациях.

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

Ниже приведена схема процесса голосования.


Кликабельно

Блокчейн-платформа


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

В реализованной системе дистанционного голосования технология блокчейн решает определенный круг задач.

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

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

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

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

Серверы подсчета


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

  • Обеспечение распределённой генерации части ключа шифрования бюллетеней. Процедура генерации ключа будет рассмотрена в следующих статьях;
  • Проверка корректности зашифрованного бюллетеня (без его расшифрования);
  • Обработка бюллетеней в зашифрованном виде для формирования итогового шифротекста;
  • Распределенное расшифрование итоговых результатов.

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

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

  • Электронная подпись;
  • Слепая подпись публичного ключа избирателя;
  • Схема шифрования Эль-Гамаля на эллиптических кривых;
  • Доказательства с нулевым разглашением;
  • Протокол DKG (Distributed Key Generation) Pedersen 91;
  • Протокол разделения закрытого ключа по схеме Шамира.

Более подробно криптографический сервис будет рассмотрен в следующих статьях.

Итоги


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

  • Верифицируемость избирателей. Система принимает голоса только от верифицированных избирателей. Это свойство обеспечивается с помощью идентификации и аутентификации голосующих, а также фиксации списка избирателей и факта предоставления доступа к бюллетеню в блокчейн.
  • Анонимность. Система обеспечивает тайну голосования, закрепленную в законодательстве РФ, личность голосующего невозможно определить по зашифрованному бюллетеню. Реализовано с помощью алгоритма слепой подписи и анонимной зоны для заполнения и отправки бюллетеня.
  • Конфиденциальность голосов. Организаторы и другие участники голосования не могут узнать результат голосования до его окончания, подсчета голосов и расшифрования итоговых результатов. Конфиденциальность достигается за счет шифрования бюллетеней и невозможности расшифрования до окончания голосования.
  • Неизменность данных. Данные о волеизъявлении избирателей не могут быть изменены или удалены. Неизменное хранение данных обеспечивается блокчейн-платформой.
  • Проверяемость. Наблюдатель может проверить, что подсчет голосов осуществлялся корректным образом.
  • Надежность. В основе архитектуры системы лежат принципы децентрализации, обеспечивающие отсутствие единой точки отказа.
Подробнее..

Обзор процедуры анонимизации системы дистанционного электронного голосования

10.09.2020 16:11:14 | Автор: admin
В предыдущих публикациях мы остановились на том, что в рассматриваемой нами системе дистанционного электронного голосования для обеспечения тайны голосования и анонимизации избирателя используется криптографический алгоритм слепой электронной подписи. В этой статье мы рассмотрим его более подробно.

Сначала обратимся к известному и знакомому алгоритму электронной подписи, который широко применяется в информационных системах различного назначения. В основе электронной подписи лежат криптографические алгоритмы асимметричного шифрования. Асимметричное шифрование это шифрование с помощью 2 ключей: один из них используется для шифрования, другой для расшифрования. Их называют открытый (публичный) и закрытый ключ. Открытый ключ известен окружающим, а закрытый только владельцу электронной подписи и хранится в недоступном для других месте.

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

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

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

Теперь перейдем к тому, что такое слепая подпись и как она может помочь нам при анонимизации.

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



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

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

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

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

Сначала на устройстве избирателя открытый ключ должен быть замаскирован. Маскировка это выполнение отдельных математических действий на устройстве пользователя. Представьте, что вы задумали некоторое случайное число от 1 до 100, потом задумали второе случайное от 1 до 10 и третье, от 10 до 50, первоначально задуманное число возвели в степень второго числа, и разделили без остатка на третье. Полученный результат сообщили окружающим. Вам не составит труда восстановить первоначальное число, так как вы знаете последовательность действий и задуманные вами числа. Но окружающие это сделать не смогут.

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

Описанный алгоритм широко используется в протоколах тайного голосования. В системе дистанционного электронного голосования на данный момент для слепой подписи используется алгоритм RSA с длиной ключа 4096 бит.

В общем виде процедура анонимизации выглядит следующим образом.

  1. При создании голосования создается отдельная ключевая пара валидатора, открытый ключ записывается в блокчейн. На каждое голосование создается уникальная ключевая пара.
  2. Пользователь идентифицируется в системе идентификации (в данном случае, в ЕСИА), и предоставляет разрешение на передачу своих идентификационных данных из системы идентификации в ПТК ДЭГ.
  3. Компонент Список избирателей ПТК ДЭГ проверяет наличие пользователя в списке избирателей.
  4. На устройстве пользователя создаются его личные ключи закрытый и открытый, известные только ему.
  5. На устройстве пользователя открытый ключ маскируется
  6. Вместе с идентификационными данными и замаскированным открытым ключом пользователь обращается к компоненту Список избирателей
  7. Компонент еще раз проверяет наличие пользователя в списке и факт того, что он не получал подпись ранее
  8. Если все проверки успешны, происходит подпись ключа
  9. Факт подписи ключа записывается в блокчейн
  10. Пользователь на своем устройстве снимает маску с открытого ключа и получает закрытый ключ, открытый ключ и подпись на открытый ключ, при этом все ключи известны только ему.
  11. После этого пользователь переводится в анонимную зону на отдельный сайт edg2020.gov.ru, где его невозможно идентифицировать (например, до перехода он может подключить VPN или сменить интернет-провайдера, полностью изменив IP-адрес)
  12. Прием бюллетеня будет зависеть только от того, пройдет ли проверку подпись валидатора и не был ли такой ключ использован ранее.


Далее приведем описание алгоритма с точки зрения криптографии.
Параметры подписи и обозначения:




M в формате padding FDN для подписи.
Подробнее..

Мы наблюдали за голосованием на ТИК ДЭГ и вот что из этого получилось (анонс пресс-конференции)

03.07.2020 18:07:41 | Автор: admin
Привет, Хабр!

Как вы все знаете, на этой неделе прошло по сути первое в России по-настоящему масштабное электронное голосование по поправкам в Конституцию. Прошло оно только в двух регионах, Москве и Нижнем Новгороде, но собрало при этом 1,2 млн. избирателей (в основном в Москве, где электронно проголосовали 15 % от общего числа избирателей).

Формально оно проходило в территориальной избирательной комиссии дистанционного электронного голосования (ТИК ДЭГ), реально, конечно, мы работали удалённо, кроме торжественных мероприятий в начале и конце. Работали мы там сразу в двух качествах: во-первых, официальных наблюдателей на ТИК ДЭГ от Общественной палаты РФ, во-вторых, экспертной рабочей группы. Такое сочетание очень удачно: во-первых, позволяет иногда не только просить, но и требовать, во-вторых, если официальный статус наблюдателя доступен избранным, то в экспертную группу мы могли вводить людей по своему собственному усмотрению.



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

Однако полный отчёт это много времени и сил, так что, чтобы сейчас начинать делиться наблюдениями и соображениями, завтра, 4 июля, в 12:00 по Москве мы проводим онлайн пресс-конференцию по итогам голосования.

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

Итак, сначала анонс.

Итоги электронного голосования. Пресс-конференция экспертной группы



Суббота, 4 июля, 12:00 по московскому времени

На завершившемся на этой неделе голосовании по поправкам в Конституцию Партия прямой демократии не только выступала в качестве наблюдателей от Общественной палаты РФ в территориальной избирательной комиссии дистанционного электронного голосования (ТИК ДЭГ), но и сформировала экспертную группу по контролю за ходом и результатами голосования.

На пресс-конференции мы расскажем о том, как проходило электронное голосование, с какими проблемами оно столкнулось, можно ли доверять его результатам а также какие шаги необходимо предпринять для дальнейшего развития и применения ДЭГ в России, в том числе на региональных выборах осени 2020 и думских осени 2021 года. О ситуации с ДЭГ расскажут эксперты по электоральным системам, блокчейну, криптографическим системам и информационной безопасности.

Трансляция будет доступна на YouTube-канале Партии прямой демократии.

Вопросы спикерам можно задавать в комментариях к трансляции или через Телеграм-канал партии.

Участники экспертной группы:

  • Олег Артамонов, член ВКС Партии прямой демократии, наблюдатель на ТИК ДЭГ
  • Мона Архипова, независимый эксперт, соучредитель и операционный директор компании Межрегиональный информационно-расчётный центр
  • Александр Исавнин, независимый эксперт, член Пиратской партии России
  • Вячеслав Макаров, генеральный секретарь ВКС Партии прямой демократии, наблюдатель на ТИК ДЭГ
  • Сергей Нестерович, независимый эксперт, заместитель главного редактора Агентства Политических Новостей
  • Александр Подшивалов, независимый эксперт, член Партии прямой демократии
  • Тимофей Шевяков, пресс-секретарь и член ВКС Партии прямой демократии
  • Алексей Щербаков, независимый эксперт, соавтор доклада Романа Юнемана Электронное голосование. Риски и уязвимости


Приглашённые гости:

  • Андрей Ларин, руководитель проекта ДЭГ, ДИТ Москвы
  • Юрий Максимов, д.э.н., к.ф.м.н., профессор МГУ, советник заместителя председателя Государственной Думы РФ, член ЛДПР


Как вы видите, состав подобрался крайне интересный. На пресс-конференции сначала выступим я и Слава Макаров как официальные наблюдатели, а потом дадим слово каждому из присутствующих экспертов и гостей. Темы и содержание их выступлений мы заранее не согласовывали, так что даже для меня они пока загадка (хотя, конечно, примерно я представляю, что Мона вряд ли будет про блокчейн, а Алексей про IDS).

Немного про ход голосования



Мы пока не оформили все материалы и не сопроводили их комментариями, но базовые метрики работы системы можем показать уже сейчас как вы все помните, на голосовании в МГД в 2019 году технические проблемы были настолько вопиющими, что прочие проблемы на их фоне потерялись.

В этот раз всё случилось намного, намного интереснее.

Во-первых, данные по явке и голосам за, по выгрузке из уже расшифрованного блокчейна:



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

Отмечу несколько моментов:
  • это выгрузка из блокчейна, она не учитывает очередей в Rabbit MQ
  • на графике не совсем корректно посчитана явка она не учитывает выданные, но не полученные обратно бюллетени, таких было около 1,7 %
  • было бы очень интересно сопоставить данные по голосам с медиамониторингом: с высокой вероятностью события 25.06 в 17:10, 26.06 в 16:30 и 29:06 в 14:10 обусловлены выходом материалов, подстёгивающих интерес к голосованию, причём первый раз в чисто московском и лоялистском канале, а второй и третий в оппозиционных СМИ
  • отдельно интересно, что пятидневное голосование выгодно противникам поправок скорее всего, потому, что изначально они были настроены в целом скептически, и не торопились голосовать, даже подав заявку на ДЭГ
  • 27.06 в районе полуночи была попытка атаки на блокчейн, которая на час вывела из строя интерфейс наблюдателя и ненадолго перегрузила блокчейн; поэтому виден скачок это поданные голоса после окончания атаки прогрузились из Rabbit MQ в блокчейн


Также положу сюда PDF-файлик с отчётом о работе блокчейна. Это рабочие наброски на основе данных ДИТ Москвы, надеюсь, к середине следующей недели мы представим более подробный и детализированный отчёт, с цифрами и комментариями.

Вывод и тезисы



С предварительными коллективно составленными тезисами экспертной группы можно ознакомиться на Google Docs.

Тезисы составлялись к пресс-брифингу Общественной палаты РФ 30 июня, но актуальности своей не утратили.

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

Итого



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

YouTube: https://youtu.be/PAhFGnLDBjI

P.S. Если вы представитель прессы, и хотите поучаствовать непосредственно в Zoom, с возможностью задавать вопросы, пишите мне напрямую в Хабре или в Телеграм olartamonov.
Подробнее..

Промежуточные итоги круглосуточного мониторинга системы ДЭГ

13.09.2020 18:19:09 | Автор: admin
При организации безопасности и контроля соблюдения всех требований, предъявляемых к системе дистанционного электронного голосования, применяется комплексный подход, с учетом наработок и опыта в высоконагруженном сервисе инфраструктуры электронного правительства. Мониторинг и анализ защищенности осуществляется в режиме 24/7 на всех этапах, вплоть до окончания голосования. В частности, для мониторинга информационной безопасности привлечены силы корпоративного центра ГосСОПКА ПАО Ростелеком, которые работают при тесном взаимодействии с профильными организациями и компетентными органами.

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

Также в выгружаемом файле находятся 2 транзакции фиксации выдачи слепой подписи на один userID, одна из которых была обработана контрактом, а вторая проигнорирована как некорректная (отсутствие поля result). В результате была выдана только одна слепая подпись.

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

Система работает в штатном режиме.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru