Между тем, защищённая от внешнего вмешательства переписка возможна не только в Телеграме, а даже посредством Почты России. Начну с примера, обходящегося вообще без шифрования.
Допустим, нужно отправить посылку в другой город. Чтобы защитить её от несанкционированного досмотра, можно снаружи перевязать её цепью и запереть на замок. Даже если Роскомнадзор потребует у Почты России вскрывать по подозрению в терроризме все без исключения посылки, в отсутствие ключа Почта России окажется неспособной выполнить это требование.
Вот если ключ не уникален, то нет гарантии, что он не окажется в руках Почты России. Но если ключ абсолютно уникален, то его нет у получателя, из-за чего он тоже не сможет открыть посылку.
Зато у получателя есть возможность повторно перевязать посылку цепью, заперев её на второй замок. Дважды запертую посылку получатель отправляет по обратному адресу. Отправитель отпирает своим ключом и снимает свой замок. Теперь на посылке остался только замок получателя. Если повторно отправить посылку ему, то Почта России по-прежнему не сумеет вскрыть её, а получателю достаточно будет воспользоваться имеющимся у него ключом.
Эта же идея лежит в основе метода шифрования RSA. Допустим, нужно срочно переслать по открытому каналу какое-то секретное сообщение (например, пароль от ячейки банка, находящегося в противоположном полушарии). Отправитель шифрует текст ключом, известным только ему. Получатель не может прочесть зашифрованное сообщение, но он повторно шифрует его своим ключом, известным только ему. Дважды зашифрованное сообщение получатель возвращает отправителю. Отправитель снимает свой шифр, после чего отправляет получателю сообщение, зашифрованное только его собственным ключом.
Для того, чтобы у получателя не возникло проблем с расшифровкой, метод шифрования должен удовлетворять двум требованиям:
1) у каждого ключа шифрования должен быть обратный ключ, применение которого сразу вслед за прямым полностью восстанавливает исходный текст;
2) все ключи шифрования должны коммутировать, т.е. результат применения любых двух ключей не зависит от того, в какой последовательности их использовали.
Существует много разных методов шифрования, удовлетворяющих этим двум требованиям. В частности, это может быть операция умножения целых чисел. Заметим, что любой файл кодируется как последовательность битов (нулей и единиц), что позволяет рассматривать его как целое число в двоичной системе счисления.
Например, пусть паролем служит число 73. Отправитель использует в качестве шифра умножение на 61 и вместо 73 отправляет произведение 73·61=4453. Получатель использует в качестве шифра умножение на 83 и возвращает отправителю произведение 4453·83=369599. Отправитель делит его на 61, после чего посылает частное 369599/61=6059. Наконец, получателю остаётся выполнить деление 6059/83=73.
Обратите внимание на то, что умножение и деление можно выполнить в столбик по алгоритмам, известным любому добросовестному ученику начальной школы. Но, чтобы найти секретное число 73, зная только какое-то из произведений 4453, 369599 или 6059, придётся разложить это произведение на множители. Это уже гораздо более сложная задача, выходящая за рамки базового школьного курса.
В реальности пароль состоит не из двух цифр, а из нескольких десятков символов. Но ситуация принципиально не меняется. Операции умножения и деления компьютер выполняет за ничтожные доли секунды. Но чтобы разложить на множители произведение, записываемое сотнями цифр, потребуются годы вычислений.