La criptografía moderna se caracteriza por usar complejos algoritmos para el cifrado de la información. Esos algoritmos se agrupan en varias familias entre las que se encuentran los algoritmos simétricos y asimétricos. En este artículo se explican los algoritmos AES y GOST.
Los algoritmos simétricos y asimétricos se explican en el artículo Conceptos generales para estudiar la criptografía.
Los principios de seguridad de los algoritmos simétricos de la criptografía moderna son similares a los de la criptografía clásica. Mediante las sustituciones y permutaciones se logra un alto nivel de difusión y confusión en el mensaje cifrado, solo que ahora todo ocurre a nivel de bits. Cuando se logra elevados niveles de confusión y difusión en el mensaje cifrado este adquiere una apariencia aleatoria y dificulta el criptoanálisis.
En los algoritmos simétricos modernos se utilizan operaciones de cálculo a nivel de bits ya que su velocidad de ejecución por los microprocesadores actuales es muy alta. Una de las más empleadas es el XOR. Esa función tiene la característica de que la salida es del mismo tamaño que la entrada y facilita la gestión del espacio en memoria necesario para utilizarla.
Los algoritmos simétricos modernos se agrupan en dos grandes familias. Los cifradores de flujo y los cifradores en bloque.
Cifradores de flujo
El funcionamiento de estos algoritmos consiste en realizar un XOR entre los bits del mensaje a cifrar y una secuencia seudo-aleatoria1. La secuencia es generada a partir de una clave o “semilla” aleatoria y un proceso que permite reutilizar y combinar los bits para aumentar el tamaño de la misma. Luego al realizar un XOR entre el mensaje y la secuencia seudo-aleatoria el resultado es visiblemente aleatorio y por lo tanto difícil de criptoanalizar.
En estos algoritmos lo complejo es generar la secuencia seudo-aleatoria que se utiliza para cifrar. Para ello una práctica es utilizar registros retroalimentados, que realizan operaciones matemáticas entre los bits ya generados a partir de la semilla y se obtienen nuevos bits para el cifrado. Esos registros generadores deben tener propiedades en el diseño que impidan que a partir de la secuencia generada se pueda deducir la semilla. Si conocer la semilla tampoco debe ser posible definir los próximos bits que se van a generar.
A partir de una semilla y un algoritmo siempre se va a generar la misma secuencia. En los cifradores de flujo la semilla es secreta y conocida por ambos extremos de la comunicación.
1 Seudo-aleatorio: Es una secuencia generada con apariencia aleatoria pero puede tener modificaciones como por ejemplo la eliminación de rachas de 1 o 0. También puede ser generada a partir de una semilla aleatoria mediante operaciones matemáticas. Debe mantener niveles de aleatoriedad que dificulten la detección de patrones.
Cifradores en bloques
Lo cifradores de bloques dividen el mensaje a cifrar en varios bloques de bits. Luego cifran cada bloque por separado. Dividir el mensaje en bloques y cifrar cada uno de forma independiente posibilita que se pueda cifrar cualquier mensaje sin importa el tamaño.
En dependencia del algoritmo que se utilice puede variar el tamaño del bloque a cifrar. En un cifrado todos los bloques van a tener el mismo tamaño. Si la longitud mensaje no es exactamente en múltiplo del tamaño del bloque entonces el último bloque se rellena para cubrir el tamaño especificado. Eso puede provocar que el mensaje cifrado sea ligeramente más grande que el mensaje original.
Comparación entre cifradores de flujo y cifradores en bloques
Los cifradores de flujo requieren poca capacidad de procesamiento y son útiles cuando el canal de comunicación puede provocar perdida de información o interferencia. Su principal limitación se debe a que con una semilla se puede cifrar un mensaje de tamaño limitado.
En los cifradores de bloque si se daña o modifica un bloque no se puede obtener el mensaje original mientras que en los de flujo solo se pierde la secuencia de bits afectada. Teniendo la clave es posible reconstruir el resto del mensaje.
Los cifradores de flujo se utilizan principalmente en componentes de hardware con pocos recursos de memoria o en comunicaciones con mucha interferencia y riesgo de pérdida de información.
Los cifradores de bloques requieren mayor capacidad de procesamiento y principalmente memoria RAM. Las computadoras modernas generalmente cuentan con los requisitos necesarios para su ejecución y corren bien en arquitecturas de 32 bits. Su principal ventaja es que permiten con una clave pequeña cifrar grandes volúmenes de datos. Son los más utilizados en la actualidad.
Resumen
Esta tabla resume algunas de las características de ambas familias de algoritmos:
Ilustración 1: Algunas diferencias entre cifradores de flujo y cifradores en bloque
A continuación se va a explicar el funcionamiento de 2 algoritmos de cifrado en bloques que actualmente se consideran seguros y representan estándares de cifrado internacionales. Se expondrá en qué se basa su seguridad y cómo deberían utilizarse.
De forma general para el diseño de un cifrador en bloque se tienen en cuenta 4 funciones
- Transformación inicial: realizan transformaciones para aleatorizar el texto a cifrar y ocultar bloques de datos que contengan solo 0 o 1.
- Función criptográfica iterada N veces: Se aplica una función no lineal compleja que su resultado depende de los datos y de la clave. Puede estar compuesta por una operación muy complicada o por muchas operaciones simples. Esta función es el núcleo del cifrador.
- Transformación final: Se utiliza para lograr que las operaciones de cifrado y descifrado sean simétricas. Eso permite que el algoritmo se pueda utilizar para cifrar y descifrar.
- Algoritmo de expansión de clave: Esta función permite convertir la clave introducida al algoritmo en una clave más grande. Esa clave se divide en un conjunto de sub claves que van a ser utilizadas en las diferentes rondas de cifrado del bloque.
Cifrador AES “American Encryption Standard”
Como sus siglas lo indican es el Estándar de Cifrado Norte Americano. A partir del envejecimiento del algoritmo DES se realiza un concurso internacional para establecer un nuevo estándar. El ganador del concurso fue el algoritmo Rijndael y fue adoptado como nuevo estándar denominándose AES.
La selección de Rijndael como estándar se debió a su facilidad de implementación a parte de sus características de seguridad. Otros finalistas del concurso que también se consideran seguros y se utilizan actualmente son MARS, RC6, Serpent y Twofish.
Características del AES
- Tamaño de clave variable 128, 192, 256 bits (estándar). Múltiplos de 4 bytes.
- Tamaño de bloques de texto de 4 bytes (128 bits).
- Emplea cajas S similares al DES.
- Numero de rondas variable en dependencia de la longitud de clave que esté utilizando.
Funcionamiento del algoritmo AES
En el algoritmo AES los datos se agrupan en matrices bidimensionales de bytes. Se realizan 4 transformaciones sobre bytes con propósitos específicos. Cada una de esas transformaciones se repiten en cada ronda de cifrado.
Funciones de cifrado
- ShiftRow (Desplazar Fila). Los bytes del bloque a cifrar se colocan en una matriz bidimensional. La función ShiftRow rota las filas de la una cantidad de posiciones definida en el algoritmo. El número de rotaciones depende de la posición de la fila en la matriz.
- MixColumns (Mezcla de columnas). Multiplica los bytes de la matriz dentro del campo de Galois por una determinada matriz.
- ByteSub (sustitución de Byte). Consiste en la sustitución de los Byte aplicando “S-Box” (Caja de sustitución) en paralelo. Una “S-Box” es una función que tiene definido un mecanismo para sustituir un conjunto de bits de entrada por un conjunto de salida. Esta compuesta por una matriz de sustitución y determinas reglas. A partir de la entrada se buscan en la matriz los bits de salida. Los diseños de las “S-Box” deben cumplir con propiedades optimas de no linealidad.
- AddRounKey (Adicionar la clave de la ronda). Es un XOR entre un estado intermedio de texto cifrado y la subclave de la ronda.
Propiedades de seguridad del mensaje cifrado
- Difusión: Este objetivo se cumple con la ejecución de las funciones “ShiftRow” y “MixColumns”.
- Confusión: Se logra mediante la ejecución de la función “ByteSub”. La sustitución de bytes cumple funciones similares a la sustitución de símbolos en los algoritmos de sustitución en la criptografía clásica. “Entendiendo los principios de la criptografía simétrica a partir del estudio varios métodos de cifrado manual“
- Alta dependencia de la clave: Con la ejecución de la función AddRounKey se logra que mensaje cifrado dependa tanto del mensaje claro como de la clave que se utiliza para cifrarlo.
Cantidad de Rondas del AES
En función del tamaño de clave que se esté utilizando en el algoritmo es la cantidad de rondas que ejecuta. Cuando se escoge AES 256 quiere decir que se está usando el algoritmo AES con una clave de 256 bits. A mayor tamaño de clave es más seguro el cifrado pero también requiere más procesamiento y toma más tiempo realizarlo.
El AES por ser un estándar permite varias longitudes de claves para que el usuario lo adapte a sus necesidades.
- 16 bytes (128 bits) = 10 rondas.
- 24 bytes (192 bits) = 12 rondas
- 32 byte (256 bits) = 16 rondas
Secuencia de ejecución del AES para cifrar un bloque de datos
Ilustración 2: Funcionamiento del AES. Fuente.
Pasos realizados durante la ejecución del AES
- A partir de la clave introducida por el usuario se ejecuta una función de expansión de clave donde se calculan las subclaves (Ki) que se van a utilizar en cada ronda de cifrado donde “i” es el número de subclaves.
- La ronda 0 comienza con la función AddRounKey entre la subclave K0 y el bloque a cifrar.
- Luego se ejecuta desde la ronda 1 hasta la penúltima ronda un ciclo donde se ejecutan las transformaciones sobre el bloque a cifrar en el siguiente orden: ByteSub, ShiftRow, MixColumns y nuevamente AddRounKey con la próxima subclave.
- La ronda final de algoritmo ejecuta ByteSub, ShiftRow, AddRounKey.
- Al concluir la última ronda se obtiene un bloque cifrado.
El proceso se repite para cada bloque de bytes hasta cifrar el mensaje completo.
Descifrar con AES
Para descifrar se realiza un proceso similar pero con las funciones inversas a las de cifrado.
Las operaciones de descifrado se realizan:
- InvShiftRow
- InvMixColumns
- InvByteSub
- InvAddRounKey
Cifrador GOST “Government Standard”
El GOST es el estándar de criptografía simétrica del Gobierno Ruso.
Características del algoritmo GOST
- Longitud de llave 256 bits.
- 32 rondas de cifrado.
- Rotación a la izquierda de 11 pasos.
- Es de tipo Feister. Este tipo de algoritmos tienen la característica de dividir el bloque a la mitad, trabajar las dos mitades por separado y luego convinarlas.
- 8 S-Box.
Uso de subclaves
Ilustración 3: Funcionamiento del GOST
- Para cifrar el bloque de datos se divide en 2. Li = Lado derecho y Ri lado izquierdo donde “i” es el número de la iteración.
- Ri se suma módulo 32 con la subclave de la iteración.
- Los bits del bloque de salida son sustituidos utilizando 8 S-box en paralelo similiar a como sucede con el AES.
- La salida se le realiza una rotación de 11 posicione a la izquierda.
- Al bloque resultante se le realiza un XOR con la otra mitad Li.
- En la próxima iteración se invierten los bloques y se realiza el mismo proceso hasta llegar a la iteración 32.
Al terminar se unen las 2 mitades y queda el bloque cifrado.
Propiedades de seguridad del mensaje cifrado
- Difusión: Se logra rotando los bits 11 posiciones a la izquierda.
- Confusión: Se logra mediante la sustitución de los bits en las S-box.
- Alta dependencia de la clave: Se logra con la suma módulo 32 entre los bits de la subclave y la mitad del bloque en cada una de las iteraciones.
Comparación entre los algoritmos AES y GOST
Conclusiones
Como se puede apreciar el algoritmo AES es más flexible en cuando al número de rondas y la longitud de la clave. Eso lo hace más adaptable a diferentes especificaciones de hardware. Al utilizar calves más pequeñas funciona más rápido, requiere menos recursos pero es más inseguro. Al aumentar la longitud de clave aumenta su seguridad pero requiere mayor capacidad de procesamiento.
El GOST es menos flexible, está diseñado para operar con los estándares más altos de seguridad.
Actualmente se considera seguro tanto el AES como el GOST utilizando la longitud de clave de 256 bits. Utilizarlo con una longitud de clave mayor puede provocar que se muy lenta su ejecución y con una menor no se considera inseguro.
Hay software como el veracrypt que permite combinar varios algoritmos de cifrado. Esa es una buena práctica para proteger la información.
Si el software que utiliza no permite crear varias capas de cifrado entonces puede combinar varias herramientas. Cifrar primero con una herramienta utilizando un algoritmo y el resultado cifrarlo con otra utilizando otro algoritmo. Para descifrar debe realizar el proceso en orden inverso.
A parte de los algoritmos explicados también se pueden usar otros como el MARS, RC6, Serpent y Twofish pero siempre con una clave no menor a los 256 bits.