Un cifrado en Bloque es un cifrado de clave simétrica que divide el mensaje en claro en unidades de un tamaño fijo, “bloques”, y a cada uno de ellos le aplica el algoritmo de cifrado. Este tipo de cifrado no está preparado para codificar información no disponible en su totalidad, problemática derivada de los nuevos sistemas de transmisión de información, teléfono, radio o televisión que es en flujo. Comparados con los cifradores en flujo los de bloque necesitan más recursos computacionales, dado que requieren almacenar datos en memoria y sus operaciones de transformación son más complejas. Diríamos que un buen cifrado en bloque debería comportarse como una función seudoaleatoria (PRF).
Se desaconseja el uso de un cifrado de bloque con un tamaño de n-bits para cifrar más de 2n / 2 bloques con una sola clave. Además, con las capacidades de cálculo actuales cualquier cifrado en bloque de 64 bits con un modo de operación de cifrado convencional y que procese gigabytes de información, no puede cumplir los mínimos de seguridad y se ve expuesto a ataques.
Principios comunes.
Fundamentalmente todos los algoritmos de cifrado en bloque introducen funciones para obtener:
Confusión. Es una transformación que cambia la relación entre las estadísticas del texto cifrado de las del texto plano, ocultando la relación entre el texto cifrado y la clave. Se obtiene con las denominadas Cajas S-Box.
Difusión. Es la propagación de la influencia de un bit de texto simple a muchos bits de texto cifrado con el propósito de ocultar la relación estadística del texto simple. Se obtiene con las denominadas Cajas P-Box.
Rondas. La difusión y la confusión se pueden lograr mediante el uso de cifrados iterados en los que cada iteración es una combinación de cajas-S (Sustitución), cajas-P (Permutación) y otros componentes.
Mezcla y expansión de claves. La mezcla es la parte más simple del algoritmo, este aplica la función XOR a la clave junto a datos del mensaje, obteniendo la nueva. En algunos casos el tamaño de la clave no coincide con el tamaño del bloque, en este supuesto se expande, sin repetirla, para facilitar los cálculos y eficiencia del algoritmo, es como si tuviésemos una Función de Resumen / Hash complementaria.
Características básicas:
- Cuanto mayor tamaño de bloque, mayor seguridad pero menor rapidez.
- Cuanto mayor tamaño de clave, mayor seguridad pero menor rapidez.
- Cuantas más rondas mayor seguridad.
- Cuanto mayor es la complejidad de las sub claves, mayor dificultad de criptoanálisis.
- Cuanto mayor es la complejidad de la función de ronda, mayor dificultad de criptoanálisis.
Tipos de cifrado en bloque.
Los cifrados en bloque actuales se dividen en dos clases:
Cifrados Feistel. Este tipo se basa en la estructura de Feistel, donde se divide un bloque de texto claro en dos o más partes y se realizan diferentes operaciones en estas partes. Ejemplos: 3DES, Blowfish, Camellia, DES, Kasumi, RC5, RC6, TEA, etc.
No Feistel. No hay que explicar mucho, son los no Feistel. Uno de ellos se denomina red de permutación de sustitución (SPN). Estos cifrados convierten los bloques de texto claro utilizando sub claves y diferentes números de rondas en el cifrado. En cada ronda, junto con otras operaciones, se realizan sustituciones (S-Box) y permutaciones (P-Box). Algunos de ellos: AES, PRESENT, SHARK, SQUARE, etc.
Modos de operación.
El modo de operación describe cómo aplicar el algoritmo de cifrado y otras características como el uso del Vector de Inicialización (IV) y el esquema de relleno. Esto es debido a que el cifrado en bloques depende del valor de la clave, de tal forma que si tenemos dos bloques idénticos de texto en claro, obtendríamos después del cifrado dos bloques idénticos cifrados, pista para el atacante y pérdida en el nivel de seguridad del esquema.
Los primeros modos de operación como CBC, ECB, OFB, etc., dejaron de ser seguros al poco tiempo y tuvieron que ser sustituidos por CTR, GCM, XEX y otros. Todos ellos aseguraban la confidencialidad pero no la integridad, para solventar esta problemática surgió el Cifrado en Bloque Autentificado que permiten ambas.
ABC
El ABC (Accumulated Block Chaining) fue propuesto por Lars R. Knudsen en 2.000 basándose en el IGE, es similar a este excepto que los bloques de texto simple se reemplazan primero por una serie de bloques hash. Cada bloque de hash es el XOR del bloque de texto plano actual con una función del bloque de hash anterior. Esa función puede ser la función de identidad, pero la función recomendada es algo más complicada: la rotación queda un bit.
CBC
El modo CBC (Cipher Block Chaining) incorpora un mecanismo de retroalimentación en el cifrado por bloques, significa que la codificación de bloques anteriores condiciona la codificación del bloque actual, por lo que sería imposible sustituir un bloque individual en el mensaje cifrado. Esto se consigue efectuando una operación XOR entre el bloque del mensaje que queremos codificar y el ultimo criptograma obtenido. En cualquier caso, dos mensajes idénticos se codificarían de la misma forma usando el modo CBC. Más aun, dos mensajes que empiecen igual se codificarían igual hasta llegar a la primera diferencia entre ellos, para evitar esto se emplea un vector de inicialización, que puede ser un bloque aleatorio, como bloque inicial de la transmisión. Este vector seria descartado en destino, pero garantiza que siempre los mensajes se codifiquen de manera diferente, aunque tengan partes comunes.
CFB
El modo CFB (Cipher Feedback Mode) utiliza la retroalimentación de segmentos de texto cifrado en los bloques de entrada para el cifrado y así generar segmentos de salida a los que se le aplica un XOR con el texto en claro para producir el cifrado y viceversa. El modo CFB requiere un Vector de Inicialización (IV) como bloque de entrada inicial que no necesita ser secreto, pero debe ser aleatorio.
Éste modo requiere un parámetro entero, denotado L, tal que 1 ≤ L ≤ n corresponde a la longitud en bits que tiene cada segmento de texto cifrado. El valor de L a veces se incorpora al nombre del modo, por ejemplo, CFB-1 bit, CFB-8 bits, … CFB-128 bits.
Los pasos de operación son:
- El primer bloque de entrada es el IV.
- Tomamos el bloque y le ciframos.
- Del cifrado tomamos los L bits más significativos, tenemos L1
- Con L1 y L bits del texto en claro realizamos un XOR, con ello ya tenemos el bloque terminado.
- Los bits menos significativos (n-L) del cifrado se concatenan con los L bits del bloque terminado para formar el siguiente bloque de entrada.
- El bloque terminado es la entrada de la siguiente iteracción (2).
CTR
En 1.979 Diffie y Hellman proponen el modo CTR (Counter). Es otra forma de transformar un cifrado en bloque en cifrado de flujo síncrono similar a OFB, salvo que el estado se cifra para obtener el flujo de clave como un contador mod 2n . CTR cifra un contador incremental para producir un valor intermedio, al que se le aplica un XOR con el texto plano para producir el texto cifrado:
Bci = bi ⊕ CK [ (IV + i) mod 2n ]
a la inversa
bi = Bci ⊕ CK [ (IV + i) mod 2n ]
donde
i = 1, 2, . . .
Bci Bloque cifrado i
bi Bloque de texto claro
K Clave
CK Cifrado con K
IV Vector de Inicialización (IV)
Acciones a tener en cuenta.
La operación […] convierte un entero de n bits a una cadena de n bits.
La probabilidad de éxito de cualquier ataque es a lo sumo 0,5σ (σ – 1) / 2n , bajo el supuesto de que el cifrado es una permutación seudoaleatoria segura (PRP), donde σ es la longitud total del texto cifrado en bloques que obtiene el atacante.
Debemos tener un contador único para cada bloque de texto en claro cuando éstos se hayan cifrado con una misma clave en todos los mensajes.
En la actualidad este modo está reemplazando en gran medida a los modos que necesitan relleno.
ECB
El modo ECB (Electronic Codebook) tiene la capacidad de admitir una clave de cifrado distinta para cada bloque. Tiene el inconveniente de ser ineficiente cuando trata bloques de tamaño pequeño y modos de cifrado idénticos, el resultado para frases idénticas en distintos bloques es el mismo, esto permite un ataque de libro de códigos, donde los patrones de texto simple son obvios, para contrarrestar esta deficiencia se suele agregar bits de relleno aleatorio en cada bloque.
HCBC-HPCBC
No confundir con el banco HSBC, ese que “presuntamente” se dedicaba al blanqueo de dinero procedente del narcotráfico, venta de armas, etc. siendo la mayor lavandería de dinero del mundo.
Hash Cipher Block Chaining (HCBC) y su variante HPCBC fueron propuestas en 2.001 por M. Bellare, A. Boldyreva, L. Knudsen y C. Namprempre. Son una variación de CBC que pretende permanecer segura sin utilizar valores iniciales aleatorios. La versión HCBC1 está diseñada para resistir los ataques de texto simple elegidos y HCBC2 está preparada para resistir los ataques de texto cifrado seleccionados.
Para compensar la falta de aleatoriedad inicial, HCBC utiliza una clave E además de una función adicional de cifrado, esta función H toma un bloque de entrada para HCBC1 y dos bloques para HCBC2, en ambos casos genera un solo bloque. La función H está codificada con una clave diferente a la E y se pueden utilizar dos alternativas para su construcción: basarla en un cifrado en bloque o un a función Resumen o hashing universal.
En contraste con el modo CBC, si un bit de texto cifrado está dañado, el siguiente bloque de texto plano y todos los bloques subsiguientes se dañarán y no se podrán descifrar correctamente.
OFB
El modo OFB (Output Feedback) transforma un cifrado en bloque en un cifrado de flujo síncrono. Este modo utiliza solo la operación de cifrado en bloque. Es una máquina de estados finitos que se inicializa con un Vector de Inicialización (IV). El estado está cifrado y el resultado del cifrado se utiliza como flujo de clave y se devuelve al estado.