Blowfish es un cifrado de bloques de clave simétrica , diseñado en 1993 por Bruce Schneier e incluido en muchos conjuntos de cifrado y productos de cifrado. Blowfish proporciona una buena tasa de cifrado en software y hasta la fecha no se ha encontrado un criptoanálisis eficaz . Sin embargo, el Estándar de cifrado avanzado (AES) ahora recibe más atención y Schneier recomienda Twofish para aplicaciones modernas. [2]
General | |
---|---|
Diseñadores | Bruce Schneier |
Publicado por primera vez | 1993 |
Sucesores | Dos peces |
Detalle de cifrado | |
Tamaños de clave | 32 a 448 bits |
Tamaños de bloque | 64 bits |
Estructura | Red Feistel |
Rondas | dieciséis |
Mejor criptoanálisis público | |
Cuatro rondas de Blowfish son susceptibles a un ataque diferencial de segundo orden (Rijmen, 1997); [1] para una clase de claves débiles , se pueden distinguir 14 rondas de Blowfish de una permutación pseudoaleatoria (Vaudenay, 1996). |
Schneier diseñó Blowfish como un algoritmo de propósito general, pensado como una alternativa al antiguo DES y libre de los problemas y restricciones asociados con otros algoritmos. En el momento en que se lanzó Blowfish, muchos otros diseños eran propietarios, estaban gravados por patentes o eran secretos comerciales o gubernamentales. Schneier ha declarado que "Blowfish no está patentado y seguirá siéndolo en todos los países. Por la presente, el algoritmo se coloca en el dominio público y puede ser utilizado libremente por cualquier persona". [3]
Las características notables del diseño incluyen cajas S dependientes de la llave y un programa de llaves muy complejo .
El algoritmo
Blowfish tiene un tamaño de bloque de 64 bits y una longitud de clave variable desde 32 bits hasta 448 bits. [3] Es un cifrado Feistel de 16 rondas y utiliza cajas S grandes dependientes de claves . En estructura, se parece a CAST-128 , que utiliza cajas S fijas.
El diagrama adyacente muestra la rutina de cifrado de Blowfish. Cada línea representa 32 bits. Hay cinco matrices de subclaves: una matriz P de 18 entradas (indicada como K en el diagrama, para evitar confusiones con el texto plano) y cuatro cajas S de 256 entradas (S0, S1, S2 y S3).
Cada ronda r consta de 4 acciones:
Acción 1 | XOR la mitad izquierda (L) de los datos con la entrada r- ésima P-array |
Acción 2 | Utilice los datos XORed como entrada para la función F de Blowfish |
Acción 3 | XOR la salida de la función F con la mitad derecha (R) de los datos |
Acción 4 | Intercambiar L y R |
La función F divide la entrada de 32 bits en cuatro cuartos de ocho bits y usa los cuartos como entrada a los S-boxes. Las cajas S aceptan entrada de 8 bits y producen una salida de 32 bits. Las salidas se agregan módulo 2 32 y XORed para producir la salida final de 32 bits (vea la imagen en la esquina superior derecha). [4]
Después de la ronda 16, deshaga el último intercambio y XOR L con K18 y R con K17 (blanqueamiento de salida).
El descifrado es exactamente igual que el cifrado, excepto que P1, P2, ..., P18 se utilizan en orden inverso. Esto no es tan obvio porque xor es conmutativo y asociativo. Un error común es usar el orden inverso de cifrado como algoritmo de descifrado (es decir, primero XORing P17 y P18 al bloque de texto cifrado, luego usando las entradas P en orden inverso).
El programa clave de Blowfish comienza inicializando la matriz P y las cajas S con valores derivados de los dígitos hexadecimales de pi , que no contienen un patrón obvio ( no vea nada en mi número de la manga ). La clave secreta es entonces, byte a byte, ciclando la clave si es necesario, XORed con todas las entradas P en orden. Luego, un bloque todo cero de 64 bits se cifra con el algoritmo tal como está. El texto cifrado resultante reemplaza a P 1 y P 2 . El mismo texto cifrado se vuelve a cifrar con las nuevas subclaves, y el nuevo texto cifrado sustituye a P 3 y P 4 . Esto continúa, reemplazando toda la matriz P y todas las entradas de la caja S. En total, el algoritmo de cifrado Blowfish se ejecutará 521 veces para generar todas las subclaves: se procesan aproximadamente 4 KB de datos.
Debido a que la matriz P tiene una longitud de 576 bits, y los bytes de clave se someten a XOR a través de todos estos 576 bits durante la inicialización, muchas implementaciones admiten tamaños de clave de hasta 576 bits. La razón de esto es una discrepancia entre la descripción original de Blowfish, que usa claves de 448 bits, y su implementación de referencia, que usa claves de 576 bits. Los vectores de prueba para verificar implementaciones de terceros también se produjeron con claves de 576 bits. Cuando se le preguntó qué versión de Blowfish es la correcta, Bruce Schneier respondió: "Los vectores de prueba deben usarse para determinar el verdadero Blowfish".
Otra opinión es que el límite de 448 bits está presente para asegurar que cada bit de cada subclave depende de cada bit de la clave, [3] ya que los últimos cuatro valores de la matriz P no afectan cada bit del texto cifrado. Este punto debe tenerse en cuenta para implementaciones con diferente número de rondas, ya que si bien aumenta la seguridad frente a un ataque exhaustivo, debilita la seguridad garantizada por el algoritmo. Y dada la lenta inicialización del cifrado con cada cambio de clave, se le otorga una protección natural contra ataques de fuerza bruta, lo que en realidad no justifica tamaños de clave superiores a 448 bits.
Blowfish en pseudocódigo
uint32_t P [ 18 ]; uint32_t S [ 4 ] [ 256 ];uint32_t f ( uint32_t x ) { uint32_t h = S [ 0 ] [ x >> 24 ] + S [ 1 ] [ x >> 16 & 0xff ]; return ( h ^ S [ 2 ] [ x >> 8 & 0xff ] ) + S [ 3 ] [ x & 0xff ]; }void cifrar ( uint32_t & L , uint32_t & R ) { para ( int i = 16 ; i > 0 ; i - = 2 ) { L ^ = P [ i ]; R ^ = f ( L ); R ^ = P [ i + 1 ]; L ^ = f ( R ); } L ^ = P [ 16 ]; R ^ = P [ 17 ]; intercambio ( L , R ); } descifrar vacío ( uint32_t & L , uint32_t & R ) { para ( int i = 16 ; i > 0 ; i - = 2 ) { L ^ = P [ i + 1 ]; R ^ = f ( L ); R ^ = P [ i ]; L ^ = f ( R ); } L ^ = P [ 1 ]; R ^ = P [ 0 ]; intercambio ( L , R ); } // ... // inicializando la matriz P y las cajas S con valores derivados de pi; omitido en el ejemplo // ... { for ( int i = 0 ; i < 18 ; ++ i ) P [ i ] ^ = key [ i % keylen ]; uint32_t L = 0 , R = 0 ; para ( int i = 0 ; i < 18 ; i + = 2 ) { cifrar ( L , R ); P [ i ] = L ; P [ i + 1 ] = R ; } para ( int i = 0 ; i < 4 ; ++ i ) for ( int j = 0 ; j < 256 ; j + = 2 ) { cifrar ( L , R ); S [ i ] [ j ] = L ; S [ i ] [ j + 1 ] = R ; } }
Blowfish en la práctica
Blowfish es un cifrado de bloque rápido , excepto cuando se cambian las claves. Cada nueva clave requiere el preprocesamiento equivalente a cifrar aproximadamente 4 kilobytes de texto, lo cual es muy lento en comparación con otros cifrados de bloques. Esto impide su uso en determinadas aplicaciones, pero no supone un problema en otras.
En una aplicación, el lento cambio de clave de Blowfish es en realidad un beneficio: el método de hash de contraseña (crypt $ 2, es decir, bcrypt) usado en OpenBSD usa un algoritmo derivado de Blowfish que hace uso del programa de clave lenta; la idea es que el esfuerzo computacional adicional requerido brinda protección contra los ataques de diccionario . Ver estiramiento clave .
Blowfish tiene una huella de memoria de poco más de 4 kilobytes de RAM . Esta restricción no es un problema incluso para computadoras de escritorio y portátiles más antiguas , aunque impide su uso en los sistemas integrados más pequeños , como las primeras tarjetas inteligentes .
Blowfish fue uno de los primeros cifrados de bloques seguros que no están sujetos a ninguna patente y, por lo tanto, están disponibles gratuitamente para que cualquiera los use. Este beneficio ha contribuido a su popularidad en el software criptográfico.
bcrypt es una función de hash de contraseña que, combinada con un número variable de iteraciones ("costo" de trabajo), aprovecha la costosa fase de configuración de claves de Blowfish para aumentar la carga de trabajo y la duración de los cálculos de hash, reduciendo aún más las amenazas de ataques de fuerza bruta.
bcrypt es también el nombre de una utilidad de cifrado de archivos multiplataforma desarrollada en 2002 que implementa Blowfish. [5] [6] [7] [8]
Debilidad y sucesores
El uso de Blowfish de un tamaño de bloque de 64 bits (a diferencia de, por ejemplo, el tamaño de bloque de 128 bits de AES) lo hace vulnerable a los ataques de cumpleaños , particularmente en contextos como HTTPS . En 2016, el ataque SWEET32 demostró cómo aprovechar los ataques de cumpleaños para realizar la recuperación de texto sin formato (es decir, descifrar texto cifrado) contra cifrados con un tamaño de bloque de 64 bits. [9] El proyecto GnuPG recomienda que Blowfish no se utilice para cifrar archivos de más de 4 GB [10] debido a su pequeño tamaño de bloque. [11]
Se sabe que una variante de ronda reducida de Blowfish es susceptible a ataques de texto sin formato conocidos en claves reflectantes débiles. Las implementaciones de Blowfish utilizan 16 rondas de cifrado y no son susceptibles a este ataque. [12] [13] Sin embargo, Bruce Schneier ha recomendado migrar a su sucesor Blowfish, Twofish . [2]
Ver también
- Tres peces
- MacGuffin
Referencias
- ^ Vincent Rijmen (1997). "Criptoanálisis y Diseño de Cifrados de Bloques Iterados" ( PostScript ) . Tesis de Doctorado . Archivado desde el original el 8 de mayo de 2013.
- ^ a b Dahna, McConnachie (27 de diciembre de 2007). "Bruce Todopoderoso: Schneier predica la seguridad a los fieles de Linux" . Computerworld . pag. 3. Archivado desde el original el 2 de diciembre de 2016 . Consultado el 26 de enero de 2018 .
Sin embargo, en este punto, me sorprende que todavía se esté usando. Si la gente pregunta, recomiendo Twofish en su lugar.
- ^ a b c Bruce Schneier (1993). "Descripción de una nueva clave de longitud variable, cifrado de bloque de 64 bits (Blowfish)" . Cifrado de software rápido, Actas del taller de seguridad de Cambridge . Springer-Verlag : 191-204. Archivado desde el original el 26 de enero de 2014.
- ^ "Criptografía: descripción de una nueva clave de longitud variable, cifrado de bloque de 64 bits (Blowfish) - Schneier sobre seguridad" . www.schneier.com . Archivado desde el original el 4 de marzo de 2016 . Consultado el 31 de diciembre de 2015 .
- ^ "Bcrypt - Blowfish File Encryption" Archivado el29 de agosto de 2015 en la página de inicio del programa de cifrado de archivos bcrypt de Wayback Machine (bcrypt.sourceforge.net)
- ^ "Descarga gratuita de bcrypt - whodunnit.tools.bcrypt" . bcrypt463065.android.informer.com . Archivado desde el original el 4 de marzo de 2016 . Consultado el 7 de mayo de 2018 .
- ^ "Paquete T2 - troncal - bcrypt - Una utilidad para cifrar archivos" . www.t2-project.org . Archivado desde el original el 21 de abril de 2017 . Consultado el 7 de mayo de 2018 .
- ^ "Oracle GoldenGate の ラ イ セ ン ス" . docs.oracle.com . Archivado desde el original el 27 de octubre de 2017 . Consultado el 7 de mayo de 2018 .
- ^ Karthikeyan Bhargavan; Gaëtan Leurent (agosto de 2016). "Sobre la (In-) seguridad práctica de cifrados en bloque de 64 bits - Ataques de colisión en HTTP sobre TLS y OpenVPN" . ACM CCS 2016. Archivado desde el original el 9 de octubre de 2016.
- ^ "Preguntas frecuentes sobre GnuPG" . Archivado desde el original el 21 de diciembre de 2017 . Consultado el 26 de enero de 2018 .
Blowfish no debe usarse para cifrar archivos de más de 4 Gb, pero Twofish no tiene tales restricciones.
- ^ "Preguntas frecuentes sobre GnuPG" . Archivado desde el original el 21 de diciembre de 2017 . Consultado el 27 de enero de 2018 .
Para un cifrado con un tamaño de bloque de ocho bytes, probablemente repita un bloque después de aproximadamente 32 gigabytes de datos. Esto significa que si encripta un solo mensaje de más de 32 gigabytes, es prácticamente una garantía estadística de que tendrá un bloqueo repetido. Eso es malo. Por esta razón, le recomendamos que no utilice cifrados con bloques de datos de ocho bytes si va a realizar un cifrado masivo. Es muy poco probable que tenga algún problema si mantiene sus mensajes con un tamaño inferior a 4 gigabytes.
- ^ Tom González (enero de 2007). "Un ataque de reflexión sobre el pez globo" (PDF) . Archivos de clase de Journal of LATEX. Archivado desde el original (PDF) el 18 de noviembre de 2015 . Consultado el 17 de noviembre de 2015 .
- ^ Orhun Kara y Cevat Manap (marzo de 2007). "Una nueva clase de claves débiles para Blowfish" (PDF) . FSE 2007. Archivado (PDF) desde el original el 5 de octubre de 2016.
enlaces externos
- Bruce Schneier. "El algoritmo de cifrado Blowfish" .
- Bruce Schneier. "Productos que utilizan Blowfish" .
- "Denominación de algoritmo criptográfico estándar: Blowfish" .