គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Рассмотрим сценарий, когда необходимо обеспечить безопасность банковского хранилища. Оно считается абсолютно неприступным без ключа, который вам выдают в первый же день работы. Ваша цель — надёжно сохранить ключ.

Предположим, вы решили всё время хранить ключ при себе, предоставляя доступ к хранилищу по мере необходимости. Но вы быстро поймёте, что такое решение на практике нормально не масштабируется, потому что всякий раз для открытия хранилища требуется ваше физическое присутствие. А как насчёт отпуска, которые вам обещали? Кроме того ещё более пугает вопрос: а что если вы потеряли единственный ключ?

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

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

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

Как разделить секрет

О таком типе схемы управления ключами думал Ади Шамир в 1979 году, когда опубликовал свою работу «Как разделить секрет». В статье кратко объясняется так называемая គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir пороговая схема для эффективного разделения секретного значения (например, криптографического ключа) на គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir частей. Затем, когда и только когда хотя бы គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir ពី គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir частей собраны, можно легко восстановить секрет គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir.

С точки зрения безопасности важным свойством этой схемы является то, что злоумышленник не должен узнать абсолютно ничего, если у него нет хотя бы គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir частей. Даже наличие គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir частей не должно давать никакой информации. Мы называем это свойство семантической безопасностью.

Полиномиальная интерполяция

Пороговая схема Шамира គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir построена вокруг концепции полиномиальной интерполяции. Если вы не знакомы с этой концепцией, она на самом деле довольно простая. Вообще, если вы когда-нибудь рисовали точки на графике, а затем соединяли их линиями или кривыми, то уже использовали её!

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir
Через две точки можно провести неограниченное число полиномов степени 2. Чтобы выбрать из них единственный — нужна третья точка. Иллюстрация: Wikipedia

Рассмотрим полином со степенью один, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Если вы хотите построить эту функцию на графике, сколько точек вам нужно? Ну, мы знаем, что это линейная функция, которая образует линию и поэтому нужно по крайней мере две точки. Далее рассмотрим полиномиальную функцию со степенью два, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Это квадратичная функция, поэтому для построения графика требуется не менее трёх точек. Как насчёт многочлена со степенью три? По крайней мере, четыре точки. И так далее и тому подобное.

Действительно классная вещь в этом свойстве заключается в том, что, учитывая степень полиномиальной функции и, по крайней мере, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir точек, мы можем вывести дополнительные точки для этой полиномиальной функции. Экстраполяцию этих дополнительных точек мы называем полиномиальной интерполяцией.

Составление секрета

Возможно, вы уже поняли, что здесь вступает в игру умная схема Шамира. Предположим, что наш секрет គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir - នេះ​គឺជា គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Мы можем превратить គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir в точку на графике គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и придумать полиномиальную функцию со степенью គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, которая удовлетворяет этой точке. Напомним, что គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir будет нашим порогом требуемых фрагментов, поэтому если мы установить порог в три фрагмента, то должны выбрать полиномиальную функцию со степенью два.

Наш полином будет иметь форму គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirដែលជាកន្លែង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — случайным образом выбранные положительные целые числа. Мы всего лишь строим полином со степенью គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, где свободный коэффициент គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — это наш секрет គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, а у каждого из последующих គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir членов есть случайным образом выбранный положительный коэффициент. Если вернуться к первоначальному примеру и предположить, что គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, то тогда мы получим функцию គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir.

На этом этапе мы можем генерировать фрагменты, подключив គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir уникальных целых чисел в គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirដែលជាកន្លែង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir (потому что это наш секрет). В данном примере мы хотим раздать четыре фрагмента с порогом три, поэтому случайным образом генерируем точки គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и отправляем по одной точке каждому из четырёх доверенных человек, хранителей ключа. Мы также сообщаем людям, что គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, так как это считается публичной информацией и необходимо для восстановления គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir.

Восстановление секрета

Мы уже обсуждали концепцию полиномиальной интерполяции и то, что она лежит в основе пороговой схемы Шамира គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Когда любые три из четырёх доверенных лиц хотят восстановить គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, им нужно только интерполировать គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir со своими уникальными точками. Для этого они могут определить свои точки គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и рассчитать интерполяционный полином Лагранжа, используя следующую формулу. Если программирование вам понятнее, чем математика, то пи — это по сути оператор for, который умножает все результаты, а сигма — это for, который всё складывает.

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

នៅ គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir мы можем это решить следующим образом и вернуть нашу исходную полиномиальную функцию:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

ចាប់តាំងពីយើងដឹង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, восстановление គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir осуществляется просто:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Использование небезопасной целочисленной арифметики

Хотя мы успешно применили основную идею Шамира គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, у нас остаётся проблема, которую мы игнорировали до настоящего момента. Наша полиномиальная функция использует небезопасную целочисленную арифметику. Учтите, что для каждой дополнительной точки, которую атакующий получает на графике нашей функции, остаётся меньшее количество возможностей для других точек. Вы можете увидеть это своими глазами, когда строите график с увеличением количества точек для полиномиальной функции с использованием целочисленной арифметики. Это контрпродуктивно для нашей заявленной цели безопасности, потому что злоумышленник не должен абсолютно ничего узнать, пока у них не будет хотя бы គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir បំណែក។

Чтобы продемонстрировать, насколько слаба схема с целочисленной арифметикой, рассмотрим сценарий, в котором злоумышленник получил две точки គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и знает публичную информацию, что គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Из этой информации он может вывести គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, равный двум, и подключить в формулу известные значения គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir.

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Затем злоумышленник может найти គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, посчитав គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Поскольку мы определили គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir как случайно выбранные целые положительные числа, есть ограниченное число возможных គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. С помощью этой информации злоумышленник может вывести គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, поскольку всё, что больше 5, сделает គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir отрицательным. Это оказывается правдой, поскольку мы определили គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Затем злоумышленник может рассчитать возможные значения គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirការជំនួស គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir в គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

С ограниченным набором вариантов для គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir становится понятно, насколько легко подобрать и проверить значения គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Здесь всего пять вариантов.

Решение проблемы с небезопасной целочисленной арифметикой

Чтобы устранить эту уязвимость, Шамир предлагает использовать модульную арифметику, заменив គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir នៅលើ គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirដែលជាកន្លែង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — множество всех простых чисел.

Быстро вспомним, как работает модульная арифметика. Часы со стрелками — уже знакомая концепция. Она использует часы, которые являются គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Как только часовая стрелка проходит мимо двенадцати, она возвращается к одному. Интересным свойством этой системы является то, что просто посмотрев на часы, мы не можем вывести, сколько оборотов сделала часовая стрелка. Однако если мы знаем, что часовая стрелка четыре раза миновала 12, можно полностью определить количество прошедших часов с помощью простой формулы គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirដែលជាកន្លែង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — это наш делитель (здесь គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir), គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — это коэффициент (сколько раз делитель без остатка переходит в исходное число, здесь គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir) និង គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — это остаток, который обычно и возвращает вызов оператора по модулю (здесь គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir). Знание всех этих значений позволяет нам решить уравнение для គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, но если мы пропустим коэффициент, то никогда не сможем восстановить исходное значение.

Можно продемонстрировать, как это улучшает безопасность нашей схемы, применив схему к нашему предыдущему примеру и используя គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Наша новая полиномиальная функция គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, а новые точки គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Теперь хранители ключа могут ещё раз использовать полиномиальную интерполяцию для восстановления нашей функции, только на этот раз операции сложения и умножения должны сопровождаться сокращением по модулю គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir (ឧ គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir).

Используя этот новый пример, предположим, что злоумышленник узнал две из этих новых точек, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, а публичная информация គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. На этот раз атакующий на основе всей имеющейся у него информации выводит следующие функции, где គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir — набор всех положительных целых чисел, а គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir представляет коэффициент модуля គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir.

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Теперь наш злоумышленник снова находит គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, вычислив គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

Затем он снова пытается вывести គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamirការជំនួស គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir в គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir:

គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir

На этот раз у него серьёзная проблема. В формуле отсутствуют значения គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir. Поскольку существует бесконечное количество комбинаций этих переменных, он не может получить никакой дополнительной информации.

ការពិចារណាអំពីសុវត្ថិភាព

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

Например, схема Шамира не создаёт проверяемых фрагментов, то есть люди могут свободно предъявлять поддельные фрагменты и мешать восстановлению правильного секрета. Враждебный хранитель фрагментов с достаточной информацией может даже произвести другой фрагмент, изменив គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir на своё усмотрение. Эта проблема решается с помощью проверяемых схем разделения секрета, таких как схема Фельдмана.

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

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

ការបង្ហាញ

នៅលើ ទំព័រនេះ есть интерактивная демонстрация cхема разделения секрета Шамира. Демонстрация сделана на базе библиотеки ssss-js, которая сама по себе является JavaScript-портом популярной программы សំណួរគេសួរញឹកញាប់. Обратите внимание, что вычисление больших значений គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir, គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir и គ្រោងការណ៍ចែករំលែកអាថ៌កំបាំងរបស់ Shamir может занять некоторое время.

ប្រភព: www.habr.com

បន្ថែមមតិយោបល់