Проект "Свободные голосования"

Электронная системы голосований через интернет
Текущее время: 27 ноя 2024, 11:59

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 09 июл 2011, 12:56 
Не в сети

Зарегистрирован: 28 июн 2011, 20:07
Сообщения: 150
Я опишу минимальную схему, которая, с моей точки зрения, обеспечивает тайность голосования и невозможность его подделки, в том смысле, что каждый проголосовавший сможет проверить свой голос. В конце я приведу некоторые дополнения, которые не сказываются на тайности голосования и невозможности его подделки, но делают схему более удобной в применении. Схема предполагает возможность делегировать свой голос делегату.

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

Голосование: вопрос, варианты ответов (конечное число, варианты определяются предварительно). Каждое голосование имеет Уникальный Серийный Номер Голосования. Уникальный Серийный Номер Голосования передается по каналам связи. Варианты ответов и их числовые представления известны всем. Они передаются по каналам связи.

Процесс голосования:
1. Пользователь решает принять участие в голосовании.
2. Голосующий подписывает Уникальный Серийный Номер Голосования своим закрытым ключом.
3. Голосующий выбирает вариант, за который он отдет свой голос.
4. Пользователь выбирает произвольное число, какое захочет, назовем его Секрет Пользователя в Голосовании. Секрет Пользователя в Голосовании НЕ передается по каналам связи в первозданном виде.

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

Эта таблица защищиает результаты голосования от изъятий и вложений. Если в этой таблице есть запись, что пользователь принял участие в голосовании, то и в следующей таблице должна быть запись, соответствующая пользователю, причем записей в таблице результатов голосования будет равно Числу в поле 3 из предыдущей таблице.

Составляем таблицу результатов голосования.

Структура записей в этой таблице:
1. Уникальный Серийный Номер Голосования.
2. Числовое Представление Варианта Ответа.
3. Секрет Пользователя в Голосовании, подписанный закрытым ключом пользвателя. Сам Секрет Пользователя в Голосовании в это поле не вносится.
4. Специальное Поле.

Столбцы 1,2 используются для подведения итогов голосования.

Столбецы 3,4 - используются для проверки пользователями (самим пользователем либо делегировавшим ему свои голоса) правильности стобцов 1,2.

Специальное Поле - некоторое зашифрованное поле.

В записи пользователя, который голосовал сам:
Секрет Пользователя в Голосовании - подписанное самим пользователем.
Специальное Поле - это подписанные закрытым ключом пользователя данные (Уникальный Серийный Номер Голосования, Числовое Представление Варианта Ответа, Логин, Секрет Пользователя в Голосовании) и эти же данные в открытом виде. Эти открытые данные и они же подписанные шифруются открытым ключом польвателя. Расшифровать его может только сам пользователь.

В записи пользователя, который делегировал свой голос:
Секрет ДЕЛЕГАТА в Голосовании - подписанное ДЕЛЕГАТОМ.
Специальное Поле - это подписанные закрытым ключом ДЕЛЕГАТА данные (Уникальный Серийный Номер Голосования, Числовое Представление Варианта Ответа, Логин Делегирующего, Секрет Делегата в Голосовании) и эти же данные в открытом виде. Эти открытые данные и они же подписанные шифруются открытым ключом ДЕЛЕГИРУЮЩЕГО. Расшифровать его может только сам делегирующий.

Зашифрованное Специальное Поле передается по каналам связи.

Никакаие другие данные по голосованию не сохраняются.

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

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

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

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

Обеспечение тайны голосования - есть.
Расшифровать Специальное Поле можно только с помощью закрытого ключа пользователя.

Невозможность подделки голосования - есть.
Данные подписанны либо самим пользователеми, либо делегатом.

Проверяя свой голос, который сделан делегатом, пользователь узнает Секрет Делегата в Голосовании. По нему и открытому ключу делегата, пользователь может проверить количество голосов, которыми проголосовал делегат в данном голосовании. Это помогает удостовериться в том, что результаты голосования не подделаны.

Очень многие аспекты тайны голосования и невозможности его подделки обсуждены в теме http://xn----7sbabbvhzqeqhjj5a7a4euhk.xn--p1ai/forum/viewtopic.php?f=5&t=48. Если вы ее не читали, очень прошу почитать. Не хочется отвечать на те же вопросы, на которые уже отвечал.

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

Выдаем пользователю Уникальный Одноразовый Идентификатор Пользователя в Голосовании. Добавляем Уникальный Одноразовый Идентификатор Пользователя в Голосовании в таблицу результатов голосования и в Специальное Поле. Теперь пользователь может искать свою запись по Уникальному Одноразовому Идентификатору Пользователя в Голосовании.

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

Описанная выше схема работает при следующих условиях:
1. Никто не запоминает соответсвия Уникальный Одноразовый Идентификатор Пользователя в Голосовании <--> Логин в открытом виде.
2. Уникальный Одноразовый Идентификатор Пользователя в Голосовании могут получить только пользователи, прошедшие аутентификацию, то есть не существует Уникальный Одноразовый Идентификатор Пользователя в Голосовании, которые бы не соответствовали реальному пользователю системы.

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

Таблица поиска:
1. Логин пользователя
2. Уникальный Серийный Номер Голосования
3. Уникальный Одноразовый Идентификатор Пользователя в Голосовании, зашифрованный открытым ключом пользователя.


Последний раз редактировалось ameten 09 июл 2011, 19:24, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 18:39 
Не в сети

Зарегистрирован: 17 июн 2011, 18:14
Сообщения: 2543
ameten писал(а):
В записи пользователя, который делегировал свой голос:
Секрет ДЕЛЕГАТА в Голосовании - подписанное ДЕЛЕГАТОМ.


Так. Здесь, насколько я понимаю, выдается лишь подпись "Секрета ДЕЛЕГАТА"? А где при этом будут хранится оригинальные данные "Секрет ДЕЛЕГАТА"? Что именно будет проверять делегат своей подписью если это ему понадобится?

ameten писал(а):
Специальное Поле - это подписанные закрытым ключом ДЕЛЕГАТА данные (Уникальный Серийный Номер Голосования, Числовое Представление Варианта Ответа, Логин Делегирующего, Секрет Делегата в Голосовании), которые потом зашифрованны открытым ключом ДЕЛЕГИРУЮЩЕГО. Расшифровать его может только сам делегирующий.


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

_________________
7BF9BDC16428245B55CF04EF4A609CA44E0F6E68


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 19:04 
Не в сети

Зарегистрирован: 28 июн 2011, 20:07
Сообщения: 150
Отвечу в обратном порядке.

Андрей писал(а):
ameten писал(а):
Специальное Поле - это подписанные закрытым ключом ДЕЛЕГАТА данные (Уникальный Серийный Номер Голосования, Числовое Представление Варианта Ответа, Логин Делегирующего, Секрет Делегата в Голосовании), которые потом зашифрованны открытым ключом ДЕЛЕГИРУЮЩЕГО. Расшифровать его может только сам делегирующий.


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


В Специальном Поле содержатся открытые данные и подписанные данные. Все вместе шифруется. Плохо объяснил. Поправлю текст.

Андрей писал(а):
ameten писал(а):
В записи пользователя, который делегировал свой голос:
Секрет ДЕЛЕГАТА в Голосовании - подписанное ДЕЛЕГАТОМ.


Так. Здесь, насколько я понимаю, выдается лишь подпись "Секрета ДЕЛЕГАТА"? А где при этом будут хранится оригинальные данные "Секрет ДЕЛЕГАТА"? Что именно будет проверять делегат своей подписью если это ему понадобится?


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 20:42 
Не в сети

Зарегистрирован: 17 июн 2011, 18:14
Сообщения: 2543
Ладно, зайдем с другой стороны. Я просто вас не понимаю. Примем терминологию:

user_id - идентификатор пользователя (то что вы называете "логином")
duser_id - идентификатор делегата
code1_user - одноразовый код пользователя для голосования
code2_user - то что вы называете "секрет пользователя"
code1_duser - одноразовый код делегата
code2_duser - то что вы называете "секрет делегата"
vote_choise - вариант ответа пользователем на предмет голосования
vote_id - идентификатор голосования
time - время соответствующего события
sign(user_id, "данные") - подпись пользователем user_id данных "данные"
enc(pub, user_id, "данные") - "данные", зашифрованные открытым ключем пользователя user_id;
enc(sec, user_id, "данные") - "данные", зашифрованные закрытым ключем пользователя user_id;

В этих терминах мой вариант (для прямого голосования) выглядит так (каждая строка в списке - отдельное поле)...

Открытый список результатов голосования:
code1_user
vote_id
vote_choise

Открытый список проголосовавших:
vote_id
user_id
"Я, пользователь ФИО участвовал в голосовании vote_id. Время time"
sign(user_id, "Я, пользователь ФИО участвовал в голосовании vote_id. Время time")

Закрытый список, который показывается пользователю в личном кабинете:
user_id
vote_id
enc(pub, user_id, "Голосование: vote_id; Время: time; Голос: vote_choise; Одноразовый идентификатор: code1_user")
enc(pub, user_id, sign(user_id, "Голосование: vote_id; Время: time; Голос: vote_choise; Одноразовый идентификатор: code1_user"))

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

_________________
7BF9BDC16428245B55CF04EF4A609CA44E0F6E68


Последний раз редактировалось Андрей 11 июл 2011, 10:52, всего редактировалось 5 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 21:30 
Не в сети

Зарегистрирован: 28 июн 2011, 20:07
Сообщения: 150
Интересно. Давайте попробуем :)

data(<list>) - просто упорядоченный список данных.

vote_choise(vote_id, user_id) - выбор пользователя user_id в голосовании vote_id

quan_delegated(duser_id, vote_id) - Число делегировавших свой голос пользователю duser_id, которыми duser_id проголосовал в голосовании vote_id плюс один (за себя самого). Как минимум равно единице - то есть делегирование самому себе.

Составляем таблицу участвоваших в голосовании:
1. user_id
2. vote_id
3. sign(user_id, vote_id)
4. quan_delegated(user_id, vote_id)
5. sign(user_id, quan_delegated(user_id, vote_id))

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

Составляем таблицу результатов голосования.

Запись в таблице для пользователя user_id, который проголосовал сам.
1. vote_id
2. vote_choise(vote_id, user_id)
3. sign(user_id, code2_user)
4. special_field(user_id, user_id)

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

Запись в таблице для пользователя user_id, который делегировал свой голос пользователю duser_id, который проголосовал.
1. vote_id
2. vote_choise(vote_id, duser_id)
3. sign(duser_id, code2_duser)
4. special_field(user_id, duser_id)

Специальное поле:
special_field(user_id, duser_id) = enc(pub, user_id, data(vote_id, vote_choise(vote_id, duser_id), user_id, code2_duser, sign(duser_id, data(vote_id, vote_choise(vote_id, duser_id), user_id, code2_duser))))

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 23:05 
Не в сети

Зарегистрирован: 17 июн 2011, 18:14
Сообщения: 2543
ameten писал(а):
quan_delegated(duser_id, vote_id) - Число делегировавших свой голос пользователю duser_id, которыми duser_id проголосовал в голосовании vote_id плюс один (за себя самого). Как минимум равно единице - то есть делегирование самому себе.

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

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

_________________
7BF9BDC16428245B55CF04EF4A609CA44E0F6E68


Последний раз редактировалось Андрей 09 июл 2011, 23:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 23:23 
Не в сети

Зарегистрирован: 17 июн 2011, 18:14
Сообщения: 2543
Кстати, неплохо-бы что-бы вы сначала в приведенных мною терминах описали свою систему вывода результатов голосования без делегирования.

А потом уже можно и делегированием заняться.

_________________
7BF9BDC16428245B55CF04EF4A609CA44E0F6E68


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 23:39 
Не в сети

Зарегистрирован: 28 июн 2011, 20:07
Сообщения: 150
Андрей писал(а):
ameten писал(а):
quan_delegated(duser_id, vote_id) - Число делегировавших свой голос пользователю duser_id, которыми duser_id проголосовал в голосовании vote_id плюс один (за себя самого). Как минимум равно единице - то есть делегирование самому себе.

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

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


А здесь мы уже с вами идеологически расходимся! :) Мы уже выяснили, что вы за сокрытие тайны количества голосов у делегата, а я - за открытие.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 23:42 
Не в сети

Зарегистрирован: 17 июн 2011, 18:14
Сообщения: 2543
ameten писал(а):
А здесь мы уже с вами идеологически расходимся! :) Мы уже выяснили, что вы за сокрытие тайны количества голосов у делегата, а я - за открытие.

В этом не я с вами расхожусь во мнении, а большинство на этом форуме с вами расходится во мнении. http://облачная-демократия.рф/forum/viewtopic.php?f=3&t=38

_________________
7BF9BDC16428245B55CF04EF4A609CA44E0F6E68


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2011, 23:55 
Не в сети

Зарегистрирован: 28 июн 2011, 20:07
Сообщения: 150
Андрей писал(а):
ameten писал(а):
А здесь мы уже с вами идеологически расходимся! :) Мы уже выяснили, что вы за сокрытие тайны количества голосов у делегата, а я - за открытие.

В этом не я с вами расхожусь во мнении, а большинство на этом форуме с вами расходится во мнении. http://облачная-демократия.рф/forum/viewtopic.php?f=3&t=38


Отлично, это можно дальше обсуждать в другой теме.

Значит, технических замечаний по схеме нет?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB