Primero, un punto de terminología: lo que describe es cifrado simétrico , y una clave que se comparte entre los participantes generalmente se conoce como clave secreta; “Clave privada” generalmente significa la parte de una clave en la criptografía de clave pública que solo un participante conoce.
Hay dos formas de difundir una clave secreta: puede transportarse de una manera físicamente segura, o puede transportarse utilizando alguna otra forma de cifrado, comúnmente criptografía de clave pública.
Hay formas de intercambiar una clave secreta que no requiere un canal de comunicación secreto. El más popular es el protocolo de intercambio de claves Diffie-Hellman. El principio de Diffie-Hellman es que cada participante genera su propio par de claves, y hay una operación matemática que construye un gran número a partir de una clave pública y una clave privada. Esta operación matemática tiene una propiedad muy interesante: el gran número puede construirse a partir de la clave privada de Alice y la clave pública de Bob, o de la clave privada de Bob y la clave pública de Alice; obtienes el mismo número de cualquier manera. Entonces, Alice y Bob intercambian sus claves públicas, y ambas partes conocen el gran número, que luego puede usarse como una clave secreta. Un espía puede encontrar ambas claves públicas, pero es imposible¹ encontrar el gran número solo de las claves públicas.
El intercambio de claves Diffie-Hellman permite a dos partes intercambiar un secreto, sin importar quién esté escuchando. Sin embargo, no autentica a Alice a Bob o viceversa. Por lo tanto, es susceptible de un ataque de hombre en el medio : Mallory realiza el intercambio de claves con Alice (que cree que está hablando con Bob) y por separado con Bob (que cree que está hablando con Alice), y así decide o menos sabe el secreto.
Cuando el atacante puede interceptar e inyectar mensajes, se necesita más criptografía para que los participantes se autentiquen entre sí. (Un atacante pasivo significa efectivamente que el protocolo de transporte subyacente proporciona autenticación). La manera fácil es que cada participante ya conozca la clave pública del otro. Si Alice conoce la clave pública de Bob:
- Alice puede autenticar a Bob enviándole un desafío: un valor aleatorio (un nonce ) encriptado con la clave pública de Bob. Si Bob puede descifrar ese valor y devolverlo, Alice sabe que realmente está hablando con Bob.
- Bob puede autenticarse con Alice enviándole un mensaje firmado con su clave pública. Alice verifica la firma para verificar que realmente está hablando con Bob.
Hay muchas variantes que usan uno de estos métodos (u otra variante) en una dirección y el mismo método o uno diferente en la otra dirección, o que se autentican en una sola dirección. Por ejemplo, SSL / TLS (la capa de criptografía para muchos protocolos como HTTPS, SMTPS, IMAPS, etc.) puede usar varias combinaciones de cifrado diferentes y, por lo general, autentica el servidor al cliente, pero opcionalmente también puede autenticarlo. Diffie-Hellman es lento y engorroso para esta aplicación; El algoritmo más ampliamente utilizado con la distribución de claves públicas es RSA .
Por supuesto, Alice y Bob podrían no conocer la clave pública del otro de antemano. Por lo tanto, confían en una cadena de confianza: Bob le envía a Alice su clave pública, junto con una declaración firmada de un tercero que afirma que esta clave es realmente la clave pública de Bob. Esta declaración firmada se denomina certificado y la tercera parte es una autoridad de certificación . El tercero puede ser conocido por Bob, o su identidad puede ser confirmada por un tercero, y así sucesivamente. Eventualmente, esta cadena de confianza (... se vale de Dominique para Charlie, que se hace cargo de Bob) debe llegar a una parte de Ron en la que Bob ya confía, lo que significa que Bob tiene la clave pública de Ron y confía en que Ron solo firme certificados válidos.
Existen protocolos que no dependen de la criptografía de clave pública. En particular, el protocolo Kerberos se usa tanto en redes basadas en Unix como en Windows para establecer conexiones entre un cliente y un servidor. Kerberos usa un servidor de autenticación central llamado centro de distribución de claves (KDC). El KDC debe tener la contraseña del usuario almacenada en una base de datos, y el cliente normalmente le pide al usuario la contraseña. Para evitar exponer la contraseña, el protocolo no usa la contraseña directamente, sino un hash criptográfico o, más generalmente, una función de derivación de clave aplicada a la contraseña.
Con este secreto compartido, el cliente y el KDC establecen un canal seguro y el KDC envía al cliente un "ticket". El ticket contiene una clave de sesión (es decir, una clave secreta recién generada), así como una copia de la clave que se cifra con otra clave simétrica compartida entre el KDC y el servidor con el que el cliente desea contactar. El cliente reenvía esta copia cifrada al servidor. El servidor descifra este mensaje para obtener la clave de sesión y genera un nonce que cifra con la clave de sesión y envía de vuelta al cliente. Luego, el cliente inicia un canal seguro con el servidor, encriptado con la clave de sesión, y comienza mostrando que podría descifrar el nonce: esto autentica al cliente en el servidor. El establecimiento de una sesión Kerberos es una variante del protocolo Needham-Schroeder .
¹ En el sentido de que los criptógrafos se han esforzado mucho, pero la mejor manera en que lo han encontrado requiere una cantidad inalcanzable de potencia informática.