Тег ‘всякое’

Что-то почти икеевское есть в этих названиях

ikea-naming

Хотя уже после Игоря чувак решил отойти от скандинавского стиля.

Загадка для математиков и причастных

quotes

Я угадал Кеннеди (”Ask not what your country can do for you – ask what you can do for your country”), Никсона (”I am not a crook!”), Мартина Лютера Кинга (”I have a dream”). Остальных – ХЗ, особенно Вейдера.

Вы предупреждены!

Московское метро, переход с Таганской-кольцевой на Таганскую-радиальную. У глухой стены стоит платный метросортир, а укромный уголочек, в который так и тянет отлить и сэкономить 50 рублей, оснащен двумя табличками: “Ведется видеонаблюдение” – для тех, кому стыдно, и “Осторожно! Высокое напряжение!” – если уж на стыд не получилось прогнуть, так хоть напугаем!

Придумал новое определение

Европейцы в широком смысле, от Владивостока до Бреста*

* https://ru.wikipedia.org/wiki/Брест_(Франция)

Готовлюсь ко второй волне короновируса

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

Патриотическое и правое сознание

patriotic-right-conscience

Увидел новость и непроизвольно зиганул.

Шотландская мова

Пишут, что “почти все” статьи Википедии на англо-шотландском написаны одним человеком, и даже не шотландцем:

https://habr.com/ru/news/t/516606/

Вам смешно? А покойный Константин Крылов писал об этой нехитрой технологии еще в 2005 году:

https://krylov.livejournal.com/1081580.html

Пойду вискарика накачу за свободу Шотландии и кино про Уильяма Уоллеса по кличке Braveheart гляну.

А расскажите про румынский паспорт

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

И актуальное

А что, правда Тихановскую сняли на том самом диване?

0b8

Разница соцсетей

В фейсбучной ленте обсуждают набранные Лукашенко и Тихановской проценты, в твиттерной – ничью Спартака и Сочи.

Вопрос к мастерам фотошопа

Вот предположим, есть у меня сканы “советской” и “американской” цветных фотографий где-то середины 80-х, со свойственными пленке “Свема” и Kodak нюансами цветопередачи (”Свема” уходит в мрачноватые сине-зеленые тона, от которых хочется моментально напиться и впасть в депрессию, Kodak – наоборот, в веселые и жизнерадостные красно-оранжевые). Вопрос такой – а какими средствами можно:

а) поправить баланс белого до “нормального”;
б) поменять депрессивный свемовский на жизнерадостный кодаковский и наоборот?

Work from home

work-from-home

Баян, но жизненно!

Лавры изобретателя

Читаю тут xkcd:

reaction_maps_2x

https://xkcd.com/2260/

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

kissing-wedding

Мне уже предложили провести эксперимент с раздачей ссылок на этот маршрут :)

Словил бан у Феликса

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

Перечитываю вчерашние переписки в телеграме

Господи, сколько же я выпил перед тем, как обсуждать Маяковского, “Логико-философский трактат” Витгенштейна и Zen and the Art of Motorcycle Maitenance? И при чем тут карта 50 самых сложных развязок Великобритании?

https://www.ordnancesurvey.co.uk/blog/2019/07/britains-most-complex-motorway-junctions/

Юридический вопрос

Обсуждали тут очередное обострение MeToo, вспомнился сюжет из задачника по уголовному праву:

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

Одна из “подготовленных” таким образом “агентесс”, продав мебель и вещи, пришла в Управление ФСБ с претензией, где найти полковника, так как она ждет его вызова.

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

Вопросов, собственно, два:

- правильно ли я понимаю, что ни 131, ни 133 УК РФ тут пришить нельзя?
- а вот 327 мужик с пола поднял – а если бы нарисовал ксиву несуществующего ведомства, типа “Агентства национальной безопасности” – то ничего бы ему и не было?

По мотивам очередного выступления

В эту субботу в очередной раз собрались обсуждать электронные выборы, и в этот раз ступора уже не было – то ли Шевяков не курил в камеру, то ли действительно надо привыкать к “публичным” выступлениям в Зуме :) Полную запись можно посмотреть на ютубе, а тут – перескажу свои основные тезисы.

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

Начну с того, что тайна голосования, которая волнует довольно многих избирателей и экспертов, действительно держалась на честном слове ДИТа. Это сложно назвать виной разработчиков и эксплуатантов системы – так уж получилось, что занимается этим ровно одно ведомство, а надо разделять систему как минимум на две части – чуть дальше станет понятно, почему, но Александр Исавнин действительно много раз задавал вопрос об этом, а ответов лучше, чем “поверьте нам на слово” техническая рабочая группа так и не получила. Опять же, отмечу, вслед за Олегом, что фактов нарушения тайны голосования пока никто не зафиксировал.

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

Чуть подробнее опишу протокол голосования – при этом постараюсь изложить это все максимально упрощенно. К сожалению, в Википедии описан похожий, но отличающийся протокол, а “Прикладная криптография” Шнайера есть под рукой далеко не у всех – хотя протокол, похожий на ДИТовский, там описан под названием “Голосование с двумя Центральными комиссиями”. Основаны все эти протоколы на криптографии с открытым ключом – здесь знать о ней надо лишь то, что используется пара из открытого и закрытого ключа, таких, что сообщение, зашифрованное открытым ключом, можно расшифровать только с помощью закрытого, и наоборот – если сообщение зашифровано закрытым ключом, то оно расшифровывается открытым. Закрытый ключ обычно держится в секрете, а открытый доступен всем.

Итак, для начала – подготовка к голосованию, которая с точки зрения криптографии состоит в том, что создается пара из открытого и закрытого ключа. Закрытый ключ разделяется на части, которые передаются членам избирательной комиссии – а они, как и на обычных выборах, представляют самые разные политические силы – например, в этот раз одним из членов комиссии был Григорий Мелконянц из “Голоса“. Главное здесь это то, что закрытый ключ не будет известен никому вплоть до момента его “сборки” – а открытый ключ, наоборот, будет опубликован во время голосования. Происходит процедура генерации и разделения ключей в торжественной обстановке, с банкетом, фуршетом, журналистками с декольте – в общем, “сожалею, что не был при сей баталии хотя бы мичманом!”

Дальше происходит собственно голосование – пройдя авторизацию на “Госуслугах” или mos.ru, избиратель получает от сервера регистрации уникальный номер (GUID) и перенаправляется на сервер голосования, по адресу “$host/election/check/$guid” (строка 94 файла Ballot.php в приложении form, опубликованном в ДИТовском гитхабе).

Сервер голосования – это приложение ballot (обратите внимание, что работало оно на другом домене – авторизация происходила на 2020og.ru, а собственно голосование – на elec.moscow, можно считать это демонстрацией возможности разделения авторизации и голосования), и там нам очень интересно содержимое файла election.js – точнее, то, что начинается после 243 строки. Там происходит следующее: с помощью библиотеки NaCl создается пара из “пользовательского” открытого и закрытого ключа, случайным образом выбирается значение nonce, сообщение из выбора избирателя и nonce зашифровывается сначала с помощью закрытого ключа избирателя, а затем – с помощью открытого ключа системы голосования. Пара из зашифрованного таким образом сообщения и открытого ключа избирателя обладает следующим очень полезным свойством – зная закрытый ключ системы голосования, можно убедиться, что сообщение (голос) зашифровано именно закрытым ключом избирателя, и никаким другим; не зная закрытого ключа избирателя, невозможно “подменить” голос; не зная закрытого ключа системы голосования – нельзя сделать с этим сообщением вообще ничего.

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

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

Попробуем теперь перечислить свойства такой системы.

  • Получить GUID и проголосовать могут лишь зарегистрированные избиратели – это обеспечивается не только криптографией, но и тем, что авторизацией пользователей занимаются “Госуслуги”;
  • Cервер голосования не может «вбрасывать» в хранилище голоса по своему усмотрению – их не может быть больше, чем на сервере авторизации было создано GUID’ов (список избирателей с отметками, кто голосовал, а кто нет, доступен для просмотра наблюдателям, как и на обычных «бумажных» выборах);
  • В ходе голосования голос пользователя расшифровать нельзя (и, допустим, отклонить его под видом технической ошибки);
  • После голосования голос пользователя нельзя изменить (так как никому, кроме самого пользователя, неизвестен закрытый ключ – и то для его сохранения надо предпринять некие усилия);
  • Каждый голосовавший может найти свой голос в опубликованных результатах;
  • Каждый может самостоятельно проверить правильность подсчета голосов;
  • Если сервер авторизации не сохраняет выданные пользователям GUID’ы, а сервер голосования не сохраняет связку между GUID и голосом (тут придется поверить разработчикам и эксплуатантам на слово – но скорее всего, это так) – никто не может узнать, какой голос принадлежит какому пользователю. Кстати, обращу внимание, что для раскрытия тайны голосования требуются согласованные действия операторов сервера авторизации и голосования – собственно, поэтому этот протокол и называется “протоколом двух агентств”.

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

Теперь перейду к плохому. Во-первых – зачем я полез смотреть код? Полез я туда именно для того, чтобы посмотреть, какой конкретно протокол голосования там реализован, и повторюсь, остался более-менее доволен увиденным – но хочу сказать, что программистом на PHP и Javascript я не являюсь, и гораздо проще было бы прочитать описание алгоритма голосования в более явном виде. Те же ГОСТы 34 серии предусматривают документ под названием “Описание алгоритма” – и может быть, я бы успокоился, увидев его и сравнив с реализацией. Кстати, еще две шпилечки в адрес ДИТа – во-первых, на вопрос “где же, все-таки, предусмотренная ГОСТами документация”, был дан ответ в духе “ну мы систему запустили, документацию напишем потом”. Хочу заметить, что у них на сайте выложен ГОСТ 34.201-89, а жить по нему они не хотят – там ясно сказано, что документ под названием “Описание алгоритма”, например, пишется на этапе технического проекта, еще до разработки каких-либо программ, и уж точно – до ввода в эксплуатацию. Точно так же хотелось бы напомнить о существовании ГОСТ РД 50-34.698-90, где можно увидеть мои хотелки в плане описания криптографических протоколов в разделе 7.1.

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

Вообще, во многих алгоритмах тайного голосования возможность проверить правильность учета своего бюллетеня, найдя его в итоговом протоколе, предусмотрена штатно (к ним относятся и вышеназванные) – хотя тот же Шнайер все же намекает, что такая возможность при неправильном ее использовании – прямой путь к организованной скупке голосов. Здесь же получилось так, что из-за некоторой скрытности авторов системы голосования возможность проверить правильность своего голоса журналисты объявили “уязвимостью”.

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

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

Еще одно странное явление – это подключение некоей “системы антифрода” (по словам представителей ДИТ), которая изначально не была заявлена. Фактически на каждую веб-страницу голосования внедрялся посторонний код на Javascript, не выложенный в публичный доступ заранее.

Скажу еще немного о блокчейне. Довольно часто говорят, что именно благодаря блокчейну эта система голосования надежна и безопасна. Вот даже на ютубе в комментариях задали вопрос – “СМИ писали, что система надёжно защищена и использование блокчейна гарантирует от подмены голосов и деанонимизации, так ли это?” – на самом деле это не совсем так. Блокчейн обеспечивает хранение уже принятых голосов, и существенно затрудняет какие-либо изменения данных постфактум – но в “модели угроз” для электронного голосования это лишь один из многих рисков. О том, как система защищена от подмены голосов и деанонимизации я сказал выше, блокчейн как таковой для этого не нужен. Впрочем, если в этот раз блокчейн работал почти хорошо (за исключением его “падения” на несколько часов в первый день голосования) – то почему бы и нет? С другой стороны, представляется, что блокчейн в целом – это “узкое место” системы, Александр Щербаков высказывал свои соображения по этому поводу.

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

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

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

А вот вам красивый график

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

http://observer2020.mos.ru/observer/downloads/ballots_decrypted_2020-07-01T19:47:00.csv

Получился такой вот забавный график (кликабельно):

e-voting

Интересно было бы сопоставить явно видимые на графике “скачки” с разными событиями прошедшей недели – например, резкий прирост голосов “за” в Москве в 17:00 25 июня, или синхронные скачки “против” в Москве и Нижнем в 16:00 26 июня и в 14:00 29 июня.

Наговняканный за полчаса код прилагается:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct voteblock {
	int time; // time in seconds since day start
	int res[2][2];
};

voteblock votes[2300000]; // max. block number is about 2.27M

int gettime(char *token){
	token[2] = '\0';
	token[5] = '\0';

	int hours = atoi(token);
	int minutes = atoi(token + 3);
	int seconds = atoi(token + 6);

	return hours * 60 * 60 + minutes * 60 + seconds;
}

void process_vote(char *buf){
	char *token;
	int district, res;

	token = strtok(buf, "\";"); // номер голоса
	int n = atoi(token);

	token = strtok(NULL, "\";"); // избир. округ
	if (strcmp(token, "77") == 0){
		district = 0;
	} else if (strcmp(token, "52") == 0) {
		district = 1;
	} else {
		fprintf(stderr, "Unknown district %s\r\n", token);
		return;
	}

	strtok(NULL, "\";"); // адрес голоса в блокчейне
	token = strtok(NULL, "\";#"); // блок голоса
	int block = atoi(token);

	token = strtok(NULL, "\";"); // время записи блока голоса
	int time = gettime(token);

	strtok(NULL, ";"); // зашифрованный голос
	token = strtok(NULL, "\";"); // расшифрованный голос
	if (strcmp(token, "2212294583") == 0){
		res = 0;
	} else if (strcmp(token, "450215437") == 0) {
		res = 1;
	} else {
		fprintf(stderr, "Unknown vote result %s\r\n", token);
		return;
	}

	strtok(NULL, "\";"); // блок расшифровки
	strtok(NULL, "\";"); // время записи блока расшифровки

	strtok(NULL, "\";"); // транзакция

	votes[block].time = time;
	votes[block].res[district][res]++;
}

void print_votes_table(){
	int day = 0;
	int starttime = 7 * 3600; // 10:00:00 MSK = 7:00:00 UTC
	int delta = 10 * 60; // 10 minutes granularity
	int allvotes[2][2] = { 0 };

	// to put the last line
	votes[sizeof(votes) / sizeof(voteblock) - 1].time = INT_MAX;

	for (int i = 0; i < sizeof(votes) / sizeof(voteblock); i++){
		if (votes[i].time >= 0){
			if ((votes[i].time > starttime + delta) || (votes[i].time < starttime)) {
				/* either end of current stats block or end of day*/
				if (votes[i].time < starttime)	{
					starttime = 0;
					day++;
				} else {
					starttime += delta;
				}

				// finalize this line
				printf("%i\t%i\t%i\t%i\t%i\t%i\r\n", day, starttime, allvotes[0][0], allvotes[0][1], allvotes[1][0], allvotes[1][1]);
			}

			allvotes[0][0] += votes[i].res[0][0];
			allvotes[0][1] += votes[i].res[0][1];
			allvotes[1][0] += votes[i].res[1][0];
			allvotes[1][1] += votes[i].res[1][1];
		}
	}
}

int main(void){
	char buf[1024]; // should be enough

	fgets(buf, sizeof(buf), stdin); // skip first line

	while (!feof(stdin)){
		fgets(buf, sizeof(buf), stdin);
		process_vote(buf);
	}

	print_votes_table();
	return 0;
}

После драки кулаками не машут, или что хотелось еще сказать

Ну или будем считать это развернутым комментарием к описанию голосовалки на Хабре :)

Начну с того, что ее авторы вовсе не изобрели велосипед – подобного рода системы довольно известны, в “Прикладной криптографии” Шнайера нечто очень похожее названо “голосованием с двумя центральными комиссиями”, а вообще в той же русскоязычной википедии приводятся примеры “протокола двух агентств” и “протокола Фудзиока-Окамото-Охта”, а в Эстонии такая система довольно широко внедрена и даже обсуждается в публикациях, как пример успешной криптографически защищенной системы голосования. Это, на самом деле, довольно положительно характеризует предложение – как минимум, в современной криптографии принцип security by obscurity не приветствуется, а тут для оценки стойкости системы и возможных рисков можно воспользоваться всем массивом знаний человечества, накопленным с 1990-х годов (когда, собственно, и были описаны основные протоколы тайного голосования).

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

Добавлю еще один технический момент – требование уже к реализации этого всего. Даже аккуратная реализация самого лучшего алгоритма может потерять все свои хорошие свойства из-за утечек по “скрытым каналам”. В частности, голосование с объединенным “регистратором” и “счетчиком” почти полностью теряет “тайну голосования”, если избиратель пользуется для связи с сервером каким-нибудь там HTTP и даже HTTPS (а чем еще можно пользоваться, когда у избирателей зоопарк из компьютеров с 3 популярными семействами ОС и смартфонов самых диких марок?). Пусть даже регистратор раздает избирателям ключи по протоколу ANDOS, который, в теории, не позволит регистратору узнать, какой ключ он кому выдал – но он при этом знает fingerprint браузера избирателя, который авторизовался, как “Иван Петрович Сидоров”, и знает fingerprint браузера избирателя, который прислал бюллетень “За кандидата N.”; сопоставить одно с другим совершенно несложно.

Маленькое отступление – да, полностью анонимных каналов связи у нас, скорее всего, нет (за исключением “распечатайте QR-код и отправьте его открыткой по почте” – но это уже не совсем электронное голосование), но деанонимизация избирателей методом “вычислю по IP” потребует уж слишком больших ресурсов, вряд ли доступных какому-нибудь одномандатнику.

Что особенно важно при электронном голосовании – это работа наблюдателей, причем в двух аспектах – как обеспечение такой возможности (нет, принтер, печатающий чеки, падающие в урну – это совсем не то, что надо), так и готовность заинтересованных сторон эту возможность использовать. “Бумажные” выборы довольно просты и понятны – как минимум на уровне здравого смысла “раздали бюллетени и аккуратно их посчитали” – так что наблюдатель на избирательном участке может работать после минимальной подготовки (и даже без нее, хотя будет плавать во многих процедурных вопросах). Электронное голосование – совсем другое дело! Если предъявить этому “минимально подготовленному” наблюдателю базу данных с бюллетенями – то вряд ли он сможет в ней что-то понять. Впрочем, на “круглом столе” озвучивался опыт Эстонии, где для такого “наблюдения” на выборах партии нанимают квалифицированных специалистов в области программирования и защиты информации – и в случае электронного голосования придется делать именно так. При этом “избирком” не должен отмалчиваться, когда ему задают “технические” вопросы, и даже больше – он должен быть готов продемонстрировать интересующие специалистов компоненты системы.

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

В общем, выступил

Если честно – как-то слабовато. Вроде готовился, посмотрел-почитал что-то по теме, вплоть до описания эстонской голосовалки – а как дошло собственно до непосредственно публичного выступления, так сказал пару-тройку фраз и дальше как отрезало, какой-то полный ступор. Сам себе даже не понравился :(