Blowfish es un cifrador de bloques de clave simétrica , diseñado en 1993 por Bruce Schneier e incluido en muchos paquetes de cifrado y productos de cifrado. Blowfish proporciona una buena tasa de cifrado en software y hasta la fecha no se ha encontrado ningún criptoanálisis efectivo de este para archivos más pequeños. Se recomienda no utilizar Blowfish para cifrar archivos de más de 4 GB de tamaño, sino Twofish . [3]
Blowfish tiene un tamaño de bloque de 64 bits y, por lo tanto, podría ser vulnerable a ataques de cumpleaños Sweet32. [4]
Schneier diseñó Blowfish como un algoritmo de propósito general, pensado como una alternativa al obsoleto DES y libre de los problemas y restricciones asociados con otros algoritmos. En el momento en que Blowfish fue lanzado, muchos otros diseños eran propietarios, estaban sujetos a patentes o eran secretos comerciales o gubernamentales. Schneier ha declarado que "Blowfish no está patentado y seguirá estando así en todos los países. El algoritmo queda por la presente en el dominio público y puede ser utilizado libremente por cualquier persona". [5]
Las características notables del diseño incluyen cajas S dependientes de la clave y un programa de claves altamente complejo .
Blowfish tiene un tamaño de bloque de 64 bits y una longitud de clave variable desde 32 bits hasta 448 bits. [5] Es un cifrado Feistel de 16 rondas y utiliza grandes cajas S dependientes de la clave . 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 submatrices de claves: una matriz P de 18 entradas (indicada como K en el diagrama, para evitar confusiones con el texto sin formato) y cuatro cajas S de 256 entradas (S0, S1, S2 y S3).
Cada ronda r consta de 4 acciones:
La función F divide la entrada de 32 bits en cuatro cuartos de 8 bits y utiliza los cuartos como entrada para las cajas S. Las cajas S aceptan una entrada de 8 bits y producen una salida de 32 bits. Las salidas se suman módulo 2 32 y se combinan para producir la salida final de 32 bits (ver imagen en la esquina superior derecha). [6]
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 utilizar el orden inverso de cifrado como algoritmo de descifrado (es decir, primero aplicar XOR a P17 y P18 en el bloque de texto cifrado y luego utilizar las entradas P en orden inverso).
El programa de claves de Blowfish comienza inicializando la matriz P y las cajas S con valores derivados de los dígitos hexadecimales de pi , que no contienen ningún patrón obvio (ver nothing up my sleeve number ). Luego, la clave secreta se combina byte a byte, ciclando la clave si es necesario, con todas las entradas P en orden. Luego, se cifra un bloque de 64 bits con todos los ceros con el algoritmo tal como está. El texto cifrado resultante reemplaza a P 1 y P 2 . Luego, el mismo texto cifrado se vuelve a cifrar con las nuevas subclaves, y el nuevo texto cifrado reemplaza 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 de 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 combinan mediante la operación 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 utiliza claves de 448 bits, y su implementación de referencia, que utiliza claves de 576 bits. Los vectores de prueba para verificar las 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 único Blowfish verdadero".
Otra opinión es que el límite de 448 bits existe para garantizar que cada bit de cada subclave dependa de cada bit de la clave, [5] ya que los últimos cuatro valores de la matriz P no afectan a cada bit del texto cifrado. Este punto debe tenerse en cuenta para implementaciones con un número diferente de rondas, ya que si bien aumenta la seguridad contra 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 realmente no justifica tamaños de clave mayores a 448 bits.
P[18] // Matriz P de 18 elementos S[4][256] // Cajas S: 4 matrices de 256 elementosfunción f(x): // Calcula una función f en una entrada x de 32 bits, utilizando S-boxes y manipulación de bits high_byte := (x desplazado a la derecha 24 bits ) second_byte := (x desplazado a la derecha 16 bits ) Y 0xff third_byte := (x desplazado a la derecha 8 bits ) Y 0xff byte bajo := x Y 0xff h := S[0][byte alto] + S[1][segundo byte] devuelve (h XOR S[2][tercer_byte]) + S[3][byte_bajo]procedimiento blowfish_encrypt(L, R): // Cifra dos mitades de 32 bits L y R utilizando la matriz P y la función f durante 16 rondas para la ronda := 0 a 15: L := L XOR P[redondo] R := f(L) XOR R intercambia valores de L y R intercambia valores de L y R R := R XOR P[16] L := L XOR P[17]procedimiento blowfish_decrypt(L, R): // Descifra dos mitades de 32 bits L y R utilizando la matriz P y la función f durante 16 rondas en reversa para la ronda := 17 hasta 2: L := L XOR P[redondo] R := f(L) XOR R intercambia valores de L y R intercambia valores de L y R R := R XOR P[1] L := L XOR P[0] // Inicializa la matriz P y las cajas S usando la clave proporcionada, seguido de la expansión de la clave // Inicializa la matriz P con los valores de la claveposición_clave := 0para i := 0 a 17: k := 0 para j := 0 a 3: k := (k desplazado a la izquierda 8 bits ) O clave[posición_clave] posición_clave := (posición_clave + 1) mod longitud_clave P[i] := P[i] XOR k// Expansión de clave Blowfish (521 iteraciones)L := 0, R := 0para i := 0 a 17 por 2: pez globo_encriptado(Izq., Der.) P[i] := L P[i+1] := R// Rellene los cuadros S cifrando L y R para i := 0 a 3: para j := 0 a 255 por 2: pez globo_encriptado(Izq., Der.) S[i][j] := L S[i][j + 1] := R
Blowfish es un cifrador de bloques rápido , excepto cuando se cambian las claves. Cada nueva clave requiere un preprocesamiento equivalente a cifrar unos 4 kilobytes de texto, lo que es muy lento en comparación con otros cifradores de bloques. Esto impide su uso en ciertas aplicaciones, pero no es un problema en otras.
Blowfish debe inicializarse con una clave. Es una buena práctica tener esta clave codificada con una función Hash_function antes de su uso.
En una aplicación, el cambio lento de clave de Blowfish es en realidad un beneficio: el método de hash de contraseñas (crypt $2, es decir, bcrypt) utilizado en OpenBSD utiliza un algoritmo derivado de Blowfish que hace uso de la programación de claves lentas; la idea es que el esfuerzo computacional adicional requerido brinde protección contra ataques de diccionario . Véase estiramiento de claves .
Blowfish ocupa poco más de 4 kilobytes de RAM . Esta limitación no es un problema ni siquiera para los ordenadores de sobremesa y portátiles más antiguos , aunque impide su uso en los sistemas integrados más pequeños, como las primeras tarjetas inteligentes .
Blowfish fue uno de los primeros sistemas de cifrado de bloques seguros que no estaba sujeto a ninguna patente y, por lo tanto, estaba disponible para que cualquiera lo usara libremente. Esta ventaja contribuyó a su popularidad en el software criptográfico.
bcrypt es una función de hash de contraseñas que, combinada con un número variable de iteraciones ("costo" de trabajo), explota la costosa fase de configuración de clave 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. [7] [8] [9] [10]
El uso de Blowfish de un tamaño de bloque de 64 bits (en oposición al tamaño de bloque de 128 bits de AES, por ejemplo) lo hace vulnerable a 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 una recuperación de texto simple (es decir, descifrar texto cifrado) contra cifrados con un tamaño de bloque de 64 bits. [11] El proyecto GnuPG recomienda que Blowfish no se use para cifrar archivos de más de 4 GB [3] debido a su pequeño tamaño de bloque. [4]
Se sabe que una variante de Blowfish de rondas reducidas es susceptible a ataques de texto plano conocido sobre claves reflexivamente débiles. Las implementaciones de Blowfish utilizan 16 rondas de cifrado y no son susceptibles a este ataque. [12] [13]
Bruce Schneier ha recomendado migrar a su sucesor de Blowfish, Twofish . [14]
Blowfish2 se lanzó en 2005, desarrollado por personas distintas de Bruce Schneier. Tiene exactamente el mismo diseño pero tiene el doble de tablas S y utiliza números enteros de 64 bits en lugar de números enteros de 32 bits. Ya no funciona en bloques de 64 bits sino en bloques de 128 bits como AES. Blowfish2 se utiliza, por ejemplo, en FreePascal. [15] [16]
no debería utilizarse para cifrar archivos de más de 4 GB de tamaño, pero Twofish no tiene tales restricciones.
un cifrador con un tamaño de bloque de ocho bytes, probablemente repetirá un bloque después de aproximadamente 32 gigabytes de datos. Esto significa que si cifra un solo mensaje de más de 32 gigabytes, es prácticamente una garantía estadística de que tendrá un bloque repetido. Eso es malo. Por este motivo, le recomendamos que no utilice cifradores con bloques de datos de ocho bytes si va a realizar un cifrado masivo. Es muy poco probable que tenga problemas si mantiene sus mensajes por debajo de los 4 gigabytes de tamaño.
En este punto, sin embargo, me sorprende que todavía se siga utilizando. Si la gente pregunta, recomiendo Twofish en su lugar.