Да, сообщение нельзя подделать. Но если ключ приходит тем же путем, что и зашифрованное сообщение, он тоже перехватывается.
Может я в чем-то неправ?
Да, видимо, стоит пояснить чуть подробнее, как работает end-2-end шифрование. Потому что явно видно, что многие не понимают, как вообще можно обмениваться зашифрованной информацией, не передавая вместе с ней ключ расшифровки.
Итак, предположим, что мы с Mike123 начинаем переписываться и обсуждать рецепт новой кулебяки, но при этом не хотим, чтобы нас подслушало мерзкое ФСБ во главе с Путеным, который, как известно, хуйло.
Обмениваемся мы с ним сообщениями в двоичном формате, к примеру. И шифруем сообщения открытыми ключами, а расшифровываем закрытыми. Для этого используем специальную криптопару ключей, которые связаны через определенную последовательность преобразований, так, что применение одного ключа делает невозможным обратное преобразование без знания второго. Для упрощения давайте предположим, что у нас такая математическая операция, для которой нет обратной, зато есть обратный ключ. Т.е. например, у нас есть умножение на некий коэффициент, но не существует деления. И получить обратное исходное число после умножения на коэффициент нельзя, даже зная этот коэффициент. Чтобы получить исходное число, нужно умножить полученный после шифровки результат на второй коэффициент, который дает результат обратный первому.
Т.е. допустим, что у каждого из собеседников генерируется пара чисел. У меня 2 и 0.5, а у Mike123 - 4 и 0.25. Один из ключей (например, 4) Майк пересылает мне. Этим ключом я буду шифровать все сообщения, которые буду отправлять Майку. Это т.н. открытый ключ (
public key). Второй ключ (число 0.25) Майк оставляет себе и никому никуда не передает и не сообщает. Это его личный ключ для расшифровки (
private key). Теперь все сообщения, которые я пишу Майку, я шифрую этим открытым ключом, который он мне переслал. Условно говоря, число, соответствующее коду символа каждой буквы из моего сообщения, я умножаю на коэффициент 4 и полученный набор новых чисел посылаю Майку. Путен может перехватить мое зашифрованное сообщение, отправленное Майку, и даже открытый ключ, который Майк отправил мне для шифровки. Но
расшифровать мое сообщение без второго ключа все равно не может, потому что хуйло.
Ну, и потому что соответствующей обратной операции условного "деления" в нашем преобразовании нет. Есть только "умножение" на обратное число, которое не знает ни Путен, ни все ФСБ, а знает только Майк. И Майк, получив от меня набор зашифрованных чисел, просто "умножает" их на свой секретный ключ и получает исходный набор чисел. Все, сообщение расшифровано!
С моей стороны, как нетрудно догадаться, с ключами происходит та же ситуация. Я пересылаю Майку один из своих ключей (
public key), например 2, а себе оставляю
private key - 0.5. Майк шифрует все сообщения, которые посылает мне, именно этим публичным ключом, который я ему отправил, а я на своей стороне расшифровываю их с помощью моего секретного ключа, который я никому и никуда не посылал, особенно Путену с ФСБ.
ФСБ может тоже перехватывать все зашифрованные сообщения Майка, отправленные мне, и даже тот открытый ключ, который я ему переслал, но расшифровать без второго ключа не может, даже если расшибется в лепешку. Такие дела.
Вот примерно так в общих чертах работает end-2-end шифрование. Нетрудно заметить, что если при таком обмене сообщениями
секретные ключи не покидают устройств и не попадают на сервер, то перехват зашифрованных сообщений на уровне сервера или на любом этапе передачи после зашифровки бесполезен чуть менее, чем полностью. Даже будь хозяин сервера передачи (условный Дуров) самым преданным сотрудником ФСБ, желающим раскрыть секрет нашей с Майком кулебяки, расшифровать наши сообщения, не имея доступа к нашим секретным ключам, он никак не сможет, хоть тресни. Такие дела.