Так вот! Сервер предоставляет публичный ключ, которым можно только зашифровать, а ключ которым можно расшифровать он держит у себя и не даёт.
Клиент получив публичный ключ, шифрует свой ключ, которым можно как шифровать, так и расшифровывать. Отправляет его серверу, только сервер может его расшифровать, так как только он имеет закрытый ключ. Получив сессионный ключ, сервер обменивается информацией с клиентом как при симметричном шифровании.