Визуализация деления секретов Шамира

Read in English

Что такое схема разделения секрета Шамира?

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

По идее можно разрезать пароль на несколько частей и каждому владельцу дать только свой кусочек. Но что если один из владельцев не сможет передать свою часть по какой-то причине? Значит, владельцев должно быть больше, чем обязательных частей пароля. Например, 10 владельцев, где любые 6 из них могут восстановить пароль.

Именно такую схему разделения пароля (секрета) и придумал израильский математик Ади Шамир. В честь него она и названа.

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

Полиномы

Полином — это функция вида

f(x)= ∑ i=0 n ai xi

Где ai — какие-то коэффициенты

Например:

Полезное свойство полиномов степени N

График полинома первой степени — прямая. Сколько таких прямых проходит через одну точку?

0 1 2 3 4 5 6 7 8 9 10 0 2 4 6 8 10 y x (2, 2)

Бесконечно много.

А через две точки проходит только одна прямая.

0 1 2 3 4 5 6 7 8 9 10 0 2 4 6 8 10 y x (2, 2) (3, 5)

График полинома второй степени — парабола. Сколько парабол проходит через одну точку?

0 1 2 3 4 5 6 7 8 9 10 0 2 4 6 8 10 y x (2, 2)

Бесконечно много.

А через две точки? Снова бесконечно много.

0 1 2 3 4 5 6 7 8 9 10 0 2 4 6 8 10 y x (2, 2) (3, 5)

А через три? Три точки задают единственную параболу.

0 1 2 3 4 5 6 7 8 9 10 0 2 4 6 8 10 y x (1, 4) (2, 2) (3, 4)

То есть для восстановления полинома степени n достаточно n + 1 точек с разными x.

Переход к разделению секрета

На этом свойстве и основан принцип разделения секрета Шамира. Графики показывают восстановление полинома на обычных числах. В самой схеме для защиты секрета используют арифметику конечного поля.

А как кодировать строки?

Строки - это последовательность байтов. Байт в компьютере - это число от 0 до 255. Для каждого байта повторяется разделение секрета.

А как кодировать действительно длинные сообщения?

На практике длинное сообщение можно зашифровать с помощью AES, а затем разделить ключ по схеме Шамира. У AES-128 ключ занимает 16 байт.

Вместе с зашифрованным сообщением передают доли ключа.

Конкретный пример: 3 из 5 секретов восстанавливают исходный секрет

Как мы получили эти точки?

Алгоритм wiki говорит: для порога k нужен многочлен степени k − 1.
Для обязательных 3 частей секрета это полином степени 3-1 = 2.
Это парабола f(x) = ax2 + bx + C. Свободный член C — наш секрет. Коэффициенты a и b выберем случайно, и получим какую-то параболу, проходящую через нашу точку.

Возьмём случайные a = 3 и b = 7 и наш секрет C = 15.
Получаем параболу f(x) = 3x2 + 7x + 15.

Теперь подставим в неё пять разных значений x и получим точки, которые раздадим хранителям секрета:

А если хочу минимум 100 из 500 секретов собрать?

Значит нужен полином степени 99, для которого посчитаем 500 точек.

То есть он будет вида: ax99 + bx98 + ... + kx + S