Diferencia entre cifrado de flujo y cifrado de bloque

Leí eso

Un flujo típico Cipher cifra el texto plano un byte a la vez, aunque un cifrado de flujo puede estar diseñado para operar en un bit a la vez o en unidades más grandes que un byte a la vez.

(Fuente: Criptografía y seguridad de red , William Stallings.)

Un cifrado de bloques cifra un bloque a la vez. El bloque puede tener un tamaño de un byte o más o menos. Eso significa que también podemos cifrar un bloque de un byte con la ayuda de un cifrado de flujo como un flujo.

Entonces, ¿cuál es exactamente la diferencia entre un cifrado de flujo y un cifrado de bloque?

Comentarios

  • En mi humilde opinión, muchos conceptos / definiciones no son exactamente claros pero tienen límites en un sentido bastante fluido. Se utilizan como tales porque son convenientes en el discurso donde comúnmente hay contextos apropiados para ayudar a una comprensión más exacta. De ahí que haya despidos. Supongo que una buena analogía con el problema aquí es » un hombre rico » versus » un hombre pobre «.
  • El primer párrafo de la pregunta parece haber sido copiado palabra por palabra de Criptografía y seguridad de red (William Stallings, sección 6.3). Siempre debe atribuir la fuente de cualquier material que copie de fuentes externas; consulte crypto.stackexchange.com/help/referencing .
  • Un cifrado de flujo puede usar o ‘ envuelve ‘ un cifrado de bloque. Por ejemplo, AES SIC se puede utilizar para generar el flujo de claves. El hecho de que el flujo de claves tenga N veces el tamaño del bloque de longitud no tiene ninguna relación con la longitud de los textos cifrados / sin formato

Respuesta

Un cifrado de bloque es una función determinista y computable de $ k $ claves de bits y $ n $ -bit (texto sin formato) bloques a bloques de $ n $ -bit (texto cifrado). (De manera más general, los bloques no tienen que ser de tamaño de bits, $ n $ -character-blocks encajarían aquí también). Esto significa que, cuando encripta el mismo bloque de texto sin formato con la misma clave, obtendrá el mismo resultado. (Normalmente también queremos que la función sea invertible, es decir, que con la clave y el bloque de texto cifrado podamos calcular el texto sin formato.)

Para cifrar o descifrar un mensaje (de cualquier tamaño), no » t use el cifrado de bloque directamente, pero póngalo en un modo de operación . El modo más simple sería modo de libro de códigos electrónicos (ECB) , que simplemente corta el mensaje en bloques, aplica el cifrado a cada bloque y genera los bloques resultantes (aunque generalmente no es un modo seguro).

Algunos esquemas de encriptación tempranos como el usado por Caesar podrían categorizarse como un «cifrado de bloque con bloques de 1 carácter en ECB -mode «. O en general, todo lo que tenga un libro de códigos .

Usualmente usamos otros modos de operación, que incluyen un vector de inicialización y algún tipo de retroalimentación, de modo que cada bloque de cada mensaje está encriptado de una manera diferente.

Un stream cipher es una función que mapea directamente $ k $ claves de bits y textos sin formato de longitud arbitraria a (la misma longitud arbitraria) texto cifrado, en tal de manera que los prefijos del texto plano se asignan a los prefijos del texto cifrado, es decir, podemos calcular la parte inicial del texto cifrado antes de que se conozca la parte final del texto plano. (A menudo, los tamaños de los mensajes también pueden estar limitados a múltiplos de algún «tamaño de bloque», pero generalmente con bloques más pequeños como bytes completos o similares).

Si una parte del texto sin formato se repite, el texto cifrado correspondiente generalmente no es lo mismo: diferentes partes del mensaje se cifrarán de diferentes maneras.

A menudo, estos cifrados funcionan produciendo una secuencia de claves a partir de la clave real (y tal vez un vector de inicialización ) y luego simplemente XOR-ing con el mensaje – estos se llaman cifrados de flujo síncrono . Otros cifrados de flujo pueden variar el cifrado de partes futuras del mensaje en función de las partes anteriores.

Algunos modos de operación de cifrado de bloques en realidad crean un cifrado de flujo síncrono, como CTR y OFB .

Nunca debe reutilizar una clave (y IV, si corresponde) de un cifrado de flujo síncrono (que incluye cifrados de bloque en modos de flujo) para diferentes mensajes, ya que esto puede llevar a compromisos. (E incluso para el mismo mensaje, mostrará que repitió un mensaje).

Tenga en cuenta que en el uso real también querrá una MAC, p. protección de la integridad, para su mensaje. (Algunos esquemas se rompen en caso de un ataque de texto cifrado elegido, por ejemplo, y tal MAC evitará esto (si solo pasa el mensaje al descifrador después de verificar el MAC)).

Comentarios

  • ¿Cuándo elegiría entre una transmisión o un bloque? ¿Existe alguna diferencia en seguridad? ¿O la velocidad de cifrado?
  • @anoopelias Los cifrados de bloque son generalmente lentos en comparación con los cifrados de flujo. Además, no estoy seguro, pero creo que los cifrados de flujo son buenos para proporcionar seguridad de la información, mientras que los cifrados de bloque son buenos para proporcionar seguridad computacional
  • Con respecto al último párrafo, ¿podría proporcionar un enlace para un ejemplo en el que ¿agregar un MAC protege contra un ataque de texto cifrado elegido?

Respuesta

Matemáticamente, un cifrado de bloque es solo un familia de permutación pseudoaleatoria con clave en el conjunto $ \ {0,1 \} ^ n $ de $ n $ bloques de bits. (En la práctica, generalmente también requerimos una forma eficiente de calcular la permutación inversa). Un cifrado de bloque por sí solo no es muy útil para la criptografía práctica, al menos a menos que simplemente necesite cifrar pequeños mensajes que encajan en un solo bloque.

Sin embargo, resulta que los cifrados de bloque son bloques de construcción extremadamente versátiles para construir otras herramientas criptográficas: una vez que tenga un buen cifrado de bloques, puede crear fácilmente cualquier cosa, desde cifrados de flujo hasta funciones hash, códigos de autenticación de mensajes, funciones de derivación de claves, generadores de números pseudoaleatorios, grupos de entropía, etc. basándose en un solo cifrado de bloque.

No todas estas aplicaciones necesariamente necesita un cifrado de bloque; por ejemplo, muchos de ellos podrían estar basados en cualquier función pseudoaleatoria que no necesita ser una permutación (pero, convenientemente, hay «sa lema que dice que una permutación pseudoaleatoria funcionará, no obstante). Además, muchas de las construcciones son indirectas; por ejemplo, puede construir una función de derivación de clave a partir de un código de autenticación de mensaje, que puede construir a partir de una función hash, que puede — pero no tener — construir a partir de un bloque cifrar. Pero aún así, si tiene un cifrado en bloque, puede construir todo el resto a partir de él.

Además, estas construcciones generalmente vienen con pruebas de seguridad (condicionales) que reducen la seguridad de las funciones construidas a la del cifrado de bloque subyacente. Por lo tanto, no necesita llevar a cabo la laboriosa y poco confiable tarea de criptoanalizar cada una de estas funciones por separado — en su lugar, puede concentrar todos sus esfuerzos en el cifrado de bloques, sabiendo que cualquier confianza que tenga en la seguridad del cifrado de bloques se traduce directamente en confianza en todas las funciones basadas en él.

Obviamente, todo esto es muy conveniente si está, digamos, trabajando en una pequeña plataforma integrada en la que incluir código eficiente y seguro para muchas primitivas criptográficas independientes podría resultar difícil y costoso. Pero incluso si no estás en una plataforma tan restringida, escribir y analizar el código criptográfico de bajo nivel puede ser laborioso debido a la necesidad de prestar atención a cosas como ataques de canal lateral . Es más fácil restringirse a un número limitado de bloques de construcción de bajo nivel y construir todo lo que necesita a partir de ellos.

Además, incluso en plataformas rápidas con mucha memoria, Al igual que las CPU de escritorio, implementar operaciones criptográficas de bajo nivel directamente en el hardware puede ser mucho más rápido que hacerlo en el software —, pero no es práctico hacerlo para muchos de ellos. . Debido a su versatilidad, los cifrados en bloque son excelentes candidatos para la implementación de hardware (como en el conjunto de instrucciones AES para CPU x86 modernas).


¿Qué pasa con los cifrados de flujo, entonces?

Matemáticamente, un cifrado de flujo — en el sentido más general del término — también es una familia de funciones pseudoaleatorias invertibles con clave, pero en el conjunto $ \ {0,1 \} ^ * $ de cadenas de bits de longitud arbitraria en lugar de en bloques de longitud limitada.

(Hay algunas sutilezas aquí; por ejemplo, la mayoría de las construcciones de cifrado de flujo requieren que la entrada incluya un valor único nonce , y no garantizar la seguridad — en el sentido de que no se puede distinguir de una función verdaderamente aleatoria — si se utiliza el mismo nonce para dos entradas diferentes. Además, como no hay una distribución uniforme en funciones invertibles desde $ \ {0,1 \} ^ * $ a sí mismo para elegir funciones aleatorias, necesitamos definir cuidadosamente lo que significa que un cifrado de flujo se vea «indistinguible de aleatorio», y esta definición tiene implicaciones de seguridad prácticas — por ejemplo, la mayoría de los cifrados de flujo filtran la longitud del mensaje. En la práctica, normalmente también requerimos que los cifrados de flujo, en de hecho, sea «streaming», en el sentido de que los flujos de bits de entrada arbitrariamente largos se pueden cifrar — y descifrar — usando o Sólo almacenamiento constante y tiempo lineal en la longitud del mensaje.)

Por supuesto, los cifrados de flujo son mucho más útiles de inmediato que los cifrados en bloque: puede usarlos directamente para cifrar mensajes de cualquier longitud. Sin embargo, resulta que también son mucho menos útiles como bloques de construcción para otras herramientas criptográficas: si tiene un cifrado en bloque, puede conviértalo en un cifrado de flujo , mientras que convertir un cifrado de flujo arbitrario en un cifrado de bloque es difícil, si no imposible, .

Entonces, ¿por qué la gente se molesta en diseñar cifrados de flujo dedicados, entonces, si los cifrados de bloque pueden hacer el trabajo igual de bien? Principalmente, la razón es la velocidad: a veces, necesita un cifrado rápido para cifrar muchos datos, y hay algunos realmente diseños de cifrado de flujo dedicados muy rápidos. Algunos de estos diseños también están diseñados para ser muy compactos de implementar, ya sea en software o hardware o ambos, de modo que si realmente solo necesita un cifrado de flujo, puede ahorre en tamaño de código / circuito utilizando uno de esos cifrados en lugar de uno basado en cifrado de bloque general.

Sin embargo, lo que gana en velocidad y compacidad, lo pierde en versatilidad. Por ejemplo, no parece haber una forma sencilla de hacer una función hash a partir de un cifrado de flujo , así que si necesita uno de esos (y a menudo hacer, porque las funciones hash, además de ser útiles por sí mismas, también son bloques de construcción comunes para otras herramientas de cifrado), tendrá que implementarlas por separado. Y, adivinen qué, la mayoría de las funciones hash se basan en cifrados de bloque, por lo que si tiene uno, también podría reutilizar el mismo cifrado de bloque para el cifrado (a menos que realmente necesite la velocidad bruta del cifrado de flujo dedicado).

Comentarios

  • Me pregunto si es necesario tener dos términos diferentes. De acuerdo con lo que explicaste, un cifrado de flujo es simplemente un caso especial de un cifrado de bloque, es decir, uno para el caso límite donde la n en el conjunto {0,1} ^ n es 1. Por lo tanto, yo diría que no se mantiene la corriente distinción de terminologías.
  • @ Mok-KongShen En realidad, un cifrado de flujo no es simplemente un cifrado de bloque con tamaño de bloque 1 (aparte de los cifrados monoalfabéticos clásicos, que se puede asumir que son ambos). Un cifrado de flujo generalmente traduce los bits / bytes / … del flujo de manera diferente, dependiendo del estado interno actual del cifrado, mientras que un cifrado de bloque para la misma entrada tiene la misma salida (y por lo tanto se usa generalmente en un » modo de operación » para crear un cifrado de flujo).
  • @PauloEbermann. En mi humilde opinión, respondiste por mí una pregunta de CodesinChaos sobre » dinámica y variabilidad «.
  • @ Mok-KongShen No él no ‘ t. La única ventaja que tiene un cifrado de flujo dedicado sobre un cifrado de bloque en un modo apropiado es el rendimiento. Puede ‘ t ignorar los modos de encadenamiento, ya que nadie en su sano juicio utiliza cifrados de bloque sin el encadenamiento adecuado.
  • @CodesInChaos. Las diferentes aplicaciones tienen diferentes requisitos de rendimiento. Para cifrar, p. Ej. un correo electrónico, uno no ‘ t necesita el rendimiento que sería deseable para el cifrado de, digamos, un archivo de video.

Respuesta

Un cifrado de bloque por sí mismo asigna n bits a n bits usando una clave. es decir, es una permutación pseudoaleatoria con clave. No puede aceptar textos más largos o más cortos.

Para cifrar un mensaje, siempre necesita un modo de encadenamiento. ECB es uno de esos modos de encadenamiento (y uno realmente malo), y no es el cifrado de bloque puro. Incluso el BCE consta de «operaciones de procesamiento adicionales». Estos modos de encadenamiento pueden tener propiedades bastante diferentes.

Uno de los modos de encadenamiento más populares, el modo Contador (CTR) construye un cifrado de flujo síncrono a partir de un cifrado de bloque.En otro modo, CFB construye un cifrado de flujo de sincronización automática, con propiedades en algún lugar entre las de CBC y un cifrado de flujo síncrono.

Por lo tanto, su suposición de que no hay cifrados entre el flujo y los cifrados de bloques no es realmente cierto. simplemente prefiero construirlos a partir de la primitiva de cifrado de bloques bien entendido, en lugar de crear un sistema completamente nuevo.

Llamaría a Vigenère un cifrado de flujo, aunque con un período demasiado corto. Utiliza una codificación de 26 símbolos en lugar de una codificación de 2 símbolos, pero eso no significa que no sea un cifrado de flujo. Mire Solitario / Pontifex para ver una construcción moderna de un cifrado de flujo con 26 símbolos.

Comentarios

  • Si no ‘ me equivoco, » encadenando » en El cifrado de bloques se emplea normalmente en el contexto de » encadenamiento de bloques «, es decir, hacer que los bloques sucesivos sean dependientes entre sí para que el análisis más difícil. Entonces, en mi humilde opinión, el BCE no tendría por definición ningún efecto de encadenamiento como tal.
  • Se equivoca. Un modo de encadenamiento bueno tendrá estas propiedades, ¡pero aún existen modos malos!

Respuesta

Hay dos tipos básicos de cifrado

  1. Simétrico. Utiliza la misma clave para el cifrado y el descifrado.
  2. Asimétrico. Utiliza dos claves diferentes (pública y privada) para cifrar y descifrar.

Block Cipher y Stream Cipher forman parte de Symmetric Encryption. Stream Cipher genera un flujo de claves extendido a partir de la clave proporcionada por el usuario y luego XoR con texto plano (para cifrado) / texto cifrado (para descifrado).

Mientras que Block Cipher toma un bloque de datos como entrada, ejecute varias rondas en él junto con la mezcla de claves y producir texto cifrado. Los Block Ciphers tienen varios modos de operación, de los cuales el modo Contador (CTR) funciona de manera similar al cifrado de flujo. Se ingresa un número secuencial al cifrado de bloque y su salida se Xored con texto plano para hacer texto cifrado. En este modo de funcionamiento, solo se requiere el código de cifrado del cifrado en bloque. No hay necesidad de descifrar código, para el descifrado simplemente ingresamos el mismo número secuencial para bloquear el cifrado, y Xored su salida con Ciphertext para obtener texto sin formato. En ocasiones, se usa un sustantivo junto con el contador, por lo que la entrada del código de bloque se divide en dos, es decir, un sustantivo fijo y un contador incremental.

ingrese la descripción de la imagen aquí

Otro modo de operaciones son: –

  1. ECB (proporciona confidencialidad)
  2. CBC y CTR (proporciona confidencialidad y seguridad desde el punto de vista emocional contra el ataque de texto plano elegido)
  3. EAX, CCM y GCM (proporciona cifrado autenticado)

Se pueden encontrar más detalles AQUÍ

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *