Редактировать
Лучший алгоритм (спасибо wnoise):
- Каждый выбирает секретный номер от 0 до М-1
- Каждый добавляет к своему номеру множество случайных групп и хэширует результат с помощью безопасного хеша
- Все рассказывают всем остальным этот хэш
- Все говорят всем свои секретные номера, а также случайный ганк, который они добавили к нему
- Каждый проверяет, совпадают ли числа и хэши + ганк
- Добавьте все секретные числа по модулю M, затем добавьте 1, чтобы получить окончательный результат
Как участник, я должен быть удовлетворен этим, потому что я знаю, что имел полное влияние на конечный результат - окончательное число могло быть любым, в зависимости от моего выбора секретного номера. Так как никто не мог предсказать мой номер, они также не могли предсказать окончательный результат.
Любой способ уменьшить количество сообщений от 3M ^ 2, которые, как я подозреваю, потребует широковещательный подход?
Я считаю, что только публикация хешей должна быть трансляцией, но она все еще O (M ^ 2). Я думаю, что единственный способ обойти это - это предварительно обменяться ключами цифровой подписи или иметь доверенный узел связи.
Edit2 - Насколько безопасна вещь хеширования?
Возможные атаки включают в себя:
- Если я могу создать коллизию хеша, у меня есть два секретных номера с одинаковым хешем. Поэтому, узнав секретные номера всех остальных, я могу выбрать, какие из секретных номеров раскрыть, и, таким образом, выбрать один из двух возможных результатов.
- Если я сгенерирую свой секретный номер и случайный ганк с помощью PRNG, то злоумышленнику, пытающемуся перебить мой хэш, не придется пробовать каждое возможное число + ганк, только каждое возможное начальное число для PRNG.
- Я использую число + ганк, которое все раскрывают, чтобы определить информацию о своих PRNG - я мог бы попытаться угадать или перебрать семена, или рассчитать внутреннее состояние на основе выходных данных. Это помогает мне предсказать, какие числа они сгенерируют в следующий раз, что сужает пространство поиска для атаки методом перебора.
Следовательно, вы должны
- Использовать надежный непрерывный алгоритм хеширования.
- Используйте криптографически безопасный генератор случайных чисел с большим начальным числом / состоянием и попытайтесь получить его из хорошего источника энтропии.