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

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

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

«Новая система отличается детерминированным шифрованием: использование одних и тех же параметров приводит к формированию идентичных шифротекстов. Более того, отправитель и получатель формируют общий ключ (shared key), который пригоден как для шифрования сообщения, так и для его расшифровки, — пишет «Медуза». — То есть избиратель теперь не только может отправить зашифрованный выбор на сервер избиркома, откуда он попадет в блокчейн, но и успешно расшифровать его. Ему не нужно ждать начала официального подсчета голосов и публикации секретного ключа избирательной комиссии — достаточно сохранить свой секретный ключ, формируемый в браузере на странице электронного бюллетеня. Мы провели эксперимент, и оказалось, что раздобыть свой секретный ключ сравнительно легко».

Для сохранения своего электронного ключа нужно открыть «Инструменты разработки» в браузере, отыскать библиотеку election.js, найти там строку с генерацией секретного и публичного ключей, поставить после неё logpoint: 'voter secret key is', encryptor.keyPair.secretKey. И после этого голосовать.


«Медуза» опубликовала скрипт votes.js, позволяющий расшифровать голоса интернет-избирателей, сохранивших свои секретные ключи. Там уже введены ключи, nonce и зашифрованные сообщения двух избирателей — так что вы можете расшифровать их голоса для проверки.

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

Автор библиотеки TweetNaCl.js Дмитрий Честных предложил пути обхода запрета на использование одной и той же пары ключей: «Например, такое расширение может генерировать ключи детерминистически, взяв хэш от статичного секрета и имени (и какого-нибудь номера избирателя) — тогда это обнаружить будет сложно, потому что пары ключей будут разные, но тот, кто владеет секретом, может их заново сгенерировать… Расширение может просто писать ключи в центральную базу. Алгоритм Curve25519 очень быстрый, поэтому расшифровать миллионы голосов не составит труда… В любом случае это, конечно, полный бред, а не система электронного голосования», — сказал он.

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