WikiDer > Обмен секретами Шамиров - Википедия
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
Обмен секретами Шамира является алгоритм в криптография сделано Ади Шамир. Это форма секретный обмен, где секрет делится на части, давая каждому участнику свою уникальную часть.
Чтобы восстановить оригинальный секрет, требуется минимальное количество деталей. В пороговой схеме это количество меньше общего количества деталей. В противном случае всем участникам необходимо восстановить первоначальный секрет.
Объяснение высокого уровня
Shamir's Secret Sharing используется для защиты секрета распределенным способом, чаще всего для защиты других ключей шифрования. Секрет разделен на несколько частей, называемых акции. Эти доли используются для восстановления оригинального секрета.
Чтобы разблокировать секрет через обмен секретами Шамира, вам нужно минимальное количество акций. Это называется порог, и используется для обозначения минимального количества акций, необходимых для разблокировки секрета. Давайте рассмотрим пример:
Проблема: компании XYZ необходимо защитить пароль своего хранилища. Можно было бы использовать что-нибудь стандартное, например AES, но что делать, если держатель ключа недоступен или умирает? Что, если ключ будет скомпрометирован злоумышленником или его владелец станет мошенником и использует свою власть над хранилищем в своих интересах?
Здесь на помощь приходит SSS. Его можно использовать для шифрования пароля хранилища и генерации определенного количества акций, при этом определенное количество акций может быть выделено каждому руководителю в компании XYZ. Теперь, только если они объединят свои акции, они смогут разблокировать хранилище. Пороговое значение может быть соответствующим образом установлено для количества руководителей, поэтому к хранилищу всегда могут получить доступ уполномоченные лица. Если одна или две акции попадут в чужие руки, они не смогут открыть пароль, если другие руководители не будут сотрудничать.
Математическое определение
Цель - разделить секрет (например, сочетание с безопасный) в фрагменты данных таким образом, что:
- Знание любого или больше штук делает легко вычислить. То есть полный секрет может быть восстановлен из любой комбинации фрагменты данных.
- Знание любого или меньше кусочки листьев полностью неопределенным, в том смысле, что возможные значения для кажется таким же вероятным, как и со знанием шт. Сказал по-другому, секрет не может быть восстановлен менее чем шт.
Эта схема называется пороговая схема. затем каждый кусочек оригинального секрета требуется, чтобы восстановить секрет.
Схема секретного обмена Шамиром
Основная идея Ади Шамирпороговая схема такова, что 2 точки достаточно, чтобы определить линия, 3 балла достаточно, чтобы определить парабола, 4 балла для определения кубическая кривая и так далее. указывает на определение многочлен из степень .
Предположим, мы хотим использовать Схема порога, чтобы поделиться нашим секретом , без ограничения общности, считается элементом в конечное поле размера куда и простое число.
Выбирать наугад положительные целые числа с , и разреши . Построить полином . Построим любой указывает из него, например, набор получить . Каждому участнику дается точка (ненулевое целое число, входящее в многочлен и соответствующий целочисленный выход), а также штрих, который определяет конечное поле для использования. этих пар, мы можем найти коэффициенты многочлена, используя интерполяция. Секрет в постоянном члене .
использование
Пример
Следующий пример иллюстрирует основную идею. Обратите внимание, однако, что вычисления в этом примере выполняются с использованием целочисленной арифметики, а не с использованием арифметика конечных полей. Поэтому приведенный ниже пример не обеспечивает полной секретности и не является истинным примером схемы Шамира. Итак, мы объясним эту проблему и покажем правильный способ ее реализации (используя арифметику конечных полей).
Подготовка
Предположим, что наш секрет - 1234 .
Мы хотим разделить секрет на 6 частей , где любое подмножество из 3 частей достаточно, чтобы восстановить секрет. Наугад получаем номера: 166 и 94.
- куда секрет
Таким образом, наш полином для получения секретных долей (очков):
Строим шесть точек от полинома:
Мы даем каждому участнику отдельный балл (оба и ). Потому что мы используем вместо точки начинаются с и нет . Это необходимо, потому что это секрет.
Реконструкция
Для восстановления секрета достаточно 3-х точек.
Учитывать .
Мы вычислим Базисные многочлены Лагранжа:
Следовательно
Напомним, что секрет в свободном коэффициенте, а это значит, что , и мы закончили.
Вычислительно эффективный подход
Учитывая, что целью использования полиномиальной интерполяции является нахождение константы в исходном полиноме с помощью Полиномы Лагранжа "как есть" неэффективно, поскольку вычисляются неиспользуемые константы.
Оптимизированный подход к использованию полиномов Лагранжа для поиска определяется следующим образом:
Проблема
Хотя упрощенная версия метода, показанная выше, в которой используется целочисленная арифметика, а не арифметика с конечным полем, работает нормально, существует проблема безопасности: канун получает много информации о с каждым что она находит.
Предположим, она находит 2 точки и , у нее все еще нет очков, поэтому теоретически она не должна была получать больше информации о Но она совмещает информацию из двух пунктов с публичной информацией: и она :
- заполняет -формула с и ценность
- заполняет (i) значениями с и
- заполняет (i) значениями с и
- делает (iii) - (ii): и переписывает это как
- знает это поэтому она начинает заменять в (iv) с 0, 1, 2, 3, ... найти все возможные значения для :
- заменяет по (iv) в (ii):
- заменяет в (vi) значениями, найденными в (v), так что она получает что приводит ее к информации:
- Теперь ей нужно угадать только 150 чисел вместо бесконечного числа натуральных чисел.
Решение
Геометрически эта атака использует тот факт, что мы знаем порядок полинома и таким образом получаем представление о путях, которые он может пройти между известными точками. Это уменьшает возможные значения неизвестных точек, поскольку они должны лежать на гладкой кривой.
Эта проблема может быть решена с помощью арифметики конечных полей. Поле размера используется. График показывает полиномиальную кривую над конечным полем, в отличие от обычной гладкой кривой, она кажется очень неорганизованной и несвязной.
На практике это небольшое изменение, это просто означает, что мы должны выбрать простое число. это больше, чем количество участников и каждый (включая ) и мы должны вычислить точки как вместо .
Поскольку каждый, кто получает балл, также должен знать ценность , он может считаться публично известным. Следовательно, следует выбрать значение для это не так уж мало.
В этом примере мы выбираем , поэтому наш многочлен принимает вид что дает баллы:
На этот раз Ева не получит никакой информации, когда найдет (пока она не точки).
Снова предположим, что Ева находит и , на этот раз общедоступная информация: так что она:
- заполняет -формула с и ценность и :
- заполняет (i) значениями с и
- заполняет (i) значениями с и
- делает (iii) - (ii): и переписывает это как
- знает это поэтому она начинает заменять в (iv) с 0, 1, 2, 3, ... найти все возможные значения для :
На этот раз она не может остановиться, потому что может быть любым целым числом (даже отрицательным, если ), поэтому существует бесконечное количество возможных значений для . Она знает это всегда уменьшается на 3, поэтому если делится на она могла сделать вывод но поскольку это главное, она не может сделать вывод даже об этом, и поэтому она не получила никакой информации.
Пример Python
"""Следующая реализация Python Shamir's Secret Sharing:выпущен в общественное достояние на условиях CC0 и OWFa:https://creativecommons.org/publicdomain/zero/1.0/http://www.openwebfoundation.org/legal/the-owf-1-0-agreements/owfa-1-0См. Несколько нижних строк для использования. Протестировано на Python 2 и 3."""из __будущее__ импорт разделениеиз __будущее__ импорт print_functionимпорт случайныйимпорт functools# 12-й Мерсенн Прайм# (для этого приложения нам нужно известное простое число как можно ближе к# возможно до нашего уровня безопасности; например желаемый уровень безопасности 128# бит - слишком большой и весь зашифрованный текст большой; слишком маленький и# безопасность скомпрометирована)_ОСНОВНОЙ = 2 ** 127 - 1# 13-й Мерсенн Прайм - 2 ** 521-1_RINT = functools.частичный(случайный.SystemRandom().Randint, 0)def _eval_at(поли, Икс, основной): "" "Вычисляет полином (набор коэффициентов) в точке x, используемый для генерации пул Shamir в make_random_shares ниже. """ накопить = 0 за коэфф в перевернутый(поли): накопить *= Икс накопить += коэфф накопить %= основной возвращаться накопитьdef make_random_shares(минимум, акции, основной=_ОСНОВНОЙ): """ Создает случайный пул шамиров, возвращает секрет и долю точки. """ если минимум > акции: поднимать ValueError("Секрет пула будет невозвратным".) поли = [_RINT(основной - 1) за я в классифицировать(минимум)] точки = [(я, _eval_at(поли, я, основной)) за я в классифицировать(1, акции + 1)] возвращаться поли[0], точкиdef _extended_gcd(а, б): """ Деление на целые числа модуля p означает нахождение обратного знаменатель по модулю p, а затем умножая числитель на это инверсия (Примечание: инверсией A является B такая, что A * B% p == 1) это может вычисляться с помощью расширенного алгоритма Евклида http://en.wikipedia.org/wiki/Modular_multiplicative_inverse#Computation """ Икс = 0 last_x = 1 у = 1 last_y = 0 пока б != 0: quot = а // б а, б = б, а % б Икс, last_x = last_x - quot * Икс, Икс у, last_y = last_y - quot * у, у возвращаться last_x, last_ydef _divmod(число, логово, п): "" "Вычислить число / день по модулю простого p Чтобы объяснить, что это означает, возвращаемое значение будет таким, что верно следующее: den * _divmod (num, den, p)% p == num """ inv, _ = _extended_gcd(логово, п) возвращаться число * invdef _lagrange_interpolate(Икс, x_s, y_s, п): """ Найдите значение y для данного x, учитывая n (x, y) точек; k точек будут определять полином до k-го порядка. """ k = len(x_s) утверждать k == len(набор(x_s)), "точки должны быть разными" def ЧИСЛО ПИ(вальс): # Пи в верхнем регистре - произведение входов накопить = 1 за v в вальс: накопить *= v возвращаться накопить числа = [] # избегать неточного деления логова = [] за я в классифицировать(k): другие = список(x_s) дворняга = другие.поп(я) числа.добавить(ЧИСЛО ПИ(Икс - о за о в другие)) логова.добавить(ЧИСЛО ПИ(дворняга - о за о в другие)) логово = ЧИСЛО ПИ(логова) число = сумма([_divmod(числа[я] * логово * y_s[я] % п, логова[я], п) за я в классифицировать(k)]) возвращаться (_divmod(число, логово, п) + п) % пdef Recovery_secret(акции, основной=_ОСНОВНОЙ): """ Восстановите секрет из очков обмена (x, y указывает на многочлен). """ если len(акции) < 2: поднимать ValueError("нужно как минимум две доли") x_s, y_s = застегивать(*акции) возвращаться _lagrange_interpolate(0, x_s, y_s, основной)def главный(): """Основная функция""" секрет, акции = make_random_shares(минимум=3, акции=6) Распечатать('Секрет:', секрет) Распечатать('Акции:') если акции: за Поделиться в акции: Распечатать(' ', Поделиться) Распечатать("Секрет восстановлен из минимального набора акций:", Recovery_secret(акции[:3])) Распечатать("Секрет восстановлен из другого минимального набора акций:", Recovery_secret(акции[-3:]))если __имя__ == '__главный__': главный()
Характеристики
Некоторые полезные свойства Шамира пороговые схемы бывают:
- Безопасный: Информационная безопасность.
- Минимальный: Размер каждого фрагмента не превышает размера исходных данных.
- Расширяемый: Когда фиксируется, части могут быть динамически добавлены или удалены, не затрагивая другие части.
- Динамический: Безопасность можно легко повысить, не меняя секрета, но время от времени меняя многочлен (сохраняя тот же свободный срок) и создавая новые акции для участников.
- Гибкий: В организациях, где важна иерархия, мы можем предоставить каждому участнику разное количество элементов в соответствии с их важностью внутри организации. Например, президент может открыть сейф в одиночку, а для его открытия требуются 3 секретаря.
Известная проблема в схеме совместного использования секретов Шамира - это проверка правильности извлеченных общих ресурсов во время процесса восстановления, который известен как поддающийся проверке секретный обмен. Поддающееся проверке разглашение секретов направлено на проверку того, что акционеры честны и не предоставляют поддельные акции.
Смотрите также
- Обмен секретами
- Полином Лагранжа
- Гомоморфное разделение секретов - Упрощенный децентрализованный протокол голосования.
- Правило двух человек
- Частичный пароль
Рекомендации
- Шамир, Ади (1979), «Как поделиться секретом», Коммуникации ACM, 22 (11): 612–613, Дои:10.1145/359168.359176, S2CID 16321225.
- Лю, К. Л. (1968), Введение в комбинаторную математику, Нью-Йорк: Макгроу-Хилл.
- Dawson, E .; Донован, Д. (1994), "Размах схемы Шамира по разглашению секретов", Компьютеры и безопасность, 13: 69–78, Дои:10.1016/0167-4048(94)90097-3.
- Кнут, Д. Э. (1997), Искусство программирования, II: получисловые алгоритмы (3-е изд.), Addison-Wesley, p. 505.
- Бензекки, К. (2017 г.), «Подходящий подход к совместному использованию секретов для безопасного хранилища MultiCloud», В повсеместной сети, Конспект лекций по информатике, Касабланка: Springer, 10542: 225–234, Дои:10.1007/978-3-319-68179-5_20, ISBN 978-3-319-68178-8.
внешняя ссылка
- Обмен секретами Шамира в Крипто ++ библиотека
- Схема секретного обмена Шамиром (ssss) - а GNU GPL выполнение
- поделился секретом - реализация на Go
- s4 - онлайн-инструмент для обмена секретами Шамира, использующий алогрит для обмена секретами Шамира Хаши