В этом посте я попытаюсь простыми словами объяснить симметричное и асимметричное шифрование.
(Предыдущий пост)
Давайте сразу перейдем к проблеме распределения ключей. Что это за проблема? Давайте представим, что у нас есть сообщение, которое зашифровано каким-нибудь ключом. Нам нужно передать сообщение какому нибудь знакомому, но для того чтобы он расшифровал сообщение ему нужен ключ. А значит нам нужно отправить еще и ключ. Но если какой-нибудь человек перехватит сообщение и ключ, то он сам сможет его расшифровать и вся секретность пропадет. Вот эта проблема передачи ключа и называется проблемой распределения ключей. Раньше она решалась передачей сообщения по надежному источнику, например курьером, или при встрече отправителя и получателя. Почему бы тогда просто не передавать сообщения по такому же источнику? Есть несколько причин.
1. Обычно ключ намного короче сообщения.
2. Можно заранее передать много ключей и договориться, какой ключ когда использовать. (Например передать по одному ключу на каждый день месяца).
3. Обычно в зашифрованных сообщениях содержится срочная информация, а, используя ключи, ее можно быстро пересылать по открытым каналам связи, которые могут прослушиваться злоумышленниками (например, радио).
Раньше считалось, что для шифрования и расшифровки сообщения необходимо использовать одни и те же ключи, которые должны находится и у отправителя и у получателя. Но в прошлом веке человек по фамилии Диффи придумал , как обойтись без передачи ключей.
Представим, что вам необходимо переслать обычное, бумажное письмо вашему другу и вы очень хотите, чтобы это письмо никто, кроме его не смог прочитать. Вы кладете письмо в железный ящик, вешаете на него замок, ключ от которого есть только у вас, и отправляете ящик почтой, ключ оставив у себя. Ваш друг получает ящик, вешает на него еще один замок, но уже свой, и отправляет ящик обратно вам. Вы снимаете свой замок и на нем остается только замок вашего друга, который может открыть только он сам. Вы снова отправляете ящик, друг его получает, снимает замок и читает сообщение.
В этом примере ключ от вашего замка всегда находился только у вас, а ключ друга, находился только у него. Поздравляю, вы передали сообщение без передачи ключей.
Но у этого способа есть маленький минус. Он абсолютно бесполезен в криптографии. Если вы зашифруете сообщение каким-нибудь сложным шифром, а потом зашифруете получившееся сообщение еще раз, то для того, чтобы расшифровать сообщение, вам сначала нужно снять второй шифр, а потом уже первый, иначе вместо сообщения получится бессмысленный набор символов. Можете представить, что вместо того, чтобы повесить второй замок, ваш друг положит ящик в еще один огромный ящик и запрет его. Но с простыми шифрами (например шифр Виженера или Цезаря, которые описаны в прошлом посте) это работает.
Несмотря на свою практическую бесполезность, этот шифр дал людям надежду, что обойти проблему распределения ключей возможно, и уже через несколько лет тот же человек (Уитфилд Диффи) придумал криптографию с открытым ключом.
Ее смысл заключается в том, что используются разные ключи: открытый для шифрования и закрытый для расшифровки. Представьте, что вы выкладываете на своей странице (или где угодно еще) свой открытый ключ, и если кто-то захочет вам написать секретное сообщение, то он зашифрует его этим ключом и отправит вам. Весь фокус состоит в том, что этим же ключом сообщение не возможно расшифровать. То есть, даже если кому-то удастся перехватить сообщение, и он найдет на вашей странице открытый ключ, то он ничего не сможет сделать. Когда вы получаете зашифрованное сообщение, вы расшифровываете его с помощью своего закрытого ключа, который держите в секрете.
Если же вы захотите отправить сообщение другу, то вы находите на его странице его открытый ключ, и повторяете тоже самое.
Если для расшифровки и шифровки используется один и тот же ключ, то это называется симметричным шифрованием. А если используются разные ключи (как в прошлом примере), то это асимметричное шифрование
Тем не менее несколько лет все это было лишь теорией, потому что никто не мог придумать как это реализовать.
Позже был создан алгоритм RSA, который является первым криптографическим алгоритмом с открытым ключом. Несмотря на то, что он был создан 40 лет назад, он до сих пор часто используется в современном мире (в том же телеграмме например). Кстати, первые современные шифры были созданы в Америке в 70-емидесятых годах, что очень пугало и нервировало правительство, так так все открытые каналы связи прослушивались. (с целью предотвращения терроризма, конечно же)
Алгоритм RSA основан на идее, что очень сложно найти множители, при умножении двух простых чисел. Например, любой человек легко сможет умножить числа 484215467 и 184354673 на калькуляторе. Но вот найти множители получившегося числа (89267384080327291) очень сложно. Если вам нечего делать, то можете сами попробовать найти множители подобного числа (например, 408598071611857). Подробнее о RSA я писать в этом посте не буду, так как это бы увеличило размер поста вдвое.
Минусом RSA является его низкая скорость шифрования, поэтому его часто применяют вместе с симметричным шифрованием. Сначала информация шифруется шифром с закрытым ключом, а потом ключ шифруется с помощью RSA.
PS Я сделал полезное приложение для андроид, вы не будете против, если я о нем расскажу?