Мой вариант распределенной системы. В нем не нужно создавать комиссию по расследованию злоупотреблений, требовать согласия всех пользователей постфактум: злоупотребления достаточно быстро выясняются автоматом. При этом сохраняется полная анонимность. Основной минус в том, что при вбросе от злоумышленника неизбежно будет определенный процент пострадавших - тех, кто принимал от него голоса, еще не раскусив его (но в варианте Юрия это тем более есть). Голоса этих пострадавших уже нельзя будет учесть - по крайней мере, на данной истерации. Итоги же голосования, которые имеются у этих пострадавших, подлежат обнулению. Тут все зависит от контекста: 1) Можно считать, что так как наказание неотвратимо и быстро, то вбросы будут сравнительно редки. Поэтому при обнаружении ЛЮБОГО вброса нужно немедленно прекратить голосование и устроить новое - переголосовать должны все. 2) Можно смотреть процент пострадавших. Если он достаточно мал, то им можно дать возможность переголосовать (в рамках текущего голосования, т.е. не дергая всех остальных), оповестив об этом всех участников системы. Для этого нужно добавить к алгоритму несколько дополнительных опций. Если же процент пострадавших достаточно велик, то можно объявить переголосование. Можно, кстати, устроить дополнительное открытое голосование: "довольны ли вы ходом голосования, считаете ли вы его честным?". Здесь каждый может постоянно менять и отзывать свой голос, передавая его всем остальным с указанием времени. Динамика этого должна быть видна всем. Как на "Эхе Москвы" кардиограмма эфира. Ключевые моменты метода.1. Механизмы контроля и защиты от вбросов: - Контроль за путем голоса, который является твоим родным или был тебе передан. Тот, кто передает голос дальше, получает расписку о получении - в ней указано, кто ее получил. Тот, кто получил расписку, присоединяет к ней свою подпись - о том, что он ее получил. Это - "лист дерева". В нем две подписи: кто получил голос и кто передал и проконтролировал получение. И этот пакет передается получателем назад по цепочке.
Тот же, кто получил уже готовый "лист" (то есть расписку о получении, заверенную подписью получившего эту расписку) - тоже передает это назад по цепочке. То есть тому, кто дал ему этот голос. Свою подпись к этому он уже не присоединяет (дабы не загромождать канал). Таким образом, по этим парам, которые к нему возвращаются, каждый может восстановить дерево, по которому движется каждый вверенный ему голос (включая и свой). - НЕПОСРЕДСТВЕННЫЙ контроль за одним звеном цепочки. То есть за тем, кто получил у тебя голос. Он обязан вернуть тебе расписки о получении от тех, кому он передал его дальше. Если же - внимание! - он не дал никаких расписок, а при этом в списке передач появляется информация, что он давал другие голоса другим людям - то это значит, что он заныкал конкретный голос, чтобы сэкономить число передач и вбросить другие. В варианте Юрия это учтено не было;
Хитрость в том, что, по правилам, нельзя начинать передавать (и соответственно, принимать) новые голоса каким-то соседям раньше, чем передать этим соседям предыдущие вверенные тебе голоса. Все голоса должны передаваться всем соседям только по очереди. Когда ты отправил расписки от соседей назад, отчитался, - то тогда уже можешь брать следующие голоса из очереди, и отправлять их этим же соседям (но не новым). Тот, кто нарушает принцип очереди и первичности расписок от соседей - это злоумышленник, который прячет голоса. - Контроль за числом входящих и исходящих передач каждого.
Когда кто-то собирается сделать передачу голоса соседу, то тот, если все нормально, просит у него публичный ключ, шифрует идентификатор голоса и отдает назад передающему, требуя расписку. Передающий убеждается, что это именно его передаваемый голос (ID), зашифрованный именно этим ключом. Он подписывает эту передачу и отдает расписку соседу, после чего сосед дает ему расписку о получении голоса. Далее эта передача (кто передал, кому передал, время и зашифрованный идентификатор) - раздается абсолютно всем по сети. По передачам каждый может посчитать количество входящих и исходящих передач каждого, восстановить цепочку всех, кто давал голоса конкретному человеку или принимать от него. Если в какой-то момент количество исходящих передач (УНИКАЛЬНЫХ голосов) какого-то человека превышает количество исходящих, то это - злоумышленник, который вбрасывает голоса. А те, кто принимал от него передачи (еще не дошло, что он злоумышленник), и соответственно, те кто принимал у принимавших и так далее по цепочке - те все являются пострадавшими. Итогам голосования, записанным у них, нельзя доверять (пока), и принимать голоса у них нельзя (пока).
2. Персональные данные клиента: - ID своего голоса. Этот ID хранится в оперативной памяти и переписывается клиентом ручкой на бумагу, или фотографируется.
- Пара ключей: секретный и публичный. Ключи никому не отправляются, кроме случая шифровки для расписки о передаче. Публичный ключ хранится на жестком диске, секретный - в оперативной памяти и записывается ручкой на бумаге. Ключ используется для шифровки ID в расписке о передаче, а также для шифровки хранящихся на диске данных о переданных голосах (таблица незашифрованный ID - голос - время).
3. Виды расписок об ответственности: - Расписка о даче (передаче) голоса. Дается тем, кто собирается передать голос, тому, кто хочет его получить. Без этой расписки о передаче принимать голос нельзя - себе дороже.
Когда кто-то собирается сделать передачу голоса соседу, то тот, если все нормально, просит у него публичный ключ, шифрует идентификатор голоса и отдает назад передающему, требуя расписку. Передающий убеждается, что это именно его передаваемый голос (ID), зашифрованный именно этим ключом. Он подписывает эту передачу и отдает расписку соседу, после чего сосед дает ему расписку о получении голоса. Далее эта передача (кто передал, кому передал, время и зашифрованный идентификатор) - раздается абсолютно всем по сети. В передаче указывается, кто передал, кому передал, время и ID голоса. ID голоса зашифрован ключом передавшего, и не будет расшифрован НИКОГДА. Это нужно для того, чтобы для каждого была возможность посчитать, сколько он передал разным соседям УНИКАЛЬНЫХ голосов. Один и тот же голос, зашифрованный одним и тем же публичным ключом, выглядит уникально. Для честности получатель, требуя расписку о передаче, сам просит публичный ключ передавателя и шифрует полученный ID - а потом требует это все подписать. Потом получает сам голос, записывает его в итоги (ID и выбор) и дает расписку о получении. А потом подписанную передачу распространяет по сети, и дальше передает голос соседям. - Расписка о получении голоса. Прежде чем передавать новые голоса соседям, клиент должен передать этим же соседям те, что пришли раньше. Получить от них расписки о получении и отправить назад, заверив своей подписью.
В свою очередь, тот, кому передали назад, записывает эту расписку (заверенную получателем) в файл, указав время и зашифровав всю запись. Теперь этот получатель отчитался перед ним. И затем он (кому передали назад) передает эту заверенную расписку дальше назад по цепочке, тому, кто давал ему голос, - уже не прибавляя к ней своей подписи, в первозданном виде (потому что это не отчет и ответственность, а просто помощь в отслеживании пути голоса, и это не так строго).
4. Что передается по сети, и что хранится на диске в зашифрованном виде. - Передаются расписки о передачах. Кто передал (ключ подписи), кому передал (ключ подписи), время и зашифрованный ID голоса. Эти расписки копятся в файлах на диске, открыты и постоянно передаются всем и обо всех. Каждому выгодно распространять свои входящие расписки о передачах - ведь этим он отчитывается за _исходящие_ передачи, о которых дал расписки другим.
Это происходит в постоянном режиме, всегда. А не то что, "когда были замечены вбросы, то при согласии всех начинаем как-то отслеживать цепочки". Если же в постоянном режиме такое невозможно (большой траффик) - то тогда скажите об этом как специалисты. Боюсь, в этом случае с мечтой о распределенном голосовании придется расстаться. По этим передачам каждый может восстановить дерево каждого, все цепочки вместе со временем - кто кому передавал голоса и во сколько. Но ID голоса зашифрован и не будет расшифрован НИКОГДА. Он нужен лишь для того, чтобы показать, что это УНИКАЛЬНЫЙ голос, переданный этим человеком какому-то набору соседей. - Передаются расписки о получении голосов, заверенные подписями тех, кто эту расписку получил.
В отличие от расписок о передачах, они передаются не всем подряд обо всех - а только назад по цепочке. Тот, кто непосредственно получил расписку о получении голоса, - ОБЯЗАН заверить ее и передать назад. Иначе он не имеет права давать этим соседям (т.е. кто должен получить голос) другие голоса. А тот, кто получил расписку уже заверенную чьей-то подписью (т.е. не непосредственно от получившего голос) - тоже передает этот пакет назад, уже никак его не меняя. Но это уже не так критично от него требуется - ведь он может выключить компьютер, не успеть и т.п. Это помогает каждому отслеживать путь своего голоса. А также контролировать тех, кто голоса ныкает, чтобы сэкономить число расписок о передачах. - Информация о переданных мне лично голосах (открытый ID - выбор голосующего - время получения) хранится на диске в зашифрованном виде (весь файл зашифрован).
Также, для каждого голоса хранится информация о том, каким соседям он был передан, и кто из них принес какие расписки от своих дальнейших соседей. Если в списке передач выясняется, что кто-то из получивших голос соседей не передал его следующему соседу (не принес заверенную расписку) - а при этом он, _позже по времени_, давал этому следующему соседу какие-то голоса - то этот (непосредственный) сосед - злоумышленник, который прячет голоса и передает другие. То есть, каждый несет ответственность за голоса, врученные ему лично. Заботится о том, чтобы каждый непосредственный сосед передал их дальше. - Информация о злоумышленниках и пострадавших передается по сети. Если кто-то считает кого-то злоумышленником (а это следует из дерева передач) - то он пишет расписку об этом и раздает всем, а все в свою очередь передают дальше.
- Информация о пострадавших (потерпевших). Она тоже передается по сети. Если кто-то считает кого-то потерпевшим от какого-то злоумышленника - то он пишет об этом расписку и распространяет ее всем по сети (и все распространяют дальше эту расписку). Соответственно, он отказывается принимать от него передачи.
Тот, кто принял передачу от потерпевшего (еще не выявив источник вброса) - сам станет в глазах остальных потерпевшим, и его итоги не будут иметь силу, а передачи от него приниматься не будут. - (Это уже опционально.) Если кто-то видит, что такого-то потерпевшего признали потерпевшим практически все, то это значит, что ему можно дать возможность переголосовать. Тогда этот кто-то стирает всю информацию о входящих передачах ему, и дает всем расписку о том, что он считает его теперь "чистым". Соответственно, каждый может наблюдать, кто считает его уже "чистым" и может принимать от него голос. Если "чистым" его считают практически все, то можно переголосовать повторно.
- Передается голос о честности голосования, признании итогов выборов. Это делается открыто, распиской, и может меняться в ходе голосования. Если у тебя появилось мнение, то ты передаешь расписку о нем всем, с указанием времени. Если оно изменилось - опять передаешь расписку.
- С определенной периодичностью каждый выбирает случайного соседа (соседа соседа... соседа) и запрашивает у него итоги голосования (список голосов). Таким образом можно убедиться, что этот сосед не только получил (дал расписку о получении) твой голос, а и учел его в общей таблице.
Если весь этот траффик неподъемен для конкретной сети - то боюсь, мечта о распределенном голосовании не реализуема.
5. Передавать голос и подпись по разным каналам не нужно. Это ничему не помогает. Список избирателей каждый может формировать просто из списка передач. Предлагаю вывесить в вики, и там обсуждать и править.
_________________ [url="http://povischuk.livejournal.com/7922.html"]"... И во многих царствах были олигархи иудейские, которые продавали и покупали... И пилил Вайншток сорок дней и сорок ночей, и увозил золото колесницами... Многие же тогда говорили: вот, по закону Моисееву, не дозволено пилить в субботу,.."[/url]
|