Hay dos tipos de criptografía. Simétrico y asimétrico.
En Simétrico , la misma clave se usa en ambas partes para cifrar / descifrar los datos. Los ejemplos incluyen el algoritmo AES. Si el MITM conoce la clave simétrica utilizada por el cliente y el servidor, puede descifrar fácilmente los mensajes.
En Assymetric , se utiliza un par de claves públicas y privadas.
Una forma de llegar a un secreto común utilizando la criptografía asimétrica es la siguiente:
El servidor genera un par de claves pub / pri, por ejemplo, utilizando el algoritmo RSA. Pone la clave pública en un certificado y la envía al cliente.
El cliente generará un secreto maestro previo aleatorio y lo cifrará usando la clave pública obtenida del certificado del servidor y enviará el secreto maestro maestro cifrado en el mensaje "intercambio de clave de cliente".
El servidor descifra el mensaje cifrado usando su clave privada asociada con la clave pública.
Ahora tanto el servidor como el cliente tienen el mismo secreto pre-maestro. Utilizarán ese y algunos otros valores aleatorios (como clientHelloRandom, serverHelloRandom que se envían en texto sin formato durante el protocolo ClientHello y serverHello) para obtener la misma clave maestra.
Esta clave maestra se utiliza para derivar claves de sesión mediante las cuales los datos de las Aplicaciones se cifran / descifran.
Tenga en cuenta que un MITM no puede hacerse pasar por un cliente porque la clave maestra generada por el cliente legítimo se envía mediante el cifrado con la clave pública. El MITM no puede descifrarlo mientras no conozca la clave privada y solo el servidor la conozca (la clave privada no se comparte). Y como MITM no conoce la clave privada, tampoco puede hacerse pasar por el servidor. .
Por lo tanto, cuando se usa una suite de cifrado como TLS_WITH_RSA_AES128_CBC_SHA, se usa RSA para generar el par de claves pub / pri, se usa DSA para firmar el certificado enviado por el servidor, y una vez que las claves simétricas (mismas) son las claves maestra-secreta y de sesión derivado tanto del cliente como del servidor, se utiliza AES128 (algoritmo de cifrado / descifrado de clave simétrica) para cifrar / descifrar los datos de la aplicación.
Espero que esto aclare.