Сначала обратимся к известному и знакомому алгоритму электронной подписи, который широко применяется в информационных системах различного назначения. В основе электронной подписи лежат криптографические алгоритмы асимметричного шифрования. Асимметричное шифрование – это шифрование с помощью 2 ключей: один из них используется для шифрования, другой для расшифрования. Их называют открытый (публичный) и закрытый ключ. Открытый ключ известен окружающим, а закрытый – только владельцу электронной подписи и хранится в недоступном для других месте.
При подписании происходит следующее: сначала электронный документ, с помощью математических преобразований, приводится к последовательности символов определенного размера – это называется хэш функцией.
Полученная символьная последовательность (хэш от документа) зашифровывается отправителем документа с помощью закрытого ключа и вместе с открытым ключом отправляется получателю. Получатель расшифровывает с помощью открытого ключа символьную последовательность, применяет к документу точно такую же хэш функцию и сравнивает результат преобразования с результатом расшифровки. Если все совпадает, то в документ не было внесено изменений после подписания его отправителем.
Описанные действия позволяют удостоверится, что документ не изменялся, но не позволяют убедиться в том, что отправитель действительно тот, за кого он себя выдает. Поэтому нам нужна третья сторона, которой доверяют и отправитель, и получатель. Для этого до отправки документа отправитель обращается к третьей стороне и просит ее подписать своей электронной подписью его открытый ключ. Теперь отправитель направляет получателю документ, свой открытый ключ, и подпись третьей стороны своего ключа. Получатель проверяет подпись третьей стороны открытого ключа и доверяет полученной подписи документа.
Теперь перейдем к тому, что такое «слепая подпись» и как она может помочь нам при анонимизации.
Представим, что в описанном выше примере отправитель – это избиратель, документ – это бюллетень, а получатель – избирательная комиссия, или как мы говорили «компонент учета и подсчета голосов». В качестве третьей стороны (валидатора) у нас будет выступать компонент «Список избирателей». В этом случае процесс может происходить следующим образом.
Избиратель на своем устройстве генерирует пару ключей – закрытый и открытый. Поскольку эти ключи создаются на его личном устройстве в браузере, они известны только ему.
С помощью этих ключей он будет подписывать бюллетень для контроля его целостности. Подписанный бюллетень и открытый ключ он направляет избирательной комиссии. Чтобы бюллетень был принят компонентом «Распределенное хранение и подсчет голосов», он должен проверить, что открытый ключ подписан валидатором.
Валидатор (компонент «Список избирателей») подпишет открытый ключ только после того, как удостоверится, что избиратель присутствует в списке избирателей.
Для решения задачи по сохранению тайны голосования открытый ключ избирателя, созданный на его устройстве, не должен быть известен никому. Получается, что валидатор должен подписать то, что ему неизвестно. Задача кажется невыполнимой, но тут на помощь приходят криптографические алгоритмы – в данном случае алгоритм «слепой подписи»
Сначала на устройстве избирателя открытый ключ должен быть замаскирован. Маскировка – это выполнение отдельных математических действий на устройстве пользователя. Представьте, что вы задумали некоторое случайное число от 1 до 100, потом задумали второе случайное от 1 до 10 и третье, от 10 до 50, первоначально задуманное число возвели в степень второго числа, и разделили без остатка на третье. Полученный результат сообщили окружающим. Вам не составит труда восстановить первоначальное число, так как вы знаете последовательность действий и задуманные вами числа. Но окружающие это сделать не смогут.
Маскировка (ослепление) открытого ключа выполняется согласно специальному криптографическому алгоритму. В результате валидатор подписывает замаскированный открытый ключ, при этом исходный ключ ему неизвестен. Но особенности алгоритма в том, что пользователь (избиратель), получив подпись на замаскированный ключ, может сделать обратные преобразования и получить подпись валидную и для исходного, незамаскированного ключа.
Описанный алгоритм широко используется в протоколах тайного голосования. В системе дистанционного электронного голосования на данный момент для слепой подписи используется алгоритм RSA с длиной ключа 4096 бит.
В общем виде процедура анонимизации выглядит следующим образом.
- При создании голосования создается отдельная ключевая пара «валидатора», открытый ключ записывается в блокчейн. На каждое голосование создается уникальная ключевая пара.
- Пользователь идентифицируется в системе идентификации (в данном случае, в ЕСИА), и предоставляет разрешение на передачу своих идентификационных данных из системы идентификации в ПТК ДЭГ.
- Компонент «Список избирателей» ПТК ДЭГ проверяет наличие пользователя в списке избирателей.
- На устройстве пользователя создаются его личные ключи – закрытый и открытый, известные только ему.
- На устройстве пользователя открытый ключ маскируется
- Вместе с идентификационными данными и замаскированным открытым ключом пользователь обращается к компоненту «Список избирателей»
- Компонент еще раз проверяет наличие пользователя в списке и факт того, что он не получал подпись ранее
- Если все проверки успешны, происходит подпись ключа
- Факт подписи ключа записывается в блокчейн
- Пользователь на своем устройстве снимает маску с открытого ключа и получает закрытый ключ, открытый ключ и подпись на открытый ключ, при этом все ключи известны только ему.
- После этого пользователь переводится в анонимную зону – на отдельный сайт edg2020.gov.ru, где его невозможно идентифицировать (например, до перехода он может подключить VPN или сменить интернет-провайдера, полностью изменив IP-адрес)
- Прием бюллетеня будет зависеть только от того, пройдет ли проверку подпись «валидатора» и не был ли такой ключ использован ранее.
Далее приведем описание алгоритма с точки зрения криптографии.
Параметры подписи и обозначения:
M – в формате padding FDN для подписи.
darnley
Вы, кажется, совершенно случайно забыли приложить ссылки на открытый исходный код, который сообщество могло бы прочитать, чтобы удостовериться, что написанное здесь соответствует действительности.
А затем рассказать, как профессиональное сообщество может провести аудит и убедиться, что работает именно этот исходный код, а не что-то другое.
dirtynike
github.com/cikrf
GreyStrannik
Этот код не из прода. Клиентская часть голосовалки как бы лезет на dev-стенд в момент голосования:
При этом gas20.ru зарегистрирован на физическое лицо. Хотя может это вы в проде гоняете голоса через домен, выданный физику?