Сквозное шифрование в мессенджерах
Сквозное шифрование (E2E) делает так, что даже сервер мессенджера не может прочитать твои сообщения.
Обычное шифрование против сквозного
При обычном шифровании (как в большинстве сайтов) данные защищены по пути до сервера, но на самом сервере они расшифровываются. Значит, владелец сервиса технически может их прочитать. При сквозном шифровании (end-to-end, E2E) сообщение шифруется на устройстве отправителя и расшифровывается только на устройстве получателя. Сервер передаёт лишь нечитаемый шифр-текст.
| Обычное | Сквозное (E2E) | |
| Кто может прочитать | Отправитель, сервер, получатель | Только отправитель и получатель |
| Где расшифровка | На сервере | На устройстве получателя |
Как это устроено
E2E опирается на всё, что мы изучили. У каждого пользователя есть пара ключей: открытый и закрытый. Открытыми ключами устройства обмениваются, договариваются об общем секрете и дальше шифруют переписку. Закрытый ключ никогда не покидает устройство — поэтому сервер физически не имеет ключа для расшифровки.
Покажем идею
Сообщение шифруется ключом, который есть только у двух собеседников. Сервер видит лишь байты:
def device_encrypt(text, key):
return bytes(b ^ key for b in text.encode("utf-8"))
shared = 99 # секрет только у Алисы и Боба
# Алиса шифрует на своём устройстве
ciphertext = device_encrypt("Встречаемся в 18:00", shared)
print("Сервер видит только:", list(ciphertext)[:6], "...")
# Сервер пытается прочитать БЕЗ ключа
server_view = ciphertext.decode("utf-8", "replace")
print("Что разобрал сервер:", server_view[:8])
# Боб расшифровывает на своём устройстве
bob = bytes(b ^ shared for b in ciphertext).decode("utf-8")
print("Боб прочитал:", bob)Вывод:
Сервер видит только: [186, 209, 213, ...] ... Что разобрал сервер: непонятные символы Боб прочитал: Встречаемся в 18:00
Что E2E защищает, а что нет
- Защищает: содержимое сообщений от сервера и злоумышленников в сети.
- Не защищает: метаданные (кто, когда и кому писал — это сервер обычно видит).
- Не защищает: от того, кто получил доступ к самому устройству.
Современные протоколы E2E (например, Signal Protocol) ещё и регулярно меняют ключи, чтобы при утечке одного ключа старая переписка осталась защищённой. Это свойство называют прямой секретностью.