CONCEPTOS BASICOS DE CRIPTOGRAFIA
¿Que es criptografia?
Es el arte o ciencia de cifrar y descifrar información utilizando técnicas que
hagan posible el intercambio de mensajes de manera segura que sólo puedan
ser leídos por las personas a quienes van dirigidos.
Una vez que la información ha sido encriptada, puede ser almacenada en un
medio inseguro o enviada a través de una red insegura (como Internet) y aún
así permanecer secreta. Luego, los datos pueden desencriptarse a su formato
original
¿Qué diferencias hay entre los algoritmos simétricos y los asimétricos?
Es el arte o ciencia de cifrar y descifrar información utilizando técnicas
que hagan posible el intercambio de mensajes de manera segura que sólo
puedan ser leídos por las personas a quienes van dirigidos.
Una vez que la información ha sido encriptada, puede ser almacenada en un
medio inseguro o enviada a través de una red insegura (como Internet) y aún
así permanecer secreta. Luego, los datos pueden desencriptarse a su formato
original
¿Qué diferencias hay entre los algoritmos simétricos y los asimétricos?
Los algoritmos simétricos encriptan y desencriptan con la misma llave. Las
principales ventajas de los algoritmos simétricos son su seguridad y su
velocidad. Los algoritmos asimétricos encriptan y desencriptan con diferentes
llaves. Los datos se encriptan con una llave pública y se desencriptan con una
privada, siendo ésta su principal ventaja. Los algoritmos asimétricos, también
conocidos como algoritmos de llave pública, necesitan al menos una llave de
3.000 bits para alcanzar un nivel de seguridad similar al de uno simétrico de
128 bits. Y son increíblemente lentos, tanto que no pueden ser utilizados para
encriptar grandes cantidades de información. Los algoritmos simétricos son
aproximadamente 1.000 veces más rápidos que los asimétricos.
TERMINOLOGIA
La siguiente terminología se usa frecuentemente al examinar cifrados
simétricos.
Cifrados en Bloque: un bloque de cifrado transforma bloques de texto
plano de n-bits a bloques de texto cifrado de n-bits bajo la influencia de
una llave k. En general se asume que la llave es escogida
aleatoriamente, para una llave fija, un bloque cifrado es una biyección,
definiendo una permutación de vectores de n-bits. Cada llave
potencialmente (pero no necesariamente) define una biyección diferente.
Para mensajes de texto plano que exceden un bloque de longitud se
usan varios modos de operación para cifrados en bloque.
Cifrados de Flujo: consiste en una máquina de estados que retorna para
cada transición de estado un bit de información. Este flujo de salida de
bits se llama comúnmente la llave corriente. La encriptación puede ser
implementada solo con darle la exclusividad de la llave corriente al
mensaje de texto plano.
La máquina de estados no es más que un generador de números seudo-
aleatorios. Por ejemplo, podríamos construir una de un cifrado en bloque
encriptando repetidamente su propia salida. Típicamente, se usan
construcciones más elaboradas para cifrados de flujo para obtener una
alta velocidad.
Algunos de los más bien conocidos cifrados de flujo son RC4 y SEAL.
Varios cifrados de flujo se basan en registros de cambio de
retroalimentación lineal (LFSR - Linear-Feedback Shift Registers), tales
como A5/1 usado en GSM. Estos tienen el beneficio de ser muy rápidos
(varias veces más rápidos que los cifrados en bloque usuales).
SSSC (Self-Synchronizing Stream Ciphers - Cifrados de Flujo de
Sincronizado Propio): La clase de cifrados de flujo de sincronizado
propio, convenientemente, tiene la propiedad de que corrige el flujo de
salida después del cambio de bits o aún cuando se pierden bits después
de un corto tiempo (digamos, algunos cientos de bits).
Los SSSCs pueden ser construidos usando cifrados en bloque en una
manera relacionada a CFB. Asuma que ya encriptamos n bits del
mensaje y conocemos ese tanto del texto cifrado (donde dice n nótese la
longitud del bloque del cifrado). Luego, producimos un nuevo bit de llave
de arranque (ver arriba) encriptando los n bits de texto cifrado. Tomamos
un bit de la salida del cifrado para que sea el nuevo bit de la llave de
arranque. Ahora moviendo un bit más podemos iterar este procedimiento
para toda la longitud del mensaje.
El cifrado en bloque usado debe tener un tamaño de bloque
suficientemente largo para evitar ataques de substitución, por ejemplo.
Substitución y transposición: substitución significa reemplazar símbolos o
grupos de símbolos por otros símbolos o grupos de símbolos.
Transposición, por otro lado, significa permutar los símbolos en un
bloque. Ninguna de estas operaciones por si sola provee de suficiente
seguridad, pero mediante su combinación pueden ser construidos
cifrados fuertes. Por una Red de Substitución-Permutación (SPN -
Substitution Permutation Network), nos referimos a un cifrado
compuesto de un número de etapas, cada una involucrando
substituciones y permutaciones. Ejemplos bien conocidos de SPNs son
DES y CAST-128.
S-Boxes:
Tablas de búsqueda que mapean n bits a m bits (donde n y m son
iguales frecuentemente). Hay varias maneras de construir buenas S-
boxes para cifrados, así como varias maneras de medirlas. Algunos
diseñadores usan una aproximación matemática rigurosa al usar
funciones curvilíneas (o relacionadas) para crear S-boxes que puedan
ser probadas como resistentes contra algunos ataques particulares.
Otros diseñadores usan aproximaciones heurísticas, lo cual conduciría a
que las s-boxes sean más difíciles de manejar en pruebas matemáticas,
pero pueden tener beneficios adicionales (como varias opciones
diferentes de implementación).
La S-Box puede ser la única parte no lineal del cifrado. Este es el caso
del cifrado en bloque DES, y de esta manera debe ser considerado
como la parte más importante del algoritmo. De hecho, muchos
consideran a las S-boxes DES tan buenas que las usan en sus propios
diseños (por ejemplo, Serpent).
Redes Feistel:
Una red Feistel es una manera general de construir cifrados en bloque
desde funciones simples. La idea original fue usada en el cifrado en
bloque Lucifer, inventado por Horst Feistel. Muchas variaciones han sido
concebidas de la versión original.
Dicho de manera sencilla, la red Feistel standard toma una función de n
bits a n bits y produce una función inversa de 2n bits a 2n bits. La
función básica sobre la cual se basa la estructura es llamada
comúnmente de redondeo. La propiedad esencial de las redes de Feistel
que las hace tan útiles en diseño de cifrados es que la función de
redondeo no necesita ser invertible, pero la función resultante siempre lo
es.
Si la función de redondeo depende de, digamos, k bits de una llave,
entonces el cifrado Feistel requiere rk bits de la llave donde r es el
número de redondeo usado.
La seguridad de la estructura Feistel no es obvia, pero análisis de DES
han demostrado que es una buena manera de construir cifrados. Es
obligatorio que el cifrado Feistel tenga suficientes redondeos, pero solo
añadiendo más redondeos no siempre garantiza la seguridad.
La operación de tomar la llave de usuario y expandirla en rk bits para los
redondeos de Feistel se llama "key scheduling". Esta operación, no
siempre es lineal, por lo tanto descubrir alguno de los rk bits de las llaves
de redondeo no provee de información directamente sobre la llave actual
del usuario. Existen muchos cifrados que tienen esta estructura básica;
Lucifer, DES, y Twofish, solo para nombrar algunos.
Expansión, Permutación:
Estas son herramientas comúnmente usadas en la mezcla de bits en la
función de redondeo. Son operaciones lineales, por lo que no son
suficientes para garantizar la seguridad. Sin embargo, cuando son
usadas con buenas S-boxes no lineales (como en DES) son vitales para
la seguridad ya que propagan las operaciones no lineales
uniformemente sobre todos los bits.
Operaciones de "corte de bits" (operaciones lógicas XOR, AND, OR,
NOT y permutaciones de bit):
La idea sobre implementaciones de operaciones de corte a cifrados en
bloque se le debe a Eli Biham. Es una práctica común en máquinas de
vectores realizar una operación paralela. Sin embargo, Biham lo aplicó
en máquinas en serie usando registros tan grandes como los que tienen
las computadoras modernas. El término "corte de bits" se le debe a
Matthew Kwan.
Básicamente todos los cifrados en bloque pueden ser escritos a la manera de
"corte de bits", pero operaciones tales como la suma y la multiplicación pueden
volverse muy lentas. Por otro lado, las permutaciones casi son libres tal que
solo requieren nombrar los registros nuevamente y esto puede hacerse a nivel
de código. De esta manera, por ejemplo, en la búsqueda exhaustiva DES
usando técnicas de "corte de bits", uno puede incrementar la llave actual en
una fracción del tiempo que usualmente se necesita para "key scheduling". El
finalista de AES, Serpent está diseñado para ser implementado usando solo
operaciones de "corte de bits". Esto lo hace particularmente eficiente en las
arquitecturas modernas con muchos registros.
TERMINOLOGIA
La siguiente terminología se usa frecuentemente al examinar cifrados
simétricos.
Cifrados en Bloque: un bloque de cifrado transforma bloques de texto
plano de n-bits a bloques de texto cifrado de n-bits bajo la influencia de
una llave k. En general se asume que la llave es escogida
aleatoriamente, para una llave fija, un bloque cifrado es una biyección,
definiendo una permutación de vectores de n-bits. Cada llave
potencialmente (pero no necesariamente) define una biyección diferente.
Para mensajes de texto plano que exceden un bloque de longitud se
usan varios modos de operación para cifrados en bloque.
Cifrados de Flujo:
Consiste en una máquina de estados que retorna para cada transición
de estado un bit de información. Este flujo de salida de bits se llama
comúnmente la llave corriente. La encriptación puede ser implementada
solo con darle la exclusividad de la llave corriente al mensaje de texto
plano.
La máquina de estados no es más que un generador de números seudo-
aleatorios. Por ejemplo, podríamos construir una de un cifrado en bloque
encriptando repetidamente su propia salida. Típicamente, se usan
construcciones más elaboradas para cifrados de flujo para obtener una
alta velocidad.
Algunos de los más bien conocidos cifrados de flujo son RC4 y SEAL.
Varios cifrados de flujo se basan en registros de cambio de
retroalimentación lineal (LFSR - Linear-Feedback Shift Registers), tales
como A5/1 usado en GSM. Estos tienen el beneficio de ser muy rápidos
(varias veces más rápidos que los cifrados en bloque usuales).
SSSC (Self-Synchronizing Stream Ciprés:
Cifrados de Flujo de Sincronizado Propio): La clase de cifrados de flujo
de sincronizado propio, convenientemente, tiene la propiedad de que
corrige el flujo de salida después del cambio de bits o aún cuando se
pierden bits después de un corto tiempo (digamos, algunos cientos de
bits).
Los SSSCs pueden ser construidos usando cifrados en bloque en una
manera relacionada a CFB. Asuma que ya encriptamos n bits del
mensaje y conocemos ese tanto del texto cifrado (donde dice n nótese la
longitud del bloque del cifrado). Luego, producimos un nuevo bit de llave
de arranque (ver arriba) encriptando los n bits de texto cifrado. Tomamos
un bit de la salida del cifrado para que sea el nuevo bit de la llave de
arranque. Ahora moviendo un bit más podemos iterar este procedimiento
para toda la longitud del mensaje.
El cifrado en bloque usado debe tener un tamaño de bloque
suficientemente largo para evitar ataques de substitución, por ejemplo.
Substitución y transposición:
Substitución significa reemplazar símbolos o grupos de símbolos por
otros símbolos o grupos de símbolos. Transposición, por otro lado,
significa permutar los símbolos en un bloque. Ninguna de estas
operaciones por si sola provee de suficiente seguridad, pero mediante
su combinación pueden ser construidos cifrados fuertes. Por una Red de
Substitución-Permutación (SPN - Substitution Permutation Network), nos
referimos a un cifrado compuesto de un número de etapas, cada una
involucrando substituciones y permutaciones. Ejemplos bien conocidos
de SPNs son DES y CAST-128.
S-Boxes:
Tablas de búsqueda que mapean n bits a m bits (donde n y m son
iguales frecuentemente). Hay varias maneras de construir buenas S-
boxes para cifrados, así como varias maneras de medirlas. Algunos
diseñadores usan una aproximación matemática rigurosa al usar
funciones curvilíneas (o relacionadas) para crear S-boxes que puedan
ser probadas como resistentes contra algunos ataques particulares.
Otros diseñadores usan aproximaciones heurísticas, lo cual conduciría a
que las s-boxes sean más difíciles de manejar en pruebas matemáticas,
pero pueden tener beneficios adicionales (como varias opciones
diferentes de implementación).
La S-Box puede ser la única parte no lineal del cifrado. Este es el caso
del cifrado en bloque DES, y de esta manera debe ser considerado
como la parte más importante del algoritmo. De hecho, muchos
consideran a las S-boxes DES tan buenas que las usan en sus propios
diseños (por ejemplo, Serpent).
Redes Feistel:
Una red Feistel es una manera general de construir cifrados en bloque
desde funciones simples. La idea original fue usada en el cifrado en
bloque Lucifer, inventado por Horst Feistel. Muchas variaciones han sido
concebidas de la versión original.
Dicho de manera sencilla, la red Feistel standard toma una función de n
bits a n bits y produce una función inversa de 2n bits a 2n bits. La
función básica sobre la cual se basa la estructura es llamada
comúnmente de redondeo. La propiedad esencial de las redes de Feistel
que las hace tan útiles en diseño de cifrados es que la función de
redondeo no necesita ser invertible, pero la función resultante siempre lo
es.
Si la función de redondeo depende de, digamos, k bits de una llave,
entonces el cifrado Feistel requiere rk bits de la llave donde r es el
número de redondeo usado.
La seguridad de la estructura Feistel no es obvia, pero análisis de DES
han demostrado que es una buena manera de construir cifrados. Es
obligatorio que el cifrado Feistel tenga suficientes redondeos, pero solo
añadiendo más redondeos no siempre garantiza la seguridad.
La operación de tomar la llave de usuario y expandirla en rk bits para los
redondeos de Feistel se llama "key scheduling". Esta operación, no
siempre es lineal, por lo tanto descubrir alguno de los rk bits de las llaves
de redondeo no provee de información directamente sobre la llave actual
del usuario. Existen muchos cifrados que tienen esta estructura básica;
Lucifer, DES, y Twofish, solo para nombrar algunos.
Expansión, Permutación:
Estas son herramientas comúnmente usadas en la mezcla de bits en la
función de redondeo. Son operaciones lineales, por lo que no son
suficientes para garantizar la seguridad. Sin embargo, cuando son
usadas con buenas S-boxes no lineales (como en DES) son vitales para
la seguridad ya que propagan las operaciones no lineales
uniformemente sobre todos los bits.
Operaciones de "corte de bits" (operaciones lógicas XOR, AND, OR, NOT y
permutaciones de bit): La idea sobre implementaciones de operaciones
de corte a cifrados en bloque se le debe a Eli Biham. Es una práctica
común en máquinas de vectores realizar una operación paralela. Sin
embargo, Biham lo aplicó en máquinas en serie usando registros tan
grandes como los que tienen las computadoras modernas. El término
"corte de bits" se le debe a Matthew Kwan.
Básicamente todos los cifrados en bloque pueden ser escritos a la manera de
"corte de bits", pero operaciones tales como la suma y la multiplicación pueden
volverse muy lentas. Por otro lado, las permutaciones casi son libres tal que
solo requieren nombrar los registros nuevamente y esto puede hacerse a nivel
de código. De esta manera, por ejemplo, en la búsqueda exhaustiva DES
usando técnicas de "corte de bits", uno puede incrementar la llave actual en
una fracción del tiempo que usualmente se necesita para "key scheduling". El
finalista de AES, Serpent está diseñado para ser implementado usando solo
operaciones de "corte de bits". Esto lo hace particularmente eficiente en las
arquitecturas modernas con muchos registros.