1.4.1 Características del cifrado en flujo y en bloque
Un cifrado en flujo es aquel que se realiza, incrementalmente, elemento a elemento (bits, dígitos, bytes, palabras, etc.). Lo más habitual es combinar el flujo de entrada de texto en claro con un flujo de elementos pseudoaleatorios (flujo clave); para combinar se suele utilizar la operación XOR y para los elementos bits o bytes.
En cualquier caso, el cifrado en flujo se realiza usando una función de transformación variable en el tiempo de manera que el cifrado de cada elemento es dependiente del estado actual en el que se encuentra esa función, por lo que también se conoce como sistema de cifrado de estado o con memoria [67, 84, 87, 91].
Definición 1.41: Cifrador en flujo
Un cifrador en flujo es un criptosistema que aplica una función de transformación variable a elementos individuales del texto en claro.
Un cifrado por bloques es el que opera sobre el texto en claro en grupos de elementos de longitud fija relativamente grandes (de 64, 128 o 256 bits, por ejemplo), llamados bloques, aplicándoles una función de transformación invariante, es decir, se aplica siempre la misma función; por lo que se dice que no poseen memoria, en referencia a que se guarde un estado del que dependa la trasformación, como sucede en un cifrado en flujo.
Definición 1.42: Cifrador en bloque
Un cifrador en bloque es un criptosistema que aplica una función de transformación fija a bloques del texto en claro.
El cifrado en bloque se realiza tomando un bloque de texto en claro como entrada y produciendo un bloque de texto cifrado [53]. El problema de cómo compatibilizar el tamaño de bloque con el tamaño del texto en claro se resuelve con un esquema de relleno y un modo de operación, que forman parte de la especificación completa del criptosistema. El esquema de relleno se refiere a cómo se debe rellenar el texto en claro para que su tamaño sea múltiplo del tamaño del bloque, mientras que el modo de operación determina cómo aplicar repetidamente una operación de cifrado a cantidades de datos de longitud mayor a la de un bloque.
Definición 1.43: Modo de operación
Un modo de operación criptográfico es el algoritmo que utiliza un cifrador en bloque para proveer servicios de seguridad sobre la información, como son la confidencialidad o la autenticidad.
El modo de operación influye en otros aspectos distintos a la seguridad como, por ejemplo, los relacionados con la accesibilidad (aleatoria o secuencial) o la implementación (parametrizable o no). Entre los modos de operación más conocidos están ECB, CBC, PCBC, CFB, OFB o CTR que son algoritmos bien documentados [33, 40, 50, 72, 79]. En la sección 1.5.1 se muestra uno de estos modos que permite usar un cifrador en bloque para cifrar en flujo; ya que, a
pesar de ser conceptualmente distintos, se puede implementar con un cifrador en bloque un cifrado en flujo.
Desde un enfoque funcional, los cifradores en flujo permiten cifrar comunicaciones bit a bit, lo que resulta ideal para sistemas hardware de tiempo real; mientras los cifradores en bloque son más cómodos para implementaciones en software, al trabajar con bloques grandes (palabras del procesador) y evitar la tediosa manipulación de bits de forma individual.
En teoría, los cifradores en flujo son más fáciles de analizar matemáticamente y existe un gran número de publicaciones al respecto, especialmente en el caso de los basados en LFSRs (véase, en la sección 1.2.2.2, la definición 1.26).
1.4.2 Cifrado de Vernam
El esquema más habitual de cifrado en flujo, es el de una transformación mediante la operación XOR del flujo de datos con un flujo clave. A este sencillo esquema se le denomina cifrado de Vernam, y al flujo clave, secuencia cifrante.
Definición 1.44: Secuencia cifrante
Se llama secuencia cifrante 𝑘𝑖 a la secuencia de elementos que opera como
flujo clave en un cifrado de Vernam.
Figura 1.4: Cifrado de Vernam
Definición 1.45: Cifrado de Vernam
Siendo 𝑘𝑖 la secuencia cifrante, 𝑚𝑖 el texto en claro, 𝑐𝑖 el texto cifrado, el
cifrador de Vernam es aquel que combina durante el proceso de cifrado la secuencia cifrante con el texto en claro mediante la operación XOR binaria (⊕):
y de igual forma durante el proceso de descifrado 𝑚𝑖 = 𝑐𝑖⊕ 𝑘𝑖 ,
ya que aplicando dos veces la misma operación XOR se obtiene el texto en claro original
𝑚𝑖 ⊕ 𝑘𝑖 ⊕ 𝑘𝑖 = 𝑚𝑖 .
El esquema creado por Gilbert Vernam para usar en teletipos tenía inicialmente como flujo clave un bucle de cinta de papel. Posteriormente, en colaboración con Joseph Mauborgne, se sustituyó esa cinta por un sistema de claves aleatorias en libretas de un solo uso, cuyas siglas en inglés OTP (One-
Time Pad) dan nombre a la secuencia cifrante ideal. Definición 1.46: OTP (One-Time Pad)
Si una secuencia cifrante de un cifrador de Vernam es una secuencia aleatoria e independiente, se dice que es una OTP.
Claude Shannon demostró en su teoría de la información [91-92], que el cifrado de Vernam con OTP tiene la propiedad que denominó secreto perfecto; es decir, el texto cifrado no aporta absolutamente ninguna información adicional sobre el texto en claro. El inconveniente está en que la secuencia OTP ha de ser tan larga como el texto en claro, así que, el grave problema que supondría distribuir y gestionar las claves tan largas como el propio mensaje, se soluciona en la práctica utilizando un generador pseudoaleatorio para generar la secuencia cifrante. Véase la figura 1.4.
La salida de un generador pseudoaleatorio es una secuencia que, pese a ser completamente determinista y poderse reproducir convenientemente a la hora de descifrar, parece aleatoria para cualquier observador externo. Cuanto más se parezca la secuencia a una secuencia realmente aleatoria, más seguro será el cifrador. La semilla del generador puede interpretarse como clave del cifrador, ya que determina completamente la secuencia cifrante generada.
Así pues, el diseño de un cifrador en flujo que siga el esquema de Vernam, se reduce al diseño de un generador de secuencia cifrante. Éste consiste en un estado interno, una función de salida y una función de siguiente estado. El estado inicial del cifrador es la clave, o depende de ella mediante otra función. A partir del estado actual, se genera una salida determinada usando la función de salida. En cada iteración se obtiene un nuevo estado del cifrador aplicando la función de nuevo estado. Es decir,
𝑒𝑜= 𝑓𝑘(𝐾) 𝑘𝑖 = 𝑓𝑠(𝑒𝑖) 𝑒𝑖+1= 𝑓𝑒(𝑒𝑖) ,
donde 𝑒𝑖 es el estado del cifrador en el instante 𝑖, 𝐾 la clave, 𝑓𝑘 la función de
(1.10)
(1.11)
estado inicial, 𝑓𝑒 la función de nuevo estado y 𝑓𝑠 la función de salida que
proporciona la secuencia cifrante 𝑘𝑖.
1.4.3 Cifradores en flujo síncronos y autosincronizantes
Los cifradores en flujo que siguen el esquema de Vernam usando un generador de secuencia cifrante pertenecen a la clase de cifradores en flujo binarios aditivos [31].
Definición 1.47: Cifrador en flujo binario aditivo
Un cifrador en flujo binario aditivo es un cifrador en flujo síncrono donde el texto en claro, la secuencia cifrante y el texto cifrado son secuencias binarias y la secuencia cifrante y el texto en claro se combinan mediante la operación XOR entre bits.
En la definición de cifrador en flujo binario aditivo aparece un nuevo concepto, el de cifrador en flujo síncrono.
Definición 1.48: Cifrador en flujo síncrono
Un cifrador en flujo síncrono es aquel en que la secuencia cifrante se genera de forma independiente al texto en claro y el texto cifrado.
El proceso de cifrado de un cifrador en flujo síncrono se puede describir de la siguiente forma:
𝑒𝑖+1= 𝑓𝑒(𝑒𝑖, 𝐾) 𝑘𝑖 = 𝑓𝑠(𝑒𝑖) 𝑐𝑖 = 𝑚𝑖 ⊕ 𝑘𝑖 .
donde 𝑒𝑖 es el estado interno en el instante 𝑖, 𝐾 la clave, 𝑓𝑒 la función de nuevo
estado, 𝑓𝑠 la función de salida, 𝑘𝑖 la secuencia cifrante, 𝑚𝑖 el mensaje en claro y 𝑐𝑖 el cifrado.
Los generadores de secuencia cifrante de emisor y receptor han de estar sincronizados. Si uno de ellos se salta un ciclo o se pierde un bit del texto cifrado, entonces el resto del mensaje se descifrará de forma incorrecta. Este inconveniente se convierte en una ventaja frente a inserciones o borrados maliciosos del texto cifrado, ya que provocan una pérdida de sincronía que se detecta inmediatamente.
Lo habitual no suele ser la pérdida de bits, sino su alteración y, en este caso, los cifradores en flujo síncronos también tienen la ventaja de que ese tipo de errores afectan únicamente al bit alterado y no se propagan al resto de bits como le pasa a los cifradores en flujo autosincronizantes.
Definición 1.49: Cifrador en flujo autosincronizante
Un cifrador en flujo autosincronizante es aquel en que la secuencia cifrante se genera como una función de la clave y de un número fijo de elementos del texto cifrado.
El proceso de cifrado de un cifrador en flujo autosincronizante se puede describir de la siguiente forma:
𝑒𝑖 = (𝑐𝑖−𝑝, 𝑐𝑖−𝑝+1, 𝑐𝑖−𝑝+2, … , 𝑐𝑖−1) 𝑘𝑖 = 𝑓𝑠(𝑒𝑖, 𝐾) 𝑐𝑖 = 𝑚𝑖 ⊕ 𝑘𝑖 .
donde p es el número de elementos del cifrado 𝑐𝑖 que constituyen el estado interno 𝑒𝑖 en el instante 𝑖, 𝐾 es la clave, 𝑓𝑠 la función de salida, 𝑘𝑖 la secuencia
cifrante y 𝑚𝑖 el mensaje en claro.
En este caso, como el estado interno depende de los 𝑝 bits previos del texto cifrado, el descifrador se sincronizará automáticamente con el cifrador transcurridos 𝑝 bits.
Este trabajo tiene como objeto un cifrador en flujo síncrono, para más información acerca de los cifradores en flujo autosincronizantes véanse [38, 45, 56, 88].