Ответ: Параметров, содержащихся в публичном ключе,
достаточно для шифрования, но недостаточно для расшифровки.
Это называется односторонняя функция с потайным входом.
Пример:
Публичный ключ содержит параметры: n и e.
Приватный ключ содержит параметры: n, e и d.
Обратите внимание: публичный ключ НЕ ЗНАЕТ о параметре d.
И еще, самое важное: e != (НЕ равно) d
Теперь смотрим на формулы, которыми мы будем шифровать:
(cipher - это шифр, data - это начальные данные)
cipher = data^e % n
data = cipher^d % n
Это как бы парные функции.
Входящее значение первой нельзя восстановить из нее самой, но можно воспроизвести во второй.
% - это деление по модулю, так же вместо этого знака еще используют mod.
Деление по модулю - это взятие остатка от деления. Оно еще называется делением с остатком.
Например: 10 % 3 = 1, т.к. ближайщее к 10 целое делимое для 3 это 9 и 10-9 = 1.
Еще примеры: 11 % 3 = 2, 12 % 3 = 0.
Давайте для примера зашифруем цифру 2. Параметры такие:
data = 2 (то что мы шифруем);
n=33; e=3; (параметры публичного ключа)
d=7; (дополнительный параметр приватного ключа, которого нет в публичном)
Тогда:
cipher = data^e % n = 2^3 % 33 = 8 % 33 = 8
Мы зашифровали цифру 2 параметрами публичного ключа и в качестве шифра получили цифру 8.
Что будет, если мы решим расшифровать наш cipher теми же параметрами от публичного ключа?
Давайте посмотрим:
Функция cipher = data^e % n необратима, ведь если мы сделаем:
8 = data^3 % 33
то столкнемся с тем, что data может принимать бесконечное количество значений,
так как деление по модулю дает цикличный результат.
И единственная возможность найти загаданное число - обратиться к нашей парной функции,
которая из-за того, что мы при создании ключей подобрали такие параметры n, e и d,
позволяет воспроизвести нужный нам результат.
data = cipher^d % n
Но параметр d публичный ключ не знает.
Если мы расшифровываем публичным ключом, то нам ничего не остается, кроме как подставить вместо d
параметр e.
data = 8^3 % 33 = 17
Как мы видим, получилось 17, а это неправильный ответ. Шифровали-то мы цифру 2.
Больше у нас параметров для подстановки нет
(от безысходности можно попробовать подставить параметр n, но это тоже не поможет), мы в тупике.
Зная только n и e, мы не можем обратить шифр, нам нужен d.
А теперь попробуем расшифровать приватным ключом, который знает, что d=7
data = cipher^d % n = 8^7 % 33 = 2
Получилось 2. То, что мы и шифровали.
Надеюсь, принцип понятен.