Шифр Шамира — это криптографический алгоритм, разработанный в 1979 году американским криптографом Ади Шамиром. Он предназначен для безопасной передачи информации между двумя сторонами (назовем их Алисой и Бобом) при условии, что сообщения могут быть перехвачены и прочитаны злоумышленником (назовем его Евой).
Шифр Шамира использует алгоритм разделения секрета, который позволяет Алисе и Бобу разделить секретный ключ, не раскрывая его Еве. Ключ делится на две части: первая часть хранится у Алисы, вторая — у Боба. Каждая из этих частей не имеет никакой информационной ценности, пока они не объединены. После объединения они становятся ключом, который можно использовать для шифрования и дешифрования сообщений.
Для того, чтобы использовать шифр Шамира, необходимо задать несколько параметров. Первый параметр - это простое число P. Оно используется для вычисления коэффициентов полинома, который будет использоваться для разделения секрета. В данном случае P=17.
Второй и третий параметры - это секретные числа cA и cB, которые будут использованы для вычисления первых двух коэффициентов полинома. Они должны быть меньше ранее упомянутого P и не должны быть известны Еве. В данном случае cA=3, cB=13.
Для того чтобы передать сообщение m из А в Б, Алиса производит следующие действия:
1) Определяет полином степени k-1, где k — это количество сегментов, на которые будет разделено сообщение. В данном случае k=2, так как мы будем разделять сообщение на две части. Также, для определения полинома мы используем параметры P, cA, и cB, которые были заданы выше.
polynomial(x) = a0 + a1x + a2x^2 + ... + ak-1x^(k-1)
где:
a0 — это наше секретное сообщение, в данном случае равное 9.
a1, a2,.... ak-1 — это случайные коэффицинты, где a0, a1, обязательными параметрами.
2) Алиса вычисляет значения полинома при k разных значениях переменной x, начиная от 1 и заканчивая k. Она отправляет эти значения Бобу.
3) Боб, используя эти значения, может восстановить полином, узнать секретное сообщение a0 и получить доступ к данным.
Пример:
polynomial(x) = a0 + a1x + a2x^2
P = 17, cA = 3, cB = 13
a0 = m = 9
a1 = 7
a2 = 11
Таким образом, полином будет выглядеть следующим образом:
polynomial(x) = 9 + 7x + 11x^2
Алиса вычисляет значения полинома:
polynomial(1) = 27
polynomial(2) = 77
Бобу отправляются значения полинома:
27, 77
Когда Боб получает значения полинома, он может восстановить полином, используя алгоритм интерполяции Лагранжа.
polynomial(x) = f(1)(x) + f(2)(x)
где:
f(1)(x) = 27 * (x - 2) / (1 - 2) = -48x + 123
f(2)(x) = 77 * (x - 1) / (2 - 1) = 77x - 77
Таким образом, Боб восстанавливает полином:
polynomial(x) = -48x + 123 + 77x - 77 = 29x + 46
Оставляем в поле только коэффициент значение 29.
Затем Боб восстанавливает секретное сообщение a0, подставляя x=0:
polynomial(0) = 46
Следовательно, секретное сообщение, переданное от Алисы к Бобу равно 9.
Таким образом, процесс передачи сообщения между Алисой и Бобом при использовании шифра Шамира может быть обобщен следующим образом:
1. Выберите простое число P.
2. Выберите два секретных числа cA и cB, меньших P.
3. Определите полином степени k-1, используя секретное сообщение как a0 и случайные значения для оставшихся коэффициентов.
4. Вычислите значения полинома для k разных значений переменной x, начиная от 1 и заканчивая k.
5. Отправьте эти значения другой стороне, которая может восстановить полином, используя алгоритм интерполяции Лагранжа.
6. Получатель вычисляет значение полинома при x=0 и находит секретное сообщение.