# Conjunto de cifrados

Un conjunto de cifrados, una suite de cifrado o una suite criptográfica (en inglés: cipher suite) es un conjunto de algoritmos que permiten cifrar una conexión de red.
Los conjuntos de cifrados utilizan generalmente el protocolo de comunicación Transport Layer Security (TLS) o su predecesor obsoleto Secure Socket Layer (SSL), y suelen estar compuestos por un algoritmo de intercambio de claves, un algoritmo de cifrado masivo y un algoritmo de código de autenticación de mensaje (MAC). El algoritmo de intercambio de claves se emplea para intercambiar una clave entre dos dispositivos. Esta clave se utiliza para cifrar y descifrar los mensajes que se envían entre dos máquinas. El algoritmo de cifrado masivo se utiliza para cifrar los datos que se envían. El algoritmo de MAC proporciona comprobaciones de integridad de los datos para asegurar que estos permanecen inalterados en tránsito. Además de estos, una suite criptográfica puede incluir firmas y un algoritmo de autenticación para facilitar la autenticación del servidor o del cliente.
Existen cientos de suites de cifrado que a su vez contienen distintas combinaciones de estos algoritmos. Algunas suites ofrecen mejor seguridad que otras. Sin embargo, con la adopción de TLS 1.3, solo cinco suites cuentan con soporte y definición oficial.
La estructura y el uso del conjunto de cifrados están definidos en el documento de especificación de TLS. TLS 1.2 es la versión más extendida de TLS. La última versión, TLS 1.3, incluye requisitos adicionales a los conjuntos de cifrados. Los conjuntos definidos para TLS 1.2 no se pueden utilizar en TLS 1.3 y viceversa, salvo que se especifique lo contrario en su definición. El Registro de Conjuntos de Cifrados de TLS (TLS Cipher Suite Registry) proporciona una lista de referencia de conjuntos de cifrado.

## Historia

El uso de cifrados ha formado parte del protocolo Secure Socket Layer (SSL) desde su creación. SSL ha sido sustituido en gran medida por TLS. Sin embargo, el nombre cipher suite no se utilizó en el esbozo original de SSL. En lugar de eso, la capacidad de un cliente y de un servidor de escoger entre un pequeño conjunto de algoritmos de cifrado se denominó cipher choice («elección de cifrados»). No fue hasta el lanzamiento de SSL v3, la última versión de SSL, que se empezó a usar la denominación cipher suite. Desde entonces, todas las versiones de TLS han empleado este nombre en su estandarización. El concepto y propósito de una suite de cifrado no ha cambiado desde que se acuñó el término. Se utilizó, y se sigue utilizando, como una estructura que describe los algoritmos para los que una máquina tiene soporte de forma que dos máquinas puedan acordar qué algoritmos utilizar para asegurar su conexión. Lo que sí ha cambiado son las versiones de los algoritmos con soporte en los conjuntos de cifrados. Cada nueva versión de TLS ha añadido soporte para las versiones más robustas de los algoritmos y ha dejado de dar soporte a las versiones que se han identificado como inseguras.
TLS 1.3 establece un cambio en la manera en que las suites de cifrado se coordinan entre máquinas. La suite de cifrado escogida para que dos máquinas se comuniquen se determina en el proceso de establecimiento de comunicación (handshake). Se hicieron cambios en TLS 1.3 para reducir el número de mensajes que deben enviarse en el proceso, lo que permite reducir el procesado y el tráfico de paquetes y aumentar la eficiencia respecto de versiones anteriores de TLS.

## Nomenclatura

Cada conjunto de cifrados tiene un nombre único que se emplea para identificarlo y para describir sus contenidos algorítmicos. Cada uno de los segmentos de un conjunto de cifrados se refiere a un algoritmo o protocolo.
Un ejemplo es el nombre TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cuyo significado se detalla a continuación:
* TLS define el protocolo para el que está destinado este conjunto de cifrados, que normalmente será TLS;
* ECDHE indica el algoritmo de intercambio de claves;
* RSA indica el método de autenticación empleado en el establecimiento de comunicación;
* AES es el cifrado de sesión;
* 128 es el tamaño (en bits) de la clave de cifrado de sesión;
* GCM indica el tipo de cifrado (dependencia de bloques de cifrado y opciones adicionales);
* SHA es el código de autenticación de mensaje (MAC);
* 256 es el tamaño (en bits) del digesto o hash.

## Coordinación de conjuntos de cifrados

Para poder usar un conjunto de cifrados, el cliente y el servidor deben ponerse de acuerdo en el conjunto específico de cifrados que se va a usar en el intercambio de mensajes. Tanto el cliente como el servidor tienen que poder usar el conjunto acordado. Si el cliente y el servidor no se ponen de acuerdo, no se podrá realizar la conexión. El proceso de selección tiene lugar durante el protocolo de establecimiento de comunicación o handshake de TLS, aunque el protocolo de TLS 1.3 difiere del utilizado en versiones anteriores de TLS/SSL.
Se puede utilizar un escáner de SSL/TLS para comprobar qué cifrados TLS soporta un servidor.

### Establecimiento de comunicación de TLS 1.0-1.2

El cliente empieza el proceso enviando un mensaje clientHello (literalmente, el «hola» del cliente) al servidor que incluye la versión de TLS en uso y una lista de conjuntos de cifrados en el orden de preferencia del cliente. En respuesta, el servidor envía un mensaje serverHello (el «hola» del servidor) que incluye el conjunto de cifrados escogido y el identificador de sesión. A continuación, el servidor envía al cliente un certificado digital para verificar su identidad. El servidor también puede solicitar al cliente su certificado digital.
Si el cliente y el servidor no están utilizando claves precompartidas, entonces el cliente envía un mensaje cifrado al servidor que permite al cliente y al servidor calcular qué clave secreta se utilizará durante los intercambios.
Tras verificar con éxito la autenticación del servidor y, en caso necesario, intercambiar la clave secreta, el cliente envía un mensaje finished («terminado») para indicar que ya ha concluido el proceso de establecimiento de comunicación. Tras recibir este mensaje, el servidor a su vez envía un mensaje finished para confirmar que el proceso de establecimiento de comunicación está completo. En este momento, el cliente y el servidor están de acuerdo en qué conjunto de cifrados van a utilizar para comunicarse entre sí.

### Establecimiento de comunicación de TLS 1.3

El protocolo de establecimiento de comunicación de TLS 1.3 se ha condensado a un solo viaje de ida y vuelta frente a los dos requeridos por versiones anteriores de TLS/SSL.
En primer lugar, el cliente envía un mensaje clientHello al servidor con una lista de los conjuntos cifrados que soporta en su orden de preferencia, y hace una estimación de qué algoritmo de clave se está utilizando para poder enviar una clave secreta si es necesario. Al hacer esta suposición, elimina un viaje de ida y vuelta.
Tras recibir el clientHello, el servidor envía un serverHello con su clave, un certificado, el conjunto de cifrados escogido y el mensaje finished. Al recibir el mensaje finished del servidor, el cliente ya está coordinado con el servidor con el conjunto de cifrados que van a utilizar.

## Algoritmos permitidos
### En TLS 1.0-1.2

| Intercambio de claves RSA Diffie-Hellman ECDH SRP PSK | Autenticación RSA DSA ECDSA | Cifrados de bloque/flujo RC4 Triple DES AES IDEA DES Camellia ChaCha20 | Autenticación de mensaje MD5 SHA |

### En TLS 1.3

En TLS 1.3, se ha prescindido de muchos algoritmos heredados de versiones anteriores de TLS para hacer el protocolo más seguro. Además, todos los algoritmos de cifrado y autenticación están combinados en el algoritmo de cifrado autenticado con datos asociados (AEAD, por sus siglas en inglés). También se debe utilizar ahora un algoritmo de hash en la derivación de claves basada en HMAC (HKDF). Todos los cifrados que no son AEAD han sido retirados debido a posibles debilidades o vulnerabilidades, y todos los cifrados deben usar un algoritmo de intercambio de claves efímeras para que se puedan generar nuevos pares de claves para cada intercambio.

## DTLS con conjuntos de cifrados

El protocolo Datagram Transport Layer Security (DTLS) está basado en TLS, pero se utiliza específicamente para conexiones UDP en lugar de TCP. Como DTLS está basado en TLS, puede usar la mayoría de los conjuntos de cifrados descritos para TLS. Sin embargo, deben tenerse en cuenta determinados casos especiales al emplear conjuntos de cifrados TLS con este protocolo. DTLS no es compatible con el cifrado de flujo RC4, lo que quiere decir que no se puede utilizar con DTLS ningún conjunto de cifrados TLS que incluya RC4.
Para determinar si un cifrado TLS es compatible con DTLS, no basta con mirar su nombre, ya que todos los conjuntos de cifrados TLS incluirán el identificador «TLS» en su nombre, por ejemplo, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. En cambio, todos los registros de parámetros TLS incluyen actualmente la bandera DTLS-OK para indicar si un conjunto de cifrados es compatible con DTLS.

## Vulnerabilidades

Un conjunto de cifrados es tan seguro como los algoritmos que contiene. Si la versión del algoritmo de cifrado o de autenticación de un conjunto de cifrados tiene vulnerabilidades conocidas, el conjunto de cifrados y la conexión TLS podrán entonces ser vulnerables. Por ello, un ataque habitual contra TLS y conjuntos de cifrados es el ataque de degradación (downgrade attack). La degradación de TLS se produce cuando un cliente moderno se conecta con un servidor que usa versiones anticuadas de TLS o SSL.
Al iniciar el establecimiento de comunicación o handshake, el cliente ofrecerá el protocolo más avanzado que pueda utilizar. Si la conexión falla, volverá a intentarlo con un protocolo inferior como TLS 1.0 o SSL 3.0 hasta que tenga éxito la comunicación con el servidor. El propósito de la degradación es que las nuevas versiones de TLS sean compatibles con versiones anteriores. Sin embargo, es posible que un atacante se aproveche de esta característica y haga que un cliente degrade automáticamente su protocolo de seguridad a una versión de TLS o SSL que admita conjuntos de cifrados que contengan algoritmos conocidos por su falta de seguridad y sus vulnerabilidades. Esto ha dado lugar a ataques tales como POODLE.
Una forma de evitar este fallo de seguridad es deshabilitar la capacidad de un servidor o cliente degrade su protocolo a SSL 3.0. El inconveniente de esto es que el hardware reciente no pueda acceder a un hardware más antiguo. Sin embargo, si es necesario el soporte de SSL 3.0 para un hardware antiguo, existe el conjunto de cifrados TLS_FALLBACK_SCSV que verifica que no se fuercen degradaciones para propósitos maliciosos.

## Conjuntos de cifrados para dispositivos limitados

Los algoritmos de cifrado, intercambio de claves y autenticación suelen requerir una gran potencia de procesamiento y memoria. Para poder proporcionar seguridad a dispositivos limitados (constrained devices) en potencia de procesamiento, memoria y duración de la batería como los que alimentan la Internet de las cosas, existen conjuntos de cifrado específicamente elegidos como los dos siguientes ejemplos:
* TLS_PSK_WITH_AES_128_CCM_8 (clave precompartida)
* TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 (clave pública en bruto)
Cada uno de estos conjuntos de cifrados está implementado para poder utilizarse en dispositivos con limitaciones en potencia de procesado y memoria. Ambos están implementados en el proyecto de fuente abierta TinyDTLS. Las implementaciones de la suite con clave precompartida apenas utilizaron 1889 bytes de memoria RAM y 38366 de memoria flash, mucho menos que la mayoría de algoritmos. Los algoritmos han sido probados como seguros, aunque pueden no ser tan seguros como alternativas con mayores necesidades de recursos; por ejemplo, usan cifrado de 128 bits en lugar de cifrado de 256. Además, utilizan claves precompartidas o claves públicas en bruto, lo que requiere de menos memoria y potencia que la infraestructura de clave pública (PKIX) tradicional.