This article needs additional citations for verification. (October 2021) |
Un cifrado de flujo es un cifrado de clave simétrica en el que los dígitos de texto simple se combinan con un flujo de dígitos cifrados pseudoaleatorios ( flujo de claves ). En un cifrado de flujo, cada dígito de texto simple se cifra de a uno por vez con el dígito correspondiente del flujo de claves, para dar un dígito del flujo de texto cifrado . Dado que el cifrado de cada dígito depende del estado actual del cifrado, también se lo conoce como cifrado de estado . En la práctica, un dígito es típicamente un bit y la operación de combinación es una operación exclusiva-o (XOR).
El flujo de claves pseudoaleatorio se genera normalmente en serie a partir de un valor de semilla aleatorio mediante registros de desplazamiento digitales . El valor de semilla sirve como clave criptográfica para descifrar el flujo de texto cifrado. Los cifrados de flujo representan un enfoque diferente al cifrado simétrico de los cifrados de bloque . Los cifrados de bloque operan en grandes bloques de dígitos con una transformación fija e invariable. Esta distinción no siempre es clara: en algunos modos de operación , se utiliza un primitivo de cifrado de bloque de tal manera que actúa eficazmente como un cifrado de flujo. Los cifrados de flujo normalmente se ejecutan a una mayor velocidad que los cifrados de bloque y tienen una menor complejidad de hardware. Sin embargo, los cifrados de flujo pueden ser susceptibles a violaciones de seguridad (consulte ataques de cifrado de flujo ); por ejemplo, cuando el mismo estado inicial (semilla) se utiliza dos veces.
Los cifrados de flujo pueden considerarse una aproximación a la acción de un cifrado irrompible probado, el block de un solo uso (OTP). Un block de un solo uso utiliza un flujo de claves de dígitos completamente aleatorios . El flujo de claves se combina con los dígitos del texto simple uno a la vez para formar el texto cifrado. Claude E. Shannon demostró que este sistema era seguro en 1949. [1] Sin embargo, el flujo de claves debe generarse completamente al azar con al menos la misma longitud que el texto simple y no puede usarse más de una vez. Esto hace que el sistema sea complicado de implementar en muchas aplicaciones prácticas y, como resultado, el block de un solo uso no se ha utilizado ampliamente, excepto para las aplicaciones más críticas. La generación, distribución y gestión de claves son fundamentales para esas aplicaciones.
Un cifrado de flujo utiliza una clave mucho más pequeña y más conveniente, como 128 bits. Basándose en esta clave, genera un flujo de claves pseudoaleatorio que se puede combinar con los dígitos del texto sin formato de manera similar al bloc de un solo uso. Sin embargo, esto tiene un costo. El flujo de claves ahora es pseudoaleatorio y, por lo tanto, no es verdaderamente aleatorio. La prueba de seguridad asociada con el bloc de un solo uso ya no se sostiene. Es muy posible que un cifrado de flujo sea completamente inseguro. [ cita requerida ]
Un cifrado de flujo genera elementos sucesivos del flujo de claves en función de un estado interno. Este estado se actualiza básicamente de dos maneras: si el estado cambia independientemente de los mensajes de texto simple o cifrado , el cifrado se clasifica como un cifrado de flujo sincrónico . Por el contrario, los cifrados de flujo autosincronizados actualizan su estado en función de los dígitos de texto simple o cifrado anteriores. Un sistema que incorpora el texto simple a la clave también se conoce como cifrado de clave automática o cifrado de autoclave.
En un cifrado de flujo sincrónico, se genera un flujo de dígitos pseudoaleatorios independientemente de los mensajes de texto simple y cifrado, y luego se combina con el texto simple (para cifrar) o el texto cifrado (para descifrar). En la forma más común, se utilizan dígitos binarios ( bits ) y el flujo de claves se combina con el texto simple mediante la operación o exclusiva (XOR). Esto se denomina cifrado de flujo aditivo binario .
En un cifrado de flujo sincrónico, el emisor y el receptor deben estar exactamente sincronizados para que el descifrado sea exitoso. Si se agregan o eliminan dígitos del mensaje durante la transmisión, se pierde la sincronización. Para restablecer la sincronización, se pueden probar sistemáticamente varios desfases para obtener el descifrado correcto. Otro enfoque es etiquetar el texto cifrado con marcadores en puntos regulares de la salida.
Sin embargo, si un dígito se corrompe durante la transmisión, en lugar de agregarse o perderse, solo se ve afectado un único dígito del texto simple y el error no se propaga a otras partes del mensaje. Esta propiedad es útil cuando la tasa de errores de transmisión es alta; sin embargo, hace que sea menos probable que el error se detecte sin mecanismos adicionales. Además, debido a esta propiedad, los cifrados de flujo sincrónico son muy susceptibles a ataques activos : si un atacante puede cambiar un dígito en el texto cifrado, podría realizar cambios predecibles en el bit correspondiente del texto simple; por ejemplo, invertir un bit en el texto cifrado hace que el mismo bit se invierta en el texto simple.
Otro enfoque utiliza varios de los N dígitos de texto cifrado anteriores para calcular el flujo de claves. Estos esquemas se conocen como cifrados de flujo autosincronizados , cifrados de flujo asincrónicos o cifrado automático de texto cifrado ( CTAK ). La idea de la autosincronización fue patentada en 1946 y tiene la ventaja de que el receptor se sincronizará automáticamente con el generador de flujo de claves después de recibir N dígitos de texto cifrado, lo que facilita la recuperación si se eliminan o agregan dígitos al flujo de mensajes. Los errores de un solo dígito tienen un efecto limitado y afectan solo a un máximo de N dígitos de texto sin formato.
Un ejemplo de un cifrado de flujo con sincronización automática es un cifrado de bloque en modo de retroalimentación de cifrado (CFB) .
Los cifrados de flujo binarios suelen construirse utilizando registros de desplazamiento con retroalimentación lineal (LFSR, por sus siglas en inglés), ya que se pueden implementar fácilmente en hardware y se pueden analizar matemáticamente sin problemas. Sin embargo, el uso de LFSR por sí solo no es suficiente para proporcionar una buena seguridad. Se han propuesto varios esquemas para aumentar la seguridad de los LFSR.
Debido a que los LFSR son inherentemente lineales, una técnica para eliminar la linealidad es introducir las salidas de varios LFSR paralelos en una función booleana no lineal para formar un generador de combinación . Varias propiedades de dicha función de combinación son fundamentales para garantizar la seguridad del esquema resultante, por ejemplo, para evitar ataques de correlación .
This section needs expansion. You can help by adding to it. (June 2008) |
Normalmente, los LFSR se escalonan regularmente. Un enfoque para introducir la no linealidad es hacer que el LFSR se sincronice de forma irregular, controlado por la salida de un segundo LFSR. Estos generadores incluyen el generador de parada y marcha, el generador de escalón alterno y el generador de contracción .
Un generador de pasos alternados consta de tres LFSR, que llamaremos LFSR0, LFSR1 y LFSR2 para mayor comodidad. La salida de uno de los registros decide cuál de los otros dos se utilizará; por ejemplo, si LFSR2 genera un 0, se sincroniza LFSR0, y si genera un 1, se sincroniza LFSR1 en su lugar. La salida es el OR exclusivo del último bit producido por LFSR0 y LFSR1. El estado inicial de los tres LFSR es la clave.
El generador de parada y marcha (Beth y Piper, 1984) consta de dos LFSR. Un LFSR se sincroniza si la salida de un segundo es un 1; de lo contrario, repite su salida anterior. Esta salida se combina luego (en algunas versiones) con la salida de un tercer LFSR sincronizado a una frecuencia regular.
El generador de encogimiento adopta un enfoque diferente. Se utilizan dos LFSR, ambos sincronizados regularmente. Si la salida del primer LFSR es 1, la salida del segundo LFSR se convierte en la salida del generador. Sin embargo, si la salida del primer LFSR es 0, la salida del segundo se descarta y el generador no emite ningún bit. Este mecanismo sufre ataques de sincronización en el segundo generador, ya que la velocidad de la salida es variable de una manera que depende del estado del segundo generador. Esto se puede aliviar almacenando en búfer la salida.
Otro enfoque para mejorar la seguridad de un LFSR es pasar todo el estado de un solo LFSR a una función de filtrado no lineal .
This section needs expansion. You can help by adding to it. (June 2008) |
En lugar de un dispositivo de control lineal, se puede utilizar una función de actualización no lineal. Por ejemplo, Klimov y Shamir propusieron funciones triangulares ( funciones T ) con un solo ciclo en palabras de n bits.
This section needs expansion. You can help by adding to it. (June 2008) |
Para que un cifrado de flujo sea seguro, su flujo de claves debe tener un período largo y debe ser imposible recuperar la clave del cifrado o el estado interno del flujo de claves. Los criptógrafos también exigen que el flujo de claves esté libre incluso de sesgos sutiles que permitirían a los atacantes distinguir un flujo de ruido aleatorio y libre de relaciones detectables entre flujos de claves que corresponden a claves relacionadas o nonces criptográficos relacionados . Esto debería ser cierto para todas las claves (no debería haber claves débiles ), incluso si el atacante puede conocer o elegir algún texto simple o cifrado .
Al igual que con otros ataques en criptografía, los ataques de cifrado de flujo pueden ser de certificación, por lo que no son necesariamente formas prácticas de romper el cifrado, pero indican que este podría tener otras debilidades.
Para utilizar de forma segura un cifrado de flujo sincrónico seguro es necesario no reutilizar nunca el mismo flujo de claves dos veces. Por lo general, eso significa que se debe proporcionar un nonce o una clave diferentes en cada invocación del cifrado. Los diseñadores de aplicaciones también deben reconocer que la mayoría de los cifrados de flujo no proporcionan autenticidad sino privacidad : los mensajes cifrados pueden haber sido modificados durante el tránsito.
Los períodos cortos para los cifrados de flujo han sido una preocupación práctica. Por ejemplo, los cifrados de bloques de 64 bits como DES se pueden utilizar para generar un flujo de claves en modo de retroalimentación de salida (OFB). Sin embargo, cuando no se utiliza la retroalimentación completa, el flujo resultante tiene un período de alrededor de 2 32 bloques en promedio; para muchas aplicaciones, el período es demasiado bajo. Por ejemplo, si se realiza el cifrado a una velocidad de 8 megabytes por segundo, un flujo de período 2 32 bloques se repetirá después de aproximadamente una hora.
Algunas aplicaciones que utilizan el cifrado de flujo RC4 son atacables debido a debilidades en la rutina de configuración de clave de RC4; las aplicaciones nuevas deberían evitar RC4 o asegurarse de que todas las claves sean únicas e idealmente no relacionadas (como las generadas por un CSPRNG bien inicializado o una función hash criptográfica ) y que los primeros bytes del flujo de claves se descarten.
Los elementos de los cifrados de flujo suelen ser mucho más sencillos de entender que los cifrados de bloque y, por lo tanto, es menos probable que oculten debilidades accidentales o maliciosas.
Los cifrados de flujo se utilizan a menudo por su velocidad y simplicidad de implementación en hardware, y en aplicaciones donde el texto simple viene en cantidades de longitud desconocida, como una conexión inalámbrica segura. Si se utilizara un cifrado de bloque (que no funcione en un modo de cifrado de flujo) en este tipo de aplicación, el diseñador tendría que elegir entre la eficiencia de transmisión o la complejidad de implementación, ya que los cifrados de bloque no pueden trabajar directamente en bloques más cortos que su tamaño de bloque. Por ejemplo, si un cifrado de bloque de 128 bits recibiera ráfagas separadas de 32 bits de texto simple, tres cuartas partes de los datos transmitidos serían relleno . Los cifrados de bloque deben usarse en modo de robo de texto cifrado o terminación de bloque residual para evitar el relleno, mientras que los cifrados de flujo eliminan este problema al operar naturalmente en la unidad más pequeña que se puede transmitir (generalmente bytes).
Otra ventaja de los cifrados de flujo en la criptografía militar es que el flujo de cifrado se puede generar en una caja separada que está sujeta a estrictas medidas de seguridad y se puede enviar a otros dispositivos, como un equipo de radio, que realizará la operación XOR como parte de su función. Este último dispositivo se puede diseñar y utilizar en entornos menos estrictos.
ChaCha se está convirtiendo en el cifrado de flujo más utilizado en software; [2] otros incluyen: RC4 , A5/1 , A5/2 , Chameleon, FISH , Helix , ISAAC , MUGI , Panama , Phelix , Pike , Salsa20 , SEAL , SOBER , SOBER-128 y WAKE .
This section needs additional citations for verification. (July 2014) |
Cifrado de flujo | Fecha de creación | Velocidad ( ciclos por byte ) | (pedazos) | Ataque | |||
---|---|---|---|---|---|---|---|
Longitud de clave efectiva | Vector de inicialización | Estado interno | Más conocido | Complejidad computacional | |||
A5/1 | 1989 | ? | 54 o 64 (en 2G ) | 22 (en 2G) | 64 | KPA activo o compensación de tiempo y memoria de KPA | ~ 2 segundos O 2 39,91 |
A5/2 | 1989 | ? | 54 | 114 | 64? | Activo | 4,6 milisegundos |
Tren de entrada-128/80 | 2006 | 1 (hardware) | 80/128 | 80/128 | 297/351 | Fuerza bruta para longitudes de trama L ≤ 2 44 . Ataque de correlación para L ≥ 248. | 2 80 resp. 2 128 para L ≤ 2 44 . |
Cripta MT | 2005 | ? | Variable | hasta 19968 | 19968 | — (2008) | — (2008) |
Cripto-1 | Antes de 1994 | ? | 48 | 16 | 48 | Ejército Popular de Corea (KPA) activo (2008) | 40 ms O 2 48 (2008) [3] |
E0 (cifrado) | Antes de 1999 | ? | Variable (normalmente 128) | 4 | 132 | Ejército Popular de Corea (2005) | 2 38 (2005) [4] |
PEZ | 1993 | ? | Variable | ? | ? | Ataque de texto simple conocido | 2 11 |
Grano | Antes de 2004 | ? | 80 | 64 | 160 | Derivación de claves | 2 43 |
HC-256 | Antes de 2004 | 4 (Pág. 4 ) | 256 | 256 | 65536 | ? | ? |
Isaac | 1996 | 2,375 (W de 64 bits ) – 4,6875 (W de 32 bits ) | 8–8288 (normalmente 40–256) | — | 8288 | (2006) Derivación de estado interno débil de primera ronda | 4,67 × 10 1240 (2001) |
Mickey | Antes de 2004 | ? | 80 | Variable (0 a 80) | 200 | Ataque por falla diferencial (2013) | 2 32.5 (2013) [5] |
MUGI | 1998–2002 | ? | 128 | 128 | 1216 | — (2002) | ~ 2 82 |
PANAMÁ | 1998 | 2 | 256 | 128? | 1216? | Colisiones de hash (2001) | 2 82 |
Félix | Antes de 2004 | hasta 8 (An x 86 ) | 256 + un nonce de 128 bits | 128? | ? | Diferencial (2006) | 2 37 |
Lucio | 1994 | ? | Variable | ? | ? | — (2004) | — (2004) |
Pi | Antes de 2004 | 2.6 | 8–2048? (normalmente 40–256?) | 64 | 8320 | Teoría criptoanalítica (2006) | 2 75 |
Conejo | 2003-febrero | 3,7 (W P3 ) – 9,7 (W ARM7 ) | 128 | 64 | 512 | — (2006) | — (2006) |
RC4 | 1987 | 7 W P5 [6] | 8–2048 (normalmente 40–256) | El RC4 no acepta una vía intravenosa. Si se desea una vía intravenosa, se debe mezclar de alguna manera con la clave. | 2064 | Derivación de clave de bytes iniciales de Shamir O KPA | 2 13 O 2 33 |
Salsa20 | Antes de 2004 | 4,24 ( G4 ancho ) – 11,84 (G4 ancho ) | 256 | un nonce de 64 bits + una posición de flujo de 64 bits | 512 | Método probabilístico de bits neutros | 2 251 por 8 rondas (2007) |
Gritar | 2002 | 4–5 (W suave ) | 128 + un nonce de 128 bits | 32? | Función de redondeo de 64 bits | ? | ? |
SELLO | 1997 | ? | ? | 32? | ? | ? | ? |
NIEVE | Antes de 2003 | ? | 128 o 256 | 32 | ? | ? | ? |
SOBRIO-128 | 2003 | ? | hasta 128 | ? | ? | Mensaje de forja | 2 −6 |
SOSEMANUK | Antes de 2004 | ? | 128 | 128 | ? | ? | ? |
Trivio | Antes de 2004 | 4 (Ancho x Largo ) – 8 (Ancho x Largo ) | 80 | 80 | 288 | Ataque de fuerza bruta (2006) | 2 135 |
Turing | 2000–2003 | 5,5 (ancho x 86 ) | ? | 160 | ? | ? | ? |
CHALECO | 2005 | 42 (W ASIC ) – 64 (W FPGA ) | Variable (normalmente entre 80 y 256) | Variable (normalmente entre 80 y 256) | 256–800 | — (2006) | — (2006) |
DESPERTAR | 1993 | ? | ? | ? | 8192 | Contador público certificado y CCA | Vulnerable |
Cifrado de flujo | Fecha de creación | Velocidad ( ciclos por byte ) | (pedazos) | Ataque | |||
Longitud de clave efectiva | Vector de inicialización | Estado interno | Más conocido | Complejidad computacional |
{{cite book}}
: |journal=
ignorado ( ayuda )CS1 maint: location missing publisher (link)