Criptografía simétrica – Conceptos clave
Hoy hablaremos sobre criptografía simétrica de flujo, de stream, y de cómo se puede lograr la seguridad, en términos de confidencialidad, autenticidad e integridad, utilizando únicamente cifradores simétricos y funciones hash.
Este artículo forma parte de la Serie sobre Criptografía Aplicada publicada en este blog. Pueden visitar el índice de la serie para acceder a todo el contenido.
Anteriormente en esta serie les comenté los conceptos básicos de seguridad informática basados en criptografía. En este artículo nos adentraremos en los conceptos de criptografía simétrica, y cómo se pueden con ella lograr los tres pilares de la seguridad: confidencialidad, autenticidad e integridad.
Criptografía simétrica
Como dijimos, los algoritmos de cifrado simétrico utilizan la misma clave para encriptar y desencriptar datos. Los algoritmos implementan el conjunto de las operaciones matemáticas necesarias para encriptar un texto plano, o desencriptar un texto cifrado, utilizando una clave simétrica.
Si bien las implementaciones de software piden una contraseña de cifrado, no utilizan dicha contraseña directamente. Generan una clave de cifrado de determinada cantidad de bits utilizando de base la contraseña provista, y una función de derivación de clave.
Así, si Alice quiere encriptar un dato:
- Introduce su contraseña.
- Se crea una clave de cifrado derivada de dicha contraseña.
- Se usa dicha clave para encriptar los datos.
- Alice envía los datos cifrados a Bob.
- Bob toma el dato cifrado, introduce la misma contraseña.
- La función de derivación de clave genere la misma clave que Alice.
- Se utiliza esta clave en el algoritmo para desencriptar el dato.
Si bien ya lo hablamos antes, el criptosistema simétrico completo, que representa la comunicación segura entre Alice y Bob, es el siguiente:
Ahora bien, las primitivas de encriptación y de desencriptación pueden o no ser las mismas. Es decir, las operaciones utilizadas entre la clave y el texto plano para generar el texto cifrado pueden coincidir o no con las operaciones utilizadas entre clave junto y el texto cifrado para obtener el texto plano.
Sí, puede marear un poco… veamos un ejemplo.
Criptografía simétrica de stream
Supongamos que queremos cifrar la palabra juncotic
utilizando la clave 0123
. Para ello necesitamos un algoritmo de cifrado. En este caso, supongamos que el algoritmo de cifrado, es decir, el conjunto de tareas que toma un texto plano de entrada, y una clave simétrica, y devuelve un texto cifrado, es la realización de la operación XOR
entre los bits del texto plano y de la clave.
En nuestro caso, si traducimos los caracteres ASCII de la palabra juncotic
a su representación hexadecimal para facilitar la operación de bits, obtenemos lo siguiente:
ASCII: j u n c o t i c
Hexa: 6a 75 6e 63 6f 74 69 63
Si hacemos lo mismo con la clave:
ASCII: 0 1 2 3
Hexa: 30 31 32 33
Ahora, procedemos a hacer el XOR
entre cada valor hexadecimal. Como la clave es más corta que la cadena, vamos a repetirla hasta completar el texto plano:
Texto plano: <strong>j u n c o t i c</strong>
Hexa "juncotic": 6a 75 6e 63 6f 74 69 63
Hexa key "0123" 30 31 32 33 30 31 32 33
XOR: 5a 44 7c 50 5f 45 5b 50
ASCII: <strong>Z D | P _ E [ P</strong>
La cadena ZD|P_E[P
es el texto cifrado, que el origen, Alice le envía a Bob.
Ahora, veamos cómo descifrar el texto y obtener el mensaje original.
En este caso particular, el algoritmo de cifrado, XOR
, es simétrica (no confundir con el concepto de criptografía simétrica en general), por lo que utilizaremos el mismo algoritmo para descifrar el contenido. Hagamos la prueba:
Texto cifrado: <strong>Z D | P _ E [ P</strong>
Hexa: 5a 44 7c 50 5f 45 5b 50
Hexa key "0123" 30 31 32 33 30 31 32 33
XOR: 6a 75 6e 63 6f 74 69 63
Texto plano: <strong>j u n c o t i c</strong>
A este tipo de algoritmos, que cifran pequeñas porciones de dato, como ser bytes, o words, se los denomina cifradores de flujo o de stream.
Hemos utilizado la misma clave para cifrar el texto plano y para descifrar el texto cifrado, y particularmente las primitivas de encriptación y desencriptación de este algoritmo son la misma: la operación XOR
.
Entre los algoritmos de cifrado simétrico de stream más conocidos se encuentran RC4, y Salsa20 y Chacha. En general se trata de algoritmos más eficientes que los de bloque que analizaremos a continuación. Igualmente, por su forma de trabajo, suelen ser más propensos a ataques, por ejemplo, RC4 hoy se considera obsoleto. De esto hablaremos en algún otro artículo.
Criptografía simétrica de bloques
Existen otro tipo de cifradores simétricos que, en lugar de encriptar un flujo continuo de bits, sino que dividen los datos en bloques de igual tamaño. los encriptan obteniendo bloques cifrados, que luego se utilizarán para componer el texto cifrado.
En este caso el texto cifrado se genera encriptando bloques de tamaño fijo del texto plano. Los tamaños comunes de bloque son 128b, 256b, 384b, y 512b.
Estos cifradores generan, a partir de una contraseña y una función de derivación de clave, una clave del tamaño necesario para encriptar un bloque de datos. El tamaño de la clave, así, depende del tamaño del bloque seleccionado.
Veamos un diagrama de cómo se encripta cada bloque de texto plano (M1, M2, …) generando texto cifrado (C1, C2, …) mediante el uso de un algoritmo de encriptación (E) y una clave simétrica. La imagen también muestra el proceso de desencriptación (D).
Los cifradores de bloque dividen la entrada (texto plano) en bloques de tamaño fijo, los encriptan, y generan la salida (texto cifrado). Estos cifradores suelen encadenar las operaciones de cifrado/descifrado de bloques de tal forma que se dificulte el trabajo a un atacante. Esta manera de encadenamiento se denomina modo de operación del algoritmo.
El ejemplo mostrado en el diagrama anterior corresponde con un modo sencillo de encadenamiento denominado ECB (Electronic CodeBook). A continuación enumero algunos modos de operación comunes, que detallaré en un próximo artículo de esta serie.
- ECB – Electronic Code Book
- CBC – Cipher Block Chaining
- CFB – Cipher FeedBack
- OFB – Ouput FeedBack
- CTR – CounTeR
- GCM – Galois Counter Mode
Cada uno de estos modos poseen sus ventajas y desventajas, algunos son paralelizables mientras que otros no, algunos carecen de difusión (propiedad criptográfica) y otros no, etc.
Todos estos temas los analizaré en el siguiente artículo de la serie, y luego pasaremos a la práctica con herramientas como OpenSSH y GnuPG.
Servicios de seguridad con criptografía simétrica
Hemos hablado sobre cifrado y descifrado simétrico, pero, ¿cómo puede usarse esto para lograr seguridad informática? Es decir, ¿cómo puede lograrse confidencialidad, autenticidad e integridad usando cifradores simétricos? Vamos por parte.
Confidencialidad
Este punto es sencillo, ya que resume lo que venimos hablando, el criptosistema.
Si Alice encripta un mensaje utilizando un cifrador simétrico y una clave secreta, y envía el mensaje cifrado a Bob, éste podrá desencriptarlo utilizando el mismo algoritmo y la misma clave secreta que usó Alice.
Con eso logramos confidencialidad de los datos. Un atacante como Eva podría capturar los datos cifrados, y podría conocer los algoritmos utilizados, pero no podrá obtener el texto plano sin la clave secreta.
El problema es: ¿cómo comparten la clave secreta Alice y Bob?
Para ello utilizan mecanismos de intercambio de claves como Diffie-Hellman, pero eso es historia de otro artículo 😛
Autenticidad
Recordemos, la autenticidad implica que Bob, como destinatario del mensaje, pueda verificar que Alice es quien lo envió, y no un atacante como Eva suplantando su identidad.
Para este caso es necesario algo más que un algoritmo de cifrado: funciones HASH o resumen.
A modo de intro, una función hash es una operación matemática unidireccional, que toma un contenido de entrada, y genera una cadena de salida única para ese contenido, y cuya longitud es fija. En otro artículo profundizaré en este tema, ya que da para mucho.
Para llevarlo a tareas linuxeras, ¿quién no ha verificado, mediante MD5 o SHA1, que una ISO de GNU/Linux no se corrompió durante la descarga, antes de quemarla?
Esas operaciones son funciones HASH que siempre generan el mismo valor, de tamaño fijo dependiendo de la función que se use, para el mismo contenido de entrada.
Ahora bien, ¿cómo se combinan las funciones HASH para lograr autenticidad?
Supongamos que Alice quiere enviar un mensaje autenticado a Bob. Si envía el mensaje y el resultado de calcular una función HASH sobre el mismo, Eva podría interceptarlos, modificar el mensaje y recalcular el HASH, de modo que no es de utilidad.
Pero… si sumamos el concepto de clave secreta, como la utilizada para un cifrador simétrico, tenemos la solución.
Supongamos ahora que Alice toma su mensaje original, lo combina con una clave secreta, llamémosle, clave de autenticación, y al conjunto le calcula una función HASH. Luego envía a Bob el mensaje y el resultado del HASH.
El proceso interno no es exactamente así, pero sirve de modo ilustrativo… cuando publique un artículo sobre hashes y hmac profundizaré en este tema.
A ese HASH generado en base a un mensaje y la clave de autenticación se lo denomina Código de autenticación basado en HASH, o HMAC (Hash-based message authentication code). La siguiente imagen ilustra la conformación del mensaje autenticado.
Eva podría interceptar el mensaje y su HASH, pero no podrá modificar el mensaje dado que, al no poseer la clave de autenticación, no podrá generar un HASH válido.
Al igual que en el caso de la confidencialidad, Alice y Bob necesitan compartir una clave de autenticación previo a realizar el intercambio. Esto genera un inconveniente que puede ser solucionado con protocolos de intercambio de claves.
Si Bob puede verificar autenticidad, es decir, Bob recibe el mensaje y el HASH, concatena el mensaje con la clave de autenticación, calcula el HASH y lo compara con el recibido, y ambos coinciden, Bob se asegura que solamente Alice pudo haberlo enviado, ya que es la única que tiene la clave de autenticación válida.
Esto también verifica No repudio. Si Bob puede verificar un HMAC válido enviado por Alice, implica que ella lo generó, ya que es la única que dispone de la clave de autenticación, y no puede desentenderse de eso.
Integridad
Esta última característica se desprende de la anterior.
Si Bob puede verificar el HMAC enviado por Alice, además de validar autenticidad se verifica integridad, es decir, Bob sabe que el mensaje no fue adulterado durante la transmisión, ya sea de manera accidental o intencional.
Seguridad completa con criptografía simétrica
Hemos visto cómo, mediante cifrado, podemos lograr la privacidad, y cómo, usando HMAC, la autenticidad e integridad.
Estos dos mecanismos separados pueden combinarse para lograr seguridad completa, es decir, podría cifrarse el mensaje, y sobre el texto cifrado, calcular el HMAC, cumpliendo todos los requisitos de la seguridad.
Otra forma, calcular el HMAC sobre el texto plano, y luego encriptar el contenido. Las diferentes posibilidades las explico en el artículo sobre el uso de criptografía simétrica en OpenSSL:
OpenSSL y seguridad con cifrado simétrico
Conclusiones
Hemos llegado al final!
Introducimos los conceptos básicos de criptografía simétrica, y dejamos abierta la puerta para nuevas publicaciones, en particular:
Además, la serie continúa con criptografía asimétrica e infraestructura de clave pública.
Veremos más adelante cómo lograr la seguridad con cifrado asimétrico únicamente, o con una combinación de diferentes algoritmos, que es lo que más se usa en la práctica.
Por cierto, si tienen dudas, consultas, comentarios, saben que pueden sumarse a la Comunidad JuncoTIC en nuestro canal y grupo de Telegram, enlazado aquí debajo.
Los espero en la próxima entrega!