# Protocolo de Needham-Schroeder

El protocolo de Needham-Schroeder se refiere a uno de los dos protocolos de comunicación para uso sobre una red insegura, ambos propuestos por Roger Needham y Michael Schroeder en un artículo en 1978. Ellos son:
* El protocolo de clave simétrica de Needham-Schroeder, basado en un algoritmo de cifrado simétrico. Forma la base del protocolo Kerberos. El objetivo de este protocolo es realizar una autenticación mutua y establecer una clave de sesión aleatoria entre las dos partes, normalmente para proteger la comunicación subsecuente.
* El protocolo de clave pública de Needham-Schroeder, basado en un criptografía asimétrica. Su objetivo es brindar autenticación mutua entre dos partes que se comunican a través de una red, pero en su forma propuesta es inseguro.

## El protocolo simétrico

En este caso, Alice (A) inicia una comunicación con Bob (B). De esta manera,
* S es un servidor confiado por ambas partes
* K$_{AS}$ es una clave simétrica que conocen solo A y S
* K$_{BS}$ es una clave simétrica que conocen solo B y S
* N$_A$ y N$_B$ son nonces
El protocolo puede especificarse mediante la notación de protocolos de seguridad de la siguiente manera:
$A\rightarrow S:A,B,N_{A}$
    Alice le envía un mensaje al servidor identificándose a sí misma y a Bob, diciéndole al servidor que quiere comunicarse con Bob.
$S\rightarrow A:\{N_{A},K_{AB},B,\{K_{AB},A\}_{K_{BS}}\}_{K_{AS}}$
    El servidor genera la clave ${K_{AB}}$ y se la envía a Alice, cifrada usando ${K_{BS}}$, para que Alice se la envíe a Bob, y una copia de la clave para ella. Dado que Alice puede estar solicitando claves para usar con distintas personas, el nonce le garantiza a Alice que el mensaje es reciente y que el servidor está respondiendo a un determinado mensaje y la inclusión de Bob le dice a Alice con quién debe compartir esta clave.
$A\rightarrow B:\{K_{AB},A\}_{K_{BS}}$
    Alice le reenvía la clave a Bob, quien la puede descifrar con la clave que él comparte con el servidor, autenticando así esta información.
$B\rightarrow A:\{N_{B}\}_{K_{AB}}$
    Bob le envía a Alice un nonce cifrado usando ${K_{AB}}$ para demostrarle que él obtuvo la clave.
$A\rightarrow B:\{N_{B}-1\}_{K_{AB}}$
    Alice realiza una operación sencilla sobre el nonce (Ej. restarle 1), lo vuelve a cifrar y se lo envía de vuelta a Bob, para que él verifique que ella existe y que obtuvo la clave también.
Para que este protocolo pueda ser usado, es necesario exigir que el método de cifrado usado no sea maleable. Esto se debe a que si el cifrado es maleable entonces el último paso, la comprobación de que Alice conoce la clave realizando un cifrado sobre el nonce, no es válida. Si por ejemplo el cifrado es one-time-pad y N es impar, cualquiera puede hallar el $\{N_{B}-1\}_{K_{AB}}$ simplemente cambiando el último bit.
Este protocolo es vulnerable a un ataque de replay. Si un atacante almacena los mensajes de este protocolo y luego descubre el valor K$_{AB}$ que fue usado, puede volver a enviarle el mensaje $\{K_{AB},A\}_{K_{BS}}$ a Bob, quien lo aceptará y no será capaz de decir si la clave es reciente o no (a no ser que lleve un registro de todas las claves que él usó). Este fallo se resuelve en el protocolo Kerberos mediante la inclusión de un timestamp.

## El protocolo de clave pública

Este protocolo asume el uso de un algoritmo de cifrado de clave pública.
En este caso, Alice (A) y Bob (B) interactúan junto con un servidor de confianza (S) para la distribución de claves públicas a pedido. Estas claves son:
* K$_{PA}$ y K$_{SA}$, las mitades pública y privada respectivamente de un par de claves de cifrado de A
* K$_{PB}$ y K$_{SB}$, idem para B
* K$_{PS}$ y K$_{SS}$, idem para S. (Nótese que en este caso K$_{SS}$ se usa para cifrar y K$_{PS}$ para descifrar).
El protocolo se desarrolla de la siguiente manera:
$A\rightarrow S:A,B$
    A le solicita a S la clave pública de B.
$S\rightarrow A:\{K_{PB},B\}_{K_{SS}}$
    S responde con la identidad de B junto con K$_{PB}$ para constatar.
$A\rightarrow B:\{N_{A},A\}_{K_{PB}}$
    A inventa N$_A$ y se lo envía a B.
$B\rightarrow S:B,A$
    B solicita la clave pública de A.
$S\rightarrow B:\{K_{PA},A\}_{K_{SS}}$
    El servidor responde.
$B\rightarrow A:\{N_{A},N_{B}\}_{K_{PA}}$
    B inventa N$_B$ y se lo envía a A junto con N$_A$ para demostrar su capacidad de poder descifrar con K$_{SB}$.
$A\rightarrow B:\{N_{B}\}_{K_{PB}}$
    A le confirma N$_B$ a B para demostrar su capacidad de poder descifrar con K$_{SA}$.
Al final del protocolo, A y B conocen la identidad del otro, N$_A$ y N$_B$. Estos nonces son desconocidos para oyentes furtivos.

### Ataques al protocolo

Desafortunadamente, este protocolo es vulnerable al ataque Man-in-the-middle. Si un impostor I es capaz de persuadir a A para que inicie una sesión con él, este puede reenviar los mensajes a B y hacerle creer a B de que se está comunicando con A.
Ignorando el tráfico desde y hacia S, que no varía, el ataque se desarrolla de la siguiente manera:
$A\rightarrow I:\{N_{A},A\}_{K_{PI}}$
    A le envía N$_A$ a I, quien descifra el mensaje con K$_{SI}$.
$I\rightarrow B:\{N_{A},A\}_{K_{PB}}$
    I le reenvía el mensaje a B, haciendo de cuenta que es A quien se está intentando comunicar.
$B\rightarrow I:\{N_{A},N_{B}\}_{K_{PA}}$
    B le envía N$_B$.
$I\rightarrow A:\{N_{A},N_{B}\}_{K_{PA}}$
    I se lo reenvía a A.
$A\rightarrow I:\{N_{B}\}_{K_{PI}}$
    A descifra N$_B$ y se lo confirma a I, quien pasa a conocerlo.
$I\rightarrow B:\{N_{B}\}_{K_{PB}}$
    I vuelve a cifrar N$_B$, y convence a B de que él lo ha descifrado.
Al final del ataque, B cree erróneamente de que A se está comunicando con él y que N$_A$ y N$_B$ son conocidos únicamente por A y B.
El ataque fue descrito por primera vez en un artículo en 1995 por Gavin Lowe. El artículo describe también una versión arreglada del esquema, al cual se lo llama el protocolo de Needham-Schroeder-Lowe.